简介:基于OpenStreetMap开源数据整理的江苏省矢量地理数据,覆盖交通路网、水系水域、建筑物、自然景点、兴趣点、土地利用等18个类别,并包含点、线、面三种几何类型,坐标系统一为WGS84。数据已按江苏省边界裁剪,适合GIS开发、城市规划、地理教学与制图分析等人员直接使用,可用于地图底图搭建、空间查询、专题制图、兴趣点检索以及叠加分析等场景。资源包共92个文件,压缩后约54.6MB,其中shp存储要素几何、dbf保存属性字段、prj定义坐标系、shx建立空间索引、xml记录元数据,并附有sbn/sbx辅助空间索引,结构清晰,可按类别单独加载或整体导入。目前已有1792人浏览学习,说明该数据集在日常GIS数据需求中具备较高参考价值。下载后可直接解压导入ArcGIS、QGIS等主流平台,省去自行下载、裁剪与格式转换等前期工作,江苏省范围内的地理信息项目可快速获得一套完整的基础矢量底图,便于后续配图、渲染与空间分析。
1. 江苏省矢量地理数据:解压就能配图的GIS底图,先看图层再谈分析
接到一个急活,要基于全省范围出一张交通道路与区县界叠合的底图。找一圈发现,真正能立刻用的不是在线瓦片,而是一份本地矢量包。把「江苏省矢量地理数据.rar」解压后,行政区划、交通道路、建筑物、水系这些图层都在,从解压到完成初稿大约半小时。这套数据以Shapefile为核心格式,适合做规划底图、GIS可视化和空间查询,也适合把交通、建筑这类要素抽取出来做专题分析。适合GIS从业者、规划方向的学生,以及需要在离线环境里配底图的开发人员。它解决的是找数据、配底图、统一坐标系这三个连在一起的麻烦。
2. 数据包内部结构:图层分类、shp文件组成与属性字段解析
拿到.rar后的第一反应,别忙着拖进GIS。先把它当成一套「菜篮子」,分清里面装的是什么。GIS数据包最忌讳的是不看文件结构就开始加载,等属性表空了或者图层飞了才回头查,浪费半天时间。
2.1 先分清要素类型:面、线、点三层的组织逻辑
这套矢量数据按照几何类型做了分层。行政区划类(省界、地市界、区县界)是面要素;交通道路类(高速公路、国道、省道、县道、铁路)是线要素;建筑物是面要素,POI兴趣点是点要素;水系里的主要河流可能是线,湖泊是面。
这样的分层逻辑和制图习惯是对应的:线层控制路网显示优先级,面层控制区域填充与统计口径。做专题图时,你可以单独关掉某个线层来检查道路连通性,也可以把建筑物面层和区县面层叠加,统计各区域建筑物分布密度。分层的本质是让「查询、符号化、空间分析」都有的放矢。
面、线、点分开存还有一个实际好处:不会出现在同一图层里既有面又有线导致样式冲突的问题。QGIS里给图层设置符号时,面用渐变填充、线用线宽分级、点用图标,每一层独立控制,出图效率会高很多。
2.2 一个完整shp图层应有哪些文件:七件套还是三件套
Shapefile(简称shp)不是一个单文件,而是一组配套文件的集合。判断一份数据是否完整,要看它是否「成套」。常见的配套文件如下表所示:
| 后缀 | 作用 | 缺失后果 |
|---|---|---|
| .shp | 要素几何坐标 | 没有它,加载直接失败 |
| .shx | 几何索引 | 缺失时部分软件能自动重建,但建议补全 |
| .dbf | 属性表(字段与值) | 缺失时图层没有属性,无法按字段筛选 |
| .prj | 坐标系描述(WKT格式) | 缺失时软件不认识坐标系,叠图容易错位 |
| .cpg | 属性编码声明(如UTF-8) | 缺失或不对时中文属性乱码 |
| .sbn/.sbx | 空间索引(可选) | 缺失不影响显示,大数据量查询变慢 |
很多网上流传的shp包只给了.shp和.dbf,丢了.prj,加载后图元能显示,但坐标系是未知状态。配底图时要么叠不上,要么你得手动猜坐标系——这是最大的时间黑洞。所以解压后第一件事是逐个图层核对,有没有.prj。
具体核对方法:在解压出来的目录里按扩展名排序,看看是不是每个图层都含有.shp/.shx/.dbf/.prj/.cpg这套「五件套」。缺了.cpg可以后续补救,缺了.prj就要小心处理。判断数据完整度,比急着打开它重要得多。
2.3 属性字段命名与类型约定:能直接拿来用的字段
不同数据来源的shp属性字段命名习惯差异很大,有的用拼音首字母,有的用英文,还有的直接用中文(不建议,但存在)。这套江西省级矢量数据里常见字段包括:
- NAME / ADNAME:要素名称或行政区名称
- CLASS / KIND:要素分类编码,比如道路等级
- GBCODE:国标分类码(国内测绘数据常用)
- AREA / HECTARES:面要素面积,注意单位
- LEN / LENGTH / KM:线要素长度,注意单位
- ADCODE / PAC:行政区划代码(6位或12位)
拿到图层后,我一般先做一次字段探查,用命令行比逐个点开属性表更快:
# 查看图层概要:要素数、范围、字段名与类型 ogrinfo -so 数据目录/道路.shp 道路参数说明:-so(summary only)只输出图层概要,不逐条列出要素,输出内容包含要素总数、图层范围、字段名和字段类型。字符串字段会标成String,数值字段标成Integer或Real,看到这些类型信息后,再决定后面筛选和计算怎么处理。这一步能避免很多后面才暴露的类型错误。
字段命名只是「约定」,不是「标准」。同一个「道路等级」,有的数据叫CLASS,有的叫ROAD_CLASS,值域从0到7都有。所以不要假设字段名,先看统计结果,再做符号化。这一点在你换了一套数据源后特别重要。另外,面要素的AREA字段可能是平方米,也可能是公顷,统计前先算一算,别把单位搞混。
3. 从解压到出图:QGIS加载、筛选配色与格式转换全流程
现在把一份刚解压的数据变成一张可交付的图。整个流程分四步:解压核对、加载设置、筛选配色、格式转换。每一步都有明确的判断标准和常见坑位,照着走就能绕开大部分问题。
3.1 解压后的第一件事:核对文件成套性与坐标信息
拿到「江苏省矢量地理数据.rar」,先用压缩软件解压到独立目录。建议目录名不要带空格和中文,因为部分命令行工具对非ASCII路径支持不太好。Linux/macOS下可以这样走:
# 解压到当前目录,保持压缩包内的目录结构 mkdir -p jiangsu_gis && cd jiangsu_gis unrar x ../江苏省矢量地理数据.rar参数说明:unrar的x选项表示保留压缩包内部目录结构,避免所有文件平铺在同一层,导致几百个文件混在一起。解压到独立目录后,后续命令行处理时路径好写,也不会污染项目根目录。如果环境里没有unrar命令,用压缩软件手动解压效果一样,关键是关注解压后的目录结构。
解压完成后,在目录里先按扩展名看一眼。如果某个图层只有.shp和.dbf,没有.prj,这类图层优先处理:打开QGIS加载后,右键图层属性,在「信息」页签里看坐标系描述是否为空。缺.prj的图层,QGIS会提示未知坐标系,这时候你后续做的每一次空间分析都可能带着位置偏差,越早发现越好。
3.2 QGIS加载shp与中文编码设置
QGIS中加载矢量数据的常用路径是「图层」菜单→「添加图层」→「添加矢量图层」,源文件类型选择「ESRI Shapefile」。默认情况下QGIS会自动识别编码,但识别不准时中文属性会变成乱码,解决方式是在添加对话框下方手动指定编码为UTF-8或GBK。
常见做法是:先加载一次,看属性表里中文是否正常。如果乱码,断开图层连接重新添加,这次在编码下拉框里选择UTF-8;若仍然乱码,换GBK再试。dbf文件的中文字符集通常是GBK(来自传统测绘数据)或UTF-8(近年整理的数据),多试一次就能确定。
注意:编码和坐标系是两个独立设置项。编码影响属性文字,坐标系影响几何位置,别混为一谈。改编码不会让图层位置变正,改坐标系也不会让乱码变成中文。
加载完成后,打开图层属性,检查几何类型与之前判断是否一致。比如道路图层应该是LineString,如果显示成MultiLineString也正常,大多数道路shp为了容纳断头路和立交,会使用MultiLineString保存。
3.3 按区县筛选与道路分级配色
出图第一个需求通常是「把某几个区县的路网单独拿出来」。如果数据里带区县名称字段,用要素筛选(不是属性表筛选)就能建立命名筛选:
-- QGIS表达式:按名称字段筛选目标区县(将'目标区县'替换为实际名称) "ADNAME" = '目标区县' -- 如果要同时包含多个区县: "ADNAME" IN ('区县甲', '区县乙')原始数据里通常有行政区划面,以及带ADNAME字段的区县界图层。在矢量图层面板上选中行政区划层,右键选择「过滤…」,把上面表达式填进去。这样图层只显示匹配区县的图元,后续导出的布局也只会包含这些要素,不用做几何裁剪,速度也快。
道路分级配色是出图里最能拉开差距的一步。在图层属性→符号化→分类里,按CLASS字段做分类符号,然后分别设置线宽与颜色。高速公路用红色粗线、国道用橙色中等宽度、省道用黄色虚线、县道用浅灰色细线、铁路用黑白相间线。分类符号化完成后,打开打印布局,插入地图框,设置比例尺,把图例和指北针放好,一张底图就成型了。
配色参数没有绝对标准,但有一个原则:主路显眼、辅路退后。如果你要做的是规划底图,建议把建筑物面层透明度调到60%以上,这样路网叠加在上面不会被遮挡。这个技巧在实际出图阶段很实用,很多新手把所有图层都设成不透明,最后打印出来一片黑,反而看不清主路。
3.4 shp转GeoJSON/KML:命令行与QGIS两种方式
数据要交给前端或移动端使用时,shp通常要转成GeoJSON或KML。GeoJSON是Web GIS的事实标准,KML适合部分桌面端和移动端查看。转格式时绕不开一个关键参数:目标坐标系。
# 转GeoJSON,同时转为WGS84经纬度(EPSG:4326) ogr2ogr -f GeoJSON output.geojson input.shp -t_srs EPSG:4326 -lco ENCODING=UTF-8 # 转KML,KML规范强制要求WGS84 ogr2ogr -f KML output.kml input.shp -t_srs EPSG:4326说明:-t_srs是输出坐标系,不写的话默认沿用源坐标系,得到的结果可能是投影坐标下的GeoJSON,前端加载到地图上会错位。建议转Web端用数据时统一输出EPSG:4326。如果数据本身已经是WGS84,也可以省略-t_srs,减少一次投影变形计算。
QGIS里另存为也可以完成同样的事:右键图层→导出→另存要素为,格式选GeoJSON,CRS选WGS84 EPSG:4326,编码选UTF-8。两种方式结果一致,命令行优势在于可以批量处理多个图层:写一个for循环,把目录里的所有shp一次性转出来,这在图层超过十个时能省不少时间。
4. 坐标系实战:CGCS2000、WGS84与高斯投影的转换与对齐
矢量数据翻车最多的地方是坐标系。不是数据错,而是你不知道数据在哪个坐标系里,或者你以为它在A坐标系,实际上它在B坐标系。先说结论:这类省级数据,最常遇到三种坐标系——CGCS2000地理坐标、CGCS2000高斯投影坐标,以及被各种在线底图默认使用的WGS84/Web墨卡托。电子地图领域还经常混入加密坐标(GCJ-02),所以叠图前一定要弄清数据的原始坐标系是什么。
4.1 用文本打开.prj文件:一眼判断数据是什么坐标系
shp的坐标系写在.prj文件里,用任意文本编辑器打开就能看到一段WKT描述。不要被这串英文吓到,判断坐标系只需要找几个关键词:
# 查看prj内容,例如某个数据集的坐标系描述 cat 行政区划.prj如果内容里有「China Geodetic Coordinate System 2000」或「CGCS2000」,说明数据是2000国家大地坐标系,这是目前国内测绘数据的标准。如果内容里有「GCS_WGS_1984」,说明是WGS84地理坐标。如果内容里有「Gauss_Kruger」或「Transverse_Mercator」且出现了中央经线(CM),说明是高斯投影下的平面坐标,单位是米。
拿不准时,打开QGIS的图层属性→信息页签,系统会显示「CRS: EPSG:4490 - CGCS2000」之类的标准描述。如果是未知或缺失,QGIS会显示一个警告图标,这时候不要点确定,先手动选坐标系,否则后续分析全是错位。
4.2 几个绕不开的EPSG代码:4326、4490、3857
| EPSG代码 | 坐标系名称 | 经纬度/投影 | 常见用途 |
|---|---|---|---|
| EPSG:4326 | WGS84地理坐标系 | 经纬度 | Web前端、GPS数据、GeoJSON规范 |
| EPSG:4490 | CGCS2000地理坐标系 | 经纬度 | 国内测绘数据的经纬度形态 |
| EPSG:3857 | Web墨卡托投影 | 米(投影) | 在线地图瓦片、Leaflet/Mapbox底图 |
| 高斯-克吕格投影 | CGCS2000 / 3-degree Gauss-Kruger CM 120E | 米(投影) | 省级测绘成果、工程坐标 |
EPSG:4326和EPSG:4490都是经纬度坐标,只是椭球参数不同,数值差异在几米到几十米量级。EPSG:3857是Web墨卡托,在线底图全是它。高斯投影是平面坐标,数值是几十万到几百万的量级,和经纬度数值差了好几个数量级,如果你加载一个图层发现坐标值是「38万、33万」这种,基本就是高斯投影。
省级数据大多统一到中央经线120E的3度带,也就是「CGCS2000 / 3-degree Gauss-Kruger CM 120E」。只需要记住,看到CM后面的度数是120E,就约等于这类应急出图的常用投影。在QGIS的坐标系选择框里搜「120E」,就能定位到这一项。
4.3 重投影与「指定投影」是两回事:错位数据怎么救
很多人在图层偏移几百米时,第一时间做「重投影(Reproject)」,结果发现偏移还在,甚至更乱。这是因为重投影解决的是「坐标系已知但需要变换」的问题,而偏移通常是因为「坐标系本身被标错」。
场景区分如下:
- 图层坐标是米制、数值几百万,系统却标成EPSG:4326:需要「指定投影(Assign CRS)」改成正确的高斯投影,而不是重投影。
- 图层坐标系正确,需要从CGCS2000转到WGS84:用「重投影」,或者导出时在目标CRS里设置。
QGIS里指定投影的入口:图层属性→来源→当前CRS右侧的按钮,弹出对话框搜索「CGCS2000 / 3-degree Gauss-Kruger CM 120E」,指定后图层回到正确位置。重投影入口:右键图层→导出→另存要素为,CRS选目标坐标系。
这个区别在概念上不大,实际使用时却是免费的后悔药:先尝试指定投影,如果图元落到合理位置,就不用重投影。反过来如果先做了重投影,原始坐标信息会被改写,想恢复还得重新加载数据。
4.4 用Python批量转出WGS84经纬度
如果要把多个图层的几何坐标批量转成WGS84经纬度,用Python的geopandas库最省事。下面这段脚本遍历指定目录下的shp,读取后统一重投影到EPSG:4326,直接写出GeoJSON供前端使用:
import geopandas as gpd from pathlib import Path in_dir = Path("data_in") # 替换为你的解压目录 out_dir = Path("data_out_wgs84") out_dir.mkdir(exist_ok=True) for shp in in_dir.glob("*.shp"): gdf = gpd.read_file(shp) # 读取时自动读取.prj里的坐标系信息 gdf = gdf.to_crs(epsg=4326) # 重投影到WGS84经纬度 out_path = out_dir / f"{shp.stem}.geojson" gdf.to_file(out_path, driver="GeoJSON", encoding="utf-8") print(f"转换完成: {shp.name} -> {out_path.name}")参数说明:gpd.read_file会读取shp配套的.prj来确定源坐标系,如果缺了.prj,geopandas会当作未知坐标系,to_crs会报错或产生错误结果。所以跑脚本前先补齐.prj。to_crs(epsg=4326)是重投影操作,不是原地修改内存对象,必须重新赋值给变量。如果你只是要快速核对坐标数值量级,可以用gdf.geometry.to_wkt()把坐标打印出来,不用等文件写出。
5. 避坑指南:江苏矢量数据使用中的五个翻车现场
以下五个问题,是我在这类省级矢量数据上反复遇到的真实案例。每一条都按「现象 → 原因 → 解决」的顺序写,可以直接对照排查。
5.1 属性表中文全部变成问号
现象:加载shp后打开属性表,所有中文属性显示成一串问号或乱码,英文和数字正常。
原因:dbf文件的字符集和QGIS加载时使用的编码不一致。老式测绘数据常用GBK/GB2312,近年整理的数据常用UTF-8,而dbf文件本身没有存储编码信息,只能靠.cpg文件声明,很多数据包没有包含.cpg,QGIS默认按系统编码猜测,猜错就乱码。
解决:重新添加图层,在编码下拉框里依次尝试UTF-8和GBK,一般能恢复正常。更保险的做法是用文本编辑器修改.cpg文件内容为GBK或UTF-8,保存后重新加载图层。此后拿到数据我会先看有没有.cpg文件,没有就预设两种编码,不再浪费时间猜,属性乱码这个坑能用两分钟排除掉,别拖。
5.2 道路叠加影像后整体偏移几百米
现象:道路线层能显示,但叠到卫星影像或在线底图上时,整体朝某个方向偏了几百米,局部桥和路也对不齐。
原因:绝大多数情况是数据的坐标系被标错或未定义,叠加时在线底图的Web墨卡托投影自动转换,基于错误的源坐标系转换自然整体偏移。少数情况是数据本身采用GCJ-02加密坐标,这和标准坐标系之间是加密偏移关系,没法用常规七参数解决。
解决:先看.prj文件判断坐标系描述,再对照同区域的高斯投影参数用「指定投影」修正。如果指定CGCS2000 120E后叠图正常,说明只是标注错误。如果所有合理参数都试过仍然偏移,且偏移量在几十到几百米、方向杂乱,考虑数据是否被加密处理过,这类数据只能做抽样校正,无法靠投影变换解决。
5.3 建筑物面数据自相交,缓冲区一跑就报错
现象:对建筑物面层做缓冲区(Buffer)时提示geometry is invalid,或者计算面积时个别要素结果为NULL。
原因:shp中的面要素来自不同批次数字化,存在自相交环、重复节点、极小缝隙。空间分析工具通常要求几何有效,这类错误数据会被直接标记无效,不参与计算。
解决:用QGIS的处理工具「修复几何」(Fix geometries)处理后再做分析。命令行可以用ogr2ogr的-makevalid参数:
# 修复几何并输出为新的shp,不指定坐标系参数时输出沿用源坐标系 ogr2ogr -makevalid 建筑物_修复.shp 建筑物_原始.shp参数说明:-makevalid是GDAL提供的几何修复选项,把自相交、环方向错误等修复为合法几何。修复后要重新检查要素数量,因为部分严重破损的面会被拆成多个面,数量会变化。也可以先用QGIS菜单「矢量」→「几何工具」→「检查有效性」,把错误要素定位到属性表,手工修正后再分析。
5.4 分县面积合计与官方统计对不上
现象:把区县面层按ADNAME字段聚合计算面积,求和后比官方面积少或多了百分之几到几十。
原因:面层的边界精度、数据源比例尺、投影方式都会影响面积统计。小比例尺数据在山区边界化简程度大,面积偏差就会放大。高斯投影下不同位置面积也有变形。
解决:如果是省级总量对比,用经纬度坐标(EPSG:4490)计算面积,在QGIS字段计算器里选中「椭球面积」选项,不要用投影坐标下的平面面积。如果是分县汇总,先用拓扑检查确认接边无缝隙无重叠,再按区县名称分组统计。切记:统计口径要一致,官方面积通常是基于基础测绘或土地调查口径,矢量化数据达不到同精度时,存在百分之几的差是正常的,不是数据彻底错了,图上标注数据来源和统计时间即可。
5.5 同一条国道在两个图层里被重复数字化
现象:道路层里有两条路径几乎完全重合,路网规划、最短路径分析时,道路数量统计比实际多一倍。
原因:数据整理时合并了不同来源的数据,同一道路既存在于基础道路层,又存在于专题道路层,没有做去重。有些还是因为数字化时沿线走向绘制了两遍。
解决:在QGIS中先把道路层按距离做缓冲合并,然后做去重复几何操作。实际工作流我会先做拓扑检查,在Processing里用有效性检查找出重叠的路段,再按道路等级优先级删除低等级副本。如果是同图层重复,直接用QGIS的「删除重复几何」按道路中心线去重。注意去重前备份,避免误删同名不同线的真实道路。
6. 最后的检查清单:六个步骤验完一套矢量数据
数据可以不用,但验数据的流程不能省。这套六步法,花十五分钟就能把一套矢量数据的健康度摸清楚。
第一步,确认文件成套性。按.shp/.dbf/.prj/.cpg逐个图层check,count一次,缺文件就拉警报。第二步,加载后看要素数。QGIS状态栏会显示要素总数,对比压缩包内附的属性统计或说明文档,数量级不对就要排查。第三步,坐标系核对。读.prj,在QGIS里打开图层信息确认CRS描述,与预期不符就立刻处理。第四步,属性字段统计。右键图层→打开属性表→字段统计,重点看NULL值比例和字段值分布。第五步,几何拓扑检查。用Processing里的「修复几何」(Fix geometries)跑一遍,观察修复数量。第六步,抽样叠图。把道路层叠加到影像底图,随机看5到10个位置,确认道路中心线与影像对齐,这一步能发现前面所有步骤都漏掉的坐标加密或偏移。
这六步里,第六步最容易遗漏,因为地图上「看起来能用」,实际上藏着几百米的偏移。我一般会在QGIS里用半透明符号把道路叠到影像底图上,挑几个路口和桥梁位置逐点比对。再配合控制台命令快速确认图层元信息:
# QGIS Python控制台:输出当前图层要素数、几何类型与CRS layer = iface.activeLayer() print("要素数:", layer.featureCount()) print("几何类型:", layer.geometryType()) print("CRS:", layer.crs().authid(), layer.crs().description())这段代码的价值在于:没打开属性表的情况下,一条命令同时确认了要素数、几何类型、坐标系三个关键信息,比人工点菜单快得多。从那以后,我每次拿到类似「江苏省矢量地理数据」这样的资源包,都会强制走一遍这个检查清单,不因为数据看着完整就跳过坐标和拓扑验证。毕竟出图翻车砸的是交付时间,希望帮到你。
本文还有配套的精品资源,点击获取