简介:这份资源面向从事区域空间分析、城市规划、资源管理与社会经济研究的GIS从业者及高校师生,汇集2024年湖北省10类地理与人文矢量数据,覆盖省、市、县区、乡镇街道四级行政区划,以及水系面线、131所高校、1241个景点、各级道路、全国高程TIF与土壤类型空间分布,统一采用WGS 1984投影,可直接加载至ArcGIS、QGIS等平台使用。压缩包共53个文件,以shp、shx、dbf、prj等标准Shapefile组件为主,辅以cpg编码文件、sbn与sbx空间索引、tif高程栅格及xlsx土壤分类表,整体约104.47MB,结构清晰、属性完备。目前已有110人学习下载。读者可据此完成分级统计制图、水文与流域分析、高校服务半径测算、旅游资源规划、交通可达性建模及农业适宜性评估等任务,省去多源数据搜集与坐标转换的重复工作,适合作为区域研究与课程实验的基础底图数据。
1. 湖北省地理人文数据合集:10 类 shp 文件到底能解决什么问题
如果你正在做湖北省的国土空间分析、选址评估、高校课题或者三维可视化,大概率绕不开一个现实问题:底图数据东拼西凑,坐标系不统一,属性表字段乱七八糟。这套「2024年湖北省10类地理+人文 shp 文件」的价值,就在于把省、市、县区、乡镇街道四级行政边界,连同水系、大学、景点、道路、高程、土壤类型这六类专题数据,统一整理成一套可直接加载的矢量文件。它解决的不是「有没有数据」,而是「数据能不能直接叠在一起用」。适合做区域研究的研究生、做规划咨询的工程师,以及需要快速搭建湖北底图的三维建模从业者。高程和土壤类型这两类,往往是大家搜得最多、也最容易踩坑的部分,后面会重点拆。
2. 拿到 shp 文件先别急着打开:坐标系与字段结构的核对方法
2.1 为什么坐标系不统一是第一个翻车点
shp 文件本身不携带坐标系信息,它依赖同目录下的 .prj 文件来定义空间参考。很多人在网上搜到的「湖北省行政区划 shp」,打开后发现和底图偏移几百米,甚至飞到国外,根本原因就是 .prj 缺失或者被错误定义。湖北省常用的坐标系有两套:一套是地理坐标系 GCS_WGS_1984(EPSG:4326),单位是度;另一套是投影坐标系 CGCS2000_3_Degree_GK_CM_114E(EPSG:4547 附近),单位是米。做面积统计、距离量算必须用投影坐标系,做网页地图叠加通常用地理坐标系。
拿到文件后,第一件事不是拖进 ArcGIS,而是先看目录里有没有 .prj。如果没有,不要猜,直接问数据来源或者用已知控制点反推。我一般会先用 QGIS 打开,右键图层属性看「源」里的 CRS 描述,再用「测量工具」量一段已知长度的道路,比如武汉长江大桥约 1670 米,量出来差太多就说明坐标系不对。
2.2 用 Python 批量检查 shp 的坐标系和字段
手工一个个看太慢,尤其是乡镇街道这种几十个文件的。下面这段代码用 geopandas 批量读取目录下所有 shp,输出坐标系、要素数量和字段名,方便你快速判断哪几个文件需要转换。
import geopandas as gpd import os # 指向你的 shp 文件夹 data_dir = r"D:\hubei_shp_2024" for root, dirs, files in os.walk(data_dir): for f in files: if f.endswith(".shp"): path = os.path.join(root, f) try: gdf = gpd.read_file(path) # 打印文件名、坐标系、要素数、字段列表 print(f"文件: {f}") print(f" CRS: {gdf.crs}") print(f" 要素数: {len(gdf)}") print(f" 字段: {list(gdf.columns)}") print("-" * 40) except Exception as e: print(f"读取失败 {f}: {e}")逻辑说明:os.walk 递归遍历所有子目录,因为 10 类数据通常按类别分文件夹存放。gdf.crs 返回的是 pyproj 的 CRS 对象,如果显示 None,说明 .prj 缺失。字段列表里要特别关注行政区代码字段,常见命名有 adcode、code、xzqhdm 等,后面做关联分析全靠它。
参数说明:如果你的数据量很大,比如乡镇街道有几千个要素,读取会慢,可以加rows=5只读前几行做抽样检查。另外 geopandas 依赖 fiona 或 pyogrio 引擎,如果报错,先pip install pyogrio再试。
2.3 统一坐标系的标准操作
确认完坐标系后,如果要做全省叠加分析,建议统一到 CGCS2000 投影坐标系。在 QGIS 里操作:右键图层 → 导出 → 保存要素为 → 选择目标 CRS 为 EPSG:4547(中央经线 114E)。在 ArcGIS 里用「投影」工具,输出坐标系选 CGCS2000_3_Degree_GK_CM_114E。注意:地理坐标系转投影坐标系要用「投影」工具,投影坐标系之间转换也用「投影」,不要用「定义投影」,后者只改元数据不改坐标值,用错了数据就废了。
提示:转换前先备份原始文件。shp 转换会生成新的 .shp/.shx/.dbf/.prj,覆盖原文件后无法撤销。
3. 10 类数据逐类拆解:从行政区划到土壤类型的加载与验证
3.1 省、市、县区、乡镇街道四级行政边界的嵌套关系
这四类数据本质上是同一套行政体系的不同层级。省 1 个要素,市州约 17 个(含直管市和林区),县区约 100 个出头,乡镇街道约 1200 个以上。加载时最容易出的问题是「层级嵌套对不上」——比如某个乡镇街道的边界超出了所属县区的范围,或者县区之间有缝隙和重叠。
验证方法:用「拓扑检查」或者简单的空间叠加。在 QGIS 里用「按位置选择」,选中某个县区,然后看该县区内的乡镇街道是否完全落在县区边界内。更直接的办法是用 Python 做面积汇总:
import geopandas as gpd county = gpd.read_file(r"D:\hubei_shp_2024\县区.shp") town = gpd.read_file(r"D:\hubei_shp_2024\乡镇街道.shp") # 按县区代码汇总乡镇面积,和县区自身面积对比 county["area_county"] = county.geometry.area town_sum = town.dissolve(by="县区代码", aggfunc={"geometry": "first"}) # 这里需要根据实际字段名调整,核心思路是分组统计 print(county[["县区名称", "area_county"]].head())逻辑说明:dissolve 按县区代码把乡镇合并,再和县区面积对比,差异超过 5% 就说明边界有问题。参数说明:area 计算依赖投影坐标系,如果还是经纬度,面积单位是平方度,没有意义,必须先转投影。
3.2 水系和道路:线要素的连通性与属性字段
水系 shp 通常是线状河流和面状湖泊混合,道路 shp 一般是线状。这两类数据在做网络分析时,最怕「断线」和「假节点」。比如一条河流被行政区划边界切断成好几段,属性表里又没有名称字段,你就没法按河流名称做聚合。
常见做法是:先检查属性表里有没有 name、河流名称、道路名称这类字段。如果没有,只能靠空间连通性合并。在 QGIS 里用「合并线」工具,设置容差 0.001 度左右,可以把断开的线接上。道路数据还要注意等级字段,比如高速、国道、省道、县道,做路径规划时权重不同。
3.3 大学和景点:点要素的去重与坐标精度
大学和景点是点数据,数量不多,但容易出两个问题:一是同名重复,比如「武汉大学」可能在不同来源里出现两次,坐标略有差异;二是坐标偏移,尤其是从网页地图抓取的点,可能偏移几十米。
去重方法:按名称字段分组,如果同一名称有多个点,保留距离道路或建成区最近的那个。坐标精度验证:随机抽几个点,和天地图或高德地图对比。如果整体偏移一个固定方向,可能是坐标系问题(比如 GCJ-02 和 WGS-84 的差异),需要做纠偏。但注意,本文不涉及任何在线地图 API 的调用细节,只讨论数据本身的处理。
3.4 高程和土壤类型:栅格转矢量的边界处理
严格来说,高程和土壤类型原始数据往往是栅格(DEM 和土壤图),但标题里归为 shp 文件,说明已经做过栅格转矢量处理。高程 shp 通常是等高线或者高程点,土壤类型 shp 是土壤图斑。
加载高程 shp 后,先看属性表里的高程值字段,常见命名有 elevation、ELEV、高程等。如果做三维建模,需要把高程点或等高线插值成 DEM,这一步在 ArcGIS 里用「地形转栅格」或「克里金插值」。土壤类型 shp 要关注分类字段,比如土种名称、土壤代码,做统计分析前先确认分类标准是否统一。
注意:栅格转矢量会损失精度,尤其是土壤类型图斑,边界会变得锯齿状。如果要做精确面积统计,建议回到原始栅格数据。
4. 避坑与排查:shp 文件处理中最容易翻车的 5 个场景
4.1 中文属性表乱码:现象是打开 dbf 全是问号
现象:用 Excel 打开 .dbf 文件,中文字段值显示为乱码或问号。原因:.dbf 的字符编码默认是 GBK 或 UTF-8,不同软件读写编码不一致。解决:用 QGIS 打开时,在图层属性里设置编码为 GBK 或 UTF-8 试一次;或者用 Python 读取时指定 encoding:
gdf = gpd.read_file(path, encoding="gbk")如果还是乱码,用 LibreOffice 打开 dbf,另存为 UTF-8 编码的 csv,再重新关联。
4.2 面积计算出负数或零:现象是投影坐标系没设对
现象:用几何计算面积,结果出现负数或极小值。原因:数据还是地理坐标系,单位是度,或者几何本身有自相交。解决:先转投影坐标系,再用gdf.geometry.area。如果还有问题,用gdf.geometry.buffer(0)修复自相交。
4.3 乡镇街道边界和县区对不上:现象是叠加后出现缝隙
现象:乡镇街道合并后,和县区边界有细长缝隙或重叠。原因:不同层级数据来源不同,采集精度不一致。解决:以县区边界为准,用「对齐到图层」或「捕捉」工具把乡镇边界吸附过去。如果缝隙很小,可以忽略;如果影响面积统计,用「消除」工具合并碎多边形。
4.4 高程点密度不够:现象是插值出来的 DEM 太平滑
现象:用高程点插值生成的 DEM,地形起伏不明显。原因:高程点采样密度太低,或者分布不均匀。解决:如果只有等高线,用「地形转栅格」时设置合适的采样距离;如果高程点太少,考虑融合其他来源的 DEM 数据。但注意,本文不提供任何 DEM 下载渠道,只讨论已有数据的处理。
4.5 shp 转其他格式后属性丢失:现象是转 GeoJSON 后字段少了
现象:把 shp 转成 GeoJSON 或 CSV 后,发现某些字段不见了。原因:字段名超过 10 个字符被截断,或者字段类型不被目标格式支持。解决:转换前先用 ogr2ogr 或 geopandas 重命名字段,确保字段名简短且无特殊字符。转 CSV 时用gdf.to_csv(),几何信息会以 WKT 格式保留。
5. 从 shp 到三维模型:用 Blender 和 QGIS 快速搭建湖北地形场景
5.1 为什么要把 shp 转成 3D Tiles 或模型
很多做可视化的人搜「shp 转 3dtiles」和「blender + 行政 + 高程数据建立 3d 模型」,本质是想把二维矢量变成三维场景。常见路径有两条:一条是 shp → DEM → 3D Tiles,适合大场景;另一条是 shp → Blender → 模型,适合小范围精细展示。两条路都绕不开高程数据。
5.2 用 QGIS 把高程 shp 插值成 DEM
假设你已经有高程点 shp,在 QGIS 里:处理工具箱 → 插值 → 反距离权重(IDW)或克里金。输入点图层,选择高程字段,输出栅格分辨率根据范围定,一般 10 米到 30 米。插值完用「山体阴影」渲染一下,看地形是否合理。
5.3 在 Blender 里用插件导入 DEM 和行政边界
Blender 本身不直接读 shp,需要插件。常见做法是:先把 DEM 转成 PNG 高度图,行政边界转成 SVG 或 PNG 叠加。或者用「BlenderGIS」插件,直接导入 shp 和 DEM。导入后,给 DEM 加「置换」修改器,强度根据实际高差调整。行政边界可以用「曲线」导入,再转成网格,挤出高度做成立体边界。
# 用 geopandas 把行政边界导出为 GeoJSON,方便 BlenderGIS 读取 import geopandas as gpd gdf = gpd.read_file(r"D:\hubei_shp_2024\县区.shp") gdf.to_file(r"D:\hubei_shp_2024\县区.geojson", driver="GeoJSON")逻辑说明:BlenderGIS 对 GeoJSON 支持较好,导出时注意坐标系用 WGS-84,因为 BlenderGIS 默认按经纬度定位。参数说明:如果边界太复杂,导出前用gdf.geometry.simplify(0.001)简化,减少顶点数。
5.4 验证三维场景是否准确的一个小技巧
在 Blender 里导入 DEM 后,找一个已知高程点,比如某座山的山顶,看模型高度是否和实际海拔接近。如果差太多,检查 DEM 的垂直单位是米还是英尺,以及置换强度是否被缩放。我一般会先用一个 1000 米 × 1000 米的平坦区域测试,确认比例尺对了再铺全省数据。
提示:Blender 处理大范围 DEM 会很卡,建议分块处理,或者先在 QGIS 里裁剪出目标区域。
5.5 我踩过的坑和现在的习惯
早期我直接把全省 DEM 丢进 Blender,结果内存爆了,文件也没保存。后来养成习惯:先在 QGIS 里按研究区裁剪,导出为 GeoTIFF,分辨率降到 30 米,再进 Blender。另外,行政边界不要用太复杂的乡镇级,用县区级就够了,否则顶点太多,Blender 操作起来像幻灯片。这套流程走下来,一个湖北省的三维地形场景,从数据准备到出图,大概半天能搞定。希望帮到你。
本文还有配套的精品资源,点击获取