资讯动态

甘肃矢量shp底图实战:从坐标纠偏到空间分析

发布时间:2026/10/12 22:50:14 来源:尧图企业网站定制
简介一份覆盖甘肃省全域的完整矢量基础数据包面向GIS学习者、规划与地理研究人员解决省级矢量底图数据分散、要素不全的问题。压缩包共225个文件其中39组.shp/.dbf/.shx/.prj构成完整Shapefile数据集另有.sbn/.sbx空间索引与.mxd工程文件等总大小17.3MB目录组织清晰。要素涵盖点、线、面三类火车站与加油站等点状设施单线水系、公路、国道、省道、县乡道等线状路网地级市、地区界、省界、县界等面状行政区划以及城墙、出入口、旅游景点、建筑物区域等综合信息。这些数据支持地图制图、叠加分析、交通规划、环境评估与旅游开发等多种GIS任务。已有3028人浏览学习适合教学演示、科研底图或区域综合分析。使用ArcGIS、QGIS即可直接加载也可转出GeoJSON或KML用于跨平台共享是一份实用性强、覆盖面广的甘肃地理基础数据资源。1. 甘肃基础数据完整版一包 shp 矢量底图先分清能做什么再动手不少人拿到“甘肃基础数据完整版矢量shp格式.rar”第一反应是找里面的 .dbf 用 Excel 打开看到一堆字段名和代码就以为数据没用了。这包资源真正值钱的不是单个 dbf而是把甘肃的地名、公路、省道、国道、县乡道、单线水系、乡镇名、加油站、建筑物区域和郊区旅游景点做成了分层的矢量 shp。配合 QGIS 或 ArcGIS你可以半小时内把它变成一张可查询、可分析的底图沿国道做缓冲区、把乡镇名挂到路网上、查旅游景点周围有没有加油站。它适合做交通和城市空间分析的人也适合正在做 GIS 课程设计、需要省域 shp 做素材的同学。先别急着双击解压把这包 rar 的文件结构、坐标系和属性编码弄明白后面每一步才不翻车。2. 拆包与图层识别先把 .shp/.dbf/.shx/.prj 这组四件套认全2.1 解压前先用 rar 命令看清单区分伪加密、分卷和损坏拿到压缩包先别急着双击。rar 是个容器里面有什么文件、缺不缺件解压前用一条命令就能看到。我最常用的是rar l它列出压缩包内所有文件的完整路径和大小不解压数据也能检查完整性。rar l 甘肃基础数据完整版.rar # 也可以试试 unrar l效果一样 unrar l 甘肃基础数据完整版.rar重点看后缀如果出现 .shp、.dbf、.shx、.prj 配套文件说明每个图层都是标准 ESRI Shapefile。如果只有一组 .dbf后面要格外小心我在这章的 2.2 里会讲清楚原因。另外一个常见的坑是资源站喜欢给 rar 加伪加密。文件头写了“加密”让 WinRAR 打开时提示要密码实际数据并没有真正加密只是防止下载工具偷跑。用rar l能列出内容说明头信息完整再用最新版 7-Zip 或 WinRAR 尝试解压大概率能直接通过。不要一上来就搜密码破解工具那种东西多数是假主页还可能把文件搞坏。还有一种情况是分卷缺件。比如作者压缩成了 part1、part2、part3你漏了下 part3解压时会提示“需要下一卷”。这时候看压缩包名称后缀是否连续缺哪卷补哪卷不是密码问题。Shapefile 这一类格式的“四件套”关系我用一张表说明扩展名存储内容缺失后果.shp要素几何坐标图层显示不出任何图形.shx几何位置索引部分 GIS 软件打不开或很卡.dbf属性字段、名称、代码、类型图形在但没有可用属性.prj坐标系 WKT 描述图层叠加时可能整体漂移.cpg属性编码声明中文属性大概率显示为乱码很多人以为 .shp 是完整的矢量文件其实它只存几何。真正和业务相关的路名、等级、长度、面积都存在 .dbf 里两者靠文件主名关联。解压后不要随意改文件名改了主名GIS 软件就找不到配套的 .dbf 了。2.2 点线面先分组公路、水系、加油站不在同一个维度上从文件名可以大致看出这包数据分三种几何类型点、线、面。分析前先分清楚否则后边做缓冲区、相交、空间连接都会报错。图层名几何类型常见用途地名点/注记地图标注、地名检索乡镇名点/注记行政中心标注、点聚合公路线路网底图、拓扑构建国道线干线选线、缓冲区省道线干线选线、缓冲区县乡道线乡村路网分析单线水系线河流网络、水资源分布加油站点服务设施密度、选址评价郊区旅游景点点旅游线路规划建筑物区域面城市建成区统计这里有个必须提醒的点公路、国道、省道、县乡道这四张线层并不是彼此独立的路网。国道和省道本身就在公路路网范围里如果把这四张图一起加载并统计总长度同一段路会被重复计算。我一般会把“公路”当作全路网底图其余三张作为道路等级标签或者用 dissolve 后按等级拆分而不是直接合并求和。2.3 QGIS 加载 shp 的完整步骤和四个关键参数QGIS 加载 shp 的操作比 ArcGIS 更直接我以 QGIS 3.x 为例说一遍完整流程。打开 QGIS菜单 Layer → Data Source Manager → Vector。浏览选择 .shp 文件注意底部 Encoding 下拉框。先选 GBK 或 GB18030如果属性还是乱码再改成 UTF-8。如果弹出 CRS 选择窗口优先选 .prj 文件里写的坐标系没有 .prj 就先选 WGS84 加载之后统一转。加载后右键图层 → Properties → Source检查 Geometry type 和 Coordinate system。参数建议值说明EncodingGBK / UTF-8国内 shp 属性常见编码是 GBKGeometry type与图层名一致点线面决定后续工具选项CRS与 .prj 一致不一致会造成图层漂移Provider默认 OGR/PyogrioQGIS 新版本默认驱动更稳定不要直接把 .dbf 拖进 QGIS。拖进去只会打开一个纯属性表格地图区不会有任何图形原因前面说过几何并不在 dbf 里。3. 坐标系与属性编码叠不齐、乱码、属性对不上全在这一章3.1 甘肃数据跨投影带为什么不能默认它一定是 WGS84Shapefile 里的坐标值只是数字坐标系定义在 .prj 文件里。你看到坐标是六位数、七位数不代表它是米制还是度。甘肃省东西跨度超过 15 度UTM 分区就会跨 47 和 48 两个带3 度高斯投影又能分成好几个中央经线。不同单位提供数据时有的用 CGCS2000有的还是西安 1980有的干脆不写坐标系。实际项目里最常见的翻车场景是这样把一份没有 .prj 的线层硬叠在另一份 CGCS2000 的县界上结果国道跑到黄河对面去了。这不是坐标算错了而是两个图层根本不在同一个坐标框架里。所以拿到这包数据第一件事不是画图而是给每个图层的 CRS 做个登记。不要凭经验猜“甘肃应该用 WGS84”先看文件再下结论。3.2 用 Python 给每个 shp 做“身份登记”检查坐标系的代码很简单用 geopandas 几行就能跑完。依赖安装pip install geopandas pyogrio然后执行import geopandas as gpd from pathlib import Path data_dir Path(甘肃基础数据) for shp in sorted(data_dir.glob(*.shp)): try: gdf gpd.read_file(shp, encodingutf-8) except UnicodeDecodeError: gdf gpd.read_file(shp, encodingGBK) print(f图层: {shp.stem}) print(f 要素数: {len(gdf)}) print(f 几何类型: {list(gdf.geom_type.unique())}) print(f 坐标系: {gdf.crs}) print( 字段:, list(gdf.columns)) print(- * 60)新版 geopandas 默认用 pyogrio 读取 shapefile速度比旧版 fiona 快也省去很多编译依赖。先试 UTF-8 读取失败再回退 GBK这是处理国内 shp 属性编码的常规姿势。需要注意这里的encoding只控制 .dbf 属性表的字符集不影响几何坐标。geom_type.unique()能一眼看出图层是否混了点和线如果出现这种混型后边分析要单独拆开处理。crs如果输出 None说明 .prj 缺失就得靠数据范围去推断坐标系。3.3 统一坐标系CGCS2000 和 WGS84 之间的选择逻辑统一坐标系一般选两个目标CGCS2000EPSG:4490和 WGS84EPSG:4326。前者是国内测绘成果的标准后者是 GPS、在线底图和 GeoJSON 的默认基准。两者在省域尺度上位移不大但严格测量时会有亚米级到米级差异。我的习惯是如果这包数据主要用来看图、叠在线底图直接转 EPSG:4326 最省事如果之后要和规划部门给的成果合并统一转 EPSG:4490输出也保留 CGCS2000。转换代码import geopandas as gpd from pathlib import Path out_dir Path(统一) out_dir.mkdir(exist_okTrue) target_epsg 4490 # 也可改成 4326 for shp in Path(甘肃基础数据).glob(*.shp): gdf gpd.read_file(shp, encodingutf-8) if gdf.crs is None: # 没有坐标系信息时只能按坐标范围推断 gdf gdf.set_crs(epsg4326) # 先按经纬度处理 gdf gdf.to_crs(epsgtarget_epsg) gdf.to_file(out_dir / shp.name, driverESRI Shapefile, encodingutf-8)to_crs是重投影set_crs是给坐标“贴上”原始坐标系标签。这两个顺序绝对不能反。如果原数据已经投好了米制高斯坐标你直接用 set_crs 告诉它这是经纬度再 to_crs 一次结果会差很多公里。没有 .prj 的图层优先看坐标范围经纬度一般不会超过 120米制投影坐标是六位数和七位数混合范围在 90 到 110 之间时先按经纬度处理。4. 实战把乡镇名、公路和单线水系叠起来做选址分析4.1 空间关系选型within、intersects、buffer 究竟用哪个做空间查询前先想清楚你要的是“包含”“相交”还是“一定距离内”。谓词/操作含义典型场景within要素完全落在对方内部判断加油站是否在镇区范围内intersects要素和对方有公共部分判断国道是否穿过某个乡镇buffer给要素生成半径范围查旅游景点周边 5 公里的设施常见的错误是把 buffer 用在经纬度坐标系下。数据如果还是 EPSG:4326直接 buffer(5000)程序会理解为 5000 度不是 5000 米。凡是算距离、算半径先把图层投影到米制坐标再做。4.2 一个能直接跑通的 Python 查询脚本假设要分析每个郊区旅游景点周边 5 公里范围内有没有国道经过有没有加油站。代码这样写import geopandas as gpd # 1. 读取原始图层 spots gpd.read_file(郊区旅游景点.shp, encodingutf-8) roads gpd.read_file(国道.shp, encodingutf-8) gas_stations gpd.read_file(加油站.shp, encodingutf-8) # 2. 统一坐标系用米制投影甘肃中东部一般可用 UTM 48N 示意 spots spots.to_crs(EPSG:32648) roads roads.to_crs(EPSG:32648) gas_stations gas_stations.to_crs(EPSG:32648) # 3. 生成 5 公里缓冲区 spots_buf spots.copy() spots_buf[geometry] spots.geometry.buffer(5000) # 4. 空间连接 road_in gpd.sjoin(roads, spots_buf, predicateintersects) gas_in gpd.sjoin(gas_stations, spots_buf, predicateintersects) print(5公里内经过的国道记录:, road_in.shape[0]) print(5公里内的加油站记录:, gas_in.shape[0]) # 5. 导出结果 road_in.to_file(国道_景点5km.geojson, driverGeoJSON) gas_in.to_file(加油站_景点5km.shp, encodingutf-8)buffer的单位是米所以要用米制投影坐标系。甘肃全省跨度大一份数据不一定能用同一个 UTM 带覆盖如果分析范围覆盖全省要么按带切分要么在代码里逐景点做局部投影不要指望一个 EPSG:32648 能解决全甘肃。sjoin是 geopandas 的空间连接返回两个图层的匹配行。老版本用op参数新版本统一改成predicate写成opintersects会有弃用告警但不影响结果。最终结果可能出现重复记录一个国道穿过同一个景点缓冲区两次或者一个加油站在多个景点缓冲区里。要统计独立景点数用drop_duplicates(subset[景点唯一标识])去重。4.3 不写代码也能在 QGIS 里复现整个流程如果不想写 PythonQGIS 界面操作也可以完成同样分析。菜单 Vector → Research Tools → Vector buffer输入图层选郊区旅游景点距离填 5000线段数保持默认或改成 10生成缓冲区。菜单 Vector → Data Management Tools → Join attributes by location缓冲区作为 Target layer国道和加油站作为 Join layer相交方式选 intersects。输出时勾选“Only keep matching records”或“Keep records that intersect”就能筛出命中的记录。不同 QGIS 版本菜单略有差异可以在 Processing Toolbox 里直接搜索 Buffer 或 Join attributes by location。关键参数只有两个Buffer 的距离单位要和投影坐标系一致Join 一定要选对 predicate。坐标系没统一之前界面操作出来的结果会同样漂移别等做完才发现图层叠在了错误的位置。5. 避坑与排查省级 shp 底图最容易翻车的五个细节5.1 中文属性乱码现象、原因、解决现象加载后面字段显示为“鍏矾鍚嶇О”或“”属性表里名称全是乱码。原因dbf 属性表常见编码是 GBK 或 GB18030但 QGIS 默认按 UTF-8 读且数据包里没有 .cpg 文件告诉软件真实编码。解决在 QGIS 数据源管理器的 Encoding 下拉框里手动改成 GBK 或 GB18030重新加载。代码读取时用encodinggbk。如果字段名也乱多半是编码选错如果字段名正常、只有中文值乱码说明源数据在导出时丢了编码头。5.2 图层互相漂移坐标系不一致现象国道线跑到县界外或者和单线水系交叉的位置明显不对。原因不同图层 .prj 缺失或者坐标系不一致一份是 WGS84 经纬度一份是 CGCS2000 高斯投影。解决用第 3 章脚本打印每个图层的 CRS统一转到一个目标坐标系。没有 .prj 的图层先 set_crs 再 to_crs顺序不能反。多次实测下来最多的问题就出在这里看起来是“数据错了”其实是坐标系标签没贴对。5.3 只有一个 dbf 文件拖进 QGIS 变成纯表格现象把“公路.dbf”直接拖进 QGIS地图区域没有任何图形只打开一张属性表。原因dbf 只是属性表几何信息在 .shp 里。单独一个 dbf 不构成完整矢量图层。解决回压缩包里确认是否有公路.shp 和公路.shx。如果资源确实只提供了 dbf那要么把它当成统计数据用要么用主键字段在 GIS 里 join 到其他带几何的数据上。没有关联字段的话这个 dbf 只能做表格查询不能做空间分析。5.4 解压提示密码或损坏先排除伪加密现象WinRAR 解压弹出“需要输入密码”或者提示压缩包已损坏。原因资源下载站常见做法是给 rar 加伪加密标志实际数据没有加密只是防止部分工具识别也可能是分卷没下载完整。解决先用rar l看压缩包内文件列表能列出说明头信息正常。再用最新版 7-Zip 尝试打开伪加密在 7-Zip 下往往能直接绕过。提示缺 part2 这类分卷编号时补全分卷再解压。不要依赖所谓密码移除工具容易弄坏文件。5.5 路网拓扑错误断头、缝隙、重复路段现象在 QGIS 里跑网络分析总是提示无法沿网络路由计算道路总长度时同一段路被统计两次。原因原始数据分层采集时线段交点没打断不同道路图层互相包含或者存在自相交和重复要素。解决先用 Python 检查几何有效性import geopandas as gpd gdf gpd.read_file(公路.shp, encodingutf-8) print(无效要素数:, (~gdf.is_valid).sum()) # 缓冲 0 修复自相交几何 gdf[geometry] gdf.geometry.buffer(0)buffer(0)能修复大部分自相交问题但对断头无效。断头要在 QGIS 里用 Processing Toolbox 里的 GRASS 工具 v.clean选择 break 和 rmdupl 操作。注意清洗前必须先统一坐标系别在经纬度下跑否则容差值会把本来正确的道路也修坏。6. 交付前最后一道工序用三步体检把这包 shp 变成可信底图6.1 第一步核对 .prj 坐标系描述shp 的 .prj 文件本质是文本文件用 cat 就能看到里面的坐标系定义cat 国道.prj输出里会出现GEOGCS[CGCS2000]或PROJCS[...3-degree Gauss-Kruger...]这样的关键词。把这段字符串和你在 QGIS 里看到的 CRS 对照能确定图层原始定位。没有 .prj 的图层用第 3 章脚本看坐标范围并在自己的数据说明里标注“坐标系不明按经纬度处理”。这个标注很重要后边换了人接手项目能被一句话救回来。6.2 第二步用 ogrinfo 核对字段结构和记录数没有 Python 环境时GDAL 自带的 ogrinfo 也能检查ogrinfo -so 公路.shp 公路-so表示只输出摘要会显示几何类型、要素总数以及字段名和字段类型。字段是 String 还是 Integer会影响后续查询和关联方式。记录数和数据说明对不上很可能解压不完整或丢要素先回压缩包复查别急着继续分析。6.3 第三步把体检结果固化成一张小表我建议在做正式分析前把上面两条检查结果敲成一张表信息包括图层名、几何类型、要素数、坐标系、字段列表、编码。这就是数据体检报告之后任何一次分析出错回来看这张表就能快速定位。比如“乡镇名”显示为 Point但你想用它做面积统计那就需要先找对应的乡镇边界面层。如果找不到就只能接受“乡镇名适合做点标注不适合直接算面积”这个限制。别把点数据当面数据硬用这是很多课程设计项目翻车的根源。从那以后我每次拿到省域 shp 包都会强制走一遍这四步列压缩包、统一坐标系、查编码、跑 is_valid。这四步加起来不到五分钟却能省掉后期排查的半天。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