拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

QGIS+百度地图AOI:公园空间分析全流程实操指南

QGIS+百度地图AOI:公园空间分析全流程实操指南

我做一个市级的公园空间分析项目时,最难的部分居然不是分析本身,而是想把百度地图上的公园AOI数据弄到QGIS里,结果发现坐标、底图、属性字段到处都是坑。后来摸清楚整套流程之后,再回头看这事儿其实并不复杂,关键是把几个环节理顺。这篇就用我实际踩过的坑,从数据下载、坐标系转换、AOI清洗到分析出图,完整记录一遍操作链路,给要用QGIS做类似POI/AOI分析的读者一条能直接走通的路。

1. 公园分析为什么非要AOI数据不可

1.1 AOI比POI好在哪

做公园分析,最常见的错误是拿POI点数据硬凑。POI只有一个点,能告诉你“这里有个公园”,但完全没法告诉你公园多大、边界在哪、覆盖了哪些小区。说句难听的,用POI算出来的“公园覆盖率”基本都是哄自己玩的。

AOI的全称是Area of Interest,也就是带边界的兴趣面。百度地图AOI数据里,一个公园对应一个闭合多边形,能把公园的实际范围圈出来。有了这个面数据之后,才能继续算占地面积、服务半径覆盖范围、人均公园绿地面积这些真正的空间分析指标。

公园AOI的数据结构核心就是两部分:几何边界和属性信息。几何边界是闭合多边形,属性信息一般包含名称、所在区域、分类标签这些字段。拿到手之后,属性字段往往不够用,后面得靠空间连接和字段计算自己去补。

1.2 百度地图AOI能做什么不能做什么

百度地图AOI数据特别适合做“面上”的宏观分析,比如:

  • 统计某个行政区范围内公园的总面积和数量
  • 按街道切片做公园密度分布图
  • 结合小区AOI做公园步行可达性分析
  • 叠加路网数据计算公园入口覆盖范围

但它也有明显的局限。第一,百度地图AOI属于导航电子地图数据,边界是经过化简的,不会像测绘部门的数据那么精确,用于1:1000这种大比例尺精度要求的工作就免谈了。第二,部分公园在大数据里是分成多个AOI的,比如一个公园隔着一条市政路分成了南北两个片区,数据上就会显示成两个独立面,做统计前必须处理合并。第三,AOI属性里通常只有名称、地址、类型,缺少“建成年代”“绿地面积”“设施数量”这种业务属性,这些得靠自己去补充。

搞清楚这些边界条件之后,再动手做数据准备,心里才有底。

2. 环境准备:QGIS版本选型与2000坐标系设置

2.1 QGIS版本和插件安装

运行环境建议直接上QGIS 3.34 LTR版本,不要装3.36或更新的开发版,虽然新版本功能多,但有些国内数据源的第三方插件对最新版兼容性滞后,LTR版本遇到问题搜到的解决方案也更多。

QGIS装好之后,需要装几个常用插件。打开“管理并安装插件”,搜索安装:

  • QuickMapServices:提供在线底图快速加载能力
  • HCMGIS:集成国内外多有名的底图服务地址
  • MMQGIS:做几何处理和坐标转换的老牌插件
  • DataPlotly:如果后续需要做统计图,这个用得上

这些插件用国内源安装可能比较慢,可以在“设置—选项—网络”里把请求超时时间调大,默认的10秒经常不够用。

2.2 CGCS2000坐标系的正确设置姿势

“qgis软件如何设置2000坐标系”是很多人搜索量很高的词,说明这个问题确实容易搞混。QGIS里设置2000坐标系涉及两层:项目坐标系和图层坐标系,这俩是分开控制的,项目坐标系决定你显示和分析时用的坐标基准,图层坐标系是每个数据文件自己带的属性。

做城市公园这类国内空间分析,项目坐标系建议设为CGCS2000 / 3-degree Gauss-Kruger zone 某度带(根据城市经度选),或者直接用CGCS2000地理坐标系EPSG:4490。具体操作:

在“项目—项目属性—CRS”里,勾选“启用 ‘按图层’ CRS 变换”,然后过滤器里输入4490或对应投影坐标系的编号,选中之后确定。

但更关键的一点是:百度地图AOI数据最后交到你手上时,底层的坐标系往往已经被转换成WGS84了,如果你把WGS84的面数据和CGCS2000的底图叠在一起,看着可能差不多,但实际算面积的时候会差出不少。所以导入数据后,第一步就要检查图层的CRS定义,右键图层—图层属性—信息,看“坐标参考系”字段。如果显示的是EPSG:4326,而你希望数据落在CGCS2000上,不能直接把图层坐标系改掉,要做“导出—另存为”,在CRS里选择目标坐标系,让QGIS做一次真正的坐标重新投影,而不是仅仅改个标注。

