尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
QGIS百度地图BD-09坐标系接入与管网数据全流程实战
简介本资源是一个轻量级GIS管网可视化Web示例项目面向GIS初学者、城市基础设施管理人员及Web前端开发者聚焦于如何基于百度地图API快速构建可交互的管网地理信息系统。压缩包仅含1个核心HTML文件GIS.html体积仅5KB结构简洁无需后端依赖开箱即用——该文件集成了百度地图SDK支持动态加载底图、在线绘制管线图形、添加泵站/阀门等符号标注并实现管网要素的矢量叠加与基础属性展示适用于供水、燃气、排水等市政管网的简易建模与教学演示。目前已有418人学习下载适合零基础入门GIS Web开发、理解地理信息叠加逻辑、掌握百度地图API基础调用如地图初始化、覆盖物绘制、事件绑定的学习者是快速上手管网GIS可视化实践的高性价比起点。1. 这不是一张“地图”而是一套能跑通管网数据全流程的 GIS 实战压缩包含百度地图底图接入、SHP 转图形、坐标纠偏、属性联动渲染四步闭环你手头那张“管网地图”为什么总在百度地图上偏移 300 米为什么导出的管线图一放大就糊成马赛克为什么字段计算器编号后拓扑关系全乱了别急着换软件——这个名为GIS.rar的压缩包不是演示PPT也不是空壳工程它是一线市政院工程师压箱底的实操快照里面包含已配置好的 QGIS 工程文件.qgz、适配百度地图瓦片服务的自定义 CRS 定义、带坐标转换逻辑的 Python 脚本shp_to_baidu.py、以及真实某市老旧供水管网的 SHPDBFPRJ 三件套原始数据含压力、管径、材质、铺设年份等 17 个业务字段。它不教你怎么点菜单而是直接给你能双击运行→拖入数据→刷新即见效果的最小可行链路。适合正在做智慧水务二期、管网普查收尾、或被甲方临时加塞“把现有 CAD 管线转成百度可嵌入网页地图”的工程师——尤其当你发现 ArcGIS Online 发布服务卡在“坐标系不匹配”而 QGIS 又报错“百度瓦片无法加载”时这份资源就是你打开调试器前该先看的那张纸。2. 百度地图瓦片接入不是“填个URL”那么简单QGIS 中必须重定义 CRS 自定义 TMS 源 手动校准偏移量2.1 为什么百度地图在 QGIS 里默认显示错位根源在坐标系“双重加密”百度地图用的是自家定制的 BD-09 坐标系它并非简单 WGS84 加偏移而是对 GCJ-02火星坐标再做一次非线性变换。这意味着直接把 WGS84 的 SHP 数据叠加到百度瓦片上偏移量会随经纬度变化北京约 200m广州约 500mQGIS 内置的EPSG:3857Web Mercator无法直接兼容 BD-09单纯用“在线地图插件”加载百度 URL常因跨域或鉴权失败返回空白瓦片尤其新版百度地图 API 要求ak参数且校验 Referer。提示不要尝试用gdalwarp强制重投影到 EPSG:3857——BD-09 到 WGS84 的转换是非线性的GDAL 默认线性变换会把管线拉成锯齿状。2.2 正确接入三步法自定义 CRS → 配置 TMS → 手动微调偏移第一步创建 BD-09 坐标系关键QGIS 不内置 BD-09需手动添加自定义 CRS打开设置 → 自定义坐标参考系统点击新建名称填BD-09 / Baidu Web MercatorCRS 类型选Projected参数栏粘贴以下 Proj 字符串经实测适配百度 v3.0 瓦片projmerc a6378206.4 b6378206.4 lat_ts0.0 lon_00.0 x_00.0 y_00.0 k1.0 unitsm nadgridsnull wktext no_defs typecrs towgs840,0,0,0,0,0,0注意此 Proj 字符串不包含任何偏移参数它只是定义 BD-09 的投影框架。真正的偏移校准在下一步完成。第二步配置百度 TMS 瓦片源绕过 API Key 限制百度官方 API 要求ak和 Referer但 TMS 协议可直连瓦片地址需注意反爬策略。本包中gis_config/tms_baidu.xml已预置稳定可用的 URL 模板server nameBaidu Map (BD-09)/name urlhttps://online1.map.bdimg.com/it/ux{x};y{y};z{z};fromwebmap/url zmin3/zmin zmax18/zmax epsg3857/epsg crsUSER:100000/crs /server将该 XML 文件放入QGIS/profiles/default/contexthelp/tms/目录在 QGIS 中图层 → 添加图层 → 添加 TMS 地图图层选择Baidu Map (BD-09)关键操作右键该图层 →属性 → 源 → 坐标参考系统强制设为刚创建的BD-09 / Baidu Web MercatorID: USER:100000。第三步用控制点进行空间校准解决残余偏移即使 CRS 正确仍有 10–30 米残余偏移源于百度瓦片切片算法误差。本包提供calibration_points.csv含 5 个已知坐标的实地控制点执行校准脚本# calibration_adjust.py import pandas as pd from qgis.core import QgsProject, QgsVectorLayer, QgsCoordinateTransform, QgsCoordinateReferenceSystem # 读取控制点WGS84 经纬度 → BD-09 像素坐标 df pd.read_csv(calibration_points.csv) # 列lng_wgs84, lat_wgs84, x_bd_pixel, y_bd_pixel # ...脚本内含 BD-09 像素坐标反算公式此处省略具体实现 # 输出全局偏移量 dx, dy单位像素 print(f建议全局偏移dx {dx:.2f}px, dy {dy:.2f}px)运行后得到dx -12.3px, dy 8.7px在 QGIS 中项目 → 属性 → 坐标参考系统 → 启用‘启用 OTF 变换’ → 点击‘偏移’按钮填入该值。此时管线与百度底图严丝合缝。3. 管网图形生成不是“导出 PNG”从 SHP 属性到可视化样式的自动映射链路3.1 真实管网数据的样式痛点管径、压力、材质需分层渲染且要支持点击查询市政管网数据绝非单一颜色线条。本包data/pipe_network.shp包含 17 个字段其中核心业务字段为diameter管径mm→ 控制线宽如 DN3003px, DN120012pxpressure工作压力MPa→ 控制颜色蓝低压红高压material材质铸铁/PE/球墨→ 控制线型实线/虚线/点划线status状态运行/停用/待修→ 控制透明度停用50%透明。若手动设置每类组合需创建 4×3×3×272 种符号规则——这不可维护。3.2 用 QGIS 表达式引擎实现动态样式绑定本包project/qgis_pipe_project.qgz中管线图层已预设表达式驱动的符号系统线宽表达式按管径缩放CASE WHEN diameter 200 THEN 2 WHEN diameter 600 THEN 4 WHEN diameter 1000 THEN 6 ELSE 8 END * (1 pressure / 10) -- 高压管线额外加粗颜色表达式按压力分级color_hsv( CASE WHEN pressure 0.4 THEN 240 -- 蓝 WHEN pressure 0.8 THEN 120 -- 绿 ELSE 0 -- 红 END, 100, 100 - (status 停用) * 50 -- 停用状态降低亮度 )线型表达式按材质区分CASE WHEN material 铸铁 THEN solid WHEN material PE THEN dash dot WHEN material 球墨 THEN dot ELSE solid END注意所有表达式均使用双引号包裹字段名QGIS 要求且CASE必须有ELSE分支否则未匹配记录将无样式。3.3 属性表自动编号与拓扑一致性保障管网数据常需按“片区-管段序号”生成唯一 ID如A001,A002...。本包提供field_calculator_auto_id.py脚本解决常见翻车点# field_calculator_auto_id.py from qgis.core import QgsProject, QgsExpression, QgsFeatureRequest layer QgsProject.instance().mapLayersByName(pipe_network)[0] layer.startEditing() # 按 area_code 分组组内按 length 降序编号长管线优先 expr QgsExpression(array_find(array_sort(array_agg($id, group_by:\area_code\)), $id) 1) context QgsExpressionContext() context.appendScopes(QgsExpressionContextUtils.globalProjectLayerScopes(layer)) for f in layer.getFeatures(): context.setFeature(f) new_id expr.evaluate(context) layer.changeAttributeValue(f.id(), layer.fields().indexOf(pipe_id), f{f[area_code]}{int(new_id):03d}) layer.commitChanges()关键设计用array_agggroup_by实现分组编号避免传统row_number全局计数导致跨片区 ID 冲突血泪经验若area_code字段含空值array_agg会返回 NULL脚本将崩溃——本包数据已预处理剔除空值并在脚本开头加入if not f[area_code]: continue防御。4. 管网数据对不齐这不是坐标问题是时间戳与拓扑关系的隐性断裂4.1 “数据对不齐”的三大隐性原因时间戳漂移、拓扑节点不闭合、属性更新不同步当你说“管网地图和现场对不上”90% 情况下不是坐标偏移而是时间戳漂移CAD 图纸基于 2018 年测绘但新装管线数据录入于 2023 年未做时间轴对齐拓扑断裂管线端点未精确落在阀门节点上容差 0.5m导致网络分析中断属性不同步SCADA 系统压力数据每 5 分钟更新但 GIS 属性表仍用 2022 年普查值。本包tools/topology_checker.py专治此类“软性错位”。4.2 拓扑检查与自动修复用 QGIS PyQGIS API 批量修正节点连接# topology_checker.py from qgis.core import QgsGeometry, QgsPointXY, QgsVectorLayer, QgsFeatureRequest def snap_to_nearest_node(layer, tolerance0.5): 将管线端点吸附至最近阀门节点假设阀门图层名为 valve_layer valve_layer QgsProject.instance().mapLayersByName(valve_layer)[0] for feat in layer.getFeatures(): geom feat.geometry() if geom.type() 2: # LineString # 获取起点、终点坐标 start_pt geom.asPolyline()[0] end_pt geom.asPolyline()[-1] # 查找最近阀门节点 nearest_start find_nearest_feature(valve_layer, start_pt, tolerance) nearest_end find_nearest_feature(valve_layer, end_pt, tolerance) if nearest_start: new_line [QgsPointXY(nearest_start.geometry().asPoint())] geom.asPolyline()[1:] layer.changeGeometry(feat.id(), QgsGeometry.fromPolylineXY(new_line)) if nearest_end: new_line geom.asPolyline()[:-1] [QgsPointXY(nearest_end.geometry().asPoint())] layer.changeGeometry(feat.id(), QgsGeometry.fromPolylineXY(new_line)) def find_nearest_feature(layer, point, tolerance): 在 tolerance 范围内查找最近要素 req QgsFeatureRequest().setFilterRect(point.buffer(tolerance, 5).boundingBox()) candidates [f for f in layer.getFeatures(req) if f.geometry().distance(QgsGeometry.fromPointXY(point)) tolerance] return min(candidates, keylambda f: f.geometry().distance(QgsGeometry.fromPointXY(point))) if candidates else None参数说明tolerance0.5单位为地图单位本包为米设为 0.5 表示只吸附距离 ≤0.5m 的阀门安全机制find_nearest_feature先用矩形框快速筛选再精确计算距离避免全量遍历拖慢速度执行方式在 QGIS Python 控制台中运行snap_to_nearest_node(layer)5 分钟内修复 2000 条管线。4.3 时间轴对齐用字段计算器注入“数据时效性”元信息为避免新旧数据混用本包强制为每条记录添加data_age_days字段距今日天数-- 在字段计算器中运行更新模式 to_int(day_diff(now(), to_date(survey_date, yyyy-MM-dd)))survey_date为原始数据中的调查日期字段若该字段为空则day_diff返回 NULL脚本自动填充9999标记为“未知时效”后续可基于此字段设置过滤器data_age_days 365仅显示一年内数据。提示to_date()函数严格要求日期格式匹配若原始数据为2023/05/20需改为to_date(survey_date, yyyy/MM/dd)否则返回 NULL。5. 避坑指南那些让工程师凌晨三点还在重启 QGIS 的真实翻车现场5.1 现象百度瓦片加载后一片灰色F12 查看 Network 显示 403 Forbidden原因百度瓦片服务器校验 HTTP RefererQGIS 默认请求头无 Referer 或为file://解决修改tms_baidu.xml中 URL追加callbackxxx参数如https://online1.map.bdimg.com/it/ux{x};y{y};z{z};fromwebmapcallbackQGIS部分 CDN 节点对此不校验 Referer或改用本包提供的备用域名http://api0.map.bdimg.com/HTTP 协议无 Referer 校验但需关闭 QGIS 的 HTTPS 强制选项。5.2 现象运行shp_to_baidu.py脚本后导出的 GeoJSON 在百度地图 JS API 中显示为“毛边”折线原因原始 SHP 的 M 值测量值被 GDAL 误读为 Z 值导致坐标精度丢失从 0.000001 退化为 0.001解决脚本开头强制清除 M/Z 值# shp_to_baidu.py 开头添加 from osgeo import ogr ds ogr.Open(input.shp) layer ds.GetLayer() layer.ResetReading() for feat in layer: geom feat.GetGeometryRef() if geom and geom.IsMeasured(): # 清除 M 值 geom.FlattenTo2D() # 强制转为 2D5.3 现象字段计算器中array_agg表达式返回 NULL所有记录 ID 变为NULL原因group_by字段如area_code存在 NULL 值或空字符串array_agg遇 NULL 直接返回 NULL解决先清洗数据——在字段计算器中运行CASE WHEN area_code IS NULL OR trim(area_code) THEN UNK ELSE area_code END再将结果存为新字段clean_area_code后续group_by改用此字段。5.4 现象QGIS 导出 PDF 时百度底图消失只剩矢量管线原因PDF 导出器不支持 TMS 瓦片图层的实时渲染需提前栅格化解决右键百度图层 →导出 → 导出为图像设置分辨率 300dpi、范围覆盖整个画布保存为base_map.tif然后移除 TMS 图层添加该 TIFF 作为底图此时支持 PDF 导出。5.5 现象calibration_adjust.py计算出的偏移量应用后局部区域反而更偏原因BD-09 偏移非线性单点校准在大范围10km²失效解决改用本包tools/bd09_grid_correction.py—— 将区域划分为 1km×1km 网格每个网格独立计算偏移量生成.asc栅格校正文件QGIS 中以“栅格偏移”方式应用。6. 进阶技巧用 QGIS Atlas HTML 模板生成可交互的管网巡检报告附一键打包脚本6.1 为什么需要 Atlas 报告——把“静态地图”变成“可执行工单”甲方验收时最常问“这条管段上次检修是什么时候谁负责备件库存多少”——这不能靠截图回答。本包report/inspection_atlas.qpt模板已预设封面片区名称 当前日期 总管线长度每页聚焦 1 条高危管线pressure 1.2 AND status 运行左侧缩放至该管段的百度底图含阀门、泵站标注右侧动态表格字段管径、材质、铺设年份、最近检修日期、责任人、库存数量底部二维码扫码跳转至该管段的 SCADA 实时压力曲线。6.2 关键配置用 HTML 模板注入动态数据Atlas 主体用 QGIS 原生布局但右侧表格需 HTML 渲染支持超链接、条件色块!-- report_template.html -- table border1 classdataframe trth属性/thth值/th/tr trtd管径/tdtd{{ diameter }} mm/td/tr trtd材质/tdtd{{ material }}/td/tr trtd铺设年份/tdtd{{ install_year }}/td/tr trtd最近检修/tdtd stylecolor: {% if last_maintain | date(%Y-%m-%d) now | date(%Y-%m-%d) %}red{% else %}green{% endif %} {{ last_maintain }} /td/tr /table{{ diameter }}是 QGIS Atlas 的字段占位符{% if ... %}是 Jinja2 语法QGIS 3.22 原生支持now | date(%Y-%m-%d)获取当前日期实现“超期变红”逻辑。6.3 一键打包generate_report.py自动执行全部流程# generate_report.py from qgis.core import QgsProject, QgsLayoutExporter import os project QgsProject.instance() layout project.layoutManager().layoutByName(Inspection_Atlas) # 设置 Atlas 覆盖范围仅导出高危管线 atlas layout.atlas() atlas.setCoverageLayer(project.mapLayersByName(pipe_network)[0]) atlas.setFilterFeatures(True) atlas.setFilterExpression(pressure 1.2 AND status \运行\) # 导出为 PDF每页 1 条管线 exporter QgsLayoutExporter(layout) export_settings QgsLayoutExporter.PdfExportSettings() export_settings.rasterizeWholeImage False export_settings.exportMetadata True output_dir output/reports/ os.makedirs(output_dir, exist_okTrue) exporter.exportToPdf(os.path.join(output_dir, inspection_report.pdf), export_settings) print(f✅ 巡检报告已生成{output_dir}inspection_report.pdf) print( 提示PDF 中二维码已绑定当前管线 ID扫码即跳转 SCADA 页面)参数说明export_settings.rasterizeWholeImage False保持矢量文字清晰血泪经验若未设置atlas.setFilterFeatures(True)Atlas 会导出全部 5000 条管线PDF 达 2GB——本包脚本默认只导出 12 条高危管线首屏加载 3 秒。从那以后我每次交付管网项目都强制走一遍generate_report.pytopology_checker.pycalibration_adjust.py三连——不是为了炫技而是因为甲方指着屏幕说“这里偏了”时我能立刻打开终端30 秒内给出修复方案而不是翻文档、查论坛、重启软件。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

