
简介这份全国矢量地图SHP格式数据集面向GIS从业者、城市规划人员、环境与交通研究者以及地理信息相关专业师生用于解决全国范围空间数据获取与底图搭建的问题。压缩包共85个文件以shp、shx、dbf三类文件为主分别承载几何图形、空间索引与属性数据另含1个xml元数据文件整体约34.27MB覆盖行政区划、道路网络、水系、居民地等常见地理要素可直接在ArcGIS、QGIS等软件中加载。已有545人学习下载说明其在空间分析与制图场景中具备一定参考价值。读者可借助这批数据完成投影转换、缓冲区分析、空间叠加与专题制图等操作也可通过GDAL/OGR或ArcPy进行批量处理为城市规划、环境评估与交通管理提供基础数据支撑。1. 全国矢量地图 shp 格式资源从拿到压缩包到跑出第一张可用底图做 GIS 项目的人大概都有过这种经历底图数据临时缺一份甲方催着要出图翻遍硬盘只找到一堆零散的省界、市界、县界文件坐标系还各不相同。这次拆的这份「全国矢量地图 shp 格式.rar」就是冲着这个场景来的——它把全国范围的矢量边界按 shp 格式打包解压后能直接拖进 ArcGIS、QGIS 或者用 GeoPandas 读适合做全国尺度的底图、行政区划裁剪、空间范围筛选这类活儿。shp 作为最老牌的矢量格式兼容性几乎无敌但它的坑也集中在「一套文件缺一不可」和「属性表编码」上。这篇笔记按「解压 → 读入 → 坐标处理 → 裁剪导出 → 避坑」的顺序走一遍新手能照着复现熟手可以重点看坐标系和字段编码那两节。2. 解压与文件结构shp 从来不是单个文件2.1 为什么一个 shp 会拖家带口很多人第一次拿到 shp 数据会懵明明叫「shp 文件」解压出来却是一堆同名不同后缀的东西。这不是打包的人乱来而是 ESRI Shapefile 这个格式的设计——它本质是一个文件夹级别的数据集主文件只存几何属性、索引、投影信息全部分散在兄弟文件里。少一个软件要么报错要么读出来是空属性。一份完整的 shp 数据集通常包含这些成员后缀作用缺失后果.shp几何坐标主体完全打不开.shx几何索引部分软件报错或读取缓慢.dbf属性表能显示图形但无字段.prj坐标系定义坐标数值在但无法定位.cpg属性表编码中文乱码高发区.sbn/.sbx空间索引一般可缺影响查询速度所以解压后如果发现某个图层只有 .shp 没有 .dbf别急着用先确认压缩包是不是被选择性解压了。2.2 解压工具与中文路径的坑rar 格式在 Windows 上习惯用 WinRAR但不少单位电脑没装7zip 其实也能解 rar需要装对应解码库新版 7zip 已内置。命令行下我一般这么干# 用 7z 解压到指定目录-o 后面不要留空格 7z x 全国矢量地图shp格式.rar -o./shp_data -y # 解压后先看目录结构确认每个图层文件是否齐全 find ./shp_data -name *.shp | head -20这里-o指定输出目录-y表示全部确认不弹窗。解压完先别急着开 ArcGIS用find列一下有多少个 .shp再抽查几个图层目录里 .dbf、.prj 是否成对出现。提示解压路径里尽量别带中文和空格。shp 本身对路径不敏感但 ArcGIS 的部分工具链在中文路径下会出玄学错误我吃过亏后来统一放英文目录。如果压缩包带了密码又忘了网上那些「强制解压」「密码移除」的工具多数是套壳或者带广告真拿不到密码就找数据提供方要别在这上面浪费时间。3. 用 GeoPandas 读入并检查坐标系3.1 读进来第一件事是看 crsshp 能不能用八成取决于坐标系对不对。国内数据常见的有 WGS84EPSG:4326、CGCS2000EPSG:4490以及各种高斯克吕格投影带。用 GeoPandas 读入后第一行就该打印 crsimport geopandas as gpd # 读入全国图层注意路径指向 .shp 主文件即可 gdf gpd.read_file(./shp_data/national_boundary.shp) # 看几何类型、要素数量、坐标系 print(gdf.geom_type.unique()) # 期望是 Polygon 或 MultiPolygon print(len(gdf)) # 要素条数 print(gdf.crs) # 关键坐标系是什么 # 看属性表字段和编码情况 print(gdf.columns.tolist()) print(gdf.head(3))gdf.crs如果返回None说明 .prj 缺失或没被识别这时候坐标数值还在但软件不知道它是经纬度还是投影米必须手动补。geom_type用来确认是面还是线全国边界一般是 MultiPolygon如果混了 Point 说明数据被污染过。3.2 坐标系不一致时的统一策略如果这份数据里不同图层 crs 不一样比如省界是 4326市界是投影坐标直接叠加会错位到离谱。统一做法是先全部转到同一个目标坐标系再操作# 统一转到 WGS84 经纬度方便后续和在线底图对齐 target_crs EPSG:4326 # 单个图层转换 gdf_wgs gdf.to_crs(target_crs) # 批量转换目录下所有 shp import glob, os for path in glob.glob(./shp_data/*.shp): g gpd.read_file(path) if g.crs is None: print(f跳过无坐标系: {path}) continue g.to_crs(target_crs).to_file( f./shp_wgs/{os.path.basename(path)}, encodingUTF-8 )to_crs做的是真正的坐标重投影不是简单改标签所以前提是原 crs 正确。如果原 crs 是错的转出来只会错得更整齐。批量导出时encodingUTF-8很关键它决定 .dbf 里中文能不能正常显示不写的话默认可能是 latin1中文直接变问号。注意如果某个图层 crs 为 None 但你确定它是经纬度可以先用g.set_crs(EPSG:4326, inplaceTrue)补上再转别直接 to_crs否则报错。4. 裁剪、筛选与导出把全国数据切成你要的范围4.1 按属性筛选目标区域全国数据动辄几千个要素直接全量渲染很卡。常见需求是只留某个省或某几个市用属性字段过滤最快# 假设属性表里有 name 字段存行政区名称 subset gdf[gdf[name].str.contains(四川, naFalse)] # 多条件筛选比如只要四川和重庆 subset gdf[gdf[name].isin([四川省, 重庆市])] # 导出为新的 shp注意中文编码 subset.to_file(./output/sichuan_chongqing.shp, encodingUTF-8)str.contains里的naFalse是防止空值报错这个细节很多人漏掉一跑就崩。isin适合精确匹配字段值必须和属性表里完全一致多个空格都会导致匹配失败建议先gdf[name].unique()看一眼真实值。4.2 用边界框或掩膜做空间裁剪如果手上有一个研究区的范围比如某个流域、某个县域边界可以用它去裁全国数据# 读取研究区边界 study_area gpd.read_file(./study_area.shp).to_crs(gdf.crs) # 用 clip 做空间裁剪只保留落在研究区内的部分 clipped gpd.clip(gdf, study_area) # 导出 clipped.to_file(./output/clipped.shp, encodingUTF-8)gpd.clip要求两个图层 crs 一致所以先to_crs对齐。裁剪结果会保留原属性表几何被切成研究区内的部分。如果研究区是多个不相连的面clip 也能处理但速度会慢一些要素多的时候建议先做空间索引。4.3 导出为其他格式的衔接shp 有 2GB 大小限制和字段名 10 字符限制数据量大或者字段名长的时候导出成 GeoJSON、GPKG 更稳# 导出 GeoPackage单文件、无字段名长度限制 clipped.to_file(./output/clipped.gpkg, driverGPKG) # 导出 GeoJSON方便前端或 Web 地图用 clipped.to_file(./output/clipped.geojson, driverGeoJSON)GPKG 是我现在做中间数据首选单文件好管理字段名随便起。GeoJSON 适合往 Web 端传但体积会膨胀全国数据不建议直接转。5. 避坑与排查shp 数据最常见的五个翻车点5.1 中文属性乱码现象打开属性表中文全是「锟斤拷」或者问号。原因.dbf 的编码和软件读取时假设的编码不一致老数据常见 GBK新数据多是 UTF-8但 .cpg 文件可能缺失或写错。解决先看有没有 .cpg没有就手动建一个内容写UTF-8或GBK用 GeoPandas 读的时候可以指定encoding参数试gdf gpd.read_file(data.shp, encodingGBK)5.2 坐标系缺失导致叠加错位现象两个图层叠在一起一个在非洲一个在中国。原因其中一个 crs 为 None软件按默认值处理。解决print(gdf.crs)逐个确认缺的用set_crs补错的用to_crs转。别靠肉眼猜投影坐标和经纬度数值差几个数量级一眼能看出来。5.3 几何无效导致裁剪失败现象clip或intersection报拓扑错误。原因面要素自相交、有重复点、环没闭合。解决跑一遍修复from shapely.validation import make_valid gdf[geometry] gdf[geometry].apply(make_valid)修复后再做空间运算成功率大幅提升。5.4 字段名截断现象导出后字段名从province_name变成province_n。原因shp 格式限制字段名最多 10 个字符。解决要么接受截断要么导出成 GPKG/GeoJSON这两个没这个限制。5.5 大文件读取内存爆掉现象读全国精细数据时内存直接拉满。原因一次性全量读入几何精度又高。解决用bbox参数只读感兴趣范围或者用pyogrio引擎分块读gdf gpd.read_file(national.shp, bbox(100, 25, 110, 35))bbox是 (minx, miny, maxx, maxy)只读这个框内的要素内存占用能降一个量级。6. 进阶技巧把 shp 转成 3dtiles 和 WKT 的实用路径数据用顺了之后总会遇到往外输出的需求。热词里 shp 转 3dtiles、shp 转 wkt、shp 转 txt 都是高频操作这里说两条我实际走通的路径。先说 shp 转 3dtiles。3dtiles 是 Cesium 那套三维场景的格式shp 是二维面直接转需要先有高度字段或者拉伸规则。常见做法是先把 shp 转成 GeoJSON再用工具链切片# 用 ogr2ogr 把 shp 转 GeoJSON指定坐标系和编码 ogr2ogr -f GeoJSON output.geojson input.shp -t_srs EPSG:4326 -lco ENCODINGUTF-8拿到 GeoJSON 后用三维切片工具比如基于 Node 的 3dtiles 生成器按高度字段拉伸成白模。注意 shp 里的高度字段如果是字符串先转数值否则拉伸出来全是 0。坐标系必须是 4326 或 3857其他投影带切片会偏。再说 shp 转 WKT。WKT 就是几何的文本表达做数据交换或者入库时常用# 把几何列转成 WKT 字符串存到新字段 gdf[wkt] gdf[geometry].apply(lambda geom: geom.wkt) # 只要 WKT 文本导出成 txt with open(./output/geoms.txt, w, encodingUTF-8) as f: for wkt in gdf[wkt]: f.write(wkt \n)geom.wkt输出的是标准 WKT精度默认够用。如果要去数据库里做空间查询记得带上 SRID比如SRID4326;POINT(...)不然入库后坐标系丢失。还有一个容易被忽略的点shp 转 txt 如果只是要坐标点别用 WKT直接拆坐标更省事# 提取每个面的所有坐标点写成 x,y 两列 coords [] for geom in gdf[geometry]: for x, y in geom.exterior.coords: coords.append((x, y)) import pandas as pd pd.DataFrame(coords, columns[x, y]).to_csv(./output/points.csv, indexFalse)这段只取外环如果面有内环洞需要额外处理geom.interiors。我一般会先判断geom.geom_typeMultiPolygon 还要再遍历一层不然会漏。从那以后我每次拿到新的 shp 数据都强制走一遍「查 crs → 查编码 → 查几何有效性」这三步再开始做任何分析。这三步花不了两分钟但能省掉后面几小时的排查。希望帮到你。本文还有配套的精品资源点击获取