2.3 数据组织目录规范

项目目录推荐这么建:

park_analysis/ ├── data/ │ ├── raw/ # 原始下载AOI数据,不做任何修改 │ ├── processed/ # 清洗转换后的数据 │ └── output/ # 分析结果与出图 ├── scripts/ # 后续如果需要写Python脚本放这里 ├── styles/ # QLR样式文件 └── project/ # QGIS工程文件

这个习惯救过我很多次,分析做复杂了之后,原始数据和处理数据混在一起,十有八九会误改了原始数据。QGIS虽然自带编辑撤销功能,但哪天手抖保存了就全完。

3. 在QGIS里加载百度地图底图:坐标偏移的坑与解法

3.1 国内可用底图加载方案

很多人拿到QGIS之后最头疼的就是没有国内底图,默认的OpenStreetMap在国内加载慢而且地名标注少。我的做法是优先用HCMGIS插件里的国内底图集合,里面整理了高德、百度、天地图等服务的瓦片地址,一键加载,方便省事。

如果网络环境连插件都加载不动,或者想要更稳定的方案,可以手动添加XYZ瓦片图层。操作路径是“图层—添加图层—添加XYZ瓦片图层—新建”,然后把瓦片地址粘贴进去。需要注意:百度地图瓦片的坐标系是BD-09,XYZ地址里带了自定义投影参数,直接添加之后QGIS可能报错“非法投影”。这是因为QGIS 3.x已经不完全支持百度瓦片那种非标准墨卡托切片方案,需要先加载一个自定义CRS或者用GeoServer做中转,复杂度反而上去了。

所以线上方案我是这样排序的:优先用HCMGIS插件加载百度底图,插件作者已经把投影转换逻辑处理好了;如果不行,退而求其次用天地图做底图,数据都是CGCS2000或者WGS84,坐标转换省心很多。

3.2 底图和AOI数据对不齐的处理办法

叠加底图和AOI数据之后,最常遇到的情况是公园AOI边界和底图上的公园边界差了几十米到上百米。这不是数据质量差,是坐标基准不同导致的。

百度地图用的BD-09坐标系,是在WGS84基础上经过了国测局偏移和二次非线性偏移的加密坐标系。如果你的AOI数据是别人从百度直接抓下来的原始坐标,那放到WGS84底图上就会系统性偏移。解决办法有两个思路:

思路一:把AOI数据从BD-09/LGCJ-02转换成WGS84。网上有很多开源坐标转换库,比如coordtransform,在QGIS里可以通过Python脚本调用,或者用MMQGIS插件的坐标转换功能手动处理。

思路二:把整个项目坐标系调整成和目标底图一致。把项目CRS设为与底图相同的坐标系,让QGIS在渲染时自动把AOI数据投影到底图坐标系上。这个思路在“看起来对齐”上是有效的,但如果要导出去和其他系统对接,还是得做一次真正的一劳永逸的转换。

我自己实际项目里的习惯是:先做坐标转换,把AOI数据统一转成CGCS2000 / 高斯克吕格投影,再叠加天地图底图验证。验证方法很直观:加载底图后,把公园AOI图层设成半透明填充,如果AOI边界线基本贴合底图上公园的围栏或绿地边界,说明转换成功;如果偏差超过一个街区,就说明坐标系处理还有问题。

3.3 字段汇总导入前的最后检查

在导入AOI数据之前,用“处理工具箱—矢量通用—按位置连接属性”先做一步空间关联,把行政区域代码挂到AOI上方便后面按区汇总。挂完之后,做一个“字段汇总”检查,按行政区域字段做分组统计,看看每个区有多少个公园AOI,总面积多少。这一步如果发现某个区面积异常或者公园数量异常少,八成是AOI抓取时边界漏了,需要回到原始数据源核验。

4. AOI数据的获取与预处理:从“一堆面”到“能分析的图层”

4.1 从百度地图拿AOI的几种渠道

百度地图官方对外没有直接提供“下载全部公园AOI”入口,实际操作中一般有几种拿数据的方式:

第一种,用百度地图开放平台的Web服务API,按区域检索POI,再把POI对应的AOI边界逐一下载。这种方式合规性最好,但受配额限制,适合小范围试点。

第二种,直接抓百度地图网页端渲染时返回的GeoJSON数据。在地图页面上画出公园边界后,网络请求里会返回Polygon数据,在浏览器开发者工具里能找到,可以保存成GeoJSON文件。这个方式获取速度快,但一次只能拿一个地块。

