首页 / 资讯中心 / 文章详情

全国矢量地图SHP处理指南:从RAR解压到坐标纠偏与发布

全国矢量地图SHP处理指南:从RAR解压到坐标纠偏与发布 ★ FEATURED ARTICLE
简介全国矢量地图shp格式压缩包面向GIS数据分析、城市规划、环境研究与交通管理等人员提供了一套覆盖全国范围的基础地理数据可满足行政区划、道路网络、水系、地貌及兴趣点等多种空间分析需求。包内共85个文件以shp几何文件、dbf属性文件、shx索引文件和xml元数据为主整体大小34.27MB数据组织较为规范便于在ArcGIS、QGIS等常用GIS软件中直接加载和编辑。目前已有543人学习下载。资源内容包含省级、市级等不同行政层级边界以及道路、河流、建筑、机场车站等点线面要素用户可以直接用于地图制图、缓冲区分析、叠加统计和路径规划等实际操作对于需要建立全国底图或开展区域研究的读者来说是一套基础且实用的数据素材。使用时注意根据项目需求核对数据精度与更新日期以提高分析结果的可靠性。1. 拿到“全国矢量地图shp格式.rar”先把坐标、来源和边界范围三件事问清楚很多做GIS的人电脑里都有这样一个压缩包几个GB的RAR文件名写着“全国矢量地图shp格式”解压出来是省界、市界、区县界、铁路、河流、居民地年份不明坐标系不明。它的价值很直接——不用从零矢量化全国也不用反复搜“中国行政区划shp怎么下载”项目底图、出图、空间分析都能靠它起步。但同样叫“全国矢量地图”的包坐标系可能是CGCS2000也可能是GCJ-02一份省界文件可能叫“省1”另一份叫“省2”在ArcGIS里打开可能是一片空白属性表全是乱码。这些都是真实发生的现象不是版本玄学。这篇从拿到RAR开始按拆包、转格式、日常加工、排错、发布五个环节讲一遍争取让你当天就把数据跑起来。2. RAR里的全国SHP拆包坐标系陷阱、图层命名差异与GB级数据的资源账2.1 坐标系陷阱CGCS2000与GCJ-02的偏差会让边界看起来“错位”300米打开压缩包以后我第一件事不是急着拖进ArcGIS而是先查坐标系。全国范围的shp文件最常见的是CGCS2000EPSG:4490这是当前国内测绘成果的标准坐标系。另一个常见的坐标是WGS84和CGCS2000在普通制图尺度下差别很小。真正让你翻车的是GCJ-02也就是高德、腾讯这些互联网地图用到的加密坐标系。高德地图矢量爬取下来的一堆边界、道路数据几乎都落在GCJ-02里。它和标准SHP叠在一起视觉上会整体偏移几百米城市里尤其明显——路网和底图错开一条街。这种偏移不是用“平移”能解决的因为GCJ-02是对WGS84做非线性加密后的结果不同区域偏移量不一样。我之前接过一个项目甲方拿“高德爬取的行政边界”当正式界址用叠到1:2000的地形图上差了半条路最后全部返工。现在我的原则是凡是涉及面积计算、界址比对、审批出图一律不用爬取类矢量做分析底图顶多当展示用。判断坐标系的方法很简单用GDAL自带的ogrinfo看一眼.prj信息ogrinfo -so 全国_district.shp 全国_district命令最后的参数是图层名通常和shp主文件名一致。输出里会有一段Layer SRS WKT看到GCS_China_Geodetic_Coordinate_System_2000就是CGCS2000看到GCS_WGS_1984就是WGS84。GCJ-02的prj文件在标准工具里经常显示为自定义字符串甚至缺失。更保险的办法是打开shp的.prj文件用记事本看里面写的坐标系名称。如果写的是“GCJ-02”这类非标准名称那这份数据就属于商业地图坐标系不能用国土、规划项目里惯用的CGCS2000去套。拿到北京 shp这类城市级数据也一样直接看prj而不是猜后缀。2.2 图层命名与字段差异同样叫“省界”为什么会有省1和省2两份文件解压出来的文件夹里经常能看到一套命名的数据省界、市界、区县界、乡镇界、铁路、河流、居民地。用词不统一但结构基本是这个套路。真正让人困惑的是有时同一个图层会出现两份比如“省界线文件省1和省2的shp文件有什么区别”这个问题我几乎每周都能在项目群里看到。常见情况有两种。第一种是同一份边界的不同版本一个含沿海岛屿、飞地另一个做了简化去掉了图斑面积特别小的小岛。第二种是数据来源不同省1来自国家基础地理信息数据省2来自某个行业专项采集属性表字段都不一样。判断方法是分别跑一次ogrinfo看要素数和字段名ogrinfo -so 省1.shp 省1 ogrinfo -so 省2.shp 省2 ogrinfo -al -so 省1.shp | head -40ogrinfo -al -so会列出所有属性字段和类型。对比两份文件的要素数、字段名集合再看是否有省代码字段。通常一份带6位或12位行政区划代码另一份只有名称这种优先选用带官方行政区划代码的版本后面做属性关联会省很多事。字段命名也要留意。有的包用英文AREA、PERIMETER、PRV_NAME、PRV_CODE这些写法很老派有的直接用中文属性名比如“省名称”“省代码”。中文属性对出图友好但转KML、GeoJSON时容易因为编码出问题这部分在第5章展开。无论什么命名我先记住一点把“省代码”“PAC”“ADCODE”这类键字段找出来它是后续关联统计数据的钥匙比名称可靠得多。2.3 要素数量与硬件预算先算资源账再决定用QGIS还是ArcGIS全国级别的shp包解压后大小往往以GB计算。虽然文件大小不直接等于加载速度但要素数量会实实在在影响软件表现。以区县级边界为例全国有几千个县级区划光是一个区县面图层加属性表就有上万条记录如果还带了乡镇界、村级点、地名注记要素量轻松到几十万甚至百万级。在这样的数据量下老版本ArcMap打开大shp经常转圈卡死尤其是启动时就自动识别字段类型的那一下可能等几分钟没反应。我现在的习惯是优先用QGIS 3.x打开全国包做浏览和检查。QGIS对大数据量shapefile的列表加载更利索内存管理也相对稳定。如果项目规范必须用ArcGIS那建议在ArcGIS Pro里操作Pro的64位架构处理大文件比传统ArcMap好不少。另一个容易忽略的点是DBF属性表的限制。shapefile的属性存于.dbf老式dbf单文件上限约2GB字段数上限255个。全国包如果属性字段特别多或者要素总量过大写入时会报错。遇到这种情况我会把数据转成GeoPackage.gpkg作为工作格式减少DBF带来的边界问题。GeoPackage在QGIS和ArcGIS Pro里都能直接读字段类型也更宽松。资源账的另一部分是坐标投影。全国矢量shp通常是经纬度坐标做长度、面积计算时必须投影到适合所在区域的地图投影坐标系。比如只算北京市的面积范围就用适合北京的投影参数算全国面积推荐Albers等积投影。很多人拿着WGS84的经纬度shp直接算面积结果单位变成平方度数值小得不正常然后跑来问数据是不是坏了。数据没坏是投影没设置。3. 解压、校验与格式转换从RAR到SHP再到KML与GeoJSON/3D Tiles3.1 用7-Zip命令行解压RAR并逐文件核验SHP三件套不少人解压RAR习惯双击用WinRAR的界面点“解压到”这对单文件没问题但遇到几十个分卷、带路径的压缩包我建议用7-Zip命令行命令简单还能保留目录结构、避免文件名编码错乱7z l 全国矢量地图shp格式.rar 7z x 全国矢量地图shp格式.rar -oD:\gis_data -y第一条命令l是列出压缩包内容先确认里面是单个文件夹还是一片散文件能提前看到有没有分卷、有没有说明文本。第二条命令x是完整解压-o指定输出目录-y遇到覆盖询问直接确认。如果压缩包设了密码可以在命令里加-p密码但我一般先不加等它提示时再输入避免密码带特殊符号时命令行解析出错。解压之后不要急着打开先做三件套校验。shapefile不是单个文件一个完整图层至少包含三个文件文件后缀作用缺失后果.shp几何要素本身打开直接报“文件不存在”.shx几何索引能打开但可能要素残缺或显示空白.dbf属性表要素能显示但没有属性字段.prj坐标系统定义软件按默认坐标读坐标可能偏移.cpg属性编码声明中文属性易乱码.dbf缺失是最隐蔽的ArcGIS可能照常显示图形但属性表打开是空的等你要用字段做符号化才发现问题。我习惯先执行一次目录清单检查ls -l D:\gis_data\*.shp D:\gis_data\*.shx D:\gis_data\*.dbf看到每类文件数量一致还不够文件名必须完全匹配。province.shp对应province.shx和province.dbf如果压缩包里有province.shx.bak这种奇怪后缀多半是别人手工修复过的残留得小心对待。3.2 SHP转KMLogr2ogr最小命令和ArcGIS的另存路线把全国或某个省份的shp转成KML用于谷歌地球、奥维、无人机地面站这类场景是出现频率很高的需求。网上常搜“arcgis shp转kml”ArcGIS里确实有专门的工具ArcToolbox里的“图层转KML”勾选“将要素限制为感兴趣区域”可以控制输出范围。但在没有ArcGIS的环境中GDAL的ogr2ogr是最省事的手段ogr2ogr -f KML -dsco NameFieldNAME 全国_省份.kml 全国_省份.shp-f KML指定输出格式-dsco NameFieldNAME把属性表里的NAME字段作为KML的标注名称这样到了谷歌地球里图斑显示的是省名而不是一串ID。如果不写这个参数KML里的Placemark名字会变成数字型要素ID显示效果很差。转出来之后KML文件默认是WGS84经纬度坐标这符合KML规范。如果原始SHP是CGCS2000ogr2ogr在转KML时会自动做坐标系变换不需要手动加参。要注意的是全国级别的KML生成后体积动辄几十MB以上谷歌地球加载会明显卡顿。我建议按省级或地市级范围导出不要一次性输出全国。反过来做kml转shp也一样ogr2ogr -f ESRI Shapefile 输出目录/转换结果.shp 输入文件.kmlKML转shp后最好用ogrinfo复查一次几何类型KML里一个要素可能被读成Point或Polygon混合一个shapefile图层不能同时容纳两种几何类型这种情况下GDAL会报错需要把点、线、面拆开分别导出。3.3 SHP转GeoJSON与3D Tiles做Web预览与三维展示的取舍Web端做可视化GeoJSON是最通用的格式。转GeoJSON的关键是输出坐标系必须是EPSG:4326不然Leaflet、Mapbox等前端库不认ogr2ogr -f GeoJSON -t_srs EPSG:4326 全国_省份.geojson 全国_省份.shp-t_srs是重投影参数把源数据从CGCS2000或Web墨卡托转换到4326。如果源SHP本身就是4326这个参数写了也不影响结果但统一写明更安全。GeoJSON字段名用英文最省事中文字段名在部分前端库和压缩传输环节会出问题。所以我在转之前会先在QGIS里把属性字段重命名一遍。现在还有人问“json转shp网站”常见做法是在浏览器用geojson.io这类在线页面工具做检查和编辑但全国级别的GeoJSON动辄几百MB上传网站既不安全也不现实。我一般做小范围数据核查才用在线工具大批量转换一律本地ogr2ogr解决数据不用离开自己的机器。“shp转3dtiles”是另一个被问很多的方向。把全国矢量转3D Tiles用于Cesium场景这个思路没问题但要注意全国级别的数据直接转3D Tiles会生成一个巨大的数据集根节点加载慢客户端也扛不住。正确做法是先分层省界单独一层道路单独一层建筑单独一层然后按瓦片范围分批转换。Cesium离子平台可以直接吃GeoJSON/glTF生成3D Tiles本地也可以用py3dtiles这样的库跑。无论用哪条路原则是“大切片小粒度”先做轻量化精简要素再转三维格式。4. 日常加工需求DWG转SHP、Excel点数据转SHP与渔网分割实战4.1 DWG转SHP图层筛选、坐标重投影与边界闭合检查国土、规划行业经常拿到DWG格式的地块边界或道路中线要转成SHP和全国底图叠在一起。最常见的问题不是“转不了”而是转完以后坐标系完全不对位。DWG文件很多是设计院自定义的平面坐标系原点、单位都不标准直接转SHP后图形可能出现在完全错误的方位。如果DWG是AutoCAD标准文件先另存为DXF再转换GDAL对DXF的支持比内建DWG驱动成熟得多。然后用ogr2ogr做转换ogr2ogr -f ESRI Shapefile 转换结果.shp 规划地块.dxf -skipfailures-skipfailures很重要源文件里有些实体类型GDAL不认加了这个参数就能跳过不至于中途中断。如果不加可能转了30%就报错停掉。转换后用QGIS加载先查看要素的属性表确认图层的几何类型DWG里的闭合多段线转进SHP后通常成了Polygon但有很多看起来闭合却实际没闭合拓扑上叫“未闭合线”后续做面积计算时会得到0或报错。遇到这种情况我的处理是在QGIS里跑一遍“修复几何”工具或者用PostGIS的ST_MakeValid批量修复。更关键的步骤是坐标重投影DWG里如果有控制点坐标用“移动到图层”工具做仿射变换把整个图形搬到正确位置。单纯在shp里修改prj文件是自欺欺人prj只改变显示坐标不改变几何数值图形该在哪还在哪。4.2 Excel坐标点转SHPpandas geopandas批量生成野外调查、管网普查的数据经常是Excel表格里面只有点号、经度、纬度要落成SHP叠加到全国底图上。这种情况我用Python的pandas加geopandas几分钟搞定几千个点import pandas as pd import geopandas as gpd from shapely.geometry import Point df pd.read_excel(井位坐标.xlsx, dtype{点号: str}) df[geometry] df.apply(lambda r: Point(r[经度], r[纬度]), axis1) gdf gpd.GeoDataFrame(df, geometrygeometry, crsEPSG:4326) gdf.to_file(井位.shp, encodingutf-8, driverESRI Shapefile)dtype参数把“点号”列强制转成字符串避免点号以0开头时被Excel识别成数值丢掉前导零。crsEPSG:4326是声明坐标是WGS84经纬度如果你的Excel坐标来自实测CGCS2000就改成EPSG:4490。声明错误是最常见的坑坐标数值完全一样但声明成不同坐标系叠图时就差出一大截。如果坐标是从高德地图或者手机App里拿的多半是GCJ-02直接转4326的SHP和标准底图叠不上。这类数据必须先通过坐标纠偏工具把GCJ-02转回WGS84再进入后续流程。我的经验是不要指望在shp里做纠偏要在进入SHP之前就把原始Excel坐标处理好。点数据分散在几十个Excel表时可以先用glob把文件全部读进来合并pandas.concat成一个DataFrame再统一生成SHPimport glob frames [] for f in glob.glob(点位数据/*.xlsx): df pd.read_excel(f) frames.append(df) df_all pd.concat(frames, ignore_indexTrue) df_all.to_excel(合并点位.xlsx, indexFalse)合并后先检查有没有重复点号、空坐标行再做SHP转换。Excel里空坐标在转Point时是致命的会直接抛异常。4.3 渔网分割SHPQGIS网格创建、按位置裁剪与批量输出把全国或者大流域的矢量范围按规则网格切开是生态、气象、自然资源调查里常见的操作。比如手头有塔里木河流域边界shp想按1公里网格统计植被指数就需要先生成渔网再用它裁剪边界。在QGIS里路径是“矢量 → 研究工具 → 创建渔网”。关键参数有三个网格间距、网格范围、输出类型。网格间距按“米”还是“度”取决于你的坐标系投影坐标系里填“1000米”经纬度坐标系里填度比如0.01度约等于1公里。网格范围可以直接引用另一个图层比如“塔里木河流域边界shp”的范围这样渔网就只覆盖流域区域不会生成一大片空白网格。生成渔网后把渔网图层和流域边界做“按位置裁剪”保留边界内部的网格单元再对每个网格单元赋值流域属性。批量输出时QGIS处理工具箱里的“按位置选择”和“分割矢量图层”是配合使用的先用分割工具按网格字段拆开再逐格导出。要注意的是裁剪后的网格单元数可能上万个导出文件时文件命名必须用字段值而不是FID不然顺序一乱全对不上。如果想用代码实现渔网分割可以用geopandas生成网格矩形并做空间连接但代码量会大不少。QGIS界面操作对多数人更快建议优先走GUI路线除非网格数超过几万个再考虑脚本。顺带说一个相关高频问题“如何在shp图中去掉一部分矢量”。例如想把南盘江流域边界中某个小支流范围去掉用“矢量 → 地理处理 → 擦除”即可。擦除失败最常见的原因是边界图层有拓扑错误工具结果为空第5章会讲排查方法。5. SHP打开失败与属性异常排查shapechk修复、RAR密码与编码乱码5.1 图层打开为空或要素残缺shapechk检测与修复流程现象在ArcGIS或QGIS里打开某个shp图层界面完全空白或者只有一部分要素显示属性表行数也少了一截。这种大概率不是数据源坐标问题而是shapefile内部结构坏了最常见的是.shx索引与实际.shp记录数不一致。检查工具我用shapechk。shapechk是专门用来扫描shp文件完整性的工具打开后选择要检测的shp它逐条读取记录并报告错误类型。使用方法是选择shp文件点击“开始”等待扫描结果。常见提示包括“索引文件记录数与几何记录数不一致”“几何类型非法”“shp文件头描述的文件大小与实际不符”。扫描发现问题后修复办法我用GDAL重写ogr2ogr -f ESRI Shapefile 修复后.shp 损坏.shp -skipfailures这条命令会从损坏文件里把能读的要素全部读出再重新生成一套完整的三件套。-skipfailures决定了一个重要行为跳过那些读不出来的要素。如果没有这个参数遇到第一个坏要素就停掉修复文件可能一个要素都没有。修复完成后再跑一次shapechk确认没有错误报告才进入下一步使用。5.2 属性表中文乱码CP936、UTF-8与.cpg文件的关系现象SHP能正常显示图形但打开属性表中文全是“锟斤拷”“燙燙烫”一类的乱码。这在从网上下载的全国矢量包里太常见了尤其是一些老版本数据。原因在于dbf属性文件的编码声明与实际编码不一致字段值实际是GBK/CP936编码但.cpg文件写成了UTF-8或者根本没有.cpg文件ArcGIS按默认规则读成了UTF-8。检查思路是用记事本打开.cpg文件看内容里面是“UTF-8”就是声明为UTF-8如果是“CP936”或“GBK”那是声明为中文编码。然后对比属性表显示如果声明UTF-8但乱码说明源数据实际不是UTF-8。修复方法有个偷懒但有效的做法用geopandas重新指定编码读取并转存import geopandas as gpd gdf gpd.read_file(乱码.shp, encodingGBK) gdf.to_file(修复编码.shp, encodingUTF-8, driverESRI Shapefile)encodingGBK保证按正确编码读出属性转存时写成UTF-8并让工具重新生成.cpg文件。转换后用QGIS复核属性表字段值正常再归档。如果源实测是其他编码比如CP936实际等于GBK绝大多数情况下GBK能覆盖。还有少数数据是Big5或者Shift-JIS那就不能用GBK硬读先试着读出正常属性再转。5.3 RAR压缩包带密码先找来源别急着用破解工具现象双击“全国矢量地图shp格式.rar”弹窗要求输入密码输不对即使能列出目录也解不出文件。这种情况第一时间想到“rar密码移除”“advanced rar password recovery”这类破解工具的人不在少数但我建议先停一下。多数带密码的国土资源类压缩包密码不是随机加密而是发布者设置的简单口令一个网址、一串数字、或者“1234”。我的处理顺序是先返回下载页面或来源页面找密码说明很多包在网盘的描述文字里就写着“解压密码www.xxx.com”。如果找不到试试压缩包里的说明文档或文件名本身文件名中用点或横线分隔的单词往往就是线索。验证密码是否正确的命令是7z t 全国矢量地图shp格式.rar -p你的密码t是测试压缩包完整性密码正确且压缩包结构完整时会显示“全部正常”同时也能顺便验证压缩包本身有没有损坏。如果确认密码错误再考虑联系方式。网上所谓的“rar password recovery”方案对老版本RAR的加密有可能奏效但遇到RAR5默认的AES-256加密普通电脑跑暴力破解的内存和时间成本极高几天几夜也未必出结果。更实际的是回来源渠道找回密码。还有一点要警惕下载所谓“破解版”恢复工具时安装包经常捆绑加载广告的子程序甚至篡改浏览器设置。我在这上面吃过亏现在宁可不解压也不碰来源不明的破解工具。5.4 拓扑错误导致裁剪失败几何修复与有效性质检现象用某个SHP做擦除或裁剪时工具提示“处理失败”或输出为空。这种情况常见于边界不完整的流域shp比如淮河shp文件可能是人工从纸质图矢量化出来的存在自相交、重复顶点、缝隙等问题。在QGIS里先检查“矢量 → 几何工具 → 检查有效性”它会把无效要素逐条列出来错误类型通常包括“自相交”“环方向错误”“重复节点”。拿到检查结果后用“修复几何”工具批量处理。修复算法会把非法的多边形重新组织成有效多边形。我在代码里修复时用shapely的make_validfrom shapely.validation import make_valid import geopandas as gpd gdf gpd.read_file(流域边界.shp) gdf[geometry] gdf[geometry].apply(make_valid) gdf.to_file(流域边界_修复.shp, encodingutf-8)修复后注意几何类型可能变化一个Polygon可能变成MultiPolygon极少数情况下还会生成LineString。线要素不能和面要素放在同一个shapefile图层里所以导出前要检查geometry类型分布如果有线单独分离出去或者丢弃。修复后的SHP再做擦除、裁剪、拓扑套合基本不会再翻车。6. 把全国SHP用起来行政区划代码关联统计表与最小切片发布6.1 用区划代码做连接主键避免地名文字匹配拿到一份全国区县SHP下一步往往是和统计年鉴、经济普查数据做关联。按名称匹配是新手最爱干的事但“城区”“郊区”这种名称在多个地市重复出现按名称连会串行。正确做法是用行政区划代码做连接主键import pandas as pd import geopandas as gpd gdf gpd.read_file(全国_区县.shp, encodingutf-8) stat pd.read_csv(2024年各县GDP.csv, dtype{区划代码: str}) merged gdf.merge(stat, left_onPAC, right_on区划代码, howleft) merged.to_file(全国_区县_带经济数据.shp, encodingutf-8, driverESRI Shapefile)dtype{区划代码: str}是必须的12位行政区划代码以数字形式存在Excel里会被读成int前导的0会消失与SHP的PAC字段类型不一致导致匹配失败。howleft保留所有SHP面要素统计表里没有的可以留空。6.2 设置县级最小显示粒度把全国包发布成XYZ Tiles最后说发布。把全国SHP发布成切片底图时最容易犯的错是一个图层从头到尾只配一种显示比例。全国范围在小比例尺下只看省界放大到城市级别才需要区县界全部要素无差别输出会让切片进程卡死生成的文件也巨大。我现在用GeoServer或QGIS Server做切片预览一般分三层省界图层从第2级显示到第8级市界从第6级显示到第12级区县界从第10级往下显示。QGIS里“瓦片生成”工具可以设置“最小缩放级别”和“最大缩放级别”直接把全国区县包切到适合Web地图使用的XYZ目录。输出前先做一次ogr2ogr简化边界保留精度在0.001度左右文件名加_simplify后缀用来发布原始SHP留作分析。去年做的一个省级项目就是把全省边界包按这个方式拆了三层发布后加载速度终于不用等十几秒转圈。从那以后我拿到新的全国矢量包第一件事固定是ogrinfo查坐标和字段第二件事是7z t验证压缩包完整然后再考虑怎么加工。数据不是越全越好而是越贴合使用场景越好。希望我的这些踩坑经验能帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站