ARTICLE DETAIL

资讯详情

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

基于QGIS与百度地图AOI的城市公园服务半径分析方法

基于QGIS与百度地图AOI的城市公园服务半径分析方法 做城市规划或地产前期分析的朋友应该都有过这种经历甲方丢过来一句“要一张全市公园分析图”可手里除了一串公园名称和地址什么都没有。要边界的没边界要等级的没等级时间又卡得紧。我平时在QGIS里处理这类需求最常用的一条路线就是拿百度地图AOI数据做底子再叠加公园点位做服务半径分析最后直接出图。整个过程不碰ArcGIS也不需要企业许可服务只要一台能联网的电脑就能跑。这篇就把从插件下载、AOI获取、坐标转换到布局出图的完整流程记录下来给第一次接触这个场景的朋友一个能直接照做的模板。1. 方案选型为什么用百度地图AOI不用OSM和天地图1.1 三类数据源的取舍很多人在做国内城市分析时第一反应是打开OpenStreetMap。OSM的好处是数据完全开放、全球统一但落到国内公园这个场景问题也很明显公园边界更新滞后像近几年新建的滨水绿道、口袋公园基本残缺甚至会漏掉部分大型森林公园的轮廓。天地图的数据偏官方、精度对得上规划要求但它的瓦片加载和接口申请流程相对繁琐普通使用者第一次配置容易卡在token和坐标系上。百度地图AOI数据则恰好卡在一个舒服的位置行政边界、功能区边界都整理成现成的面公园、学校、小区这类POI类型非常全更新频率高而且底图对国内城市的渲染观感也符合大众审美。具体选哪个数据源还要看项目阶段。如果是报建、评审这类需要严谨成果的场景建议用天地图或测绘部门数据校核如果只是前期研判、快速出专题图百度AOI足够撑起整个分析链路。我自己的习惯是先用百度AOI把分析框架搭出来等结论基本确定后再针对关键地块用天地图影像做一次目视校核性价比最高。这里放出三类数据源的直观对照表方便你按实际场景做决策。数据源AOI边界精细度公园POI齐全度更新频率坐标问题上手成本OSM偏粗部分区域只有外轮廓点一般小公园常缺社区维护速度不一WGS84无加密中天地图官方边界精度高覆盖一般按版本定期更新经纬度无偏转高百度地图AOI较好有行政面和功能区面很全分类细持续更新BD-09偏转需处理低1.2 插件和接口两条路线拿到百度地图AOI数据实操层面有两条主流路线。第一条是直接用QGIS插件HCMGIS它在菜单里集成了百度地图的底图和行政区划下载功能鼠标点几下就能把某个城市的行政边界AOI导出成本地文件。这种方式适合快速建模比如先拿到区县边界作为分析底图再继续叠公园数据。第二条是调用百度地图开放平台的API按行政区划或地点检索接口把AOI多边形、POI点数据拉下来适合需要批量取数或想把流程做成自动化脚本的情况。两条路线我在实战里都验证过HCMGIS主打快速API主打灵活。对新手我的建议是第一次跑通优先用插件等理解了数据结构和坐标转换之后再考虑API。因为插件的输出会直接帮你处理掉一部分坐标偏移和字段整理问题能让你把精力集中在分析和出图本身。而API返回的GeoJSON仍然保留百度坐标体系的特征如果对坐标系理解不深很容易出现“位置对不上”的迷茫期。这篇的后半部分我会把两条路线的坑都写出来但演示流程以插件路线为主。2. 环境准备与插件安装2.1 QGIS版本与系统依赖QGIS版本建议选LTR长期支持版我目前用的是3.34.4。不要图新装开发版很多国内相关插件对最新开发版的支持有滞后。系统上需要提前装好Python 3.9以上环境QGIS内置的Python环境一般已经满足要求普通使用不需要额外配置。安装目录不要带中文和空格否则个别插件处理中文路径时容易报错。如果你在Windows下出现插件列表加载不出来的情况先检查QGIS的“设置→选项→网络”里请求超时和代理设置。国内网络环境下官方插件库的连接有时候不稳定我一般会配置一个国内镜像源或者直接把插件包手动下载下来离线安装。离线安装的具体方法在第5节会讲这里先不展开。2.2 插件与底图加载实操打开QGIS后点击菜单栏“插件→管理并安装插件”在搜索框输入HCMGIS看到插件名后直接点安装。装完会在菜单栏多出一个HCMGIS菜单点击“GIS Tools”里能找到“Download Chinese Map”相关功能。这里注意不同版本菜单名称可能有变化如果找不到关键词可以试着在搜索框里输入Baidu、ADB等拼音缩写。加载百度底图是分析的第一步。HCMGIS菜单中通常有“Add Baidu Map”之类的选项选择底图类型标准、卫星或带注记导入后会生成一个XYZ Tiles图层坐标系显示为EPSG:3857。如果插件里没有底图入口也可以手动添加Url模板下面这个地址是我实测可用的百度标准底图瓦片地址直接在“XYZ Tiles”里新建连接然后填入模板即可。https://maponline0.bdimg.com/tile/?qtvtilex{x}y{y}z{z}stylesplscaler1udt20200807需要注意的是瓦片URL里的参数在不同时间可能调整如果发现底图加载出来是灰块可以到百度地图开放平台文档页找回最新的瓦片规则。底图加载完后建议先在浏览器里缩放到目标城市确认和你的研究范围一致再开始下载AOI数据。3. AOI数据下载与预处理3.1 用HCMGIS下载行政区/城市AOI详细操作我以获取厦门市各区的AOI边界为例演示整套流程。先在HCMGIS菜单下找到“Download China Administrative Divisions From Baidu Map”或类似名称运行后会弹出一个带城市层级选择的窗口。第一级选“省份”第二级选“厦门”第三级可以选“市辖区”设置输出路径建议用GeoPackage格式而不是Shapefile因为后者字段名会被截断成10个英文字符中文表头直接变成乱码。点击确定后插件会调取百度地图接口按行政级别逐个下载最终在工作区生成一个名为“厦门市_区县”的多边形图层。打开属性表查看字段里通常包含name、adcode、center等关键属性name是中文明细名称adcode是行政区划代码center是中心点坐标。这些字段后面做字段筛选和统计非常有用。实操中我发现插件获取的AOI面坐标虽然和百度底图是匹配的但CRS定义有时并不明确导出后默认不自动设置CRS。建议在拿到图层后立刻检查右下角的CRS如果显示未定义就右键图层→图层属性→信息确认坐标范围是否和城市经纬度吻合。如果坐标范围不符合常识可以用“图层→重设CRS”手动指定为百度底图对应坐标系然后再进行后续投影。3.2 用百度地图API补充公园AOI或POI行政区边界到手后公园面数据还是缺的。HCMGIS插件并没有专门抓公园AOI面的入口所以我通常用百度地图开放平台的“地点检索API”来补充公园相关的点数据。先到百度地图开放平台注册一个开发者账号创建“浏览器端”应用获取AK密钥。然后按“行政区划区域检索”方式请求关键词填“公园”region填城市名tag可以填“公园”或“绿地”每页最多返回20条需要按page翻页。下面是一个用Python批量拉取公园数据并保存成CSV的小脚本我在QGIS外跑完再导入QGIS使用。运行前把ak替换成你自己的密钥。import requests import time import csv ak 你的AK city 厦门市 keyword 公园 base_url https://api.map.baidu.com/place/v2/search results [] for page in range(0, 10): params { query: keyword, region: city, output: json, ak: ak, page_size: 20, page_num: page, scope: 2, } r requests.get(base_url, paramsparams, timeout15) data r.json() if data.get(status) ! 0: break rows data.get(results, []) if not rows: break for row in rows: loc row.get(location, {}) results.append([ row.get(name, ), loc.get(lat, ), loc.get(lng, ), row.get(address, ), row.get(area_type, ), ]) time.sleep(0.5) with open(park_points.csv, w, newline, encodingutf-8-sig) as f: writer csv.writer(f) writer.writerow([name, lat, lng, address, area_type]) writer.writerows(results) print(fdone, total {len(results)})返回数据里的lat和lng是百度坐标系下的经纬度导入QGIS时不要直接当作WGS84数据使用。如果你后面所有分析都在百度底图下进行可以暂时不做平移但如果需要出正式图或与CGCS2000套合就必须按第3.3节做坐标转换。另外百度地图免费配额有限个人开发者一天的请求量大概在几千到几万次对公园这种城市级检索完全够用注意不要在循环里瞬间发太多请求控制一下频率。3.3 坐标系与投影转换这一步是整个流程中最容易被忽略、也最容易翻车的环节。百度地图的坐标体系叫BD-09它是在GCJ-02基础上二次加密的结果和国际通用的WGS84相差数百米。你在QGIS里把点导入后如果直接叠加在WGS84底图上会看到所有公园点整体偏移到道路甚至海里。HCMGIS下载的AOI面虽然和百度底图重合但它不会主动告诉你数据究竟是什么CRS。大多数项目在国内交付时都要求使用CGCS2000坐标系所以建议从一开始就统一到CGCS2000。具体操作很直接右键要素图层→导出→要素另存为在弹出的窗口里把CRS设置为CGCS2000 / 3-degree Gauss-Kruger CM 120E这个适合东经118到122度附近的城市。如果你的城市在东经114度附近就选CM 114E在108度附近就选CM 108E。带号匹配错误虽然不会导致点偏移到海上但会让面积计算出现误差。设置完成后保存到新文件后续所有缓冲、裁剪、相交操作都基于这个包含正确投影的图层。为了更清楚我把常用城市的带号选择列了个小表。城市范围参考中央经线EPSG代码适用城市示例东经108度108EEPSG:4540西安、成都一带东经114度114EEPSG:4544武汉、长沙一带东经120度120EEPSG:4547北京、上海、杭州、厦门一带东经123度123EEPSG:4550沈阳、长春一带如果你所在单位没有硬性要求也可以直接在QGIS里继续使用EPSG:3857 Web墨卡托所有空间分析工具都能正常运作。只是最后出图报告里最好注明坐标系为“百度/Web墨卡托”不要含混地写成WGS84否则审图阶段容易被打回。4. 城市公园分析实操4.1 公园数据提取与清洗导入park_points.csv到QGIS的方法是图层→添加图层→添加分隔文本图层数据源选择CSVX字段选lngY字段选lat几何类型选点坐标系选WGS84先临时指定后面统一投影。导入后先做一个基础清洗把名称明显不是公园或绿地的点删掉。公园类POI在百度地图里可能混入“森林公园管理处”“公园派出所”这类配套设施它们的位置虽然真实但当作服务设施点去缓冲会负面影响分析结果。我通常用字段计算器新建一个“是否公园”字段使用表达式筛查。name LIKE %公园% OR type LIKE %公园% OR name LIKE %绿地% OR name LIKE %植物园%然后选中这个字段值为1的记录导出到新图层作为正式分析的公园点位。清洗时还要注意重复点同一个公园可能在POI库里出现两次比如大门和服务中心各一条可以直接用“按位置删除重复几何”工具去重。经过这一步通常一个地级市能留下几十到两百个有效公园点数量级别很合理。如果你手里有插件下载的公园AOI面数据更推荐直接用面来做分析。点数据的好处是来源简单坏处是无法区分公园真实面积对覆盖率分析会有偏差。折中办法是给每个公园点附一个面积估算值比如大型综合公园2平方公里、社区公园0.2平方公里然后在最后用面积加权修正结果。不过对大部分前期研判来说点缓冲法已经能说明问题。4.2 多级服务半径缓冲区分析公园服务半径是城市分析里的常用概念通俗理解就是“从公园门口向外走多远还能算作能便捷使用该公园”。步行通常选500米骑行或快速通行选1000到1500米驾车或城市级公园选2000米以上。由于不同公园规模不同我会先按面积或等级分场再对不同等级做不同半径。但没有详实数据时也可以先做统一的三级缓冲分别是500米、1000米、2000米。在QGIS中执行缓冲操作处理工具箱搜索“缓冲”输入图层选清洗后的公园点图层距离栏输入500段数填12勾选“融合结果”。融合后所有公园500米范围会合并为一个整体避免计算覆盖率时重复计数。再对1000米、2000米各执行一次同样的操作。如果想做“环形缓冲”例如计算1000米覆盖但500米未覆盖的区域需要把1000米缓冲结果与500米缓冲结果做“擦除”得到“从1000到500米之间的区域”这也是常用的“差集缓冲法”。有一个细节需要注意缓冲工具的距离单位默认跟随图层单位如果你的图层是经纬度500会被当作500度结果直接崩坏。所以一定要先在投影坐标系下操作。我的习惯是每次缓冲前都检查图层的CRS如果是WGS84就先用第3.3节的方法做投影转换。4.3 公园覆盖率计算公园覆盖率是这次分析最核心的产出指标通俗说就是某个区域内公园服务范围占区域总面积的比例。我拿区县级AOI作为分析单元把公园500米缓冲区和区县AOI做一次“相交”得到每个区被公园服务覆盖的多边形。用“字段计算器”给相交结果添加面积字段公式直接填“$area”如果当前投影单位是米单位就是平方米除以1000000变成平方千米。接着用“按字段汇总”工具以区县名称为分组字段对面积字段求总和得到每个区的公园服务总面积。把这个结果通过区县名称关联回区县AOI图层再在区县图层用表达式算出服务覆盖率服务总面积/总面积*100。这里最终结果用百分比表示。例如某区总面积35.6平方千米公园500米覆盖面积9.8平方千米覆盖率就是27.5%。如果只想输出一张简单图表不需要做完整数据库关联也可以直接用“统计”工具得到一张每个区公园覆盖面积的表格再把表格复制到Excel里做饼图和柱状图。我个人强烈推荐在QGIS里直接做一张覆盖面积分级填色图比表格直观得多。4.4 核密度与热力可视化缓冲区能说明“服务范围是否覆盖”但看不出“公园密度的冷热不均”。我还会顺手对公园点做一次核密度分析来识别城市中心与边缘绿地的供给差异。处理工具箱里搜索“热力图核密度”输入公园点图层半径设2000米像素大小设20米。输出是栅格值越高代表公园分布密度越大。栅格生成后用“单波段伪彩色”样式颜色渐变选择绿—黄—红透明度调到60%叠加在百度底图上。核密度图特别适合用来辅助判断城市“公园盲区”比如某条城市发展带的边缘区域缓冲区看起来可能被覆盖到了但核密度值明显很低实际上缺少步行可达的高质量公园。这种结论在汇报中很容易打动听者因为它同时结合了覆盖率数据和空间分布特征。5. 制图出图与常见问题排查5.1 图层样式与专题配色分析做完最难的部分其实是从“一堆图层”到“一张图”。我出图的习惯是先关掉中间计算图层只保留四个东西百度底图、区县AOI边界、公园点、三级缓冲面。区县边界用细白色线填充设为“无”避免遮挡底图公园点用深绿色圆点直径2.2毫米三级缓冲面按距离由近到远分别用深绿、中绿、浅绿三档透明度填充透明度设在45%到60%之间。百度底图的视觉控制也直接影响出图效果。选中底图图层在图层样式里将不透明度调到50%混合模式改为“正片叠底”。这样既能留下道路和地物轮廓作为定位参考又不会抢走分析符号的风头。如果上方还有栅格核密度图就把核密度栅格放在底图与边界之间混合模式使用“滤色”能得到相对干净的热力效果。图例名称尽量改成中文业务词汇而不是图层名。方法是在图层面板右键图层→图层属性→显示→改为“公园500米服务范围”这类名称。保存工程后每个图层名都会统一更新到图例比用英文或乱码字段名专业很多。5.2 打印布局出图完成图层设置后点击“新建打印布局”在布局里插入一个“添加地图”控件框选内容之后再添加比例尺、指北针、图例和标题。地图比例尺选择“单一分式比例尺”比例尺数值调成近似整数比如1:100000地图缩放时比例尺数值会自动更新。指北针可以用内置的“新制指北针”图例勾选“仅显示可见图层”避免把处理过程中的临时字段也带进来。最容易被忽略的是导出设置。在布局菜单“布局→导出为图片→设置”中分辨率建议填300dpi勾选“始终将地图导出为矢量”这样文字和符号不会因光栅化而发虚。如果是成果汇报可以再加一个“导出为PDF”的副本PDF里的图例和比例尺可以继续修改对需要后期微调的场景很友好。实际工作中我还发现QGIS布局里的中文字体如果出现方框是字体缺失或字体名称不兼容的问题。解决方案是在布局的“项目属性→文本设置”里统一指定“微软雅黑”或“思源黑体”所有文本元素继承默认字体后就不会乱。不要一个个去改文本项效率太低。5.3 常见问题与排查技巧从下载AOI到出图整个流程里我踩过的坑不少这里整理成速查表希望帮你少走冤枉路。问题现象可能原因解决办法插件列表搜不到HCMGIS网络连不上QGIS官方插件库配置国内镜像源或离线下载zip包手动安装加载百度底图后是灰块瓦片URL失效或网络限制到百度地图开放平台文档页获取最新瓦片地址模板导入的公园点位置偏到海上lat/lng字段选反或坐标系不对检查X/Y字段映射先指定WGS84再统一投影缓冲区结果是一个超大圆或多边形数据CRS是经纬度距离被当成“度”先投影到CGCS2000或Web墨卡托再缓冲面积字段计算出来数值巨大单位是平方米没有换算除以10000得到公顷除以1000000得到平方千米出图后图例是乱码或方框中文字体未指定或缺失项目属性里设置微软雅黑/思源黑体作为全局字体AOI边界太精细导致卡顿面数量多或折点密集用“简化”工具设置容差0.001再重新投影抛开表格这里有三个比较实用的排查经验。第一所有预处理尽量在GeoPackage中完成Shapefile在复杂字段名和Unicode属性上问题太多。第二不要在一个图层里既放缓冲结果又放原始AOI物理分开更利于调试。第三在分析过程中经常使用“测量线”工具在地图上量一下公园点位到边界的距离如果数值不符合直觉立刻回头检查坐标系不要等出完图再返工。最后再分享一个小技巧。如果做公园分析时拿不到足够精细的公园AOI面可以下载公园POI点后用“最小边界几何”功能按名称分组生成凹壳模拟出公园的大致范围再参与缓冲计算。这种方法生成的面虽然不完全是真实边界但在服务半径、覆盖面积分析场景下结果比单纯用点做缓冲区要可信得多也是我这次实操中最后实际采用的方案。这个内容后续还可以继续扩展比如叠加房价数据看“公园溢价”或者叠加路网数据算各片区的实际步行到达时间。只要底图上AOI数据能拿得稳QGIS能做的事情其实远超想象。
返回列表