第三种,找现成的整理好的AOI数据集。GitHub上有一些开源项目维护了百度地图AOI的历史快照,下载后导入QGIS即可。这适合分析全国尺度或历史对比场景。

实际项目里我一般用第二种和第三种结合,城市范围小的话直接抓网页数据,范围大的话先找开源数据集,再补漏个别公园。

4.2 GeoJSON导入QGIS后的清洗流程

不管哪个渠道拿到的AOI数据,导入QGIS之后都不能直接拿来做分析,至少要做四步清洗:

第一步,检查几何有效性。用“修复几何”工具处理自相交和重复点问题。面数据最常见的错误是某个多边形有一条边反向,导致整个面判定为无效几何。修复后要重算面积,不修复的话后面按面积汇总统计就全错了。

第二步,去除重复和包含关系。同一公园出现两个重叠的AOI边界,直接做面积统计会翻倍。用“删除重复几何”工具去重,再手动检查被包含的小面是否需要合并。

第三步,按业务口径合并AOI。前面说过,百度地图AOI有时会把一个公园拆成多个面。判断标准是看名称字段,把名称相同且边界相邻的AOI用“融合”工具(Dissolve)合并成一个面,融合的字段用“名称”,属性值保留区域信息。

第四步,创建唯一标识字段。在属性表里加一个FID字段,用“字段计算器”赋值 @row_number,这个唯一标识在后续做空间连接、按公园汇总时非常有用。

4.3 坐标转换后再做一次面积校验

清洗完数据后,我先不用项目里显示的平方度数值,而是把图层转成正确的投影坐标系,再通过“字段计算器”用 $area 函数重算面积字段。这一步能有效发现坐标转换失败的数据:如果一个公园的面积算出来是几亿平方公里,那它肯定没落在CGCS2000上。

举个例子,一个正常城市公园面积应该是0.02到2平方公里左右,如果你看到面积值是0.0000003,那说明坐标单位是度而不是米,面积计算结果完全不可用。遇到这种问题就在图层CRS上找原因,不要硬往下做。

5. 公园分析核心流程:密度、可达性与覆盖度

5.1 公园分布核密度分析

拿到干净的公园AOI图层后,第一个常规分析是核密度。但核密度分析工具要求输入的是点数据,因此需要先提取面图层的质心点,操作路径是“处理工具箱—矢量几何—多边形质心”。

提取质心后,打开“处理工具箱—插值分析—核密度分析”,设置搜索半径。搜索半径的取值直接决定成图效果,如果是市级分析,建议设1.5公里左右;如果是区级分析,可以缩小到800米。这个值不是拍脑袋定的,可以参考城市规划里“15分钟生活圈”的概念,将搜索半径设为步行15分钟覆盖距离的一半,效果比较有说服力。

5.2 基于半径缓冲区的可达范围分析

公园可达性是公园分析里最常被问到的问题。做法是对公园AOI做缓冲区,“处理工具箱—矢量几何—缓冲区”,距离设为500米和1000米两种。

缓冲区距离虽然短,但背后的逻辑要说清楚:500米对应5分钟步行圈,1000米对应10分钟步行圈。大多数城市居民对公园可达性的心理预期就是“步行十分钟能到”,所以这两档是最常用的。

做缓冲区之前,记得把项目坐标系切到投影坐标系,长度单位才会是米。我之前在WGS84地理坐标系下做缓冲区,设距离为500,结果缓冲区画出来覆盖了半个城市,就是因为单位是度而不是米。这个坑说出来很基础,但真的掉进去过。

缓冲区生成后,下一步用“按位置选择”统计落在缓冲区里的居住小区数量。拿小区AOI和公园缓冲区做空间连接,能够得到“有公园覆盖的小区占比”,这个指标比单纯给公园数量要直观得多。

5.3 各区公园面积占比与人均水平统计

按行政区汇总公园总面积,操作是“处理工具箱—矢量叠加—按位置汇总”,目标图层选公园AOI,汇总图层选行政区面,统计字段选面积字段,在统计参数里勾选总和。

汇总结果里有一个隐含的坑:一个公园可能跨了两个行政区,按位置汇总会把它算进两个区。业务上如果接受“按下辖区划分,不重复计算任何面积”的口径,就需要用“裁剪”工具先把公园AOI按照行政边界切开,再统计,这样才能保证各区面积加起来等于全市总面积。

人均公园绿地面积还需要人口数据。把人口统计单元(比如街道或社区)和公园AOI做空间关联,按人口加权计算人均水平。没有人口数据的话,也可以退而求其次,用“每平方千米公园面积”代替,做横向对比也有价值。

