简介:《城乡规划GIS应用技术指南》是一份面向城乡规划专业学生、规划师及相关从业者的完整技术资料包,聚焦GIS在规划实践中的实际应用,覆盖从基础理论到专项分析的常用场景。压缩包整体约450MB,内部按章节组织,便于按需查阅;虽然具体文件清单未展开,但内容模块清晰,适合需要系统掌握GIS操作并完成规划分析任务的读者。目前已有3010人学习下载,是业内常见的工具型学习资料。指南围绕空间数据获取与处理、土地利用规划、交通规划、环境影响评价与灾害风险分析、社区与公共服务设施选址等主题展开,能够帮助读者理解GIS基础架构与数据管理,掌握遥感图像解析、坐标转换、拓扑修复等实操技能,并学会将数据建模与决策支持方法应用到真实的城乡规划项目中。通过分章学习,读者既能补齐软件操作短板,也能建立从数据到决策的完整分析思维,提升规划工作的科学性和实施效率。
1. 城乡规划GIS应用技术指南:从项目包到一张能落地的规划图
打开一个名为「城乡规划GIS应用技术指南.zip」的压缩包,里面通常不是一套软件安装包,而是一条完整的工作链路:底图怎么统一坐标、地块边界怎么核验、面积怎么汇总成用地平衡表、生活圈怎么算、管理单元图纸怎么批量出、成果怎么打包交付。城乡规划场景下的GIS,和通用GIS最大的区别在于它要为地块、指标、公示和审查负责,所以最有价值的不是按钮和渲染效果,而是数据口径与分析逻辑。这套流程适合两类人:规划院里需要自己动手处理数据的规划师,以及刚接规划项目的GIS数据处理或开发工程师。新手可以照着步骤把CAD底图做成带坐标系、有属性、能分析、能出图的成果;熟手可以直接对齐坐标系选择、拓扑规则和交付格式这些平时最容易返工的边界。
2. 坐标与套合:城乡规划GIS技术在底图处理阶段的两个基本功
2.1 为什么CAD转GIS之后总是偏:坐标系和单位先统一
CAD图纸在规划项目里最常见的两种形态:一是地方独立坐标系的毫米图,二是沿用西安80或北京54旧控制点的图纸。GIS软件默认按WGS84或CGCS2000去理解坐标,坐标系和单位不一致,图就会偏移到完全不相干的位置,这不是操作失误,而是数据定义没对齐。
第一步是确认CAD单位。在AutoCAD里执行UNITS命令,看插入比例是毫米还是米;第二步是找到图上至少两个已知控制点坐标,和规划部门给定的标准坐标对比,判断到底是独立坐标系还是国家坐标系。只有把这两件事确认完,才可以动手做转换或配准。
2.1.1 从西安80转到CGCS2000:EPSG参数怎么选
以陕西西安80坐标系、3度带、中央经线114°E的数据为例,对应EPSG:2383;要转到的目标是1200国家大地坐标系3度带高斯-克吕格投影,中央经线同样是114°E,对应EPSG:4547。如果项目区域正好在带号覆盖范围内,直接指定这两个EPSG编号即可,不需要手工拼投影参数。
# 查看现有矢量数据的坐标系信息 ogrinfo -so land_2022.shp land_2022 # 从西安80 3度带转到 CGCS2000 3度带,中央经线114E ogr2ogr -s_srs EPSG:2383 -t_srs EPSG:4547 land_2022_114.shp land_2022.shp-so表示只读取数据集的元数据,不加载全部要素,检查坐标系结构时速度快且省内存。-s_srs是告诉GDAL源数据的坐标系,在shp文件缺少.prj文件时尤其有用,光靠文件本身的坐标数值无法判断投影,必须由这个参数补齐。-t_srs是输出目标坐标系,转换完成后GDAL会自动生成配套的.prj文件,后续在QGIS或ArcGIS里打开就不会再问“未知坐标系”。
如果源数据是独立坐标系,没有对应的EPSG编号,常见做法是先用控制点做配准。配准的原理是选择图上已知坐标的点位,让软件通过多项式拟合计算出整张图的坐标变换关系,适用于无法从CAD内部直接读取坐标系定义的情况。
2.2 用QGIS做矢量底图与影像配准:操作参数怎么设
加载一张没有地理参考的规划扫描图或CAD导出图,在QGIS菜单里找到“栅格→配准→地理配准器”,这是处理这类文件最常用的入口。添加影像后,逐点添加控制点,每个控制点需要同时填写图上坐标和真实坐标,真实坐标可以从测绘控制点成果表或者天地图的在线底图上读取。
变换类型的选择有讲究。控制点数量在15个以内时,一次多项式(Linear)通常够用;控制点超过20个,改用薄板样条(Thin Plate Spline),它能更好地处理扫描件因纸张伸缩产生的局部变形。重采样方法选“最近邻”还是“双线性”,看配准对象:土地利用分类图这类离散栅格选最近邻,避免插值出不存在的地类;遥感影像或地形图选双线性,视觉效果更平滑。
输出坐标系建议直接写成项目带号对应的CGCS2000高斯投影,而不是先配准成WGS84再转换一次。坐标转换的次数越多,累积误差越不可控,一步到位能减少后续反复对图的成本。
2.3 Excel坐标表转点:解决“gis坐标转点”最常见的两种数据形态
规划调研阶段经常拿到Excel统计表,里面是地块编号、X坐标、Y坐标,没有几何图形。转成点要素有两种常用做法。
第一种是QGIS界面操作:菜单“图层→添加图层→添加分隔文本图层”,文件格式选CSV或自定义分隔符,X字段设为表中的东坐标列,Y字段设为北坐标列,几何类型选点,坐标系选EPSG:4547。这里最容易出错的是把X和Y填反,GIS里的坐标对是(X,Y)对应图上水平X、垂直Y,而测绘数据常见的是先写Y(北坐标)再写X(东坐标),导入前先看几个点的落位,确认方向正确再继续。
第二种是命令行方式,适合批量处理几十个csv文件:
ogr2ogr -f "ESRI Shapefile" points.shp points.csv \ -oo X_POSSIBLE_NAMES=lon -oo Y_POSSIBLE_NAMES=lat \ -a_srs EPSG:4547-oo参数是传给CSV驱动器的开放选项,X_POSSIBLE_NAMES=lon表示从表头中名为lon的列读取X坐标,Y_POSSIBLE_NAMES=lat同理读取Y坐标。如果表头是中文的“横坐标”“纵坐标”,就把参数值改成对应的中文列名。-a_srs用于在输入数据没有坐标系字段时,直接给结果打上目标空间参考,省去后续再定义坐标系的步骤。
这段做完之后,如果发现点图层无法复制粘贴到另一个图层,常见原因是源图层和目标图层的坐标系定义不一致,或几何类型一个是点、一个是多点。后面第4章会专门说入库时的图层组织问题,这里先记住:坐标系定义是复制粘贴操作能否成功的前提。
3. 空间核验与分析:城乡规划GIS应用里绕不开的六类操作
3.1 面积、平衡表与气泡检查:Excel复核不出来的误差
用地平衡表是规划方案审查中最基础的一项。用GIS算面积看起来简单,但如果坐标系或计算方法选错,几千公顷的规划区可能差出几个百分点。QGIS字段计算器里有area()和$area两个函数,area($geometry)返回的是要素在投影平面上的面积,$area在项目坐标系为投影坐标时返回椭球面积。规划管理实践中以投影平面面积为准,因为它对应图纸上的量算尺寸,和CAD里的面积数字口径一致。
地块面积算完,紧接着就是汇总成平衡表。每次都在QGIS里手动分组求和效率太低,SQL方式更适合反复核对:
SELECT land_code, sum(st_area(geom)) / 10000 AS area_ha FROM land GROUP BY land_code ORDER BY area_ha DESC;这段SQL在QGIS的数据库管理器中可以直接对shp图层执行。st_area(geom)按米为单位返回面积,除以10000换算成公顷,GROUP BY land_code把同一用地代码的碎斑合并统计,ORDER BY area_ha DESC让面积最大的用地类型排在最前,便于一眼看出方案的主导功能。
按用地代码汇总之后,面积总和与规划范围总面积对不上是常态,常见原因是相邻地块之间存在重叠或缝隙,肉眼在屏幕上看不出来,但面积计算时会被重复计入。下一步用气泡检查定位异常:在属性表里按面积字段降序排列,逐个检查面积异常大的地块;再叠加范围边线,确认是否有地块超出规划边界。
3.2 15分钟生活圈与网络分析:交叉口等候时间要单独建模
“GIS 生活圈分析”是规划项目里的高频需求。很多方案拿服务设施点做半径缓冲,画一个圆形范围当生活圈,这在成果汇报时可以看个大概,但落到设施布点评估就不够严谨,必须用路网做网络分析。15分钟生活圈的基准是步行速度,通常取4.8公里/小时,即每分钟80米,这是《城市居住区规划设计标准》推演慢行出行时常用的取值。
用pgRouting做路网分析,关键是成本建模。先给每条路段算步行时间:
UPDATE edges SET cost = st_length(geom) / 1000.0 / 4.8, reverse_cost = st_length(geom) / 1000.0 / 4.8;st_length(geom)以米为单位,除以1000转成公里,再除以步行速度4.8公里/小时,得到的是步行通过该路段所需小时数。路径规划算法比较的是cost字段数值的大小,reverse_cost是反向行走的成本,无向路段两条成本保持一致即可。
交叉口等候时间不体现在路段长度里,处理方式是在转向成本中增加等待。pgRouting的pgr_dijkstra只识别边成本,适合的做法是给交叉口生成虚拟转向边,或者把信号交叉口附近的短路段补偿一段额外时间。更直接的做法是,把路网在交叉口打断后,对连接线段的端点做成本加成。现实中每个交叉口的信号周期不同,统一取30至60秒的单次通过等待时间作为初期参数,比完全不考虑红绿灯更接近实际。“gis网络分析如何设置交叉路口等候时间”这个问题,答案就是把等待转化成边的扩展成本,而不是试图在几何点位上直接挂耗时属性。
3.3 叠加、提取中心线与双标注:把规划意图变成可核对的图面
3.3.1 叠加分析用union还是intersect
用地规划中经常要做多方案叠加核验,比如现状地类与规划地类的冲突区、三区三线划定后的矛盾图斑。union保留所有输入要素的全部边界,输出结果包含相交区域和各自独立的部分;intersect只输出要素重叠的区域,外部被舍弃。
| 操作 | 输出内容 | 适用场景 | 数据量特征 |
|---|---|---|---|
| union | 全部面及相交切分 | 生成土地利用现状与规划对照总表 | 图斑数量成倍增加 |
| intersect | 仅重叠区域 | 找出生态红线与建设用地的冲突图斑 | 结果集相对较小,便于核查 |
| erase | 被移除区域之外的剩余要素 | 扣除水域后的可建设用地面积统计 | 保留源数据属性结构 |
查重叠冲突图斑的SQL写法,在PostGIS或DuckDB Spatial里都类似:
SELECT a.fid AS aid, b.fid AS bid, st_area(st_intersection(a.geom, b.geom)) AS inter_area FROM land_plan a JOIN land_plan b ON st_intersects(a.geom, b.geom) WHERE a.fid < b.fid AND st_overlaps(a.geom, b.geom) AND st_area(st_intersection(a.geom, b.geom)) > 1;a.fid < b.fid用来避免同一对图斑被统计两次;st_overlaps要求两个面存在内部重叠而不是仅共享边界,能把共边的正常相邻地块排除掉;最后一行把相交面积小于1平方米的微缝过滤掉,只保留真正需要人工核对的冲突斑块。
3.3.2 提取缓冲区中心线与双标注
廊道类规划里经常需要把缓冲区转成中心线,比如河流绿带的管控边界转骨架线。QGIS里可以用“处理工具箱→SAGA→Shapes to Lines”里的骨架化算法,或者用Voronoi图提取中轴线。实际操作时,骨架化结果会有大量细枝末节的分支,需要在后处理时设置最小长度阈值,把短于50米的毛刺去掉。
图面上同时显示地块编号和用地代码,是出图时的常见需求,对应“gis怎么显示两个标注”的检索意图。不要在图层上硬做两次独立标注,而是合并成一个标注表达式。QGIS的标注属性里选择“基于表达式”,写入:
concat("地块编号", '\n', "用地代码")ArcGIS里则是打开标注表达式,用"地块编号" & vbCrLf & "用地代码"。\n和vbCrLf都表示换行,输出效果是两行文字互相独立,字号可以分别通过富文本设置微调。多个属性字段混合标注时,先检查字段类型是否一致,数字字段需要先转成字符串,避免表达式报错。
4. 入库、质检与批量出图:城乡规划GIS成果交付之前的三个关卡
4.1 从shp堆到File Geodatabase:解决图层“复制了不能粘贴”的图层管理问题
一个中大型规划项目落地时,几十个shp文件堆在一个文件夹里是常态:道路、地块、水域、设施点、管控边界层层叠加。shp格式本身有诸多限制,字段名长度限制10个字符、属性表不支持复杂数据类型、没有拓扑规则约束。项目收口阶段,我一般会把全部shp导入到File Geodatabase或GeoPackage统一管理。
“gis复制了不能粘贴为什么”这个问题,在这一阶段暴露得最明显。复制失败的原因主要是三个:目标数据集的坐标系与源图层不一致、几何类型不匹配、数据源处于只读状态。其中最常见的是坐标系问题,File Geodatabase中的要素数据集一旦设定了坐标系,内部所有要素类都必须与之匹配,直接粘贴一个不同坐标系的数据会被拒绝。解决办法是先用“重投影图层”把源数据转换到目标坐标,再执行复制粘贴。
用PyQGIS做批量导入的脚本骨架:
from qgis.core import QgsVectorFileWriter, QgsProject layer = QgsProject.instance().mapLayersByName("land_plan")[0] options = QgsVectorFileWriter.SaveVectorOptions() options.driverName = "FileGDB" options.layerName = "land_plan" error = QgsVectorFileWriter.writeAsVectorFormatV3( layer, r"E:\planning\result.gdb", options)driverName指定输出格式为FileGDB;layerName是写入要素类的名称;writeAsVectorFormatV3输出时默认沿用源图层的坐标系,不需要额外指定。如果源数据坐标系比较杂乱,建议在导出之前先用QgsCoordinateReferenceSystem明确目标坐标系,避免入库后才发现坐标系不统一。
4.2 拓扑核查与属性约束:入库前要挡住8类错误
规划成果入库前做拓扑检查,是避免后面反复返工的关键。面图层最容易出现的问题是地块重叠、地块间存在缝隙、碎面、自相交,这些错误在普通视图下肉眼很难发现。QGIS的拓扑检查器插件能直接处理shp图层,GeoPackage则支持通过SQL写约束。
| 错误类型 | 检查方法 | 修复方向 |
|---|---|---|
| 重叠面 | 拓扑规则“不能有重叠” | 找出来后手动切分或合并 |
| 面间缝隙 | 拓扑规则“不能有间隙” | 边界捕捉对齐后重新融合 |
| 自相交 | 几何有效性检查 | 用v.clean或修复几何工具处理 |
| 属性值超出范围 | 字段约束 | 按用地代码表核验更新 |
| 坐标超出规划边界 | 边界包含检查 | 重新裁切或修正范围线 |
用SQL检查重叠图斑是另一种可靠手段,适合批量处理入库后的要素类,代价是需要数据库或DuckDB Spatial支持空间函数。
SELECT a.fid, b.fid, st_area(st_intersection(a.geom, b.geom)) AS overlap FROM land_plan a JOIN land_plan b ON st_intersects(a.geom, b.geom) WHERE a.fid < b.fid AND st_area(st_intersection(a.geom, b.geom)) > 0.5;输出结果逐对照表,人工逐个确认是真实重叠还是共边误报。0.5平方米阈值用来过滤掉边界捕捉误差产生的微缝,这类微小交叠在自动处理时可以忽略,但面积超过1平方米的重叠必须处理,否则后续用地平衡表统计会重复计面积。
4.3 用PyQGIS批量出图:52个管理单元一次跑完
“gis怎么批量出图”在规划院是刚需。一个控规项目动辄几十个管理单元,每个单元要出一张现状图和一张规划图,手动逐张导出既慢又不稳定。批量出图的前提是有一张配置好的打印布局,地图框、图例、比例尺、指北针都摆好,然后把地图框的主题按要素逐个切换。
核心逻辑是遍历目标要素类,把每个要素的边界范围传给布局中的地图框,再导出PDF:
from qgis.core import QgsProject, QgsLayoutExporter layout = QgsProject.instance().layoutManager().layoutByName("规划图") map_item = layout.itemById("Map 0") for feature in land_plan.getFeatures(): rect = feature.geometry().boundingBox() rect.grow(rect.width() * 0.1) map_item.zoomToExtent(rect) exporter = QgsLayoutExporter(layout) exporter.exportToPdf(f"unit_{feature['fid']}.pdf", QgsLayoutExporter.PdfExportSettings())zoomToExtent设置地图框的显示范围,grow把范围向外扩大10%,防止地块要素顶到图框边缘影响美观。出图前确认布局名称和地图框item名称和脚本里写的一致,拼错任何一个名称脚本都会静默跳过或直接报错。图例如果是按图层自动生成,所有图斑都会列出来,建议在布局里固定图例内容,只保留规划图例的可见图层,避免每张图都带着全部图层条目。
5. 把整包成果按zip交付:一套城乡规划GIS数据包的打包与自检方法
5.1 压缩包结构约定:数据、元数据、日志三者齐放
成果打包阶段,常见的做法是把GDB或GeoPackage、制图模板、坐标系说明、质检日志放在同一个zip包内,目录层级不要超过三层,避免接收方解压后到处找文件。shp文件打包时要连shx、dbf、prj一起带上,少任何一个文件,GIS软件都会报打不开或字段缺失。
tree -L 2 城乡规划GIS应用技术指南/输出结果能直观看出包内结构。压缩成zip后,如果接收方反馈文件打不开,先检查是否是分卷zip的问题。网上下载的z01文件是分卷压缩包的一部分,不能单独改后缀强行解压。正确合并方式是:
zip -s 0 城乡规划GIS应用技术指南.z01 城乡规划GIS应用技术指南.zip-s 0表示把分卷合并成单一zip文件。执行前确保所有分卷在同一个目录,且原始zip文件也在,合并完成后用unzip -t测试完整性。Lottie或Android开发场景中常见的“invalid zip archive: could not find eocd”报错,本质就是分卷缺失、文件被截断或伪装成zip的普通文件,EOCD标记在文件末尾读不到,解压工具就无法确定目录索引位置。
5.2 不用口令,用校验和:zip包完整性怎么验证
规划成果包不建议加访问口令。成果要用于公示、审查和归档,口令往往在机构交接时变成障碍,而且zip的加密口令对内部流转几乎起不到真正的权限控制作用。比设密码更可靠的做法是同时发布校验和,接收方解压时独立计算比对,能识别文件在传输中是否被篡改或损坏。
sha256sum 城乡规划GIS应用技术指南.zip > 城乡规划GIS应用技术指南.zip.sha256sha256sum按内容计算哈希值,和文件本身大小无关,源文件有任何字节变化,校验和对不上。发布方把.sha256文件和数据包分开发给接收方,接收方执行sha256sum -c 城乡规划GIS应用技术指南.zip.sha256,输出“OK”表示校验通过。
5.3 交付前最后一道自检:校验脚本检查EOCD与文件逐一核对
手工检查zip包里的文件是否齐全,容易漏掉。用一段Python脚本替代人工,把必需文件清单写死在检查逻辑里,每次交付前跑一遍:
import zipfile, hashlib, sys REQUIRED = ["guide/land_plan.gpkg", "guide/road_line.gpkg", "guide/README.md", "guide/quality_check.log"] def check_zip(path): try: zf = zipfile.ZipFile(path) except zipfile.BadZipFile: print("FAIL: 文件不是有效的zip包,EOCD标记缺失或截断") sys.exit(1) names = zf.namelist() missing = [f for f in REQUIRED if f not in names] if missing: print("FAIL:", missing) else: print("PASS: 所有必需文件在包内")脚本只依赖Python标准库,不引入第三方依赖,任何机器都能直接跑。BadZipFile对应解压时“could not find eocd”一类报错;namelist()列出zip内全部文件路径,与REQUIRED逐项比对。把这份核验脚本存成check_delivery.py,加进每次交付前的固定动作里,检查的不只是压缩包能打开,更是包里该有的东西一样不少。
本文还有配套的精品资源,点击获取