简介:这是一份江苏省地理信息系统的Shapefile格式数据包,覆盖河流、湖泊、县域、市域、高速公路、国道、铁路、丘陵、湿地、经纬网等核心地理要素,适合GIS学习者、城乡规划与交通研究人员用于制图、空间统计、科研底图或项目前期分析。压缩包共83个文件,以shp几何文件、dbf属性表、prj坐标系文件及shx/sbn空间索引为主,整体约974KB,导入ArcGIS或QGIS后即可分层查看与叠加。数据边界与线网按区域整理,县域和市域面数据便于行政区划统计,河流湖泊数据可支撑水资源管理、洪水预警与水文生态分析,高速、国道、铁路等线数据适合交通网络研究,丘陵和湿地补充了地形地类信息。已有2382人学习下载,对于需要江苏省基础地理底图的用户,是一份轻量、即用且便于扩展的GIS数据资源,可作为专题制图、空间分析及区域研究的统一数据基础。
1. 江苏 shp 数据这一套能做什么:从业者的底图层刚需
做地理数据相关的工作头一两年,我几乎每个项目都在等别人发底图。手里攒了不少零零散散的河流、道路、行政区划素材,但每次一拼起来就露馅——坐标对不上、边界对不上、河流和湖泊直接错位。后来在某次项目协调会上,一位做数据治理的同行把“江苏省河流、湖泊、县域、高速、等shp数据”这套整合包丢给我,我才明白一套成体系的 shp 底图能省下多少前置工作。它解决的不只是“有一份江苏地图”,而是把省域边界、县级行政区、骨干水系、湖泊分布、高速路网这五类最常用的矢量图层打包成统一规范的 shp 格式,让做环保、交通、农业、城市规划的工程师能直接拿来加载、裁剪、统计,而不是自己到处找零碎数据再花两个晚上对齐坐标。
2. 数据清单与图层字段:拿到手先要读懂的五个要素
2.1 五个图层分别装了什么:从几何类型到属性字段
这套数据按命名规则区分得很清楚,文件名基本能直接看出用途。常见的五类图层是这样的:
- 省域边界面(province.shp):整个江苏省的外轮廓,一个 Polygon,属性表只有省名和代码,主要是用来做整体范围的裁切边界和出图底框。另外,它也承担了地图上“整省套一个外框”的任务,很多刚上手的人直接拿它叠加遥感影像,后续做匀色和出图便当得多。
- 县域边界面(county.shp):江苏下辖各县级行政区的面状边界,一般包含县名字段和县级行政区划代码字段。这类图层在处理统计类专题时几乎是必须的。把经济、人口、污染源数据按县名关联到面图层上,再按数值字段分级设色,就能快速出一张县域专题图。
- 河流线图层(river.shp):线要素,画的是骨干河道的中心线。属性字段里一般带河流名称、级别(流域级/省级/市级等)或长度字段。注意这里它是“线”,不是“面”,所以水量大不大、河面多宽从这个图层里看不出来,做防洪淹没分析还需要找水面面数据。
- 湖泊面图层(lake.shp):面要素,把主要湖泊、水库标出来。字段通常有湖名和面积字段。这个图层最常被拿来和河流做网络分析或生态空间叠加。
- 高速公路线图层(highway.shp):线要素,对应省内高速骨干路网,属性字段一般包含路线名称、编号、等级。用来做通达性分析、服务区选址、物流路径测算都很实用。
需要强调一点:FAQ里不少常见描写把“河流和高速”混在一个图层里,实际上这套数据是分文件的。如果打开后发现所有要素都叠在一块,多半是加了什么奇怪的“全要素合并图层”,而不是那五个基础文件。读到这先看一下文件名后缀再操作,别一上来就加载整个目录。
2.2 坐标系与投影:为什么多数新手栽在“对不上”这一步
拿到任何 shp 数据,第一件事不是打开符号化,而是右键图层看属性里的“源”或“坐标参考系”信息。这套江苏数据默认常见的有两种可能:WGS84 地理坐标系(EPSG:4326),或者 CGCS2000 地理坐标系(EPSG:4490)。偶尔也有人把服务器里的数据直接转成了 Web 墨卡托(EPSG:3857),那这种多半是为了套在线底图准备的,不是原始底图。
江苏的经纬度范围大致在东经 118° 到 122°、北纬 30.7° 到 35.1° 之间。判断坐标系有个笨办法:如果图层 Extent 里出现的是十进制度数(比如 118.8, 31.9 这种),那基本可以确定是地理坐标系。如果出现的是七位数的米制坐标(比如 3.5e7 这种),那就是投影坐标系。这套数据的原始来源大多基于 CGCS2000,做国土类项目建议保持它本身坐标系不动;做互联网可视化展示再转 Web 墨卡托。
坐标系选错是后续所有“对不上”的根源。尤其是拿高清影像做底图时,影像默认 WGS84,而矢量图层是 CGCS2000,两者虽然都是地理坐标系,但参考椭球定义不同,在江苏区域中小比例尺看几乎差别不大,一旦放大到县域甚至镇域,有的地方会偏移几十米到上百米。所以别偷懒,统一坐标系这件事要在第一次加载时就解决,别放到交付前才做。
2.3 适用场景的前置判断:哪些需求不适合直接拿原始面去跑
这套数据能解决常规底图需求,但不是万能钥匙。我拿到手第一时间就会做适用性筛查,主要有三类需求我不会直接拿原始数据硬跑:
第一类是“面转点”之后的精确空间分析,例如把省界面直接转成点再去算点到某个路口的距离,边界上会产生很多无效点。正确做法是先按分析半径裁剪出工作区,再转点。第二类是河网拓扑分析。河流线数据是地理测绘的精简河段,不是带流向属性的水文模型河网,直接拿去做河网密度、上下游连通性分析会漏掉不少中小支流,严谨的做法是补充水文数据集后再做。第三类是县域边界的统计汇总。如果拿县界去和街道级人口数据做空间连接,很多时候人口数据是按街道点发布的,连接之后县内的点被切分得七零八落,统计口径容易出问题。
这套数据最稳的应用场景是中宏观尺度的出图底图、县界裁切、交通路网可视化和水系分布概览。数据能做什么不能做什么,先想清楚再动手,比后期返工省时间。
3. 从下载到目录还原:解压、校验与工程目录规范
3.1 解压后文件结构长什么样:shp 家族七件套与识别
拿到压缩包后先别急着双击打开,先把整套文件解压到一个“没有中文路径、没有空格”的纯英文目录里。shp 不是一个单文件,而是由一个“文件家族”构成的,典型的组成包括:
.shp:图形几何数据主体,里面存坐标点和图形类型.shx:几何索引用,没有它很多 GIS 软件会拒绝打开.dbf:属性表,所有字段内容都存这里,乱码问题也出在这.prj:坐标系描述文件,很多软件靠它识别投影信息.cpg:属性字段编码描述,常见值为 UTF-8 或 ANSI.sbn / .sbx:空间索引,可让渲染和查询更快,缺失不会致命.xml:元数据文件,靠它看数据的编辑时间与来源描述
如果你下载的压缩包解压后每个图层只有.shp和.dbf,缺了.prj,那后续定位对不齐的坑多半就埋在这了。.prj文件很小但决定生死,做数据交付时一定要让每条 shp 都带上它。我对拿到手的数据做的第一件标准化操作,就是新建一个 data 目录,按 five_layers 分好子目录,再把附件说明文档放到另一个 doc 目录下。
3.2 完整性校验清单:哪些文件缺失会导致读取失败
我先列一个自己整理的检查清单,每次拿到数据包都按这个过一遍:
- 每个图层至少要有
.shp/.shx/.dbf,最好带.prj/.cpg - 用软件预览图层范围,江苏数据应该在 118°E~122°E、30.7°N~35.1°N 附近,如果范围跑到别的地方,坐标系描述大概率错了
- 图层数量应该是 5 个左右,若发现几十个碎文件,多半不是原始数据包而是某软件工程目录
- 属性表第一行是否能正常显示中文,乱码基本意味着
.cpg和.dbf编码不对
如果在解压过程中发现压缩包报错,先重新下载一次,别硬解。之前我在某次项目里图省事跳过坏块,结果整个县界图层缺了几十个面,后续统计怎么都对不上,排查了三个小时才回头,这种血泪经验真不想再多来一次。
3.3 目录命名与项目引用习惯
工程规范这块容易被忽略,却是后期多项目复用的关键。我一般会把原始下载包放在raw_data/目录下不动,然后建立一个work_data/目录,所有转换、裁剪后的中间文件放那里。在项目里引用数据时一律用相对路径,不要用绝对路径。
这份江苏 shp 数据本身是分图层的,但真正做项目的过程中你会经常做“县级边界 + 高速 + 河流”的组合显示。与其每次重新加载三个文件,不如预先建立一个index.gpkg或project.sqlite把它们统一管理。不过初次接触时直接使用原始 shp 逐个加载就够了,不用上来就把自己搞复杂。
4. 在 GIS 软件里把数据用起来:QGIS 加载与配色
4.1 导入省界与县界:层级使用思路
我用 QGIS 做演示,因为它是开源工具,团队内任何同事都能免费装。打开 QGIS 后,菜单栏选“图层” → “添加图层” → “添加矢量图层”,把解压出的省界面.shp和县界面.shp两个文件分别拖进图层面板。第一次加载时会弹出“坐标系变换”提示,如果两个图层坐标系不一致,统一转到 CGCS2000(如果你手头版本里没有,就选 EPSG:4490)。
加载完成后先看两个图层的范围是否重叠。如果省界和县界边界存在细微重叠或缝隙,这是不同部门数据采集精度不一致导致的常见现象,先别急着修,等做专题图时再用拓扑修复功能统一处理。图层显示顺序上把“县界”放省界之上,这样打开后会先看到细分区域,再叠加上省界的外框,图面会更清晰。
符号化方面,我给县界的填充色设置成“无”,边框线宽设为 0.3 左右,颜色用深灰;省界的填充色同样设成“无”,边框线宽设 0.8,颜色用纯黑。这样能分清楚“省界线比县界线粗一档”的视觉层级,看图的人一眼就能分清楚行政级别。
4.2 河流与湖泊的自然表达
水系图层我习惯用单线符号表达河流,颜色选青蓝色,线宽按属性字段中的“等级”分类设置:省级骨干河流线宽 1.2,其他支流 0.6。如果你拿到的数据里没等级字段,也可以直接用统一线宽 0.8。
湖泊面图层用浅蓝色半透明填充,透明度大概 70% 左右。叠加方式是河流线在上、湖泊面在下,因为河流是动态通道,湖泊是静态水面,让通道压在水面上更符合读图习惯。QGIS 内可以选中图层后在右侧“图层属性”里调整符号,透明度直接通过“简单填充”里的透明度滑块控制。
这里有个细节:如果河流和湖泊在交界处出现不衔接,说明河网线没有在出口处打断。当年我遇到这种情况选择直接在 QGIS 里用“几何检查器”把这些线打断,然后用捕捉工具把断头重新接上。但记住这是修饰性修复,不能改变数据本身。真正做水文分析还是得回到原始数据源里去修正和处理。
4.3 高速底图叠加与多图层联动
高速公路图层加载后,一般默认是一条条白色细线。建议改成实体红色或深橙色线宽 1.5 左右,并在符号样式中添加一个“简单线”外加白色描边,形成描边效果,白天出图时会明显清晰很多。
多图层联动是实际出图中最耗时间但也是最有价值的操作。先把省界、县界、河流、湖泊、高速这五个图层全部加载出来,切换“地图视图 → 打印布局”,在布局里添加同一地图框。左边列表控制各图层的可见性,右侧一个地图框内会自动刷新显示效果。要特别注意:出图时一定把坐标系临时切到适合江苏区域的投影,比如 CGCS2000 / 3-degree Gauss-Kruger zone 40(EPSG:4514 附近)。地理坐标系虽然加载没问题,但出图比例尺和标注会因为你默认的分带不对产生容易忽视的形变。
这种多图层叠加能解决日常非常核心的诉求:当部门里讨论某条高速穿越哪些县、又跨过哪条河流时,直接切到打印布局一键导出 PDF 能让对方记住 80% 的上下文。我做交通规划的小组同事最喜欢这种方式,因为不用理解 GIS,甚至能点开 PDF 里的图层查看字段说明。
5. 踩坑与排查:加载、编码、边界对不齐等五个高频问题
5.1 属性表中文乱码
现象:打开省界或县界线图层的属性表,中文显示成乱码,常见的是一堆类似“鍥剧墖”的字样。
原因:shp 的.dbf属性表通常按 GBK(即 Windows 本地代码页 936)存储中文,但部分 re-download 版数据在保存时改成了 UTF-8,而软件默认读取编码为 UTF-8,于是读错。
解决:在 QGIS 加载时手动指定编码。路径是“图层属性 → 数据源 → 数据源编码”,改选 “GBK” 或 “System(自动检测)”,然后确认重载。如果 QGIS 自动识别不到,你可以直接用文本编辑器打开.cpg文件,把UTF-8改成GBK再重新加载。注意改.cpg只是改描述,不改变.dbf里真正的字节内容,如果原来存的就是 GBK,改完才正常显示,如果原来存的是 UTF-8,那你就得把.cpg写回 UTF-8。
5.2 面状图层与底图位置偏移
现象:把县界面叠到卫星影像上,道路或者建筑地物整体偏移了几十米到几百米,不是局部问题,而是整个图层“平移”了。
原因:最常见的两个原因,一个是图层坐标系和底图坐标系不一致,矢量是 CGCS2000 而底图是 WGS84,江苏区域最大偏移量按国家标准大致在 60 米以内;另一个是 shp 自带的.prj文件缺失或写错了投影参数,软件默认按 WGS84 读,于是错位几千甚至上万米。
解决:先看图层的“范围”和投影信息。如果范围在米制坐标且数值很大(X 轴七位数以上),说明 shp 是投影坐标却被按地理坐标加载。此时在 QGIS 中右键图层“设置图层 CRS”,手动指定正确的投影坐标系,软件会自动重新投影。如果范围本身是经纬度但偏移依然存在,那就进入“变换 → 自定义基准点变换”,用至少三个同名控制点做七参数纠正。实际恢复成本不低,所以更建议回到原始发布源去拿一份带正确.prj的文件这几分钟花的远比事后校核值。
5.3 高速图层与县界线空间连接出现空结果
现象:把高速线和县界做空间连接(Join attributes by location),结果一大半路线要素的县名字段是空的。
原因:县界图层是面要素,高速图层是线要素。如果高速线刚好沿着县界边界走,空间连接会因“线完全落在面边界上”导致判定失败;另一类原因则是高速线和县界线之间存在几十米的缝隙,这是不同部门采集精度不同造成的系统性差异。
解决:连接前先对高速图层做 50 到 100 米的缓冲区,把线转成“窄面”,然后再与县界做空间连接。缓冲区半径按精度情况调整,我常用 50 米起步,效果足够。连接完成后检查一下空值的数量,如果还是很多,那就用“最近距离”法,直接在属性表中添加县名,按线与县界最短距离来匹配。
5.4 坐标转换后湖泊面积异常变化
现象:把 WGS84 坐标系的湖泊面图层“另存为”到某个投影坐标系后,面积跟之前计算差了一倍甚至更多。
原因:这属于量测单位误用。地理坐标系直接算面积,单位是“平方度”,数值完全没意义;投影坐标系面积单位是平方米,但不同分带投影下变形程度不一样。把平方度当平方米读,数字自然差得离谱。
解决:统一将数据先“另存为”到适合江苏区域的投影坐标(比如 CGCS2000 / 3-degree Gauss-Kruger CM 120E,见 EPSG:4545 系列),再在字段计算器里用$area表达式算面积,并把它导出到字段。计算后对比华东地区主要湖泊的面积数量级,如果只有几十公顷,多半是坐标系还是没转对。做全省汇总统计时,推荐全部统一到 CGCS2000 / 3-degree GK zone 40,这样各县面积能直接横向对比。
5.5 河流线穿过县界边界
现象:河流图层与县界相交处出现河道直接横穿行政边界,部分县界的河流段在行政图中被“切”成两截,但河网线依旧是一条完整长线。
原因:这里其实是两类问题:一类是河流要素本身是连续的,县界是行政划分,两套数据的构建逻辑不同,所以交叉是正常的;但如果你做水利分区统计,河流线没在县界打断,会导致“这条河哪县管”无法通过空间关系表达。
解决:解决方式是在 QGIS 里用“工具 → 拆分矢量图层”,或者用 GDAL 的ogr2ogr -splitlistfields把线图层在面边界处切断。专业流程是把河流线和县界做一次“交点提取”,再把河网按交点切成多个短线段,然后给每个短线段赋上所在县名。如果我没别的手动修的办法,就直接用 PgRouting 配合 PostGIS 里的 ST_Split,把一条长线按县界拆出分段并打上县名属性,后面做水利分析就不用再返工。
6. 用 Python 复核与裁剪:一套能复用的数据处理流水线
拿到这套江苏 shp 数据后,我最常用的一个落地操作是用 Python 快速复核图层要素数量和空间范围,再按指定的县域范围裁出某条高速的子集。几行代码就能把上面的很多坑一次性过滤掉。以下脚本依赖 GDAL/OGR 的 Python 绑定,只要你的环境里已安装 gdal 即可运行:
from osgeo import ogr # 打开省界图层并读取范围 prov = ogr.Open("data/province.shp") layer = prov.GetLayer(0) # 打印坐标系、要素数、范围 print("CRS:", layer.GetSpatialRef().GetAttrValue("PROJCS")) print("Feature count:", layer.GetFeatureCount()) extent = layer.GetExtent() print("Extent: {:.4f}, {:.4f} ~ {:.4f}, {:.4f}".format(*extent)) # 用县域边界裁剪高速图层 county = ogr.Open("data/county.shp") county_layer = county.GetLayer(0) highway = ogr.Open("data/highway.shp") highway_layer = highway.GetLayer(0) # 找到目标县(这里以字段 name 匹配,具体字段名以实际属性表为准) target = None for feat in county_layer: if feat.GetField("name") == "目标县": target = feat.geometry().Clone() break if target: # 按目标县边界切出高速路线段 result = ogr.GetDriverByName("ESRI Shapefile").CreateDataSource("highway_target.shp") out_layer = result.CreateLayer("highway", highway_layer.GetSpatialRef(), ogr.wkbLineString) out_layer.CreateField(ogr.FieldDefn("id", ogr.OFTInteger)) out_feature = ogr.Feature(out_layer.GetLayerDefn()) count = 0 for feat in highway_layer: geom = feat.geometry().Clone() clipped = geom.Intersection(target) if clipped is not None and not clipped.IsEmpty(): out_feature.SetGeometry(clipped) out_layer.CreateFeature(out_feature) count += 1 result = None print("Clipped features:", count)这段脚本的逻辑分三步:先打开省界图层读取坐标范围,这是每次拿到数据最快验证坐标系有没有问题的办法;然后用县界的几何对象对高速图层做空间相交运算,把落在目标县范围外的线段直接裁掉;最后把结果写出为另一个 shp 文件。
参数说明:ogr.wkbLineString指定输出要素类型是线要素,如果你的数据里是 MultiLineString,这里可能要改成ogr.wkbMultiLineString,否则写出时几何会被丢弃。县名字段name是我常见的默认命名,实际以你那份属性表为准,建议先打印feat.GetFieldNames()确认。空间相交用Intersection()而不是Clip(),是因为它不依赖输入顺序,直接返回两几何的交集,书写更直观但性能上会稍慢,数据集不大时完全无感。
脚本里还有一个容易被忽略的点:target.geometry().Clone()这一步不能少。直接从遍历中拿到的 geometry 引用会在下一轮循环中失效,不 Clone 就会出现“所有裁出来的线都一样”的诡异结果。这个诡异问题我当年排查了很久才意识到。
从那以后我每次拿到任何 shp 数据,都会强制走一遍这个流程:读取 CRS、打印要素范围、随机抽 3 个要素看属性表是否乱码、再做一个小范围的裁剪验证。过程不超过三分钟,但基本能拦住 90% 的因数据损坏、坐标系描述错误、字段命名不一致导致的翻车问题。希望帮到你。
本文还有配套的精品资源,点击获取