简介:包含浙江省省、市、县三级行政区划面状边界,以及道路网、铁路网线状要素,满足从省级宏观到县级微观的多尺度表达需求;面向GIS空间分析与地图制图场景,适合城乡规划、交通物流、地理信息等领域的从业者与学习者使用。压缩包共33个文件,以.shp存储几何图形、.dbf存储属性数据、.prj记录投影坐标信息,并配有.shx几何索引、.sbn/.sbx空间索引及.xml元数据,可在ArcGIS、QGIS等桌面GIS软件中直接加载,支持边界裁剪、叠加分析、专题图制作等操作。资源包大小约52.15MB,已有2553人学习下载。省、市、县边界分层存储,道路与铁路分类独立,便于按行政级别或交通类型灵活选取;属性表中含名称、编码等关键字段,可快速定位目标区域,辅助完成区域统计、路网分析、地图出版等实际工作。
1. 这套省域底图能帮你省掉哪些事
做GIS数据处理的人都有这种体会:真正卡时间的不一定是分析算法,而是底图。边界不对、路网缺失、字段乱码,哪一样都能把一个下午耗掉。这份2022年7月的shp压缩包,把浙江省省、市、县三级行政区划边界和道路网、公路网放在了一起,拿到就能直接当画布用。我自己在处理区划统计、道路现状梳理或者专题制图时,最常用的就是这类统一版本的基础数据。适合GIS、规划、数据分析岗,也适合想快速出一张可用底图的新手。如果你只是临时画一张示意图,它有点重;但只要涉及空间统计、相交计算、出图打印,这套数据的价值就很直观。
2. shp包里到底装了什么:图层与字段的第一次确认
2.1 解压后先别急着拖进软件,先按文件组核对
很多新手第一次接触shp,以为一个.shp文件就是一个完整数据,这其实是踩坑的开始。shp是一种由多个同名文件共同组成的矢量格式,至少需要.shp(几何)、.dbf(属性)、.shx(索引)三个文件才能正常打开,.prj(坐标系)虽然不是必需文件,但缺失会直接导致后面坐标对不上。
解压这套包后,我的习惯是先看一眼每个图层的文件组是否完整,重点确认.prj在不在。之前接过一份类似的省域边界数据,.prj被人为删掉过,打开后图层落在赤道附近,完全没法用。.prj本身是纯文本,用记事本打开就能看到坐标系描述,比如常见的GCS_WGS_1984或CGCS2000。
用pyshp读取一个图层的属性结构,是安装依赖最少的一种确认方式:
import shapefile # 注意替换成你解压后的实际路径 sf = shapefile.Reader("city.shp") # sf.fields第一项是DeletionFlag,实际字段从第二项开始 fields = sf.fields[1:] print([f[0] for f in fields]) # 查看第一条记录的属性值 print(sf.record(0))这段的作用是快速列出dbf里的字段名,判断数据里有没有名称、区划代码、类型等关键信息。pyshp读取时默认按UTF-8解析,如果字段或内容出现乱码,可以在Reader里加上encoding="gbk"参数,这一点第4章会细说。
2.2 省、市、县三级边界不是简单放大缩小
这套包里最核心的区划数据分了三级:省级边界、地级市边界、县级边界,每一级在项目里的用途完全不同。省级边界适合做整体范围裁剪,市边界适合做区域统计,县边界则是空间连接和里程统计的基本单元。
同一份省域数据里,三级边界在几何上往往是包含关系,但在实际使用中不能直接拿来做空间裁剪。比如用县边界去切割道路网,得到的线要素会保留县级边界内部的路段,这个没问题;但如果你拿县边界和市边界做相交计算,会发现边界重叠处出现拓扑不一致,因为不同来源的边界在接边处本来就有微小偏移。
看待这份数据时,我建议把它拆成两类看待:区划面图层用来做统计和配色,区划边界线图层用来出图时压边线。两者符号化参数不同,加载顺序也不一样,后面第3章会展开。
2.3 道路网和公路网放在一起时怎么分辨
这个包里同时包含道路网和公路网两类线图层,听起来重复,实际上用途差异很大。道路网更偏向全部可通行道路的集合,往往包含城市道路、乡村道路、连接线这类较低等级的路段;公路网则通常聚焦国道、省道、县道这类干线公路。做路网密度分析、可达性计算,一般优先用道路网;做干线规划展示、公路里程统计,则用公路网更贴合口径。
两个图层叠加后,在比较密的城区会看到大量重合或平行的线,这不算数据错误,而是采集来源不一致。判断方式是打开属性表,看等级或类别字段,比如高速、国道、省道、县道、乡道这类分级。不同来源的数据对字段命名差异较大,常见的有class、type、grade、road_level,拖进QGIS后先看一眼字段值分布,再决定按哪个字段做符号化。
3. 让数据在QGIS里跑起来:加载顺序、坐标系与基础出图
3.1 打开前先确认坐标系:避开动态投影的假象
QGIS打开shp时,如果图层没有.prj文件,会弹窗让你选坐标系。很多人随手选了一个WGS84,图层能显示,但叠加在线影像上位置偏了上百米——这不是数据错了,而是坐标系选错了。
正确做法是先用文本编辑器打开.prj文件看坐标系字符串,再在QGIS里设置。如果省或市边界的.prj写的是CGCS2000相关的字符串,那这个图层本身就该按CGCS2000加载,不要在弹窗里乱选。还有一种情况是.prj存在,但坐标系和实际数据不匹配,比如数据明明是投影坐标系,.prj却写成了地理坐标系。这种情况靠打开后的变形状态能看出来:面要素压扁、角度扭曲,通常就是坐标系声明和实际投影不匹配。
没有.prj时,可以根据要素范围大致判断。浙江省的经纬度范围在东经118°到123°、北纬27°到31°附近,如果加载后图层落在这个范围内,大概率是经纬度坐标;如果数值变成一大串米制数字,则是投影坐标。
3.2 加载顺序与符号化:先底后线、先面后界
QGIS里加载这套数据,我建议按这个顺序拖入:县级边界 → 地级市边界 → 省级边界 → 公路网 → 道路网。先加载面图层作为底色,再叠加边界线,最后放路网,这样路网不会被区划面盖住。
符号化的参数直接关系到出图是否能用,我常用的参数是:县级边界填充色设成浅灰(#eeeeee),透明度25%,边界线宽0.3mm;市级边界不填充,边界线宽0.5mm,用深灰色;省级边界线宽0.9mm,用黑色。公路网按等级分色显示,高速用红色、线宽0.8mm,国道用橙色、0.6mm,省道用黄色、0.4mm,其他道路用深灰色、0.3mm。
标签设置上,县级名称用8号字、半透明黑,市名用10号字加粗,省名一般不在市级比例尺下显示。如果不需要文字遮挡太多路网,可以只显示县名和高速名称。QGIS里对每个图层右键 → 属性 → 符号化,就能做上述配置。
3.3 坐标系统一:用ogr2ogr做原地转换
多图层一起分析时,坐标系必须统一。QGIS的画布可以实时重投影,显示看起来没问题,但做空间计算时,如果两个图层坐标系不一致,结果会完全错误。我一般不用QGIS界面里的“另存为”去做批量转换,命令行工具ogr2ogr更可控。
把源数据从CGCS2000地理坐标系转到WGS84,常用命令如下:
ogr2ogr -f "ESRI Shapefile" output.shp input.shp \ -s_srs EPSG:4490 -t_srs EPSG:4326 \ -overwrite -lco ENCODING=UTF-8-s_srs是输入坐标系,-t_srs是目标坐标系,EPSG:4490对应CGCS2000地理坐标系,EPSG:4326对应WGS84。注意这一步是把几何坐标真正重写,不是临时投影显示。-overwrite允许覆盖输出文件,-lco ENCODING=UTF-8则让输出的dbf属性用UTF-8保存,减少后面乱码概率。
如果要把数据转成投影坐标系再做距离计算,可以把-t_srs改成EPSG:3857(Web墨卡托)或者适合浙江的CGCS2000 / 3-degree Gauss-Kruger CM 120E(EPSG:4513附近,按实际需求选)。决定用哪种坐标系,取决于你是要出图还是算距离。算长度和面积建议投影坐标系,经纬度坐标算出来的距离单位是度,没有实际意义。
4. 避坑记录:编码乱码、边界错位与路网断头的现场排查
4.1 属性表打开全是乱码
现象:在QGIS里打开某个区县级边界的属性表,字段名正常,但名称列显示“锟斤拷锟斤拷”这类乱码。
原因:shp的属性存储在.dbf文件里,国内能下载到的数据大多按GBK或GB2312编码保存,而QGIS新版默认按UTF-8解析,两边对不上就会出现乱码。反过来也遇到过,数据是UTF-8,旧工具按GBK读,同样乱。
解决:图层上右键 → 图层属性 → 数据源 → 数据源编码,手动改成GBK或GB18030,应用后重新打开属性表。如果是命令行处理,pyshp可以在读取时指定编码:
import shapefile # 用gbk编码读取dbf,遇个别无法解析字符时用替换符兜底 sf = shapefile.Reader("county.shp", encoding="gbk", encodingErrors="replace") for i in range(3): print(sf.record(i))这里关键参数是encoding和encodingErrors。前者告诉pyshp按GBK解码,后者避免某个特殊字符解不了导致整个读取中断。读取正常后再导出成UTF-8编码的新文件,之后在QGIS里就不会再有乱码问题。
4.2 区划边界与在线影像对不上
现象:叠加在线底图后,道路或边界整体偏移,轻的差几十米,重的漂移几百米。
原因:绝大多数情况是.prj缺失或坐标系选错。另一种隐蔽情况是.prj写的坐标系没写错,但数据生产时套用的是GCJ-02等偏移坐标系统。浙江省这类行政区划数据一般来自测绘或地图服务商的底图,如果套的是偏移坐标系,会和WGS84影像差出上百米。
解决:先排除最简单的情况——右键图层看坐标系,确认和在线影像一致。如果一致性没问题但仍有偏移,检查.prj内容是否带有投影参数偏移。手里只有shp时,可以尝试用已知地物坐标点做配准,但更实际的做法是找原始数据来源确认坐标系,不要硬纠偏。对大多数制图场景来说,只要边界和路网来自同一个包、坐标系一致,内部空间关系就是准确的;只有叠加外部影像时才需要考虑配准。
4.3 两条路明明交叉却没有交点
现象:做网络分析或取道路交叉点时,发现两条道路在图面上看着相交,但软件里取不到交点。放大看,两条线差了两三米甚至更小的一段距离。
原因:不同图幅单独数字化,拼接时没做拓扑咬合;或手绘时没开捕捉。这个情况在路网数据里太常见了,不是这套包独有,几乎所有路网都逃不掉。坐标精度越高越容易暴露这类拓扑问题。
解决:QGIS里装Topology Checker插件,规则选“不能有悬挂点”,跑一遍会把断头位置标出来。再配合GRASS的v.clean工具,设置snap阈值为1米甚至更小,把靠近未相交的端点捕捉到一起。用代码排查的话,可以写一段找出“距离很近但没有相交”的线对:
import shapefile from shapely.geometry import LineString sf = shapefile.Reader("road.shp") lines = [LineString(s.points) for s in sf.shapes()] # 阈值按数据坐标系单位来,经纬度数据建议先转投影 threshold = 0.001 for i, la in enumerate(lines): for j, lb in enumerate(lines): if i >= j: continue # 已经相交的说明拓扑没问题,跳过 if la.intersects(lb): continue d = la.distance(lb) if d < threshold: print(f"line {i} and line {j}: distance={d:.4f}")这段复杂度是O(n²),几万条线跑起来会很慢,实际用的时候可以先用空间索引过滤候选对。重点在于理解判断逻辑:先排除相交,再判断最小距离是否小于阈值,小于阈值就是疑似断头。
4.4 行政区划版本与业务库对不上
现象:做区县维度统计,业务库里的区划代码和shp属性表join不上,某几个县找不到对应记录。
原因:行政区划会随年度调整,撤市设区、县改区、乡镇撤并都会影响代码和边界。2022年7月这个版本,反映的是当时时点的区划状态,和更早或更晚的业务数据对不上很正常。
解决:先确认业务表里用的是什么时点的区划代码,再看shp属性表里的区划代码字段。如果代码只是个别尾号差异,可以用名称字段做模糊匹配过渡;如果差异很大,说明业务数据时点和底图版本跨度太大,最稳妥的方式是换一套和业务数据同年份的区划边界。
5. 让底图真正跑起来:空间连接、里程统计与专题出图
5.1 用空间连接给每个县算一遍公路里程
拿到这套数据后最高频的需求,是把公路网里程按县级行政区汇总。这里不能直接用属性表里已有的长度字段,因为长线道路会横跨多个县,需要在相交点上打断再归并。用geopandas来做,代码很直接:
import geopandas as gpd county = gpd.read_file("county.shp") road = gpd.read_file("highway.shp") # 统一坐标系,单位不一致时算出的长度是错的 if county.crs != road.crs: road = road.to_crs(county.crs) # 按面相交关系连接 joined = gpd.sjoin(county, road, how="left", predicate="intersects") # 每条线段长度转成公里 joined["seg_len_km"] = joined.geometry.length / 1000 # 按区划代码分组汇总 mileage = joined.groupby("PAC").seg_len_km.sum().reset_index() # 回填到区划面 result = county.merge(mileage, on="PAC", how="left")关键参数留意两点:一是predicate="intersects"会被跨越多县的公路重复记录到多个县,这正是我们需要的行为;二是计算长度前必须确认坐标系。如果数据还在地理坐标系,先投影到米制坐标系,否则长度单位是度。分组字段建议用PAC这类区划代码,不要用名称,名称在不同表里可能有空格或简称差异。
5.2 一张能直接用的路网专题图
空间统计做完,最后就是出图。在QGIS打印布局里添加地图、图例、比例尺,县级边界透明度设到60%,公路按等级给不同线宽和颜色。比例尺放到1:50万左右时,能同时看到省界和主要路网;放到1:10万时,县界和县道及以上等级道路都能显示清楚。图例会覆盖在路网密集区域,建议把图例背景设为白色半透明,避免遮挡道路。
输出格式上,导出为PDF或300dpi的PNG都可以。PDF适合后续编进汇报材料,PNG适合直接贴进文档。
我在处理某次区划底图时,因为直接拿了旧版县级边界去叠加当时的新路网,里程统计整体偏了几个百分点,排查了半天才发现是边界版本不一致导致的。从那以后,我每次处理这类行政区划底图,都强制先清点一遍图层、核对一次坐标系和版本月份,再做任何操作。这套2022年7月的省域shp包,边界和道路是同一时点产物,直接拿来当底图能省去不少凑数据的功夫,希望帮到你。
本文还有配套的精品资源,点击获取