5.4 用栅格分析补一张“偏远的角落”示意图

面状分析做完之后,我习惯补一张栅格形式的距离图,用来直观呈现“哪些地方离最近的公园最远”。操作是“处理工具箱—栅格分析—距离栅格(近似)”,输入公园AOI,像元大小设100米,生成的结果就是每个像元到最近公园边的距离。

把结果用渐变色渲染,从绿色到红色渐变,就能很直观地看到城市边缘的“公园盲区”。这张图放到汇报PPT里非常加分,因为决策者一眼就能看出问题区域在哪里,比一堆数字更有说服力。

6. 出图排版:从QGIS里导出一张能直接放汇报里的地图

6.1 图层符号化的细节设计

分析做到最后,总要落到一张拿得出手的图上。QGIS的默认配色基本不能直接用于汇报,需要花点心思调整。

公园AOI的填充色我一般用青绿色系,透明度设30%~40%,让底图的地名标注还能透出来。边界线稍微粗一点,用深绿色,粗细设0.6毫米。缓冲区用淡橙色半透明填充,叠加在公园面上,形成“公园是绿的,步行圈是淡橙的”这种直观表达。

核密度栅格的配色用Inferno或者Viridis色带,透明度拉到50%左右,和底图的融合度会好很多。如果直接默认透明度100%,栅格颜色会完全盖住底图,基本看不清街道名,图就废了。

6.2 布局管理器出图全流程

进入“布局管理器—新建布局”,核心组件安放顺序是:地图主体、缩放比例尺、图例、指北针、标题栏、数据说明。

地图主体放置后,在项目属性里可以设置渲染比例尺。市级公园分析图比例尺设在1:50000到1:100000比较合适,区级可以放到1:20000左右。设置方式:右键地图主体—移动和缩放—设置地图范围,在“比例尺”输入框里直接敲数字。

图例组件里要注意:只勾选需要显示的图层,一定要取消勾选“自动更新”,不然图例里会冒出行政区边界、路网辅助图层这些不该出现的内容。图例标题建议改成“图例”,字太大反而喧宾夺主。

比例尺选“单段”(Single Box)模式,单位设为“千米”,分段数3段左右最清晰。城市地图上比例尺动辄好几公里,分段多了文字会叠在一起。

6.3 导出参数设置避坑

导出成图时,“布局—导出为图片—设置”,分辨率设300 DPI,格式选PNG或者PDF。

如果图里文字出现乱码,多半是字体缺失,到系统里装好中文字体后重新打开工程再导一次就好。

高级选项里有一个“仅在绘制期间绘制地图项目”复选框,导出大幅面地图时如果出现要素丢失,把这个勾选取消,让QGIS强制重绘所有要素,效果会稳很多。

最后提醒一句:出图前先检查一下是否有“未定义CRS”的图层。如果有图层坐标系统是未知状态,出图的时候这个图层会直接消失,或者整整一个图层被画到地图角落。解决办法还是老套路——右键图层—图层属性—信息,确认CRS,不确定的话就“另存为”指定一次坐标系。

7. 复盘:坐标、边界、字段三个环节踩过的坑汇总

每次做完一个区域分析项目,我都会把过程中踩过的坑记下来,比任何操作手册都有用。这次用百度地图AOI做公园分析,最大的收获集中在三个方面:

第一,坐标系处理永远是最前面的关卡。不要等分析做完了才发现底图和AOI错位、面积单位不对。每一步操作前先检查当前图层的CRS,这个习惯能省下至少半天返工时间。

第二,AOI边界数据的清洗比分析本身更耗时。拿到的数据越方便,脏数据越多。去掉重复边界、合并拆碎的公园、修复无效几何,这几步必须一个不落地走完。很多分析结论不准,根本不是方法错,是数据源头就没理干净。

第三,字段命名和属性表的整理,决定了后续分析效率。拿到AOI后第一时间把名称、区域、唯一ID这三个字段理顺,后面做按区汇总、空间连接就会非常顺手。如果原始数据里字段乱七八杂,先花十分钟重命名字段,比在分析时反复查字段名要高效得多。

这套流程跑通之后,再做其他类型的AOI分析,比如学校、医院、商圈,只需要把分析目标替换一下,整体链路是可以直接复用的。对我个人来说,QGIS真正厉害的地方,就是能把这种网络地图的碎片化数据,通过坐标转换、几何清洗、叠加分析这几板斧,变成能支撑实际决策的成果。后面如果再有人问我“百度地图AOI数据在GIS里能不能用”,我大概会直接把这篇文章甩给他。

返回列表