5.3 邻近度:距离如何参与叠加


文档摘要

5.3 邻近度:距离如何参与叠加 本节摘要:距离是空间分析里使用率最高的变量,ArcGIS 提供三把量尺——缓冲区把距离变成可叠加的面,近邻分析把"离谁最近、多远"写成属性字段,服务区把路网距离变成可达范围。本节讲三把尺子的适用边界与参数细节(融合、侧型、欧氏与路网距离之别),并演示它们与叠加六式的组合用法。 距离是最常用的空间变量 翻开任何一份空间分析报告,十有六七含距离条件:"距学校 500 米内""距加油站不足 100 米""步行 15 分钟可达"。距离之所以高频,是因为它把连续空间翻译成了非此即彼的判断——在 500 米内或不在,这种二元化让叠加运算成为可能。 但"距离"这个词在不同语境下指三种不同的东西,用错尺子结论就错。

5.3 邻近度:距离如何参与叠加

本节摘要:距离是空间分析里使用率最高的变量,ArcGIS 提供三把量尺——缓冲区把距离变成可叠加的面,近邻分析把"离谁最近、多远"写成属性字段,服务区把路网距离变成可达范围。本节讲三把尺子的适用边界与参数细节(融合、侧型、欧氏与路网距离之别),并演示它们与叠加六式的组合用法。

距离是最常用的空间变量

翻开任何一份空间分析报告,十有六七含距离条件:"距学校 500 米内""距加油站不足 100 米""步行 15 分钟可达"。距离之所以高频,是因为它把连续空间翻译成了非此即彼的判断——在 500 米内或不在,这种二元化让叠加运算成为可能。

但"距离"这个词在不同语境下指三种不同的东西,用错尺子结论就错。直线距离(欧氏距离):两点间穿空直线,乌鸦飞的路线,算起来最快,适合管线、视线类问题。路网距离:沿道路网的实走路径,绕行、限速、单行都算数,适合出行、配送类问题。时间距离:路网距离除以速度,再叠加拥堵,是"15 分钟生活圈"的真正度量。三把尺子对应的工具分别是缓冲区与近邻、网络分析的服务区、带阻抗的服务区。

图:三把距离尺子

图:三把距离尺子

缓冲区:距离的第一形态

缓冲区工具的输入是点、线或面,输出是一个面——距离源要素不超过给定值的范围。参数看似只有"距离",实则有三个决策点。

距离单位:写 "500 Meters" 而不是裸数字 500。裸数字按输入坐标系单位解释,米制坐标系下侥幸正确,经纬度数据下就是 500 度的天文笑话——5.1 节的警告 000978 说的就是它。

融合选项:一千个超市各生成 800 米缓冲,重叠处是否合并成一片。默认 NONE 保留一千个独立面(适合"哪个超市覆盖了这个小区"的追溯),DISSOLVE 融合成连续覆盖面(适合"城区服务覆盖范围"的展示)。分析用保留、展示用融合,两份都要就跑两次。

侧型与端头:线的缓冲可以双面、左面、右面,端头可平可圆。道路红线分析(左右各退 30 米)与单侧河岸带(只缓冲左岸)用到它们。

import arcpy arcpy.env.workspace = r"K:/gisdata/site_select.gdb" # 一、保留式缓冲:每校一个面,可追溯归属 arcpy.analysis.Buffer("schools", "school_buf_800", "800 Meters", dissolve_option="NONE") # 二、融合式缓冲:全区教育服务覆盖一片 arcpy.analysis.Buffer("schools", "school_cover", "800 Meters", dissolve_option="ALL") n1 = int(arcpy.management.GetCount("school_buf_800").getOutput(0)) n2 = int(arcpy.management.GetCount("school_cover").getOutput(0)) print(f"保留式 {n1} 个面,融合式 {n2} 个面") # 输出: 保留式 63 个面,融合式 9 个面 —— 63 校连片成 9 大覆盖区