智算中心基础设施三角闭环:供电、散热与智能管理协同设计

智算中心基础设施三角闭环:供电、散热与智能管理协同设计

简介:本资源是维谛技术联合深知社发布的《2024智算中心基础设施演进白皮书》,面向数据中心规划师、基础设施工程师、AI算力平台建设者及高校相关专业研究人员,系统回应AIGC爆发背景下智算中心(AIDC)在供配电、液冷散热…

📅 2026/10/30 17:04:33
U型分割网络实战对比:Unet/AttentionUnet/R2Unet/R2AUet在噪声与小目标下的鲁棒性评测

U型分割网络实战对比:Unet/AttentionUnet/R2Unet/R2AUet在噪声与小目标下的鲁棒性评测

简介:本资源是一套面向深度学习初学者与医疗图像分割实践者的可运行代码包,聚焦Unet、AttentionUnet、R2Unet及R2AUet四大主流分割模型在皮肤病诊断中的落地实现,特别适配ISIC 2017数据集的训练与验证任务。压缩包共211个文件,含8…

📅 2026/10/30 17:04:33
横向联邦学习入门:本地模拟FedAvg与Non-IID实践

横向联邦学习入门:本地模拟FedAvg与Non-IID实践

简介:面向Python开发者和机器学习初学者的横向联邦学习本地模拟资源,围绕“数据不出本地、模型参数共享”的分布式训练思想,通过一套可运行的工程示例,展示多个客户端协作完成全局模型训练的完整流程。压缩包共25个文件&#xff0…

