甘肃矢量shp数据包解析:QGIS加载、坐标系修正与GeoJSON导出

发布时间:2026/10/18 16:42:00
甘肃矢量shp数据包解析:QGIS加载、坐标系修正与GeoJSON导出 简介甘肃省基础地理信息矢量数据包以Shapefile格式组织面向GIS初学者、规划人员及地理数据分析者可用于地图制图、空间查询与基础分析。包内共225个文件含39组shp、shx、dbf、prj配套文件覆盖相同数量的要素图层另有sbn、sbx空间索引以及mxd工程文档压缩包大小17.3MB。数据涵盖点、线、面多种几何类型包括火车站、公路、国道、县乡道、单线水系、省县界、加油站、旅游景点等可支撑交通网络分析、行政区划展示、资源分布评估等场景。已有3031人学习下载目录按要素拆分、命名规范便于按需调用。通过ArcGIS或QGIS可直接加载并可进行叠加分析、缓冲区分析等空间操作也可转换为GeoJSON等格式用于Web可视化是理解甘肃省地理空间特征、开展区域研究与规划工作的实用基础数据包可直接用于项目底图与分析。1. 甘肃基础数据包先搞清楚这套shp能拆出什么拿到“甘肃基础数据完整版矢量shp格式”这个压缩包先说一句可能打消你疑虑的话里面不是一张栅格底图也不是在线地图的截图而是标准的Shapefile矢量数据。做GIS的同事看到那一排.dbf后缀就知道——每一层的几何图形和属性表分开存放加载后能筛选、裁剪、按字段查询也能直接导出成GeoJSON或KML。我的建议是先别急着画图把压缩包里的要素层逐个加载一遍确认坐标系和属性表编码再谈出图和分析。这篇文章同时覆盖两类人用QGIS做项目地图的从业者以及正在做地理空间分析的学生无论哪一类都需要先想明白“这套数据能拆哪几层、坐标是什么、乱码怎么修”。2. 压缩包里装了什么十类要素层与Shapefile三件套2.1 Shapefile不是单文件每个图层至少要凑齐三件套很多第一次接触GIS数据的人会问为什么解压出来一堆同名文件到底该拖哪个进软件答案很直接拖.shp后缀的那个其他文件是它的“随从”。一套完整的Shapefile由多个伴随文件组成缺了任何一个都可能让图层打不开或者属性表变空。扩展名作用缺失后果.shp存储几何信息点、线、面的坐标图层完全无法加载.shx几何索引按记录号定位坐标某些软件提示“损坏”或无法显示.dbf属性表每一行的字段值都在这里图层能看到形状但属性表空白.prj坐标系统描述WKT格式文本软件会“猜”坐标系经常猜错.cpg属性表编码声明常见GBK/UTF-8中文属性乱码这套压缩包里的“地名.DBF”“公路.DBF”这些清单实际上对应的是“地名.shp”这些图层的属性表文件。你在解压时如果发现某个图层只有.dbf而没有.shp说明文件在传输时被拆分或者丢失这个图层就只能当表格用无法画到地图上。2.2 十类要素层的部门划分点、线、面分别能干什么从压缩包的文件清单来看这套数据至少包含十种要素层。把它们按几何类型归类使用思路就清晰了线要素公路、国道、省道、县乡道、单线水系。这些层表示道路和水系的中心线或边线可以用来做路网连通性分析、路径规划底图、水系分布研究。点要素地名、乡镇名、加油站、郊区旅游景点。这些是POI性质的数据适合做设施分布密度、可达性分析或者直接作为地图标注点。面要素建筑物区域。闭合多边形可以用于城市建成区提取、建筑面积统计、地块边界参考。这里有一个容易被忽略的细节压缩包里没有单独的“省界”“县界”图层只有乡镇名和地名。如果你需要精确的行政边界常见做法是拿乡镇名图层做标注基准再补充一套行政界线shp或者从乡镇名坐标点做泰森多边形得到粗略势力范围。别指望一套基础数据把行政区划边界也给你画好。2.3 用脚本快速摸清每个图层的字段结构拿到压缩包后我习惯先跑一段Python脚本把每个图层的要素类型、记录条数和字段名列出来。这样能提前发现“这个图层能不能做属性筛选”“哪个字段适合做标注”。用pyshp库最轻量import os import shapefile data_dir 甘肃基础数据/shp # 改成你解压后的实际目录 for fn in os.listdir(data_dir): if fn.endswith(.shp): base fn[:-4] try: sf shapefile.Reader(os.path.join(data_dir, fn)) print(f图层: {base}) print(f 要素类型代码: {sf.shapeType} (1点, 3线, 5面)) print(f 记录数: {len(sf)}) field_names [f[0] for f in sf.fields[1:]] print(f 字段: {field_names}) sf.close() except Exception as e: print(f {base} 读取失败: {e})这段代码的核心是调用pyshp的Reader对象shapeType返回的是几何类型代码3代表PolyLine即线要素5代表Polygon即面要素1代表Point即点要素。拿到字段列表后你就能判断哪个字段适合做名称标注、哪个字段是道路等级代码、哪个字段可以用来做分类渲染。参数上唯一需要改的是data_dir路径如果你的shp文件和解压后的文件夹放在一起也可以直接指到根目录。3. 坐标系与属性表编码打开前的两个关键设置3.1 先答三个问题坐标系、投影、单位加载shp数据后地图上的位置不对十有八九是坐标系问题。中国的基础地理数据最常用的有三种坐标系WGS84GPS原生坐标、CGCS2000国家大地坐标系、Xian 80老图常用。前两者的经纬度数值几乎看不出差别但平面投影后的坐标值完全不同。怎么判断你的这套数据是什么坐标系先看有没有.prj文件有的话用文本编辑器直接打开里面写着完整的坐标系统定义。如果能看到GCS_China_Geographic_Coordinate_System_2000或者CGCS2000字样那就是CGCS2000如果只有GCS_WGS_1984就是WGS84。没有.prj的情况下加载到QGIS后看鼠标指针显示的地图坐标值——经纬度范围在90到135之间说明是地理坐标系如果是带米单位的数值说明用了投影坐标系比如高斯-克吕格投影。这里要特别提醒用投影坐标系还是地理坐标系直接决定长度和面积计算准不准。你如果只做展示、配色地理坐标无所谓但要做道路里程统计、面积计算、缓冲区分析就必须先投影到合适的米制坐标系。甘肃地域跨度大常用的投影带比较分散不能简单套一个全国范围投影。3.2 属性表乱码dbf编码与修复入口中文属性表乱码是这套数据最高频的翻车现场。.dbf是dBASE时代的格式默认用系统代码页编码简体中文Windows下通常表现为CP936也就是GBK。但Mac或Linux下打开很多GIS软件默认按UTF-8解码于是“甘肃省”就变成了“鐢樿們鐪?”看着一团乱。在QGIS里修复乱码不需要重装数据右键图层选择“属性”切到“数据源”选项卡在“图层编码”里把默认的UTF-8改成GBK或CP936属性表立刻恢复可读。ArcGIS Pro通常自动识别但如果你在ArcMap里遇到乱码可以去“ArcMap选项→表格→编码默认值”里调整。还有一种一劳永逸的办法用ogr2ogr把dbf重新转一遍编码让数据本身变成UTF-8ogr2ogr -lco ENCODINGUTF-8 甘肃基础数据_utf8/ 甘肃基础数据/ *.shp这段命令会把整个目录下的shp重新写出到一个新文件夹并把属性表编码强制设为UTF-8。-lco ENCODINGUTF-8是创建新数据时的编码控制选项一定要写否则ogr2ogr可能沿用源文件的编码声明。转换完成后在QGIS里重新加载属性表中文就能正常显示。3.3 缺少.prj文件时怎么估算坐标系没有.prj的文件坐标系是个黑匣子。我的排查方法是先用QGIS加载取消“CRS transformation”提示让图层落在WGS84的默认范围然后看几何体的大致位置。如果点的经纬度落在东经90110、北纬3045之间说明是甘肃一带的地理坐标如果坐标是五六百万的大数字比如X18500000说明是高斯-克吕格投影后的米制坐标这类数据通常需要根据带号反推投影分带。更省力的做法是写段Python读取.prj并解析出EPSG编码直接把坐标系定死from pyproj import CRS with open(乡镇名.prj, encodingutf-8, errorsignore) as f: wkt_text f.read() crs CRS.from_wkt(wkt_text) print(坐标系名称:, crs.name) try: print(EPSG编码:, crs.to_epsg()) except Exception: print(EPSG编码: 未匹配可能需要手动指定) for axis in crs.axis_info: if axis.abbrev not in (None, ): print(f轴 {axis.name}: 单位 {axis.unit_name} ({axis.unit_abbrev}))这段代码里CRS.from_wkt把.prj文本解析成坐标系对象crs.name输出可读名称to_epsg()尝试返回权威编码。注意axis_info是复数包含x、y两个轴输出单位能看出是“degree”还是“metre”。参数上如果直接读中文.prj文件errorsignore能避免微软的BOM头干扰解码。4. 把shp用起来QGIS加载、属性筛选与GeoJSON导出4.1 QGIS加载拖拽、编码与首屏校验加载shp最无脑的方式是直接把文件拖进QGIS窗口但拖进去之后不要马上开始画图先做三件事确认图层编码、确认坐标系、确认几何类型正确。点击图层面板左下角的“属性”按钮检查“数据源”选项卡里的编码设置把乱码的图层编码改成GBK再切到“信息”选项卡看坐标系是不是你预期的那个。首屏校验最直接把“乡镇名”图层开出来和底图叠加缩放后看点是否落在甘肃范围内。如果所有要素集中在某个角上或者跑到国外去了说明坐标系不匹配QGIS的“CRS Transformation”通常会自动处理但遇到同名图层文件时偶尔会弹窗选来源坐标选错就会出现位置偏移。4.2 属性筛选用SQL表达式选出国道和乡镇名基础数据真正好用之处在于属性筛选。比如你只想保留“国道”图层中的国道线路不需要省道和县乡道同时显示可以右键图层→“过滤”。QGIS的表达式语法用起来像SQL很适合做条件筛眩-- 用字段筛选把国道单独拿出来 class 国道如果字段名是汉字比如“道路等级”需要在QGIS表达式对话框中点击字段列表自动插入注意字段名要用双引号包起来字符串值要用单引号。筛选成功后图层面板里该图层会显示一个漏斗图标数据只显示符合条件的那部分。“乡镇名”图层也类似可以用乡镇名 LIKE %城关%这样的模糊匹配把包含特定关键词的乡镇挑出来。4.3 导出GeoJSON过滤字段与坐标系转换做完筛选后不是直接截图交差而是导出成对方能用的格式。Web端好兄弟更认GeoJSONPostGIS入库则用SQL直接导入。用ogr2ogr导出国道图层是一个稳妥方案ogr2ogr -f GeoJSON 国道_output.geojson \ 甘肃基础数据/国道.shp \ -where class 国道 \ -t_srs EPSG:4326-where参数把属性筛选条件写进导出过程只导出符合条件的要素-t_srs EPSG:4326强制输出到WGS84经纬度坐标。如果你的原数据已经是地理坐标系这一步可省略但如果原数据是投影坐标这个参数能把数据转成经纬度方便在Leaflet、Mapbox这类前端地图库中直接叠加。导出之前建议先用第3章的脚本确认源坐标系避免转换偏移。4.4 Python直读geopandas批量导出中心文件如果你要的不是单层导出而是把整包shp按统一标准转成GeoJSON建议用geopandas写批量脚本import geopandas as gpd import os src_dir 甘肃基础数据/shp out_dir 甘肃基础数据/geojson os.makedirs(out_dir, exist_okTrue) for fn in os.listdir(src_dir): if fn.endswith(.shp): gdf gpd.read_file(os.path.join(src_dir, fn)) # 统一转成 WGS84 gdf gdf.to_crs(epsg4326) out_path os.path.join(out_dir, fn.replace(.shp, .geojson)) gdf.to_file(out_path, driverGeoJSON, encodingutf-8) print(f已导出: {out_path}, {len(gdf)} 条)gpd.read_file直接读shpto_crs(epsg4326)把坐标系统一转成经纬度to_file写出GeoJSON。encodingutf-8这个参数在QGIS里也对应着图层编码导出后打开前端地图属性表不再乱码。这套脚本最大的价值是可以一次性转完整包不用在软件里一层层点。5. 避坑记录五个高频翻车现场5.1 属性表全是问号中文名碎成一地现象加载后在属性表里看到“????”或者“鍖椾含”之类的乱码无法读取乡镇名和道路名称。原因dbf文件是GBK编码而QGIS默认按UTF-8解码两侧编码不一致。解决在图层属性→数据源→图层编码里手动改成GBK或CP936。如果多处图层都这样就按第3.2节的ogr2ogr命令整批转成UTF-8之后所有图层统一用UTF-8加载。5.2 QGIS提示Invalid Data Source图层拖进去就是加载失败现象把shp拖进去后QGIS报“Invalid Data Source”图层面板里没有出现图层。原因多数情况是.shp文件缺失伴随的.dbf或.shx也有可能是目录路径包含中文或空格导致底层驱动找不到文件。解决先看压缩包里的同名文件是否齐全至少.shp、.dbf、.shx要在同一目录。其次把路径改成纯英文比如D:/gansu_data/shp/避免沿途目录里有中文。5.3 图层出现但所有要素跑到地图范围外缩放到图层也看不见现象加载后地图上什么也没有“缩放到图层”看到的是一片空白或者几何越界。原因原始shp没有.prj文件QGIS默认按WGS84经纬度解析但数据实际是投影坐标系米制值这种情况下坐标值被当成经纬度用位置偏移到几百万度之外。解决按3.3节的方法读取或估算坐标系然后在QGIS图层属性里手动指定正确的坐标系让QGIS重新投影。5.4 筛选“国道”筛选不出任何东西现象写了class 国道筛完结果为零但图层明明有国道。原因字段类型不匹配。如果字段是数值型比如道路等级用1、2、3表示而你拿文本“国道”去比自然永远匹配不上。恰恰相反如果是文本字段但值包含空格或者全角字符也匹配不了。解决先在属性表里查看该字段的具体值和类型。数值字段改用class 1文本字段检查内容里是否有空格用trim()函数包裹字段再比较。5.5 编辑要素后无法保存提示文件被锁定现象改了某个图层的属性点保存的时候提示“could not remove file”或者“permission denied”。原因shp文件的锁定通常是两个一是QGIS里正在开着该图层的编辑会话二是文件被另一个GIS软件或杀毒软件占用。解决确认关闭编辑会话、关闭所有引用该文件的窗口后重试。路径在U盘或共享盘的话把文件复制到本地再编辑。这个坑几乎每个做GIS的人都会踩一次我的习惯是编辑前先复制一份备份改坏了随手可以把原始文件拖回来。6. 进阶数据体检与拓扑修复基础数据里的矢量图层不是拿来就能直接用于分析的尤其是道路和水系这类线要素经常存在悬挂线、重复线段、自相交之类的问题。拿来做缓冲区分析或者网络分析之前先跑一遍拓扑检查能省很多事。QGIS里装Topology Checker插件按下面步骤操作插件→拓扑检查器点击“配置”选择要检查的图层。规则选择“不能有悬挂线”对应线要素的端点必须与其它线相交或落在端点范围内。运行检查后不符合规则的线会高亮出来缩放到错误位置查看原因。对于重叠面或者缝隙规则用“不能有重叠”和“不能有缝隙”。拓扑错误修复的手段比较粗糙也有效手动移动顶点、删除重复要素、用v.clean破面修复。我不建议在基础数据里直接改原图而是先用“保存为”→GeoPackage导出当前图层把原shp当参考改的是副本。数据体检还包括另一个习惯拿到数据先看要素计数记录每个图层原始记录数再做任何删除操作前再次对比数量。这个习惯救过我多次——有一次我在QGIS里做道路筛选明明只选中五百条保存后整个图层剩三十条如果不看记录数就会把原始数据毁了。从那以后我每次拿到新的shp资源都会强制走一遍“编码检查→坐标系复核→记录数快照→副本备份”的流程再开始做任何处理。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询