天地图与QGIS联合AI实现建筑物轮廓快速提取的实用路线

发布时间:2026/9/16 2:10:05
天地图与QGIS联合AI实现建筑物轮廓快速提取的实用路线 做GIS的人大概都遇到过这种临时任务项目还没立项预算也没批但领导已经把坐标范围甩到桌上要求三天内把区域内的建筑物轮廓提出来。手头正经高清影像没有高精度矢量缺一堆唯一确定能用的就是公开的天地图遥感影像以及那台装了QGIS的电脑。我接过不少这种活也折腾过从纯手工勾绘到深度学习模型辅助的各种方案这篇就把我目前认为最稳的一条技术路线写下来给需要在有限条件下快速出成果的朋友做个参考。先说结论天地图影像做底图、QGIS做编辑和质检、AI做候选轮廓预提取、人工做最终修正这套组合能覆盖大多数小范围的建筑物轮廓提取需求。它不是用来替代正规测绘成果的但在前期普查、项目预可研、应急排查、外业核查底图这些场景里完全够用而且效率能比“纯手工画图”高一截。1. 先想清楚这套方案到底能解决什么场景1.1 不要一上来就冲AI先看任务类型很多朋友听到“遥感影像提取建筑物”第一反应就是上深度学习但我建议先冷静一下。任务要求的精度和用途决定了用什么手段而不是工具越先进越好。如果你要出的是1:500房产测绘、确权登记这类正经界址成果那不管是用天地图还是用什么AI模型都不建议直接作为最终交付依据。因为天地图影像的时相、分辨率和几何精度都存在不确定性AI提取结果也只是“影像上看到的屋顶范围”不等于实际产权界线。这种任务该用无人机航测、精密控制点加专业采集流程不是这篇要讲的事。反过来如果你的任务是村域鸟瞰摸底、城市更新前期调查、灾后快速统计大概有多少栋房、或者给外业人员做一张核查底图那天地图加QGIS这套组合就是性价比极高的选择。我自己做过最典型的一次是一个乡镇范围的建筑分布初查范围不大但时间很紧甲方只要数量级正确、位置大概准、能把每栋建筑的参考边界画出来就行。这种情况下传统人工描一遍大约需要一整天配合AI预提取后大半天能交活而且人记得住每一处检查过的位置心里有底。1.2 整体技术路线把“影像-矢量-AI”串成一条流水线这套工作流不是某一个软件单独完成的而是一条相互衔接的流水线。我习惯把它拆成四段一是准备阶段。申请天地图密钥把影像正确加载进QGIS确认坐标系和显示层级必要时做影像增强。二是数据生产阶段。根据任务需要人工勾绘一批精度可靠的矢量轮廓作为“基准样本”这批数据同时也是后续AI训练的标签来源。三是AI辅助阶段。用AI模型在影像上预测建筑掩膜再把栅格掩膜转成矢量生成一批候选轮廓。四是质检修正阶段。人工在QGIS里逐屏检查AI结果删除误提、修正漏提、补齐边界最后做拓扑和属性统计。很多人会把“AI方案”理解成“全自动提取”这是个误区。现阶段除了少数条件极其理想的地区AI直接出图仍然会有漏检、粘连、边界锯齿等问题。真正稳定高效的用法是把AI当成一个“批量初绘员”让人从每栋都手画变成只在AI结果上做修改工作量能减少一大半。2. 准备工作把天地图影像稳定加载进QGIS2.1 申请天地图密钥和XYZ瓦片地址在QGIS里接入天地图影像本质上是把它当成一个在线瓦片服务来调用。天地图的开放平台支持WMTS协议你在官网注册开发者并申请个人密钥后会得到一个类似“tkxxxxxxxxxx”的参数这个参数要拼到瓦片请求地址里。我习惯在QGIS里通过“XYZ Tiles”方式加载操作很简单打开浏览器面板找到XYZ Tiles右键选择“新建连接”然后填下面这个地址。https://t0.tianditu.gov.cn/img_w/wmts?SERVICEWMTSREQUESTGetTileVERSION1.0.0LAYERimgSTYLEdefaultTILEMATRIXSETwFORMATtilesTILEMATRIX{z}TILEROW{y}TILECOL{x}tk你的密钥这里有几个关键点。一是LAYERimg表示影像底图如果只看影像不要注记到这一步就够。二是如果想让图上叠加地名和道路标注再建一个连接把URL改成LAYERcia同时注意把TILEMATRIXSET保持为w否则影像层和注记层很容易错位。三是t0可以换成t1到t7这样有多个子域名分摊请求压力批处理跑任务的时候不容易被限流。2.2 坐标系和显示层级不同“底图”别混着用天地图服务在URL里带“w”和“c”两种后缀对应不同的坐标系。带w的是Web墨卡托适合在QGIS里配EPSG:3857显示带c的是经纬度坐标适合配EPSG:4326或CGCS2000地理坐标使用。如果你在QGIS里用XYZ Tiles方式加载建议直接用_w系列不然会出现影像投影怪、加载位置偏移的问题。更需要注意的是成果矢量数据本身的坐标系。大多数项目最终都要求交国家大地坐标系或地方独立坐标而QGIS支持在线实时投影转换所以你完全可以让“底图显示”用EPSG:3857“矢量成果存储”用CGCS2000或当地高斯投影。但这要求你在新建矢量图层时就把坐标系设对不要等画完了再后悔。画完再重投影虽然也能做但经历过的人都知道边长、面积、角度的微小差异会带来一堆麻烦。无论是在线加载还是后期发布最好先确认你所在的行政区是否有大比例尺数据可以对照。天地图影像在放大到16到18级时大部分城镇区域的建筑物轮廓是能看清的但它的清晰度会随地区差异很大。有的城市能看清屋顶楼梯间有的片区到18级已经糊成一片。遇到后者就要在操作前做好心理准备必要时叠加其他时相影像辅助判断。2.3 影像显示优化看不清楚就画不好这个问题很多人忽略。QGIS默认加载天地图瓦片时显示效果不一定是最好的尤其是色调偏暗、对比度不够的时候建筑物边界和阴影混在一起肉眼很难分辨。我一般会选中影像图层打开图层属性里的“栅格渲染”设置把对比度增强方式改成“按需裁剪至1%-99%”或者“标准差拉伸2”同时根据影像亮暗适当调高亮度几档。这个操作不会改变影像原始数据只会改变显示效果但对人工勾绘的准确率影响很大。阴影重的区域还可以把“伽马值”微调到0.8到1.2之间很多被阴影遮住的建筑边线会变得清爽一点。另外建议开启QGIS的“地图级联缓存”。在图层右键菜单里设置合适的缓存大小缩放浏览时会更顺滑。你要是做长时间勾绘断网环境下也能继续看已经缓存过的区域这个细节在野外或内网办公时特别有用。3. 人工方案在QGIS里高效描出建筑物轮廓3.1 建图层、定字段、设样式在QGIS里人工勾绘第一步不是急着动手画而是把矢量图层建对。在“图层”菜单里选择“新建”“新建Shapefile图层”要素类型选“面”坐标系按前面确认好的成果坐标系来。字段尽量一次建全后面省得反复加字段。我常用的是这几项id自动编号用整数型。type建筑类型字符型比如住宅、厂房、棚房。floor层数整数型不知道就填-1或留空。source来源字符型标记是“人工”还是“AI”。remark备注字符型写特殊情况。图层建好后先做样式。描边颜色选饱和度高的黄色或品红色填充色用半透明的对比色这样叠在影像上最醒目。勾绘时建议把捕捉选项打开尤其是“捕捉到要素”“捕捉到节点”这样画相邻建筑时能精确共边后期做面积统计和拓扑检查会省很多事。3.2 实操勾绘技巧从“顺手”到“批量”说得直白点人工勾绘是个体力活但体力活也有技巧。我总结了几个能明显提速的点。第一个是善用“追踪”工具。QGIS的构建要素工具里有一个“沿现有要素追踪”选项当你画到已经画过的相邻建筑边时点一下追踪模式鼠标沿着已有边界滑动就能自动生成重合边。一栋挨着一栋的城中村区域这个功能能省掉大量重复描点。第二个是巧用高级数字化面板。画建筑物轮廓时很多屋顶转角是直角你不需要一个点一个点地精确点到位。开启高级数字化工具栏后画的过程中可以按C锁定垂直约束、按O锁定平行约束配合长度和角度输入能画出比较规整的直角轮廓。尤其对厂房、学校这类方正建筑速度非常快。第三个是画完必简化。手绘出来的多边形经常会有大量冗余顶点用QGIS的“简化”工具把容差设为0.5米到1米能在保持形状不变的前提下减少顶点数量。处理几千栋建筑时这个操作能让后续叠加分析、空间查询和拓扑修复都跑得更快。第四个是批量属性填充。画完一批建筑后不用逐栋在属性表里打字。可以先全选这一批在属性表里直接输入同样的type、floor值然后用“表达式”或短的Python脚本来初始化id。QGIS支持图标、状态栏、高级过滤器熟练后这步能压缩到几分钟完成。3.3 属性字段和面积统计一起做完建筑画完面积统计是大概率要做的。QGIS的字段计算器里用$area就能获取图斑面积注意这里的单位由图层坐标系决定。如果图层坐标系是经纬度$area算出来是平方度不能直接用正确做法是确保图层存储在投影坐标系里或者在表达式中用transform($geometry,EPSG:4326,EPSG:3857)先把几何对象转成投影再算。其实最省心的方式还是建图层时直接用投影坐标系。我通常会在属性表里新建一个“面积”字段用表达式round($area, 1)填充单位是平方米。如果还要看建筑基底占比再建一个“周长”字段用$length。按村、按组团统计时用“按类别统计”工具或者表达式aggregate()都能快速汇总。批量统计最常用的方法是“处理工具箱”里的“矢量分析”分组找到“按类别统计”选择一个分组字段比如type它就输出每个分类的图斑数量、面积总和、平均面积。这个表直接导出成Excel给甲方要比现场临时翻图层方便得多。4. AI方案让模型先把“像房子”的像素找出来4.1 技术选型不是只有深度学习一条路AI辅助提取建筑物轮廓学术叫法是“建筑物语义分割”或“建筑足迹提取”。但在实际项目中不一定非得训练一个深度学习模型很多传统遥感分类思路也能用关键看数据和场景。如果你的任务区建筑形态比较单一屋顶颜色与周围环境差异明显先用QGIS里的dzetsaka插件跑一遍随机森林分类或者用Orfeo ToolBox的均值漂移分割加随机森林就能得到一个像模像样的建筑掩膜。这种传统机器学习方案的好处是样本量要求低、训练快、对电脑配置几乎没要求缺点是对复杂阴影、多样屋顶材质处理能力弱。如果你的任务区像城中村、老工业园区屋顶材质五花八门建筑边界和树木、车辆混在一起那还是得靠深度学习模型。建筑提取领域比较成熟的方案包括U-Net、DeepLabV3以及很多基于Transformer的分割模型。实际工程里U-Net类模型因为结构简单、训练稳定、部署灵活依然是最常见的选择。4.2 给AI喂数据切瓦片、做标签、训模型深度学习不是魔术喂什么数据出什么结果。想在一个新区域用AI提建筑轮廓最稳妥的路线是先从目标区域里匀出一小块地方人工勾绘几十栋到上百栋建筑作为标签再做成训练集和验证集。具体操作大概分三步。第一步是把天地图影像裁剪成512×512或1024×1024的小瓦片每张瓦片对应一张同尺寸的标签图。第二步是在QGIS里把人工勾绘的矢量建筑轮廓转成栅格掩膜用“栅格”“转换”“矢量转栅格”像素值设成0和10是背景1是建筑。第三步是做数据增强把影像和标签同步旋转、翻转、微调亮度至少把训练样本扩大8到10倍不然模型容易过拟合。训练部分可以用PyTorch生态装好segmentation-models-pytorch之后一个基础U-Net的权重定义并不长。下面这段是我经常用来做快速推理验证的骨架代码注意演示用途实际模型结构、数据加载要按自己的标签情况调整。import numpy as np import torch import rasterio as rio from segmentation_models_pytorch import Unet model Unet( encoder_nameresnet34, encoder_weightsNone, classes1, activationsigmoid, ) checkpoint torch.load(building_unet.pth, map_locationcpu) model.load_state_dict(checkpoint[model_state_dict]) model.eval() def predict_tile(image_path, size512): with rio.open(image_path) as src: img src.read([1, 2, 3], out_shape(3, size, size)).astype(float32) / 255.0 img_tensor torch.from_numpy(img).unsqueeze(0) with torch.no_grad(): prob model(img_tensor).squeeze().numpy() return (prob 0.5).astype(uint8)这里面的核心是“把影像读成三通道RGB归一化到0到1模型输出一个和原始影像同尺寸的概率图再按0.5阈值转成0/1掩膜”。实际模型如果训练得好这个阈值可以在0.4到0.6之间微调用来控制提取结果的“激进程度”。阈值低漏检少但误检多阈值高误检少但漏检多。如果你不想训练模型也可以找一些别人训练好的建筑分割权重比如部分开源遥感模型库提供了在公开建筑数据集上训练的权重下载后直接推理。这个方案适合快速验证但一定要在目标区域抽几个小块对比精度不同卫星源、不同分辨率、不同拍摄角度的影像效果差异非常大。天地图影像和某些开源训练集里的航空正射影像风格差异一旦太大结果可能很惨。4.3 后处理从像素掩膜到能用多边形AI模型直接输出的是像素掩膜不能直接交付。必须做后处理这一步往往决定了最终成果像不像样。首先是掩膜清洗。用形态学操作把掩膜里的空洞填掉把细小噪点去掉。比较省事的方法是在Python里用scipy.ndimage的binary_fill_holes和binary_opening也可以用QGIS的栅格计算器和SAGA“关闭缝隙”“分离对象”等工具。清洗的原则是宁可保留少量小碎块也不要过度“开运算”把细长建筑切断。然后是栅格转矢量。QGIS菜单里“栅格”“转换”“多边形化”就是GDAL的polygonize把清洗后的二值掩膜转成面要素。这个转换结果通常边界锯齿严重而且会有大量面积很小的小图斑。接着用“简化”和“平滑”处理几何容差可以先用1米试一下太大容易丢失直角特征太小解决不了锯齿。最后用属性筛选清理垃圾图斑。在属性表里添加“面积”字段并计算然后用表达式筛选出面积小于某个阈值的多边形比如小于20平方米或30平方米的多半是车、树冠、空调外机、集装箱造成的误检直接删除。这一步之后AI原始结果才算成了“候选建筑轮廓”。4.4 AI人工协作现实中最稳的落地流程我见过很多人对AI结果特别有信心矢量一转出来就直接提交结果甲方看图发现一堆漏洞返工比手工画还慢。正确做法是把AI当成“初绘员”而不是“专家”。我目前用的工作流是AI大批量生成候选轮廓之后在QGIS里给它加一个状态字段比如status默认值设为“待核”。然后按屏幕范围分块人工逐块浏览遇到正确的建筑轮廓就把状态改成“确认”遇到明显误检就删掉遇到漏检就用手绘工具补一个新轮廓并把状态改成“补充”。这个流程下人工主要做判断而不是描点效率高很多。为了方便质检可以在样式里用“基于规则的渲染”status为“确认”的显示为绿色细边status为“待核”的显示为黄色细边漏检后补画的显示为品红色。颜色一区分眼睛扫一圈就能知道哪些已经查过哪些还没看。还有一个值得养成的习惯永远保留一份“AI原始结果”图层不要直接在上面改。后面甲方追问某个轮廓怎么来的你可以分分钟对比原始AI结果和处理后结果而不是面对一份无来源的矢量图层说不清楚。5. 常见问题与排查技巧实录5.1 天地图在QGIS里加载不出来这是新手最容易卡住的地方。我整理了几种常见现象和对应解决方法可以直接对照处理。现象常见原因解决方法一直白屏不显示密钥错误、未启用服务检查URL里的tk参数去开放平台确认服务已启用只有道路注记没有影像把LAYERimg写错成LAYERvec改用img_w或img_c对应服务影像位置整体偏移坐标系后缀用错显示层尽量统一用_w系列和EPSG:3857放大到19级很模糊天地图该区域分辨率有限接受当前清晰度或叠加其他公开影像辅助判断缓存异常老图不更新QGIS缓存残留清空瓦片缓存关闭重开项目如果你在单位的局域网里工作还要注意网络策略是否允许访问天地图外部服务。有些内网合规环境会屏蔽外网地图瓦片这时候只能申请内部离线影像切片或者先在内网之外下载好缓存再导入。5.2 人工轮廓和影像线对不齐严格来说天地图影像和你的矢量成果之间可能存在系统性偏移。这个偏移有时候来自坐标系转换差异有时候来自影像本身纠正精度也可能是你在勾绘时开着实时投影转换导致视觉误差。我踩过一次坑新建矢量图层时选了EPSG:3857项目也是EPSG:3857画的时候看着完全贴合后来项目要求交给CGCS2000的高斯投影成果直接用“导出要素”重投影后发现部分建筑在局部区域整体偏了1到2米。这个问题的根源不是天地图不准而是在线瓦片底图与本地坐标框架之间存在不可避免的配准差。解决方案是不要依赖单一底图做绝对定位引用当地测绘部门下发的已知坐标控制点或已有矢量参考层先做一次整体“平移纠正”再开始正式勾绘。5.3 AI结果碎多边形太多AI栅格转矢量后碎多边形多的原因通常有两个一是模型输出的掩膜不干净二是简化容差太小导致锯齿边界被分解成大量小图斑。处理顺序很关键。一定要先做栅格层面的开闭运算再做矢量转面最后再做简化反过来效果会很差。另外删除小图斑时不要只按面积阈值一刀切因为可能有些真的有建筑功能的小棚屋面积也很小。我一般是先用面积阈值清一遍再用“按位置连接”叠到原始影像上人工抽查小图斑集中的区域确认是误检就批量删。5.4 大批量处理太慢怎么办如果任务范围从村域扩到县域几万栋建筑同时处理QGIS也会卡。这时候不要在一个图层里硬扛建议把研究区分成规则网格用“创建网格”工具生成格网再“按位置裁剪”把影像和矢量都切成块分批处理。QGIS的“处理工具箱”支持批量运行选择多个输入文件后一键执行机器能一晚上把裁剪、矢量化、简化这些费时操作自动跑完。你要是有一台多核电脑还可以用GDAL和Python脚本做并行处理把每个网格块分配给独立进程。我实际测试下来把大范围切片并行处理后总耗时比单图层跑原始范围能快出好几倍关键是每个切块崩溃了不会影响全局进度。6. 最后再分享一个我自己的习惯我每次把AI结果交给甲方之前不管时间多紧都会做两件事。第一建一个叫“质检”的图层把AI矢量成果复制进去然后用50%透明度的半透明填充叠在原始天地图影像上在1:1000左右的显示比例下逐屏翻一遍。这个动作不用特别精细但能发现绝大多数的漏检和误检。第二做一次“面积统计拓扑检查”重点看是否有重叠面、缝隙和异常小面这三类问题一旦出现数据进数据库的时候就会引发连环报错。如果你正准备用这套流程我建议不要一上来就铺满全镇。先找一平方公里左右的小区块把天地图加载、人工勾绘、AI模型推理、后处理转矢量这一整条链路完整跑通记录每一步的耗时和踩坑点。小范围验证没问题之后再放大任务范围。这么做看起来多花了一天准备时间但实际上会帮你省掉后面好几天的返工。我现在的习惯已经变成把所有重复性描图工作都尽量交给AI先干一遍而我把省下来的时间用在外业核查、与甲方沟通、数据质检这些更需要判断力的事情上。毕竟测绘和GIS的最终价值从来不只是画出一堆面而是让这些面能真正落到业务里去算得清、查得到、用得住。