缓冲区与六式的组合是标准打法。求"在学区覆盖内的人口",先缓冲学校、再与人口小区图层相交、最后按人口字段汇总——缓冲把"距离条件"物化为图层,相交让两个世界相遇。

近邻分析:把距离写进属性

缓冲区回答"在不在范围内",近邻分析(Near)回答"离谁最近、到底多远"。它不改几何,只在输入图层的属性表上追加最近要素的 ID 与距离——本质是空间连接的特化版。

import arcpy arcpy.env.workspace = r"K:/gisdata/site_select.gdb" # 给每个候选店址找最近的地铁站:追加 NEAR_FID 与 NEAR_DIST 字段 arcpy.analysis.Near("candidate_sites", "metro_stations", "1500 Meters") rows = [(r[0], round(r[1], 1)) for r in arcpy.da.SearchCursor("candidate_sites", ["site_id", "NEAR_DIST"])] for sid, d in rows[:5]: print(f"店址 {sid} 距最近地铁站 {d} 米") # 输出: # 店址 S01 距最近地铁站 245.3 米 # 店址 S02 距最近地铁站 886.0 米 # 店址 S03 距最近地铁站 1402.5 米 # 店址 S04 距最近地铁站 298.7 米 # 店址 S05 距最近地铁站 143.2 米

加上最大搜索半径参数(例中的 1500 米),超出的要素距离记 -1——这本身是筛选信号:距地铁超过 1.5 公里的店址直接出局。Near 的孪生工具 GenerateNearTable 更进一步,输出前 K 近的完整表而非只记最近一个,适合"周边 3 公里内有几家竞品"这类多邻分析。

服务区:路网上的可达范围

缓冲区的圆是真的圆,但城市里人不能飞。服务区分析(需要网络数据集与 Network Analyst 扩展)沿路网生长:从设施点出发,按阻抗(距离或时间)阈值切割街道,围出真实可达范围。

操作步骤:生成社区医院 10 分钟服务区 1. 准备网络数据集:基于路网要素构建,设置步行速度属性(默认 5 公里每小时) 2. 新建服务区图层:分析选项卡、网络分析、新建服务区 3. 加载设施:把社区医院点加载为设施点 4. 设定中断值:服务区选项卡、中断值填 10,单位选分钟 5. 生成面:求解,输出按 10 分钟一圈的面(可叠设 5、10、15 三档) 6. 叠加评估:服务区面与人口小区相交,统计各档覆盖人口比例

第 6 步让服务区回到叠加语境:可达性分析的最后一步,仍然是空间连接或相交——量尺生产图层,叠加消费图层,这个分工贯穿始终。

三尺联用的一个提醒

三把尺子联用时注意口径一致:服务覆盖评估里,学校用直线缓冲、医院用路网服务区,两套口径得出的覆盖率不可比。要么统一升级到路网,要么在报告里明确标注各自口径。距离口径的混用是评估报告里最隐蔽的逻辑漏洞之一。

⚠️ 常见坑:缓冲区后忘了坐标系单位。对 Web 墨卡托图层直接做 800 米缓冲,实际地面距离随纬度膨胀百分之几十——先投影到高斯带再做距离运算,是第 2 章规则在本章的再次兑现。

💡 关键直觉:距离条件先"物化"为图层,再参与叠加。缓冲区、服务区都是把连续的距离变量切成一块可以相交的橡皮——想通这一点,任何"距 X 多少范围内"的问题都有了固定解法。

要点回顾

  • 三种距离:直线、路网、时间,选错尺子结论错,口径混用结论不可比
  • 缓冲三决策:单位带 Meters、融合按用途、侧型按场景
  • Near 是属性级量尺:最近者与距离写入字段,搜索半径做预筛
  • 服务区是路网生长:中断值分档,覆盖评估落回相交与连接
  • 物化再叠加:距离条件变图层,叠加消费图层,固定套路

工具箱到此配齐。下一节全副武装进入综合案例:为连锁超市选出最佳新店址,从商业逻辑到地图答案的完整推演。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U