简介:中国矢量地图(SHP格式)是一套覆盖国界、省界、市界、县界四级行政边界的GIS基础数据资源,面向GIS开发者、城乡规划师、地理数据分析人员及科研学者,可直接用于地图制图、区划分析、人口与经济数据可视化、城乡与交通规划等多种场景。资源包共28个文件,每种核心格式各4个,shp存储几何形状,dbf记录行政区域属性,prj提供投影坐标,shx、sbn、sbx构成空间索引,xml保存元数据,配套完整,可在ArcGIS、QGIS等主流平台中直接加载与编辑。整个压缩包仅1.78MB,轻量紧凑,便于快速部署。目前已有8029人浏览学习,是相关地理工作者常用的基础数据。借助这套数据,用户能省去自行搜集与整理行政边界的环节,快速开展空间统计、专题制图与决策支持,有效提升中国地理数据分析效率。 做GIS的人,手里没有过几套“中国矢量地图SHP文件”都不好意思说自己是干这行的。但说实话,我见过太多人卡在同一个地方:要么下载SHP文件之后发现打不开,要么就是格式五花八门,KML、GeoJSON、DWG各种来路的数据堆在一起,转换折腾到半夜;还有人问得最多的一句话就是——“ArcGIS到底怎么按区域裁剪SHP?”。这篇文章我就把自己这些年折腾中国矢量地图SHP的经验捋一遍,从文件结构、格式互转、裁剪分割,到国土报备常用的SHP转TXT和WKT转多边形,最后再讲几个ArcGIS Pro和QGIS的实操细节,尽量把热搜词里的那些需求一次说清楚。
1. 中国矢量地图SHP:先搞清楚你手里这份数据够不够用
很多人拿到SHP文件就直接往ArcGIS里拖,结果弹出一堆错误,第一反应是软件坏了。其实不是,多半是文件本身有问题。
1.1 一份能直接用的中国矢量SHP,文件结构长什么样
SHP格式不是“一个文件”,它是一组文件的集合。一个完整的中国省界矢量数据,至少要有:
.shp:几何信息,也就是点线面的坐标.dbf:属性表,存放地名、区划代码、面积等字段.shx:几何和属性的索引文件.prj:坐标系定义文件,这个文件尤其重要
我遇到过一份中国地图SHP,拖动到软件里只显示了一张空表,检查才发现是.dbf文件丢失了。所以拿到数据后第一件事,就是确认这些配套文件是否齐全。如果你只有单个.shp文件,用QGIS打开时还勉强能识别,但ArcGIS往往会报“无法打开”。网上很多下载包为了省事,把.dbf和.shx分离了,下载时一定要看清文件列表。
还有一个更隐蔽的坑:属性表里的字段名。中国数据常见的字段有NAME、PAC(行政区划代码)、AREA,但有些数据源用的是中文表头,例如“省名称”“代码”。这两种字段名在ArcGIS里都能显示,可一旦要做连接、按字段筛选、导出TXT,麻烦就来了。建议拿到数据的第一时间,先打开属性表看一眼,把字段名统一成英文或拼音,顺便检查有没有乱码。中文乱码通常是因为.dbf的字符集问题,ArcGIS Pro里可以通过“数据源字符集”设置调整,QGIS里则是在打开文件时选编码。
1.2 省级、市级、乡镇级:不同粒度边界的获取与精度取舍
你搜“中国矢量地图SHP”时,大概率会看到几种粒度:全国省级边界、市级边界、县级边界、乡镇边界,还有一些专题数据像地质图、土壤图。粒度不同,获取难度和精度完全不一样。
- 全国省级边界:最普及。网上随便一搜就能找到,精度基本够做示意图、培训演示。
- 地市级边界:也常见,但要注意数据版本。近几年不少地方撤地设市、县改区,老数据里有些名字和边界已经变了。
- 乡镇级边界:真正的稀缺资源。像热搜词里的“云南省乡镇边界shp”,得去各省测绘局、自然资源厅或第三方数据商那里找。乡镇边界更新的成本高,很多数据实际上是几年前的,用的时候要核对区划代码。
说到“精度”,这里想提醒一下:很多免费SHP的精度是1:100万甚至更低。用来画小比例尺地图、做统计图表没问题,但如果要做高精度出图或者空间分析运算,还是得用1:25万、1:5万的官方基础地理数据。这就像拿地图App的离线包和测绘院的专业数据相比,完全不是一个量级。大家在搜索时留意一下数据说明里有没有标注比例尺和数据来源,别一看到“中国矢量地图”几个字就下载。
2. 格式互转的完整方案:KML、GeoJSON、DWG、3DTiles到SHP的六条路线
热搜词里有大量关于格式转换的问题:“kml转shp”、“geojson转换成shp格式工具”、“dwg转shp”、“wkt字符串转多边形shp”、“shp转3dtiles”。说到底,这些操作背后的逻辑没变:让不同来源的空间数据统一成SHP,或者让SHP走向更广阔的Web可视化场景。下面几条路线,是我实测过比较稳的。
2.1 KML转SHP:ArcGIS模型构建器实现批量转换
Google Earth里画的KML文件,基本没有属性字段可言,只有几何图形和名称;而ArcGIS里的KML转图层工具,默认只输出点、线、面三类要素,还经常把多面体拆散。单文件转换很简单:用ArcToolbox里的“KML转图层”(KML To Layer)工具。但在KML数量很多时,一个个转太费时间,这时候就要上模型构建器。
模型构建器的核心思路是:遍历某个文件夹下所有.kml文件,逐个执行转换,最后合并成一个要素类。我用一个最简单的模型结构说明:
- “遍历文件”工具,设置输入文件夹,过滤器选
KML。 - 把遍历结果连到“KML转图层”工具的
输入KML文件参数。 - “KML转图层”的输出是图层和子文件夹,直接用“要素转面/线/点”工具提取几何。
- 最后用“合并”把多次转换的结果整合到同一个SHP。
实际操作时有一个非常容易忽略的坑:同一个KML里可能同时含有点、线、面,转图层后系统会生成多个子图层,但模型构建器里如果不对输出路径做动态命名,后一次转换会覆盖前一次的结果。解决办法是用%名称%作为输出要素类名的一部分,保证每次生成的临时文件名不同。我经常看到有人模型构建器写完了,跑了半天,最后结果只有最后一个KML的数据,就是这个原因。
2.2 GeoJSON转换SHP和DWG转SHP:小工具与大软件各显神通
GeoJSON转SHP其实没有技术壁垒,QGIS里直接把GeoJSON文件拖进图层面板,右键导出,选ESRI Shapefile格式就行。如果你不想装QGIS,也可以用在线转换工具,不过我建议涉及坐标系的转换慎重用在线工具——很多免费网站不处理坐标参考系统,转换结果直接套用了WGS84,和中国常用的CGCS2000叠起来就偏了。
DWG转SHP又是另一套逻辑。AutoCAD的DWG本质上是CAD图形数据,转成SHP之前要先想清楚:你要的是边界线,还是面要素?很多房屋、地块图纸里的闭合多段线,直接转SHP出来是线,不是面。我常用的流程是:先在CAD里把图层整理清楚,把需要转面的闭合线放到单独图层,然后用ArcGIS的“CAD转地理数据库”工具,导入后再用“要素转面”生成面SHP。这一步在批量处理时特别有用,尤其是热搜词里提到的“arcgis模型构建器实现批量kml文件转换者shp”这类需求,思路完全一致:数据整理→批量导入→结构转换→合并输出。
2.3 从SHP到3DTiles:WebGIS可视化的跨维升级
“shp转3dtiles”这个词条近两年热度一直很高,因为基于Web的三维地球应用越来越普及。SHP是二维数据,转3DTiles的本质是给二维要素加上“高度”或“拉伸”属性,然后重新组织成支持LOD的瓦片结构。
目前最常用的转换方式是:
- CesiumLab:国产工具,界面友好,支持SHP直接转3DTiles。操作时选择“矢量数据转3DTiles”,设置高度字段(比如楼层数或海拔值),再设置坐标参考系统即可。
- FME:灵活度高,可以处理超大数据量,几百MB的SHP转出来的3DTiles瓦片数量和大小控制得更好。
- 自研或GDAL脚本:适合有开发能力的团队。思路是先用GDAL读取SHP几何和属性,再用Cesium的3D Tiles规范封装成b3dm。
做转换的时候最需要注意的是纹理和坐标:如果SHP自带高度字段但没有“高程基准”,转出来的3DTiles会和地形对不齐。我曾在做一个城市白模项目时,直接用SHP的默认高度拉伸,结果建筑底标高和地形起伏完全脱节,后来才意识到必须给每个要素设置一个基准高程,并从DEM里采集。记住:3DTiles的坐标原点、高度基准、几何细节层级,决定了你的模型在Web端是否“稳”。
2.4 WKT字符串转多边形SHP:数据库里的坐标怎么变成可用数据
WKT(Well-Known Text)是一串文本坐标,例如:
POLYGON((116.391 39.907, 116.394 39.909, 116.392 39.912, 116.391 39.907))在PostgreSQL和MySQL里,空间字段存的往往就是WKT。把它转成SHP,最直接的办法是用PostGIS输出GeoJSON再转SHP;如果没有数据库环境,也可以用Python的shapely加geopandas:
import geopandas as gpd from shapely.wkt import loads wkt = "POLYGON((116.391 39.907, 116.394 39.909, 116.392 39.912, 116.391 39.907))" geom = loads(wkt) gdf = gpd.GeoDataFrame(geometry=[geom], crs="EPSG:4326") gdf.to_file("polygon.shp", encoding="utf-8")这里有一个小坑:很多数据库导出的WKT带SRID前缀,或者坐标顺序是“纬度、经度”,一定要先确认坐标系和坐标顺序,再转出SHP,不然图形会跑到地球对面去。我自己因为这个栽过跟头,数据库里存的是WGS84的经纬度,结果转SHP时默认套了Web Mercator,最后所有图形都叠不到底图上。
3. 裁剪、分割、批量出图:中国区数据的三大高频操作
拿到一份全国SHP,大多是“杀鸡焉用牛刀”——你往往只需要某个省、某个市的边界。这时候就涉及裁剪、分割和批量处理。
3.1 按指定区域裁剪SHP:ArcGIS裁剪工具的隐藏细节
ArcGIS里“裁剪”(Clip)工具是按“裁剪要素”的几何范围切掉原始要素。很多人都知道用“分析工具→提取分析→裁剪”,但不知道几个细节:
- 裁剪时如果“裁剪要素”是面,输出要素会精确保留落在范围内的部分;如果“裁剪要素”是线或点,输出结果往往不是预期效果。
- 裁剪后属性表会自动保留原始字段,但也会新增几个字段(如裁剪要素的ID),让数据显得乱。建议裁剪后用“删除字段”清理。
- 如果裁剪对象本身是图斑(比如地质图里的多边形要素),裁剪工具产生的碎屑小图斑很常见,可以用“消除”(Eliminate)工具把面积过小的碎斑合并到邻近多边形。
我经常用这样的流程:全国省界SHP → 按“NAME=云南省”筛选出云南的边界 → 用这个边界裁剪全国要素类 → 得到云南省范围的数据。这套流程看似简单,但放在模型构建器里配合迭代,就能批量生成多个省份的数据包。热搜词里“arcgis裁剪shp指定区域”问的就是这个。
3.2 渔网分割SHP与批量裁剪影像:从整幅到瓦片
“渔网分割shp”这个需求,通常出现在要把一个大范围数据切碎成瓦片、分发给不同项目组的时候。ArcGIS的“创建渔网”(Create Fishnet)工具可以生成规则格网,然后用格网裁剪SHP。但渔网裁剪有个细节:渔网拐角和边界必须和SHP完全匹配,稍微有一点缝隙,裁剪出的边缘就会出现狭长碎面。解决方案是创建渔网时把“几何类型”设为“面”,并且“模板范围”选SHP的包络矩形,这样格网边缘就不会越过原始数据范围。
批量裁剪影像则常用“按掩膜提取”(Extract by Mask),配合渔网格网做循环。其实不用写代码也能做:ArcGIS的“批处理”窗口支持一次设定多个输入输出。操作思路是,在“按掩膜提取”工具上右键选择“批处理”,每一行对应一个渔网单元格和一个输出文件名,几十个瓦片几分钟就生成完。
3.3 中国区数据批量处理的通用思路:模型构建器和Python脚本二选一
中国的行政区域层级多、数据量大,经常要批量做各省、各市的裁剪。我的习惯是:能上Python就不用手工点。给一段通用代码示例:
import arcpy shp_path = "D:/data/省级行政区.shp" clip_features = "D:/data/地市边界.shp" out_dir = "D:/output" with arcpy.da.SearchCursor(clip_features, ["NAME"]) as cursor: for row in cursor: name = row[0] where = f"NAME = '{name}'" clip_fc = arcpy.Select_analysis(clip_features, f"{out_dir}/clip_{name}.shp", where) arcpy.Clip_analysis(shp_path, clip_fc, f"{out_dir}/{name}.shp")用代码的好处是可控性和可复现性都很强,哪一步出错可以直接看错误信息,不会像模型构建器那样跑完发现输出目录全是空结果。没有Python基础的读者,用模型构建器同样可以,核心就是把迭代器和输出路径处理好。
4. 国土报备场景下的SHP转TXT:字段映射与格式校验的实战细节
“shp转txt”和“shp转txt插件国土报备”这两个热搜词,一看就是土地报批、国土调查场景下的真实需求。SHP是空间矢量数据,国土报备系统大多要求的是固定格式的TXT文本,每个字段按特定顺序排列、以逗号或制表符分隔。这种转换的关键不是“怎么转”,而是“字段怎么对齐”。
4.1 为什么国土报备要转TXT,而不是直接用Excel或SHP
很多新手不理解:为什么系统不直接接收SHP?其实国土报备系统很多是上世纪90年代开始建设的,底层数据库和SHP的兼容性并不好,TXT反而是最通用的中间格式。TXT文件本质上就是一个纯文本数据表,行是记录,列是字段,几乎没有软件打不开。这个做法虽然土,但胜在稳定、传输体积小、不容易被解析器“嫌弃”。
国土报备的TXT通常要求这些字段按顺序输出:
- 图斑编号
- 行政区代码
- 地类编码
- 面积(单位通常为公顷)
- 坐标点串,格式多为“经度,纬度;经度,纬度”
注意,坐标点串在TXT里是一个长字符串,而不是多行坐标。这个格式如果手工在Excel里拼,几千个图斑能把人逼疯。我的做法是先用ArcGIS打开SHP属性表,按系统要求的字段顺序,把必要字段用“添加字段”和“字段计算器”补全,然后用“表转Excel”导出,再用Python脚本把坐标和属性合并成TXT。
4.2 用ArcGIS和Python完成SHP转TXT全流程
先说最关键的一步:计算每个图斑的坐标点串。ArcGIS里可以直接用Python在字段计算器里写:
def get_coords(feature): parts = [] for part in feature: for point in part: parts.append(f"{point.X:.6f},{point.Y:.6f}") return ";".join(parts)然后在面积字段、地类编码字段都准备好之后,把属性表导出成CSV,再用Python脚本做最后拼接:
import csv with open("result.txt", "w", encoding="gbk") as f: with open("data.csv", "r", encoding="gbk") as csvfile: reader = csv.DictReader(csvfile) for row in reader: content = f"{row['图斑编号']},{row['行政区代码']},{row['地类编码']},{row['面积']},{row['coords']}" f.write(content + "\n")这里最容易出问题的是编码。很多国土软件在Windows上跑,默认用GBK或GB2312编码,如果生成的是UTF-8的TXT,上传后所有中文都会变成乱码。所以SHP转TXT时,优先选择GBK编码,文件没有中文汉字段时才考虑UTF-8。
4.3 WKT字符串转多边形SHP在报备场景中的应用
报备数据里还经常遇到空间数据库导出的WKT字符串。比如有人发来一个Excel表格,里面有一列是“几何信息”,存的是一整段POLYGON((...))。这其实就是WKT字符串。转成SHP时,我建议直接用QGIS或GeoPandas来做,步骤在上面已经写过。特别提醒:在处理报备WKT时,要注意面积单位是平方米还是公顷,以及坐标是经纬度还是投影坐标。坐标系统的差异会在后面“坐标系三座大山”部分详细说。
5. 软件实操避坑:SHP文件位置、导出顺序、坐标系三座大山
最后这部分,专门讲搜索热词里那几个看似基础但经常把人卡住的问题:ArcGIS Pro的SHP文件在哪、QGIS导出SHP最简单的方法、以及坐标系问题。
5.1 ArcGIS Pro / GIS Pro的SHP文件到底放在哪
很多人问“gis pro的shp文件在哪里”,这其实是个数据管理习惯问题。ArcGIS Pro默认会在“工程文件夹”里存放工程文件(.aprx),但这个文件夹并不会自动包含你下载的SHP。SHP文件的位置取决于你把它放在哪里。SHP是一组磁盘文件,不会自动存进Pro工程文件。
正确的做法是:在ArcGIS Pro的“目录”面板中,右键“数据库”或“文件夹”节点,选择“添加文件夹连接”,把SHP所在的本地目录连接上。然后才能在目录面板里看到SHP文件并拖入地图。还有一种办法是使用“添加数据”按钮,直接浏览到SHP文件路径。如果找不到刚才打开的SHP存到哪里,可以在图层的属性里查看“数据源”,里面有完整的物理路径。
5.2 QGIS导出SHP最简单的方法
QGIS导出SHP,只要三步:图层列表右键 → 导出 → 保存要素为,格式选“ESRI Shapefile”。真正让我无数次翻车的是弹窗里的“编码”选项。如果源数据是中文属性,导出时编码选UTF-8,然后在部分老软件里打开还会乱码。一个稳妥的组合是:
- 源数据是中文 → 导出编码选
UTF-8,在QGIS里打开正常 - 源数据要交给ArcGIS或国土报备软件 → 导出编码选
GBK或System,避免中文乱码
还有一个细节:导出的SHP文件名不要用中文和数字开头。虽然QGIS允许中文文件名,但Shapefile格式的一些底层组件(比如.dbf的字段名限制)对非英文路径支持并不好,导出后放在有中文路径的目录下,再用ArcGIS读取时很容易报错。我建议所有SHP文件和路径都统一用英文。
5.3 坐标系:为什么你的SHP叠不上影像
坐标系是中国矢量地图使用中最容易踩的坑,没有之一。
- CGCS2000:中国官方测绘采用的国家大地坐标系,很多基础地理数据都默认CGCS2000。
- WGS84:GPS和Web地图常用,和CGCS2000在多数应用场景下差异只有几厘米到几十厘米,肉眼几乎看不出,但精度要求高的项目必须区分。
- Web Mercator(EPSG:3857):Google Map、天地图Web端常用,带距离和面积误差,不适合直接做面积计算。
很多人在ArcGIS里打开全国SHP后发现它跑到地图外边去了,或者叠不上影像,多半是坐标系不对。有一个非常典型的操作:把SHP直接拖到ArcGIS Pro里,因为Pro支持同图层动态投影,如果图层本身没有.prj文件,Pro就会默认用WGS84处理几何坐标。可如果你的SHP实际是CGCS2000投影坐标,几何数值是米制,不定义坐标系直接打开,图层就会以一个“假WGS84”形式显示在赤道附近,怎么都对不上位置。
解决办法是:先用“定义投影”工具给SHP指定真正的坐标系。如果你确定数据是CGCS2000 3度分带(比如CGCS2000 / 3-degree Gauss-Kruger zone 40,EPSG:4549),就选对应坐标系。注意,定义投影不会改变几何数值,改的是“解释方式”;真正改变坐标数值要用“投影”工具。这两者的区别是新手最容易混淆的地方。
另外,GIS里用的“中国矢量地图”很多都带独立的.prj文件,有时候打开时没显示坐标系错误,但缩放到某一级别后SHP明显偏移。这时要检查是不是因为ArcGIS Pro默认的底图是Web Mercator,而SHP是WGS84投影,动态投影后导致微小的偏移。动态投影下,WGS84和Web Mercator的偏差在高纬度区域会更明显,所以处理中国数据时,我习惯先把底图换成和SHP相同的坐标系,再做其他分析。
最后分享一点个人习惯与数据管理建议
做GIS数据这么多年,我的个人体会是:SHP文件管理的关键不是软件操作,而是“数据规范”。每一份中国矢量地图SHP,我都会在旁边的同名文件夹里放一个README.txt,写清楚数据来源、坐标系、比例尺、下载时间、字段说明。看起来很土,但半年之后再翻出来用,能省下不少重新琢磨的时间。
另外一个小技巧:手上常备一个万能坐标系转换工具箱。QGIS和ArcGIS Pro都能做投影,但遇到批量、跨软件的数据迁移,我会用ogr2ogr命令行工具:
ogr2ogr -t_srs EPSG:4490 -s_srs EPSG:4326 output.shp input.shp它支持一次性批量转换整个目录下的SHP,再配合Shell或Python循环,基本能应对99%的坐标系转换需求。最后建议,所有SHP数据导出后,把.dbf、.prj、.shx三个配套文件一起打包备份,少一个,后续使用都会多一份折腾。
本文还有配套的精品资源,点击获取