ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

管网GIS数据从解压到叠加百度地图:坐标纠偏与属性整理实践

管网GIS数据从解压到叠加百度地图:坐标纠偏与属性整理实践 简介这是一份面向GIS开发初学者与管网管理人员的轻量级示例资源演示了如何借助百度地图API构建可在网页端在线编辑的管网地图应用。资源包为rar压缩格式整体仅5KB内含1个HTML文件。该文件将GIS展示与交互逻辑集中在一个页面中可直接通过浏览器打开查看效果便于分析代码结构与技术实现。借助百度地图API实现了管网图形在线绘制、符号标注和地图叠加展示等能力覆盖供水、排水、燃气等基础设施管理的常见可视化需求。对于希望快速了解Web GIS入门技术、管网图层制作方式或百度地图JS API基础调用方法的读者这份体积小、结构清晰的案例可作为很好的学习参照。该资源已有418人学习下载适合用于理解GIS数据在地图服务中的呈现与管理思路。1. 一个 GIS.rar 压缩包能不能变成一张能用的管网地图接手管网项目时最常见的交接物不是数据库而是一个叫 GIS.rar 的压缩包。里面可能装着从老电脑上拷下来的 gis 管网矢量数据、CAD 原始总图或者一堆后缀名都没见过的文件。你双击解压拖进 GIS 软件大概率会遇到两种结果要么管线图形和百度地图对得上要么整条管线跑到隔壁街区属性表里全是乱码。这篇笔记就是要把 GIS.rar 到一张能用的管网地图之间要过的四道关讲清楚——格式识别、坐标纠偏、底图叠加、字段与出图。适合刚接手管网数据的工程运维人员、兼职做数据整理的 GIS 初学者以及被一句“把百度地图上的管线弄出来”砸懵的人。2. 解开 GIS.rar先确认里面是 Shapefile、GeoJSON 还是 CAD 管网图拿到压缩包先别急着双击解压。几百 MB 的包全解出来铺一地只会让你在找文件上多花半小时。第一步永远是先看包内结构。2.1 先不急着解压用 rarfile 列出压缩包内部结构rar 格式可以用 Python 的 rarfile 库直接读取文件列表不解压就能知道里面有什么。这个库底层依赖本机的 unrar 或 WinRAR 命令行工具没装会直接报错。import rarfile rar_path GIS.rar # 如果提示 Cannot find unrar需要先安装 unrar 或 WinRAR 并加入环境变量 with rarfile.RarFile(rar_path) as rf: for info in rf.infolist(): print(f{info.filename}\t{info.file_size})这段代码遍历压缩包内所有文件条目打印文件名和原始大小。看到列表后先按扩展名归类.shp/.shx/.dbf/.prj成组出现说明里面是 Shapefile.dwg/.dxf说明是 CAD 图纸.geojson或.txt则可能是整理好的交换数据。如果全是.sid/.ecw/.tif那多半是影像底图而不是矢量管网后续思路完全不同。不想写 Python 的话直接用命令行也可以unrar l GIS.rar参数l是 list只列目录不解压vb可以只输出文件名列表方便后续用管道接 grep 筛查。注意压缩包如果带密码l也会要求输入密码但有些 WinRAR 加密的包允许不输密码查看文件名实际取决于打包时的加密设置。2.2 看清管网数据的三种面孔Shapefile、GeoJSON、DWG管网矢量数据在交付文件里最常见的就三种形态处理思路完全不同。格式文件特征打开方式适合做什么Shapefile.shp/.shx/.dbf/.prj 成组出现QGIS / ArcGIS空间分析、属性管理、叠加底图GeoJSON单个 .geojson文本可读QGIS / 文本编辑器轻量交换、Web 地图展示DWG / DXF单文件或一组图纸QGIS 需插件 / CAD原始设计图、报批出图看到.shp就优先用 Shapefile因为 DXF 里的管线虽然画得清楚但管径、材质往往写在文字标注里而不是属性表里没法直接做分级统计。.geojson如果是别人从在线地图导出的坐标系大概率已经被处理过直接验证坐标范围就好。同一个包里既有.dwg又有.shp时.shp通常是整理过的成果数据先打开它把 CAD 图留作核对参考。2.3 用最小文件清单验证数据完整shp、shx、dbf、prj 缺一不可Shapefile 是一个“伪单文件”格式实际由多个同名不同扩展名的文件组成。缺了.shxQGIS 直接提示文件无效缺了.dbf属性表打不开管径材质全部看不到缺了.prj软件不知道坐标系是什么后面纠偏全靠猜。用一段脚本扫目录可以快速定位哪些数据不完整。import os folder unpacked # 改成实际解压目录 required [.shp, .shx, .dbf, .prj] for root, _, files in os.walk(folder): for f in files: if f.lower().endswith(.shp): base os.path.join(root, f[:-4]) missing [ext for ext in required if not os.path.exists(base ext)] if missing: print(f[缺失] {f}: 缺少 {、.join(missing)}) else: print(f[完整] {f})原理是按文件名前缀分组把同一前缀的四个扩展名一一对照检查。.prj缺失是最麻烦的软件默认按 WGS-84 处理如果数据实际是高斯投影坐标直接叠加底图会偏到完全不相干的位置。遇到这种情况先用文本编辑器打开同目录其他.prj文件参考或者问交付方要坐标系说明别自己猜。解压时还有一个老生常谈的坑中文文件名加空格。Shapefile 的配套文件是靠主文件名关联的路径里有特殊字符时部分组件会读取失败。我一般会在解压后立刻把所有文件复制到纯英文路径下再打开能省掉后面一堆莫名其妙的报错。3. 坐标纠偏把管网数据从 WGS-84 或 GCJ-02 转到百度 BD-09文件能打开只是起点。把管网数据拖进带百度地图底图的工程里最常见的反应是“怎么偏了这么多”。这不是数据坏了是坐标系错了。3.1 为什么百度地图上的管网会“漂移”WGS-84、GCJ-02、BD-09 的关系很多 gis 教程只教你加载底图不告诉你坐标系会漂。百度地图用的是 BD-09GPS 设备采集的原始坐标是 WGS-84国内地图服务商出于显示一致性会用 GCJ-02 做一次偏移百度又在 GCJ-02 基础上做了 BD-09 的二次偏移。管线数据如果是 WGS-84 直接叠到百度底图上偏差可达几十米甚至上百米在城市主干道上几十米足以让管线从道路一侧“穿楼”到另一侧现场巡查完全没法用。数据坐标系直接叠加百度底图的结果需要做的处理WGS-84明显偏移几十米以上先转 GCJ-02再转 BD-09GCJ-02仍有几十米偏差只需要做 GCJ-02 到 BD-09 的二次偏移BD-09基本重合不需要转换怎么判断数据到底是哪个坐标系先看.prj文件内容写的是GEOGCS[WGS 84]就是 WGS-84如果坐标范围是经纬度且在 100120、3040 之间大概率是未投影的经纬度坐标。如果坐标是六位数级别比如 x310000y3400000那是投影坐标高斯克吕格要先把它转回经纬度再谈百度地图叠加。很多老管网数据根本没有.prj这时候只能根据坐标量级和经验判断判断错了后面全白做。3.2 在 QGIS 里重投影自定义 BD-09 CRS 的操作步骤QGIS 的 EPSG 代码库里没有 BD-09 的标准编号它本质上不是一个严格的投影坐标系而是加过偏移的经纬度系统。常见做法是自己定义一个新的 CRS 来“贴标签”真正的坐标偏移交给脚本去算。操作如下打开 QGIS菜单栏“设置 → 选项 → 坐标参考系”切到“自定义 CRS 选项卡点“添加”名称填BD-09格式选Proj String按 WGS-84 的经纬度定义填写参数对没有坐标系的图层右键 → “图层属性 → 信息”先看当前 CRS确认图层实际坐标是 WGS-84 后用“矢量几何 → 重投影图层”目标 CRS 选自定义的 BD-09。这里要提醒一个极易混淆的点把输出 CRS 改成 BD-09 并不会自动生成百度偏移量。QGIS 的重投影只做标准椭球变换不包含 GCJ-02 和 BD-09 的加密偏移算法。所以 3.2 的操作只适用于“数据本身已经是 BD-09 坐标、但缺少 CRS 定义”的情况。大多数从 GPS 采集来的管网数据是 WGS-84直接重投影到 BD-09 结果是错的必须用 3.3 的脚本做显式纠偏。3.3 用 pyproj 批量转换坐标代码与参数说明管网数据动辄几千条管线靠 QGIS 手工另存费时且不可复现。我一般会把 WGS-84 到 GCJ-02、GCJ-02 到 BD-09 的公开转换算法封装成函数用 Python 批量处理。下面的代码使用 geopandas 读取 Shapefile逐点转换几何坐标。import math import geopandas as gpd from shapely.geometry import Point, LineString def wgs84_to_bd09(lon, lat): # WGS-84 - GCJ-02公开近似算法精度米级 a 6378245.0 ee 0.00669342162296594323 d_lon lon - 105.0 d_lat lat - 35.0 magic math.sin(d_lat * math.pi / 180.0) magic 1 - ee * magic * magic sqrt_magic math.sqrt(magic) m_lon (d_lon * 180.0) / (a / sqrt_magic * math.cos(d_lat * math.pi / 180.0) * math.pi) m_lat (d_lat * 180.0) / ((a * (1 - ee)) / (magic * sqrt_magic) * math.pi) gcj_lon lon m_lon gcj_lat lat m_lat # GCJ-02 - BD-09固定偏移叠加 z math.sqrt(gcj_lon * gcj_lon gcj_lat * gcj_lat) 0.00002 * math.sin(gcj_lat * math.pi / 180.0 * 3000.0) theta math.atan2(gcj_lat, gcj_lon) 0.000003 * math.cos(gcj_lon * math.pi / 180.0 * 3000.0) bd_lon z * math.cos(theta) 0.0065 bd_lat z * math.sin(theta) 0.006 return bd_lon, bd_lat def shift_geom(geom): # 点转点线转线逐顶点偏移 if isinstance(geom, Point): x, y wgs84_to_bd09(geom.x, geom.y) return Point(x, y) if isinstance(geom, LineString): return LineString([wgs84_to_bd09(p[0], p[1]) for p in geom.coords]) return geom # 读入 WGS-84 的管线数据强制转成标准经纬度 gdf gpd.read_file(pipes_wgs84.shp) gdf gdf.to_crs(epsg4326) gdf.geometry gdf.geometry.apply(shift_geom) gdf.to_file(pipes_bd09.shp, encodingutf-8)代码的逻辑分三步先读入原始数据并统一到 WGS-84 经纬度再遍历每条管线的每个顶点做纠偏最后写回新文件。为什么输出文件不指定 CRS因为 BD-09 没有 EPSG 编号写文件时只能按 epsg4326 保存但坐标值已经是百度系后续叠加时不需要再做重投影。代码里的a、ee是克氏椭球参数0.0065、0.006是 BD-09 的固定偏移量这些数值来自公开算法不要随意改动。该算法满足管网巡查的目视定位需求但别拿去做厘米级测量。4. 叠加百度地图底图与排查瓦片加载、坐标偏移、属性乱码的五个坑坐标系处理完终于可以看效果了。把转换后的pipes_bd09.shp拖进 QGIS加载百度地图瓦片这是最让人“上头”的一步——以为万事大吉结果一屏黑或整体错位。4.1 加载百度地图瓦片在 QGIS 里配置 XYZ Tiles 底图QGIS 的“浏览器”面板里右键 XYZ Tiles → “新建连接”填一个名称和 URL 模板就能把百度地图瓦片当底图用。URL 模板必须包含{x}、{y}、{z}三个变量QGIS 会根据当前视图范围自动计算需要请求的瓦片行列号。百度地图网页版加载的瓦片地址常见做法是用浏览器开发者工具抓取请求链接把固定部分存成模板。这类地址的稳定性不由你控制不同时期会变化所以我不在这里写死某个具体域名你按下面的方式自己获取更可靠用 Chrome 或 Edge 打开百度地图网页版按 F12 打开开发者工具切到“网络”面板拖动地图找到类型为png或jpeg的瓦片请求把请求 URL 复制出来把 URL 中的行列号替换成{x}、{y}、{z}填进 QGIS 的 XYZ Tiles 模板。还有一点容易被忽略百度瓦片本质是 Web 墨卡托切图而纠偏后的管线数据是 BD-09 经纬度。QGIS 加载时最好先把项目 CRS 设置为 EPSG:3857再拖入管线数据让软件做在线重投影这样两者才能落在同一个画布上。加载后如果还是错位优先检查第 3 章的数据坐标系处理而不是底图设置。4.2 瓦片黑屏、坐标偏移、乱码五个真实踩坑记录以下五条是处理管网数据和百度底图叠加时最高发的故障现象、原因、解决一条条对。坑 1瓦片黑屏画布一片黑或灰 现象加载底图后什么都没有缩放也没反应。 原因URL 模板里缺{z}变量或瓦片服务地址已失效请求被服务方拒绝也会表现为黑屏。 解决先用浏览器直接访问一个完整的瓦片 URL比如把模板里的{x}、{y}、{z}代成具体数字能出图说明模板对不能出图就换模板。QGIS 的“网络日志”面板能看到 404 或 403 状态码据此判断是地址问题还是权限问题。坑 2管线整体跑到底图西北方向几十米 现象管线和底图道路平行但间距稳定像被人平移过。 原因数据是 WGS-84 或 GCJ-02没做 BD-09 纠偏。 解决回到第 3.3 节用脚本转换后再叠加。别靠“手动平移”去凑几百条管线手移不现实而且每条偏移量还不同。坑 3shp 能打开属性表全是“口口口口” 现象图形正常但管径、材质等中文字段全是方框乱码。 原因dbf 属性表是 GBK 编码QGIS 默认按 UTF-8 读取。 解决加载 shp 时在“数据源管理器”里把编码改为GBK或者用 ogr2ogr 把 dbf 统一转成 UTF-8。这个坑在处理老管网数据时几乎必踩提前知道能省半小时。坑 4rar 包解压后双击 .shp 提示文件无效 现象单独拖出一个 .shp 文件提示缺少组件无法打开。 原因压缩包里同一组文件没全解出来或者用鼠标拖拽只移出了部分文件。 解决回到 2.1 的unrar l列表确认原始文件数量再用unrar x GIS.rar一次性全量解压不要用拖拽方式单个提取。坑 5坐标范围像是经纬度但位置在海里或空白区 现象坐标值在 100120、3040 之间但点落在地球上根本不对的地方。 原因数据是投影坐标如高斯克吕格被误当成经纬度或者原始.prj内容丢失软件按默认 WGS-84 处理。 解决用文本编辑器打开.prj看是PROJCS投影坐标还是GEOGCS地理坐标。如果是投影坐标先用 QGIS 的“重投影图层”转到 EPSG:4326再做 BD-09 纠偏。4.3 验证叠加精度用拾取器采样量化偏移距离纠偏有没有成功不能靠“看着差不多”下结论。常见做法是在百度地图网页端的坐标拾取器里选三五个特征点——路口中心、桥头、河流拐弯——记下 BD-09 坐标然后在 QGIS 里用测量工具量同一特征点到管线端点的距离。我一般会在项目里建一个小表把采样点和偏差值记下来采样点底图坐标BD-09数据坐标转换后偏差人民路/建设路口120.12345, 30.23456120.12351, 30.23450约 3 米解放桥北桥头120.13456, 30.24567120.13449, 30.24571约 2 米偏差小于 5 米基本不影响管网巡查定位10 米以上要重新检查坐标系处理步骤而不是在 QGIS 里硬调。还有个小提醒不要用“经纬度差零点几秒”来目测判断秒级差在城区就是几十米测量工具显示的米数才直观。5. 从管网图形到管网地图字段分级、自动编号与导出 txt坐标对齐了底图也有了但一个只有线条的图层还不能叫“管网地图”。要能查管径、查材质、查埋深并且能输出给施工或巡检用属性整理和出图这步绕不过去。5.1 管网属性表的设计管径、材质、埋深与字段类型管线数据的属性表质量决定这张图能不能用。最常见的字段包括管径、材质、埋深、起点/终点井号、长度和竣工日期。字段类型的选择有一个常被忽略的点材质这类字段不要用数字代码直接存中文文本配合 QGIS 的“值映射”做显示查询时一眼能看懂。字段名类型示例用途DIA整数300管径分级显示MATERIAL文本球墨铸铁材质配色DEPTH浮点1.85埋深统计START_ID / END_ID整数1001 / 1002构建管网拓扑LENGTH浮点23.6长度统计如果拿到的是 CAD 图纸而不是 Shapefile属性表基本是空的要先在 QGIS 里用“导入 DXF”或“点/线转要素”把图形转成 GIS 要素再手工补字段。这一步工作量最大没有捷径。字段里如果有“DN300”这种带前缀的文本先别急着手动改下一步用字段计算器批量清洗。5.2 用字段计算器做管径分级与自动编号字段计算器是整理管网属性最高频的工具很多 gis 教程都把它当基础讲但实际用到管网上时核心就两个场景提取数字、分级显示。先看管径字段里带着单位前缀怎么清洗。假设字段名是DIA_TEXT内容是DN300、DN500这种用表达式提取数字部分regexp_replace(DIA_TEXT, DN, )这会把DN300变成300输出类型选“整数”新建一个字段DIA保存。如果数据里写的是de315这类外径标识正则要改成匹配字母regexp_replace(DIA_TEXT, [a-zA-Z], )提取完数字后做分级用 CASE WHEN 把管径分成三档为后面符号化做准备CASE WHEN DIA 1000 THEN 大管径 WHEN DIA 500 THEN 中管径 ELSE 小管径 END自动编号是另一个高频需求。QGIS 3.x 里最简单的写法是row_number或者在字段计算器里用autoIncrement()生成从 1 开始的连续编号。两者区别在于row_number是行号变量跟着数据排序走autoIncrement()生成的是稳定的递增序号适合作为节点或管段的唯一 ID。注意在运行前先按关键字段比如节点编号排序否则编号顺序和数据文件原有顺序一致很可能不是你期望的“从上游到下游”。5.3 分级符号化与“图中图”出图思路字段就绪后符号化按管径分级设置线宽DN300 用 1.2mmDN500 用 2.0mmDN1000 用 3.5mm按材质配色球墨铸铁用灰色PE 用蓝色钢管用红色。管网图要“能读”比“好看”更重要不要搞十种颜色十种线宽现场看图的人记不住。出图时有个很实用的技巧——“图中图”。在 QGIS 打印布局里放两个地图框主图框显示当前管段细节另一个小地图框显示整个片区的总览范围并加一个高亮矩形框表示主图位置。这样看图人既有局部细节又有全局定位感做管网普查图和竣工图时非常受用。另外如果底图用的是百度地图瓦片出图前要确认瓦片使用范围项目内部巡检问题不大对外提交成果时换用标准影像底图更稳妥。5.4 把矢量管网导出为 txt用 ogr2ogr 生成带 WKT 的文本施工交底或巡检 App 对接时经常需要把 shp 转成 txt 交换格式。常见做法是用 GDAL 自带的 ogr2ogr 命令行把几何写成 WKT 文本ogr2ogr -f CSV pipes_out.txt pipes_bd09.shp \ -lco GEOMETRYAS_WKT \ -lco SEPARATORCOMMA \ -select DIA,MATERIAL,START_ID,END_IDGEOMETRYAS_WKT把图形写成 WKT 字符串SEPARATORCOMMA指定逗号分隔-select控制导出字段只带走需要属性。如果接收方只需要坐标点可以把管段两端点的 x、y 拆到属性表里再按普通 CSV 导出。带 Z 值的数据会在 WKT 里多出 Z 坐标接收方解析不了时要提前确认。还要注意 CSV 默认是 UTF-8 编码用 Excel 直接打开会乱码建议另存一份 GBK 编码或提醒对方用导入方式打开。6. 进阶技巧把坐标转换与精度自查固化为一个可复用脚本处理完一两个管网包后你会发现整个流程里最耗时间的不是操作本身而是每次都要重新确认坐标系、重新写转换逻辑、重新找采样点验证。我现在的习惯是把 3.3 的坐标转换脚本和 4.3 的验证思路合并成一个批处理工具输入一个 WGS-84 的 shp输出 BD-09 版 shp 和一份抽样检查点。def main(): src pipes_wgs84.shp gdf gpd.read_file(src) gdf gdf.to_crs(epsg4326) gdf.geometry gdf.geometry.apply(shift_geom) # 输出纠偏后的完整管线 gdf.to_file(pipes_bd09.shp, encodingutf-8) # 随机抽 10 个节点用于人工核对 check gdf.sample(10) check.to_file(check_points_bd09.shp, encodingutf-8)输出的检查点文件直接拖进 QGIS叠加百度底图逐个核对这些点是否落在道路、井位等特征位置上。如果抽样点全部合理基本可以放心交图。这个方法相当于给数据处理流程加了一道自动化测试比“打开看一眼觉得差不多”可靠得多。曾经有次赶工期我图省事直接在 QGIS 里用“另存为”改了坐标系就交图结果现场巡线时发现整段管线在底图上偏了十几米返工比重新处理还麻烦。从那以后凡是经过坐标转换的数据我都会设置一个固定命名规范原始文件名_wgs84.shp和原始文件名_bd09.shp分开存放转换脚本和参数说明放在同一个工程文件夹里。这样三个月后再打开项目还能一眼看出当初是怎么处理的不用对着文件名猜。坐标转换这类事最怕“这次看着像对的”就交差。一个压缩包从 rar 到能用的管网地图每一步都有验证方法格式用文件清单验证坐标系用采样点验证字段用分级结果验证。把这些验证变成脚本里的一行输出比任何口头承诺都让人放心。希望帮到你。本文还有配套的精品资源点击获取
返回列表