简介:面向GIS分析、城市规划与地理教学的矢量数据集,内含我国34个省级行政区(含直辖市、特别行政区)省会驻地点要素,基于最新行政区划与地理坐标制作,每个点位对应省会城市的几何中心,可直接用于地图标注、空间分布分析与区域对比研究。资源共28个文件,除核心shp几何文件外,配套dbf属性表、shx索引、prj投影定义以及sbn/sbx空间索引等ArcGIS/QGIS常用辅助文件,压缩包总大小15.96MB,结构清晰便于导入主流GIS平台。数据内含中国各省轮廓与省会城市两个图层,可叠加显示省市位置关系。该数据集已有1812人学习下载,兼具实用性与参考性。尤其适合制图人员快速绘制全国省会城市分布图,也可为交通路网规划、社会经济数据挂接、环境因素空间分析等场景提供基础底图数据,帮助研究者减少坐标配准与属性整理时间。
1. 点要素SHP文件:为什么34个驻地点比行政边界更常用
平时做全国图,面图层SHP只用来显示边界,真正决定标注位置和查询效率的,常常是一个点文件。这个名为“34个省市直辖市省会驻地点要素 shp文件(最新版).rar”的压缩包,装的就是全国34个省级行政中心的驻地点要素:没有面边界,没有道路,只有点坐标和对应的属性字段。做城市名称标注、做省级行政区定点位、做“某省会在哪”这种查询,用这样一份点文件比拿省级面图层去算质心省事得多。
标题里的“省市直辖市省会”排得有点绕,实际数据一般就是34个省级行政中心的点坐标,有些版本还会附上加粗的注记字段。数据量很小,但它在日常GIS项目里出现的频率极高。下面从文件组成、RAR解压、坐标核查、批量转KML到最后的空间验证,把这条线完整走一遍。新手能对照操作,老手能确认边界条件。
2. 点要素SHP结构:先弄清文件组成和坐标系再动手
2.1 一个完整SHP由哪些文件构成
打开RAR后如果只看到“xx.shp”,不要急着认为这就是全部。ESRI Shapefile从诞生起就不是单文件格式,而是同一主名下一组配套文件共同构成。缺少任何一个关键文件,QGIS或ArcGIS都会报错或显示不出要素。
| 文件后缀 | 作用 | 缺失后果 |
|---|---|---|
| .shp | 几何坐标本体 | 无法识别图层 |
| .shx | 几何索引,建立坐标与属性对应关系 | 读取异常,无法定位要素 |
| .dbf | 属性表,Record同一条要素的名称等字段 | 属性为空或打不开表 |
| .prj | 投影和坐标系定义 | 打开后坐标系未定义 |
| .cpg | 标识dbf的字符编码 | 中文属性出现乱码 |
很多人在微信或网盘里只传了一个.shp文件,接收方打不开,以为数据坏了,其实就是缺少配套文件。所以拿到RAR时,第一步是看解压后是否同时存在.shp、.shx、.dbf,最好还有.prj和.cpg。
提示:把SHP文件从A机器拷到B机器时,不要只拷.shp,要把同主名的一套文件都拷走。用RAR整体打包分发,是目前最不容易丢文件的方式。
2.2 属性表字段与“驻点”的真实含义
“驻点”不是行政区划上随便选的城市质心,它代表省级行政中心的实际位置。不同来源的属性字段并不统一,常见字段如下:
| 字段名 | 类型 | 内容说明 |
|---|---|---|
| NAME | String | 城市名,例如“北京市” |
| PYNAME | String | 拼音缩写或全拼 |
| ADCODE | Integer | 行政区划代码 |
| LONGITUDE | Double | 经度,十进制度 |
| LATITUDE | Double | 纬度,十进制度 |
| REMARK | String | 备注或更新时间说明 |
拿到数据先打开.dbf看字段,而不是先画图。我的习惯是直接用表格工具打开dbf检查一遍:是否有重复记录、是否有空值、字段名里是否混入了特殊字符。曾经见过某份“34点”数据里混了36条记录,多出来的是两个重复坐标,说明原始来源做过追加操作没有去重。这类问题在几何上看不出,属性表里一眼就能发现。
2.3 解压之前用ogrinfo确认数据范围
在打开桌面GIS之前,先用命令行工具读出图层概要,能避开很多后期问题。GDAL安装后自带ogrinfo,QGIS安装目录里的OSGeo4W Shell也能直接调用。
ogrinfo -ro -so 34驻地点.shp 34驻地点参数解释:-ro表示只读打开,避免误写源数据;-so表示仅输出概要信息,不逐条列出要素;最后的“34驻地点”是图层名,通常等于文件名主名。执行后能看到Geometry类型、Feature Count和Extent范围。
如果输出显示“Feature Count: 34”,说明记录数与预期一致。Extent里的经纬度大致在73到135度、3到54度之间,说明这是地理坐标系数据。如果Extent出现4000多、5000多这样的数值,则是投影坐标,你需要确认它到底是哪个投影带,再决定是否和底图匹配。如果提示“Layer SRS WKT”为空,说明缺少.prj,数据源的坐标参考已丢失。
2.4 用Python直读dbf而不打开桌面GIS
没有安装QGIS的环境下,用Python第三方库fiona也能快速读字段。这个方法也适合在服务端做数据自动巡检。
import fiona with fiona.open('34驻地点.shp', encoding='utf-8') as src: print(src.schema) print(src.crs) print(len(src))代码逻辑:src.schema输出属性字段列表,src.crs输出坐标系描述,len(src)统计要素数量。参数encoding='utf-8'决定dbf里的中文字段如何解码,如果输出乱麻,可改成gb18030再试一次。通过这种方式可以确认三件事:记录数都是34、字段里是否有NaN、坐标系是否匹配周边底图。只要三点都通过,后面的分析才有意义。
3. 从RAR到QGIS:解压、编码和打开的一条龙流程
3.1 解压前用unrar测试压缩包完整性
“.rar”是专有格式。拿到“34个省市直辖市省会驻地点要素 shp文件(最新版).rar”这样的大文件,我建议先测试完整性,再正式解压,不要在解压一半时才发现损坏。
unrar t 34驻地点要素最新版.rart是test的意思,只检查卷内每个文件的CRC,不写入磁盘。测试结束看到“All OK”再解压。如果提示某个分卷CRC错误,直接解压出来的SHP可能在几何上出现破洞,点坐标也可能异常偏移,这种文件后续怎么修都别扭。压缩包若被拆成r00、r01,需要把全部分卷放进同一目录,对第一个分卷执行测试。
关于热词里常见的“rar密码移除”,正规数据的密码都是作者主动散播的,输入作者提供的密码即可,不要在逻辑上尝试“破解”。如果拿到的压缩包带密码,正确路径是找数据分发方索取,这类点要素数据本身不是稀缺内容,没必要冒风险运行来路不明工具。
3.2 用unrar x保留目录结构解压
unrar x 34驻地点要素最新版.rar ./2025_capital_points/参数x表示解压时保留压缩包内的目录结构,e参数则是把所有文件平铺到当前目录。对SHP这种多文件配套格式,建议用x,避免把.shp和.dbf展开到不同位置。目标目录里最好不带中文,比如./2025_capital_points,这样后续脚本处理时少一层编码转换问题。
解压完成后先核对文件,同名.shp、.shx、.dbf必须放在同目录。还要留意压缩包内是否还有投影定义文件.prj,以及命名为“说明.txt”之类的元数据说明,很多“最新版”的更新时间、坐标基准就写在这些附加文档里,不要删掉。
3.3 QGIS加载SHP并解决中文乱码
QGIS打开SHP的步骤不复杂,但编码选择决定属性表是否可读。
- 菜单“图层 -> 添加图层 -> 添加矢量图层”
- 数据源类型选择“文件”,浏览选中刚才解压出的.shp
- 编码下拉框先选UTF-8,点击“添加”
- 打开属性表,若中文显示为乱码,移除图层后重新添加,把编码改为GB18030或System
参数说明:dbf字符编码与.cpg文件有关。有的数据在Windows环境下用GBK写入,.cpg缺失时QGIS默认按UTF-8解析,导致“北京市”变成“鍖椾含甯”。加载后看左下角坐标显示:如果鼠标移动时坐标在116度、39度附近,说明数据是Web地图常见的WGS84或GCJ02;如果坐标是七位八位的大数值,那是投影坐标,后续叠加底图时必须转换。
3.4 打开后必做的图层信息复核
加载成功后,在图层上右键选择“属性 -> 信息”,确认Geometry类型写的是Point,Feature Count等于34。这里不要只看地图上的符号数量,因为点重叠时视觉上可能少一个。同时检查图层范围Extent:全国驻点经度应覆盖东经73度到135度,纬度覆盖北纬3度到54度。如果范围只有几个市那么大,说明这个SHP根本不是全国数据,可能是源文件被抽取过或者坐标缺失。
如果QGIS弹出“未定义坐标系”对话框,且Extent显示经纬度范围,通常选EPSG:4326即可。若点位置直接跑到海里,多半是原始数据用的坐标系不是底部数据用的坐标系,需要回看压缩包里的说明文件。
4. 点数据与边界叠加:Excel坐标导入和坐标统一
4.1 怎么把Excel经纬度数据导入到ArcMap中
用户经常拿着一个Excel表格,里面是省会城市的经纬度,希望转成点图层。ArcMap的“添加XY数据”功能能完成这件事,但细节决定成败。
| 步骤 | 操作 | 关键参数 |
|---|---|---|
| 1 | 整理Excel,A列写经度,B列写纬度 | 字段名用英文字母,例如X、Y |
| 2 | 另存为CSV | 编码选UTF-8或GBK,保持一致 |
| 3 | 在ArcMap中执行“文件 -> 添加数据 -> 添加XY数据” | X Field选经度列,Y Field选纬度列 |
| 4 | 点击“编辑”按钮设置坐标系 | 与底图一致选WGS84或CGCS2000 |
| 5 | 导出为SHP | 右键临时事件图层,选择“数据 -> 导出要素” |
最容易犯的错是把经度填到Y字段,纬度填到X字段,结果所有点沿着一条对角线排布,看起来完全不是地图上的位置。如果导入后点跑到非洲或大西洋,先检查X对应经度、Y对应纬度,再检查度分秒格式:ArcMap的XY数据只认十进制度,“116°30′”这种格式必须提前换算成116.5。
4.2 用QGIS空间连接排除面外的“飞点”
当34个点与省级边界底图叠加后,某个点漂到相邻省份内,常见原因是“点图层坐标系”和“面图层坐标系”不一致,比如点用GCJ02、边界用WGS84的底图。不要手工拖动点,标准做法是做一次空间连接。
QGIS菜单“处理 -> 工具盒”,搜索“连接属性按位置”,参数设置如下:目标图层选点数据,连接图层选省级边界面,几何谓词选intersects,最后生成结果图层。这样每个点都会带上所在省份名称字段,凡是“所属省”和实际城市不一致的,就是投影或坐标基准错位。
这种检查在边界接壤频繁的城市最有效,例如京津冀一带,坐标偏移几百米就可能从北京落到河北廊坊。空间连接的结果里若出现多个点落在同一省份,代表数据里有重复点或错点,应回到源表逐条核对。
4.3 用Fiona把点要素统一到同一坐标系
数据混用最直接的解法是重投影。GDAL自带的ogr2ogr处理简单情况很顺手,但如果你想在写入前清洗字段、或者想保留原属性并做转换中断处理,我用Python的fiona和pyproj更可控。
import fiona from pyproj import Transformer with fiona.open('raw_points.shp', 'r', encoding='utf-8') as src: transformer = Transformer.from_crs(src.crs, 'EPSG:4326', always_xy=True) schema = src.schema.copy() schema['geometry'] = 'Point' with fiona.open('points_wgs84.shp', 'w', driver='ESRI Shapefile', schema=schema, crs='EPSG:4326', encoding='utf-8') as dst: for feat in src: x, y = feat['geometry']['coordinates'] feat['geometry']['coordinates'] = transformer.transform(x, y) dst.write(feat)代码逻辑是用Transformer.from_crs建立从源坐标系到目标坐标系EPSG:4326的转换器,参数always_xy=True表示输入输出的坐标永远按经度在前、纬度在后的顺序处理。逐要素读取原始坐标,转换后写进新文件。这样得到的points_wgs84.shp具备明确投影定义,和任何WGS84底图叠加都不会出现漂移。如果目标坐标系想用国测局坐标系,把EPSG:4326换成GCJ02对应参数即可,但要注意GCJ02没有正式官方EPSG编号,依赖第三方实现。
5. SHP批量合并和转KML:让点要素出活
5.1 把多个点SHP合并成一份数据
实际项目中,你手上可能除了34个驻地点,还有下属地级市的点位。把这些分散的点SHP合并成一个文件,是常见需求。
QGIS菜单“处理 -> 工具盒”,找到“合并矢量图层”。参数指定多个输入SHP,字段兼容项勾选“将字段名视为名称”,输出的图层是所有输入的集合。合并前先统一点坐标字段:如果A文件的字段叫LON,B文件叫LONGITUDE,合并结果里两个字段会同时存在,其中一个全为NULL。因此先对每个文件执行“修改字段名”,统一成LON和LAT再合并。
合并后的图层要素数量为各输入总和。若合并后只有34条而输入总和远高于此,多半是中间选了“仅保留第一个图层的字段”而把后续字段全丢了。
5.2 SHP批量转KML的三个必调参数
KML是外业采集和Google Earth浏览的常用格式,但很多人图省事直接右键“导出”,结果在Google Earth里点全飞了。原因是KML标准强制要求WGS84坐标,而源数据是GCJ02或国家2000。
| 参数 | 推荐值 | 原因 |
|---|---|---|
| CRS | EPSG:4326 | KML只合法支持WGS84 |
| 格式 | KML或KMZ | KMZ为压缩包,传输更小 |
| 字段 | 勾选NAME字段 | 点标注显示城市名,便于外业 |
操作路径:右键图层 -> 导出 -> 保存要素为,格式选“Keyhole Markup Language [KML]”,CRS选EPSG:4326。如果数据是GCJ02,需要先用第4.3小节的重投影代码转一遍,再导出KML。批量处理多个SHP时,可以在“处理 -> 批处理”里加载全部文件,一次性输出KML。这样导出的文件可以直接拖进Google Earth、手机地图软件或无人机地面站检查。
5.3 用Leaflet把点坐标发布成Web地图
有时候需要在网页上临时展示34个驻点,不搭GIS服务端。把SHP导出成CSV,再整理成JavaScript数组,用Leaflet渲染是轻量方案。
const cities = [ { name: '北京', lon: 116.40, lat: 39.90 }, { name: '上海', lon: 121.47, lat: 31.23 }, { name: '广州', lon: 113.26, lat: 23.13 } ]; cities.forEach(c => { L.marker([c.lat, c.lon]) .addTo(map) .bindPopup(c.name); });注意L.marker接收的是纬度在前、经度在后,而SHP里记录的坐标通常经度在前。直接复制CSV里的经纬度行列式,标记就会跑到海里或变成一条斜线。参数说明:bindPopup绑定属性字段对应的名称,用于鼠标点击显示文字;map是前面L.map('mapId')创建的底图变量。这里只是把导出后的坐标做展示,底图切片务必也用WGS84服务,否则点和底图偏移。
6. 用空间运算验证34个点要素的合法性
6.1 GeoPandas校验点是否在省级边界内
用GeoPandas读点SHP和边界SHP,做一次空间连接,是校验这份“最新版”数据最直接的手段。
import geopandas as gpd points = gpd.read_file('34驻地点.shp') province = gpd.read_file('全国省级行政区.shp') province = province.to_crs(points.crs) result = gpd.sjoin(points, province, how='left', predicate='within') print(len(points), result['province'].isna().sum())代码逻辑是先把边界数据投影到点数据所在坐标系,再用sjoin做空间连接,参数how='left'保证点全保留,predicate='within'要求点必须落在面内。输出第一项是点总数,第二项是落在所有省份面外部的点数。正常结果是“34, 0”。只要第二项大于0,就要逐条检查问题点。特别行政区、部分岛礁型地级市的边界在公开数据里经常被简化,可能出现合法点落在面外的情况。这属于数据边界精度问题,不是坐标系问题,直接修改点位置不如换一套精度更高的边界数据。
6.2 经纬度范围和重复点位检查
最后一个检查项是数值层面的:经度区间应在73至135度,纬度区间应在3至54度。出现0、999、-1这类异常值,基本可判定该记录是从Excel空行或错误行读出来的。还有一种情况是DBF表里有多行坐标相同但城市名不同,这常见于不同来源数据合并时未去重。把坐标完全一致的点筛选出来,通过属性表比对ADCODE字段最可靠,直接保留最新更新时间的那条记录。
对“最新版”三个字保持怀疑是数据工作者的基本素养:所有空间数据都要自己验证一遍,不要因为压缩包标题写着最新就跳过这一步。把过滤出的要素单独导出新SHP,再对比ADCODE字段与边界属性表,就能精确定位到具体是哪个城市点位需要反过来和最初的数据分发方补齐。
本文还有配套的精品资源,点击获取