简介:这份甘肃基础数据完整版以矢量shp格式整理,面向GIS初学者、地理研究及城市规划人员,用于地图制图、空间分析与规划决策等场景。压缩包共225个文件,约17.3MB,以shp、shx、prj、dbf为核心,分别承载几何图形、索引、坐标系统与属性数据,并附sbx、sbn空间索引及mxd工程文件,便于在ArcGIS、QGIS中直接加载编辑。数据覆盖点、线、面多类要素:火车站、加油站、旅游景点等点要素,单线水系、公路、国道、省道、县乡道等线要素,以及地级市、地区界、省界、县界等面要素,还包含城墙、出入口、沟渠、桥等复杂要素,较完整地反映甘肃省地形、交通与人文地理特征。已有3027人学习下载,读者可据此开展交通网络连通性分析、水资源分布研究、旅游资源评估与行政边界制图,也可将shp转换为GeoJSON或KML用于数据共享,是理解并描绘甘肃地理空间特征的实用基础资料。
1. 甘肃基础数据完整版 shp 到底装了什么:从一次边界对不齐说起
做西北项目的人大概率遇到过这种场景:拿到的甘肃省界 shp 和影像底图套不上,或者市县边界之间出现细缝,又或者属性表里只有 NAME 字段,想按行政区代码关联统计数据时直接卡住。这时候你需要的不是某个在线地图截图,而是一份结构完整、拓扑干净、字段规范的甘肃基础数据 shp 文件。所谓「完整版」,通常意味着它不止有省界,还包含省市县多级行政边界、水系、道路、居民点等基础地理要素,且坐标系和字段设计能直接进 GIS 流程。这类数据适合做区域规划、资源调查、专题制图、空间分析底图,也适合作为其他数据入库前的参照框架。但拿到压缩包只是第一步,真正决定你能不能跑通项目的,是坐标系判断、字段核对和拓扑检查这三件事。下面按我实际处理这类数据的顺序,把每一步拆开讲。
2. 拿到 shp 压缩包先别急着拖进 ArcGIS:坐标系与字段的核对方法
2.1 为什么坐标系判断错了后面全白干
甘肃跨度大,经度从 92° 到 108° 左右,纬度从 32° 到 42° 左右。如果数据本身是地理坐标系(GCS),单位是度;如果被定义成投影坐标系(PCS),单位是米。很多「完整版」压缩包里同时放了 WGS84 和 CGCS2000 两套,或者只放了一套但没写清楚。你直接拖进 ArcGIS 或 QGIS,软件会按 .prj 文件读,但如果 .prj 缺失或写错,软件可能默认成某个投影,结果就是位置偏移几百米甚至几公里。判断方法很简单:先看 .prj 文件里有没有 GEOGCS 和 PROJECTION 关键字,再用识别工具点一下省界上的点,看坐标数值是「度」还是「米」。如果是度,说明是地理坐标系;如果是几十万到几百万的数值,说明是投影坐标系。甘肃常用的投影有 CGCS2000 3 度带或 6 度带,中央经线一般在 96°E 到 102°E 之间。核对清楚再决定要不要投影转换,否则后面做面积统计、缓冲区分析全是错的。
2.2 用 Python 批量读取 shp 元数据与字段结构
拿到一堆 shp 文件,手动一个个看太慢。我一般先用 Python 把每个文件的坐标系、要素数量、字段名和字段类型扫一遍,输出成表格,方便对比。下面这段代码依赖geopandas和pyproj,没有的话先pip install geopandas pyproj。
import geopandas as gpd import os import pandas as pd # 把这里换成你解压后的文件夹路径 data_dir = r"./甘肃基础数据完整版" records = [] for root, dirs, files in os.walk(data_dir): for f in files: if f.endswith(".shp"): path = os.path.join(root, f) try: gdf = gpd.read_file(path) # 坐标系信息 crs = gdf.crs # 字段名和类型 fields = [(col, str(gdf[col].dtype)) for col in gdf.columns if col != "geometry"] records.append({ "文件": f, "要素数": len(gdf), "坐标系": crs.name if crs else "缺失", "字段": "; ".join([f"{c}({t})" for c, t in fields]) }) except Exception as e: records.append({"文件": f, "要素数": -1, "坐标系": "读取失败", "字段": str(e)}) df = pd.DataFrame(records) df.to_csv("shp_metadata_check.csv", index=False, encoding="utf-8-sig") print(df)这段代码的逻辑是遍历文件夹下所有 .shp,用geopandas.read_file读取,然后提取 CRS 名称、要素数量和字段列表。参数上,data_dir要改成你实际解压的路径;输出 CSV 用utf-8-sig编码是为了 Excel 打开不乱码。跑完之后重点看三列:坐标系是否一致、要素数是否合理(比如省界应该只有 1 条,市县界应该有几十到上百条)、字段里有没有你需要的行政区代码。如果发现某个文件坐标系是「缺失」,那就要手动补 .prj 或者用gdf.set_crs指定。
2.3 字段核对:NAME 之外你还缺什么
很多网上下载的 shp 只有 NAME 一个字段,做展示够用,但一做统计就废了。完整的甘肃基础数据通常应该包含:省级有 NAME、CODE;市县级有 NAME、CODE、PARENT_CODE 或 CITY_CODE;水系有 NAME、TYPE、LEVEL;道路有 NAME、TYPE、GRADE。如果你拿到的只有 NAME,那就要考虑从其他来源补代码,或者用空间连接的方式从标准行政区划表里把代码挂上去。核对字段时注意字段长度和类型,比如 CODE 如果是数值型,前导零会丢,必须转成文本型。用gdf['CODE'] = gdf['CODE'].astype(str)可以强制转换,但要注意原来如果是浮点数,会变成「620000.0」这种,得先转整再转字符串。
3. 把 shp 用起来:从拓扑检查到常见格式转换的完整操作链
3.1 拓扑检查与修复:shapechk 和 QGIS 两条路
shp 格式本身对拓扑约束很弱,相邻多边形之间可以有缝隙或重叠。做空间分析前必须检查。常见做法有两种:一是用 shapechk 这类专用工具,二是用 QGIS 的拓扑检查器。shapechk 的使用方法是:打开工具,选择要检查的 shp,设置检查规则(比如「不能有重叠」「不能有缝隙」),运行后它会生成错误报告和修复建议。QGIS 里则在「矢量」菜单下找「几何工具」→「检查有效性」,或者用「拓扑检查器」插件。我一般先跑一遍有效性检查,看有没有自相交、空几何、重复节点;再跑重叠检查,看相邻面之间有没有压盖。如果只是少量错误,手动编辑节点就能修;如果错误很多,可以用「融合」再「拆分」的方式重建拓扑,但要注意属性会丢,得提前备份。
3.2 用 GDAL 命令行做 shp 到 GeoJSON、KML 和 CSV 的批量转换
项目里经常需要把 shp 转成其他格式给不同软件用。GDAL 的ogr2ogr是最稳的。下面几条命令覆盖常见需求:
# shp 转 GeoJSON,注意指定编码,避免中文乱码 ogr2ogr -f "GeoJSON" -lco ENCODING=UTF-8 output.geojson input.shp # shp 转 KML,适合给 Google Earth 或奥维用 ogr2ogr -f "KML" output.kml input.shp # shp 转 CSV,只导出属性表,加上 -lco GEOMETRY=AS_XY 可以带经纬度 ogr2ogr -f "CSV" -lco GEOMETRY=AS_XY output.csv input.shp # 批量转换当前目录下所有 shp 为 GeoJSON for f in *.shp; do ogr2ogr -f "GeoJSON" -lco ENCODING=UTF-8 "${f%.shp}.geojson" "$f" done参数说明:-f指定输出格式;-lco ENCODING=UTF-8是图层创建选项,保证中文属性不乱码;GEOMETRY=AS_XY会把几何的经纬度写成两列。批量循环里${f%.shp}是去掉扩展名。注意如果 shp 本身是投影坐标系,转出来的 GeoJSON 坐标会是米,不是经纬度,需要先做投影转换再转格式。转换前用gdalinfo input.shp看一眼坐标系,确认无误再操作。
3.3 从 Excel 点数据生成 shp 并叠加甘肃底图
做项目时经常拿到 Excel 里的采样点,需要转成 shp 再和甘肃边界叠加。步骤是:先把 Excel 另存为 CSV,确保有经度、纬度两列,列名用英文如 lon、lat。然后用 QGIS 的「添加分隔文本图层」导入,X 字段选 lon,Y 字段选 lat,坐标系选 EPSG:4326。导入后右键导出为 shp,坐标系可以选 CGCS2000 或保持 WGS84。如果要用 Python 做,代码如下:
import pandas as pd import geopandas as gpd from shapely.geometry import Point # 读取 CSV,确保 lon/lat 列存在 df = pd.read_csv("sample_points.csv") # 创建几何列 geometry = [Point(xy) for xy in zip(df["lon"], df["lat"])] gdf = gpd.GeoDataFrame(df, geometry=geometry, crs="EPSG:4326") # 保存为 shp gdf.to_file("sample_points.shp", encoding="utf-8") print("生成完毕,要素数:", len(gdf))这里crs="EPSG:4326"表示 WGS84 经纬度。如果甘肃底图是 CGCS2000 投影坐标系,需要用gdf.to_crs(底图的crs)转一下再叠加,否则位置会偏。参数上注意 CSV 里的经纬度不能有度分秒符号,必须是十进制度。
4. 避坑与排查:甘肃 shp 处理中最容易翻车的 5 个地方
4.1 现象:省界和市县界套不上,出现明显偏移
原因:省市县三级数据来自不同来源,坐标系不一致。省界可能是 WGS84 地理坐标,市县界可能是 CGCS2000 投影坐标。解决:统一转成同一个坐标系再叠加。用gdf.to_crs(epsg=4490)统一到 CGCS2000 地理坐标,或者统一到对应的 3 度带投影。转换前先确认每个文件的原始 CRS,不要凭感觉猜。
4.2 现象:属性表里中文全是乱码
原因:shp 的 .dbf 文件默认编码可能是 GBK 或 Latin1,而软件按 UTF-8 读。解决:在 QGIS 里设置图层编码为 GBK 再加载;或者用ogr2ogr转换时加-lco ENCODING=UTF-8重新输出一份。Python 里用gpd.read_file(path, encoding="gbk")可以指定编码读取。
4.3 现象:面积统计结果明显偏大或偏小
原因:在地理坐标系下直接算面积,单位是平方度,没有实际意义。解决:先投影到合适的投影坐标系再算面积。甘肃常用 CGCS2000 3 度带,中央经线根据区域选 96°E、99°E、102°E 等。用gdf.to_crs(epsg=4547)这类带号 EPSG 转换后再算。
4.4 现象:shp 文件拖进软件打不开,提示缺少 .prj 或 .dbf
原因:压缩包里可能只放了 .shp 主文件,缺少配套的 .shx、.dbf、.prj。解决:shp 是复合格式,至少需要 .shp、.shx、.dbf 三个文件同名同目录才能正常读取。如果缺失,找原始压缩包确认是否解压完整,或者用其他来源补 .prj。
4.5 现象:用渔网分割 shp 后,每个格子里的属性丢失
原因:渔网分割时没有做空间连接,或者连接时字段映射没设对。解决:先用「创建渔网」生成网格,再用「空间连接」把原 shp 的属性挂到网格上,注意连接操作选「一对多」或「一对一」取决于需求。如果只是要统计每个格子里的要素数量,用「按位置选择」再汇总即可。
5. 进阶:用甘肃 shp 做流域提取与 3D 可视化前处理
拿到甘肃基础数据后,除了做平面制图,还可以往两个方向走:一是做流域边界提取,二是做 3D 可视化前处理。流域提取需要 DEM 数据配合,用 ArcGIS 的水文分析工具或 QGIS 的 SAGA 模块,先填洼、算流向、算流量累积,再根据阈值提取河网,最后用「分水岭」工具生成流域边界。甘肃地形复杂,祁连山、黄河上游、内陆河流域交错,阈值设置很关键,一般先试 1000 到 5000 个栅格单元,看提取的河网是否合理再调整。生成的流域边界可以和甘肃市县 shp 叠加,统计每个县覆盖的流域面积。
3D 可视化方面,shp 转 3dtiles 是常见需求。思路是先把 shp 转成 GeoJSON,再用工具转成 3D 模型格式,最后切片成 3dtiles。但 shp 本身是二维的,要做出立体效果,需要给要素加高度字段,比如建筑物层数或道路高程。没有高度字段的话,可以统一给一个基准高度,或者用 DEM 采样每个要素的高程。这一步我踩过的坑是:直接转出来的 3dtiles 没有贴地,悬在空中,原因是坐标系没有统一到 ECEF(地心坐标系)。解决方法是转换前先把数据投影到 EPSG:4978 或使用支持地理坐标的转换工具。
最后说一个我自己的习惯:每次拿到新的 shp 数据,先建一个「检查」文件夹,把元数据扫描结果、拓扑检查报告、坐标系转换记录都放进去。这样后面不管谁接手,或者自己隔几个月再回头看,都能快速定位问题。甘肃基础数据完整版这类资源,价值不在文件本身,而在你能不能把它干净地接入自己的流程。希望帮到你。
本文还有配套的精品资源,点击获取