
简介这是一套适用于 GIS 学习与应用的甘肃省基础矢量数据包聚焦 Shapefile 标准格式面向地理信息工作者、城乡规划与交通旅游领域研究人员可直接用于地图制图、空间叠加与规划决策。压缩包共 225 个文件、约 17.3MB包含 .shp/.shx/.dbf/.prj 等核心文件以及 .sbn/.sbx 空间索引和 .mxd 工程文档其中 .shp 存储几何要素.dbf 保存属性信息.prj 定义坐标系分文件存储方式便于数据管理与交换。数据覆盖地级市、县界、公路国道、单线水系、乡镇名、加油站、旅游景点等点线面要素较完整地反映了甘肃的自然与人文地理框架使用 ArcGIS、QGIS 可加载分析也可转换为 GeoJSON、KML 等格式。已有 3022 人学习下载能帮助用户快速掌握 shp 数据结构并为区域研究、资源评估和基础底图制作提供可靠数据支撑。对地理教学、城市规划与环境保护等工作尤具参考价值。1. 甘肃基础数据从一堆 DBF 反推矢量包的价值压缩包名字叫“甘肃基础数据完整版矢量shp格式.rar”但解压后第一眼看到的是“公路.DBF”“县乡道.DBF”“单线水系.DBF”“乡镇名.DBF”这一排文件不少人会怀疑自己下错了包。其实这恰恰是 Shapefile 的正常分布.shp 存几何坐标.dbf 存属性GIS 软件在打开时是成套识别的Windows 文件管理器只显示 .dbf 不代表几何数据缺失。这套数据覆盖国道、省道、县乡道、单线水系、乡镇名、加油站、建筑物区域、郊区旅游景点和各级行政边界属于典型的“基础底图 POI”组合。对要做甘肃区域制图、路网连通性分析或旅游设施落位的人来说建议先别急着拖进 ArcMap先确认坐标系、字段编码和各图层的几何类型否则很容易出现“图层已添加但看不到”或“图形和影像错位几百米”的问题。这篇文章按“文件结构 → 图层组织 → 加载查询 → 格式转换 → 边界验证”的顺序把整套数据拆开来讲。2. Shapefile 文件结构.shp/.dbf/.shx 缺失判断与甘肃 CGCS2000 投影2.1 为什么解压后只看到 Batch 文件经常有人用 Excel 直接打开“公路.DBF”看到一堆乱码字段名就以为数据损坏。实际上 .dbf 只是属性表真正的折线坐标和节点坐标全部记录在 .shp 里.shx 则是几何记录的位置索引。一个可正常加载的 shapefile 至少需要 .shp、.shx、.dbf 三件缺一都可能导致图层打不开、图形不显示或者属性表为空。比如只丢 .shx 时QGIS 会提示“无法找到 .shx 文件”ArcMap 则会拒绝加载只保留 .dbf 时能打开却看不到任何图形。甘肃这套数据如果压缩包里只出现 .dbf建议先检查杀毒软件是否隔离了同名 .shp再用 7-Zip 重新解压一次。完整 Shapefile 的配套文件如下扩展名存储内容缺失表现.shp几何坐标点/线/面图层加载后无图形.shx几何记录索引部分软件提示无法读取 .shx.dbf属性字段如 NAME、CODE、LENGTH图形正常属性表为空.prj坐标系描述图形偏移、单位错误.cpg.dbf 字符编码中文属性乱码提示不要单独把 .dbf 拉到 Excel 里修改再存回去。Excel 另存会截断字段长度或改变数值精度导致 ArcGIS 读属性时出现“字段值变成科学计数法”或中文乱码。需要批量改属性时在 QGIS 或 ArcGIS 的编辑会话里操作更安全。2.2 甘肃数据常用的坐标系判断方法甘肃东西跨度大常见的 .prj 有两种一种是 CGCS2000 3 度分带投影比如“CGCS2000 / 3-degree Gauss-Kruger CM 102E”单位为米另一种是 WGS84 经纬度单位为度。加载到 GIS 后如果发现公路图层和高德/百度影像底图错开几百米多半是坐标系定义缺失或投影转换没做。判断方法可以看数据范围。用 GDAL 的 ogrinfo 只读查看ogrinfo -so 甘肃基础数据/国道.shp 国道 | grep -E Extent|Geometry|PROJCRS|GEOGCRS参数含义-so是 summary only只输出图层概要国道是图层名grep过滤出范围、几何类型和坐标系描述。输出里如果出现PROJCRS[CGCS2000]说明是投影坐标系Extent 里的数值一般是七位数比如 X 在 520000 到 640000 之间如果只有GEOGCRS[WGS 84]Extent 里就是纬度 3243、经度 92109 的小数。甘肃全境的经纬度大致在这个范围内投影后的米制坐标需要结合中央经线判断。如果需要给缺失 .prj 的图层补坐标系QGIS 里右键图层 → 图层属性 → 设置源选择目标 CRSArcMap 里使用“定义投影”工具。注意“定义投影”和“投影变换”不是一回事定义投影只是告诉软件数据原本在哪个坐标系投影变换才真正改变坐标值。直接对无 .prj 的 shp 做投影变换软件会默认把它当 WGS84 处理结果自然是偏的。常见可选的坐标系参数EPSG名称适用区域4490CGCS2000 地理坐标系经纬度制图、在线发布4547CGCS2000 / 3-degree Gauss-Kruger CM 102E甘肃中部4548CGCS2000 / 3-degree GK CM 105E甘肃东部4326WGS 84通用 GPS 数据和在线地图2.3 属性表字段与中文编码这套数据里各 .dbf 字段名通常包含 NAME、CODE、TYPE、LENGTH 等基础属性。中文乱码一般源于 .cpg 文件缺失或内容不是 UTF-8。在 QGIS 中加载出现乱码时可以重新加载数据并手动把数据源编码改为 GBK 或 GB18030ArcMap 10.2 以下版本对中文 .dbf 处理较弱可以把字段名改成拼音后重新导出。用 Notepad 或者cat打开 .cpg 能看到编码声明例如 UTF-8、GBK。如果文件夹里没有 .cpg优先用 GBK 尝试因为很多省市级基础数据都是老 ArcGIS 环境导出的字段编码是 GBK 而不是 UTF-8。3. 点线面图层组织加油站、公路水系与行政边界的拓扑关系3.1 点要素加油站、乡镇名与郊区旅游景点的空间属性甘肃基础数据中加油站.DBF、乡镇名.DBF、郊区旅游景点.DBF 对应的 .shp 在大多数情况下是点图层。点要素只有一个坐标对属性表里记录的是这个点的名称、设施类型和所属行政区。比如加油站图层做路径规划时需要先和路网做空间连接确定它落在哪条路附近乡镇名图层则可以直接用作标注层叠加到底图上做地名注记。属性表结构通常是字段名示例值说明NAME某服务区加油站设施名称TYPE加油站点类别COUNTY敦煌市所在行政区LON94.66经度或投影 XLAT40.14纬度或投影 Y当需要统计每个县有多少个郊区旅游景点时用 PostGIS 做空间连接最直接SELECT j.name AS county, COUNT(g.name) AS spots FROM 县界 j LEFT JOIN 郊区旅游景点 g ON ST_Intersects(j.geom, g.geom) GROUP BY j.name;这段 SQL 先用ST_Intersects判断旅游景点点是否落在县界面内再按县名分组计数。没有 PostGIS 环境时QGIS 里对应操作是“按位置连接属性”目标图层选县界连接图层选郊区旅游景点几何谓词勾选“相交”。3.2 线要素国道、省道、县乡道与单线水系的拓扑问题公路.DBF、国道.DBF、省道.DBF、县乡道.DBF 全部是线要素但它们的拓扑精度和坐标系可能来自不同批次。国道、省道在出图时往往按中心线采集县乡道则更接近实际路面走向两条道路相交处如果没共享节点后续做网络分析时会出现“路明明交叉了却不连通”的情况。单线水系.DBF 同样属于线层但语义上是河网不能和道路做相同的拓扑处理。河流在跨越道路时通常有桥梁直接让河网和路网共节点会把桥梁位置弄错。用 ogrinfo 快速确认线要素类型ogrinfo -ro -al 甘肃基础数据/县乡道.shp | sed -n 1,12p输出中的Geometry: Line String表示单线要素Multi Line String表示多部件线串。遇到后者通常是因为数据在采集时把一个完整路段切成了多段属性表里的 LENGTH 字段只统计当前要素长度。如果需要合并同一条路的完整长度可以在 QGIS 字段计算器里用$length结合dissolve按道路名称聚合处理。常见做法是先用v.clean去除拓扑错误再用dissolve按道路编码合并最后重新计算长度。3.3 面要素县界、地区界、建筑物区域与多部件孔洞面图层包括县界、地区界、地级市边界和建筑物区域。面要素由闭环构成属性表里一般有面积字段。甘肃这套数据里县界和地区界可以用于统计乡镇、加油站、旅游景点的分布密度建筑物区域比较特殊它虽然叫“区域”在部分数据源里实际是建筑轮廓多边形做尺度分析时不能和行政区面混用。面要素最常遇到的问题是几何无效自相交环、空几何、多部件中有孔洞。例如从卫星影像提取的建筑物区域经常带碎孔直接用“相交”统计面积会算错。解决方法是先修复几何再用投影坐标系计算面积ogr2ogr -dialect sqlite -sql SELECT ST_Union(geometry) FROM 建筑物区域 建筑物合并.shp 建筑物区域.shp参数说明-dialect sqlite告诉 GDAL 使用 SQLite 方言处理 OGR 几何函数ST_Union将多个面合并为单个集合体。面积计算时注意WGS84 经纬度下$area算出来不是平方米必须先投影到 4547 或 4548再在字段计算器里使用area($geometry)得到的结果单位才是平方米。4. 加载与查询字段乱码、SQL 选择与 Excel 经纬度落图4.1 在 ArcGIS/QGIS 中加载 shp 并修复字符集QGIS 直接拖拽 .shp 文件到画布是最快的加载方式ArcMap 则使用“添加数据”按钮。加载后如果属性表中文乱码QGIS 里可以这样处理右键图层 → 图层属性 → 数据源 → 编码改为 GBK如果仍乱改 GB18030 或 UTF-8。ArcMap 中则建议用“ArcToolbox → 转换工具 → 要素类 → 要素类转要素类”在环境设置里把代码页设为 936GBK输出新 shp。更省事的方式是用 geopandas 读一次并转成 GeoJSON绕开历史编码问题import geopandas as gpd gdf gpd.read_file(甘肃基础数据/公路.shp, encodingGBK) gdf.to_file(公路_utf8.geojson, driverGeoJSON, encodingutf-8)这里read_file的encoding参数指定的是 DBF 的读取字符集常见值是GBK和UTF-8to_file时driverGeoJSON会把几何和属性一起写进 JSON之后用 QGIS 或地图库加载就不容易乱码。4.2 按属性过滤与空间查询在 QGIS 中打开属性表后用“按表达式选择”可以快速筛选。例如要选择长度大于 100 公里的省道NAME LIKE %省道% AND LENGTH 100表达式中LENGTH是字段名LIKE用于模糊匹配%是任意通配符。需要更复杂的空间查询时可以使用 QGIS 的“按位置选择”目标图层选省道比较图层选县界选择“相交”。这在实际工作中常用来提取穿过兰州市区的所有道路或者落在某一行政边界内的加油站。4.3 Excel 经纬度导入 ArcMap 生成 shp经常有人手头只有 Excel 表格里面放着名称、经度、纬度却没有矢量文件。这种情况下ArcMap 中可以直接“文件 → 添加数据 → 添加 XY 数据”X 字段选经度列、Y 字段选纬度列坐标系选 WGS84EPSG:4326软件会生成一个临时事件图层。确认点位没有明显偏移后在图层上右键 → 数据 → 导出要素选择保存为 shapefile。QGIS 对应操作是“图层 → 添加图层 → 添加分隔文本图层”文件格式选 CSVX 字段选 lonY 字段选 lat图层坐标系选 EPSG:4326。参数对应如下参数推荐值说明文件格式逗号分隔对应 CSV记录和字段自动检测首行需有字段名X 字段lon经度列名Y 字段lat纬度列名图层坐标系EPSG:4326经纬度坐标导入后再“导出要素”为 shp随后可以在数据管理工具里进行投影转换把它转成甘肃本地的 CGCS2000 投影便于和已有道路、行政区图层叠加。5. 转换实战shp 转 txt/CSV、批量转 kml 与 dwg 接入5.1 shp 转 txt / CSV坐标和属性一起导出很多场景下需要把 shp 里的坐标点读成文本方便做算法输入。最直接的工具是 GDAL 的 ogr2ogrogr2ogr -f CSV 国道.txt 国道.shp -lco GEOMETRYAS_XYZ-f CSV指定输出格式为 csv-lco GEOMETRYAS_XYZ决定把几何信息以 X、Y、Z 三列追加到属性表后。国道.txt是输出文件如果不给扩展名GDAL 也能识别但明确写成 .txt 便于后续处理。输出结果第一行是字段名后面每行是一条要素的坐标和属性。如果只导出属性表不导出坐标可以去掉-lco GEOMETRYAS_XYZ。遇到中文属性乱码时追加-lco ENCODINGGBK让 GDAL 用指定编码写入输出文件。这个命令对“shp 转 txt”的需求最有用不需要打开 GIS 软件就能完成。5.2 shp 批量转 kml 与按行政区裁剪把甘肃基础数据切分到甘肃省各市、县时可以用 OGR 命令行实现。比如把当前目录下所有 shp 批量转成 KMLfor shp in *.shp; do ogr2ogr -f KML -dsco NameFieldNAME ${shp%.shp}.kml $shp done这行脚本先遍历所有 .shp${shp%.shp}是去掉.shp后缀的变量替换输出同名 .kml。-dsco NameFieldNAME把属性表里的 NAME 字段映射为 KML 的显示名称这样在 Google Earth 里看到的是中文地名而不是默认的要素编号。按行政区裁剪常用-clipsrcogr2ogr -f GeoJSON 兰州公路.geojson 公路.shp -clipsrc 兰州市.shp-clipsrc接受另一个矢量文件作为裁剪范围执行后只剩下落在兰州市界内的公路要素。这个做法比在 QGIS 里手动裁剪更可控适合在脚本里循环处理多个地市。5.3 从 dwg 转 shp、EPS 地图转 shp 与渔网分割规划类项目经常需要从 CAD 图纸里拿路网但 GDAL 原生不读 DWG只支持 DXF。常见做法是在 CAD 里另存为 DXF再执行ogr2ogr 输出_路网.shp 输入.dxf转换时注意 DXF 里的多段线和样条曲线会被拆成线要素属性表里只有 Layer、Entity 等字段。EPS 地图转 shp 也类似需要先在 EPS 中导出 DXF再按上面命令转换。转换后如果图形偏移检查 DXF 原文件是否带地理坐标如果只是 CAD 施工坐标系需要先做仿射变换。渔网分割 shp 常用于抽样和空间统计。QGIS 中“矢量 → 研究工具 → 创建渔网”设置网格间距和范围能够生成一个覆盖甘肃全省的网格面图层。ArcGIS 里对应“创建渔网”工具参数可以这样设置参数示例值说明输出要素类甘肃渔网.shp生成网格边界模板范围县界.shp与甘肃边界一致网格间距 X0.01经度方向间隔或 1000 米网格间距 Y0.01纬度方向间隔或 1000 米之后用“按位置选择”或“相交”把道路、景点等落到网格内就能按网格统计要素数量。最终网格数据如果还要转成 3D Tiles建议先在 QGIS 里把属性字段精简一遍只保留需要的字段直接转全字段会导致 3D Tiles 数据量明显膨胀。6. 边界提取与坐标验证的收尾技巧6.1 验证坐标系和范围是否在甘肃每次转换格式后都要重新确认坐标范围是否合理。用 ogrinfo 只读查看ogrinfo -so 甘肃基础数据/省界.shp 省界 | grep Extent如果输出是(92.0, 32.0)到(109.0, 43.0)左右的小数说明是经纬度如果是(520000, 3800000)这种七位数则是投影坐标。转换前后两次对比能快速发现坐标丢失、投影错误的问题。6.2 只保留外边界线做甘肃全省专题图时往往需要提取最外圈省界去掉内部县界。用 geopandas 可以优雅解决import geopandas as gpd gdf gpd.read_file(甘肃基础数据/县界.shp, encodingGBK) boundary gdf.dissolve().boundary boundary.to_file(甘肃_外边界.shp, encodingutf-8)gdf.dissolve()默认把图层中所有面要素溶解成一个整体面内部县界会消失.boundary把这个整体面的外环几何提取成线要素。之后再用 QGIS 打开“甘肃_外边界.shp”叠加影像底图检查边界是否沿甘肃轮廓闭合如果出现零星碎线说明原始县界存在拓扑缝隙需要返回v.clean修补。本文还有配套的精品资源点击获取