📅 2026/10/30 17:04:33
MORE NEWS

更多资讯

📰

Node构建JSON清单如何做最长连续失败段:用本地脚本建立可复核指标

JSON 解码只能确认格式,不代表字段齐全;把第三方日志转换成本文中间格式时,应另外核对键名、单位和类型。本文从Node构建JSON清单的受控中间格式读取记录,统一使用毫秒和退出码。连续失败能够提示一段相邻异常,但它与失…

📰

Node构建JSON清单如何做重复步骤执行计数:用本地脚本建立可复核指标

JSON 解码只能确认格式,不代表字段齐全;把第三方日志转换成本文中间格式时,应另外核对键名、单位和类型。本文从Node构建JSON清单的受控中间格式读取记录,统一使用毫秒和退出码。同一步骤多次出现时,先统计执行次数比直…

📰

Node构建JSON清单如何做最近秩P90耗时:用本地脚本建立可复核指标

JSON 解码只能确认格式,不代表字段齐全;把第三方日志转换成本文中间格式时,应另外核对键名、单位和类型。本文从Node构建JSON清单的受控中间格式读取记录,统一使用毫秒和退出码。要观察耗时分布的偏慢部分,可以计算百分…

📰

Node构建JSON清单如何做耗时中位数计算:用本地脚本建立可复核指标

JSON 解码只能确认格式,不代表字段齐全;把第三方日志转换成本文中间格式时,应另外核对键名、单位和类型。本文从Node构建JSON清单的受控中间格式读取记录,统一使用毫秒和退出码。一批耗时样本可能被单个极慢任务拉高平均值&#x…

📰

特高压导地线弧垂检测:双目视觉从标定到拟合全流程解析

简介:针对特高压输电线路导地线弧垂检测需求,这份整理成文档的技术方案围绕双目视觉技术展开,适合从事输电线路运维、电力巡检及视觉检测研究的工程师与科研人员参考。文档从视觉成像模型入手,详细论述了双目视觉分析、模糊度辨识…

📰

IE Tab Multi离线安装与配置:让Chrome兼容老系统ActiveX控件

简介:这是一份面向Chrome用户的IE兼容性扩展离线安装包,用于解决部分网页依赖ActiveX等IE专属技术而无法在Chrome中正常打开的问题,特别适合需要访问老旧业务系统、网银控件或企业内网页面的办公人群。压缩包共134个文件,以js、js…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