news 2026/10/21 18:40:57

ArcGIS大型超市选址:矢量叠置与栅格计算双路线实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ArcGIS大型超市选址:矢量叠置与栅格计算双路线实战

简介:这份PPT面向地理信息、城市规划与商业选址方向的学习者,以大型超市选址为完整案例,讲解如何用ArcGIS把空间分析落到实际决策中。内容围绕商业布局原则、选址依据与数据准备展开,覆盖土地利用、道路交通、超市与停车场分布、地铁公交站点、居民点等六类图层,并分别演示矢量与栅格两条技术路线:矢量部分涉及土地分级、缓冲区、泰森多边形与叠置分析,栅格部分则包含分析环境设置、距离图、重分类、临近分配与栅格计算器叠加。资源包共1个PPT文件,约227KB,结构紧凑,适合课堂讲解或自学对照。目前已有256人学习,读者可借此掌握从数据准备到综合评定的完整选址流程,并把方法迁移到零售、服务业与城市规划等场景。

1. 大型超市选址综合:从一份 PPT 拆出 ArcGIS 双路线落地法

手里这份《第16章 大型超市选址综合.ppt》不是那种翻两页就关的课件,它把 ArcGIS 在商业选址里的两条完整技术路线——矢量叠置和栅格计算——压进了一个案例里。80% 的商业经济活动数据带空间特征,这话放在选址上尤其扎心:拍脑袋定的点位,开业三个月客流上不来,回头复盘才发现要么被现有超市的缓冲区吃掉了辐射范围,要么居民点泰森多边形压根没覆盖到。这份资源解决的就是“怎么用空间分析把选址从玄学变成可复现的评分模型”,适合会基本 ArcGIS 操作、但没完整跑过选址流程的从业者,也适合拿它当教学案例拆解的学生。下面我按自己复现的节奏,把矢量路线和栅格路线各拆一遍,顺带把参数和翻车点标出来。

2. 矢量路线:土地利用分级与四层缓冲区怎么设参数

矢量路线的核心逻辑是“先筛地,再算距离,最后叠置打分”。土地利用图负责把不可能建超市的地块踢掉,缓冲区负责量化各因素影响范围,泰森多边形负责把居民点变成面,叠置分析负责把所有这些图层揉成一张综合评分图。这条路线的好处是每一步都看得见摸得着,属性表里加字段、赋分值,出了问题能追溯到具体哪个图层哪条记录。

2.1 土地利用分级:先做排除法再做适宜性打分

打开土地利用图属性表,先看地类字段。大型超市不可能建在水面、林地、农田上,也不适合建在工业用地上,所以第一步是筛选出城建用地。常见做法是新建一个短整型字段Suit,用字段计算器按地类编码赋值:城镇用地给 3,工业用地给 1,水面林地农田给 0。这里有个容易翻车的地方——地类编码在不同数据源里不统一,有的用两位数,有的用字符串,赋值前一定先Frequency统计一下唯一值,别照着 PPT 上的编码硬套。

# 在 ArcGIS Pro 的 Python 窗口里批量赋值,假设地类字段名为 DLMC # 先看唯一值,确认编码体系 import arcpy fc = r"C:\data\landuse.shp" with arcpy.da.SearchCursor(fc, ["DLMC"]) as cursor: vals = set(row[0] for row in cursor) print(vals) # 确认实际地类名称 # 按实际名称赋值,避免编码对不上 arcpy.management.AddField(fc, "Suit", "SHORT") with arcpy.da.UpdateCursor(fc, ["DLMC", "Suit"]) as cursor: for row in cursor: if row[0] in ["城镇住宅用地", "商服用地"]: row[1] = 3 elif row[0] == "工业用地": row[1] = 1 else: row[1] = 0 cursor.updateRow(row)

这段代码先做唯一值探查再赋值,比直接写死编码稳。Suit字段后续要参与叠置,所以用短整型,别用浮点,不然后面加权求和时精度对不齐。赋值逻辑里城镇住宅和商服给最高分,是因为这两类用地人口密度和购买力预期最高,工业用地给低分但不排除,留个弹性。

2.2 四层缓冲区:距离参数不是拍脑袋,看数据尺度

停车场、现有超市、道路、地铁公交站点这四个图层要分别建缓冲区。缓冲区距离怎么定?PPT 里没给具体数值,但按城市尺度的大型超市辐射逻辑,我一般这么设:现有超市用 1000 米和 2000 米两圈,1000 米内视为强竞争直接降级,1000 到 2000 米视为中度竞争;道路用 500 米,覆盖步行可达范围;停车场用 300 米,因为顾客步行到停车场的容忍度低;地铁公交站点用 500 米,这是公共交通接驳的合理步行距离。

# 批量缓冲区,输出到地理数据库里,避免 shapefile 字段名截断 out_gdb = r"C:\data\site.gdb" buffers = [ ("supermarket", 1000, "super_1000"), ("supermarket", 2000, "super_2000"), ("road", 500, "road_500"), ("parking", 300, "park_300"), ("transit", 500, "transit_500"), ] for src, dist, out_name in buffers: arcpy.analysis.Buffer( os.path.join(out_gdb, src), os.path.join(out_gdb, out_name), f"{dist} Meters", dissolve_option="ALL" # 同类要素融合,减少叠置时的碎片 )

dissolve_option="ALL"这个参数很关键。如果不融合,同一图层里相邻要素的缓冲区会重叠,叠置后属性表里出现大量重复记录,后续加权求和直接翻车。融合后每个距离圈只有一个面,属性表干净。缓冲区建完还要分级,比如现有超市 1000 米内给 1 分,1000 到 2000 米给 2 分,2000 米外给 3 分,用AddField加Score字段手动或脚本赋值。

2.3 泰森多边形:居民点从点变面,边界要设对

居民点是点图层,要参与叠置就得变成面。泰森多边形的逻辑是每个居民点控制离它最近的那片区域,正好用来表达“这个点周边多大范围算它的潜在客群”。操作上直接用CreateThiessenPolygons工具,但有个参数必须注意:输出字段选ALL,这样居民点属性表里的入口数、户数这些字段会带到多边形上,后面按人口加权才有依据。

arcpy.analysis.CreateThiessenPolygons( os.path.join(out_gdb, "residential"), os.path.join(out_gdb, "res_thiessen"), fields_to_copy="ALL" ) # 按居民点人数给泰森多边形打分,人数越多分值越高 arcpy.management.AddField(os.path.join(out_gdb, "res_thiessen"), "PopScore", "SHORT") with arcpy.da.UpdateCursor(os.path.join(out_gdb, "res_thiessen"), ["POP", "PopScore"]) as cursor: for row in cursor: if row[0] >= 5000: row[1] = 3 elif row[0] >= 2000: row[1] = 2 else: row[1] = 1 cursor.updateRow(row)

泰森多边形的边界默认只覆盖到点群外围,如果研究区边缘有居民点,生成的多边形会超出行政区范围,叠置前记得用行政区划面裁剪一下,不然边缘区域评分虚高。

2.4 叠置分析:加权求和还是等级叠加,看决策需求

所有图层准备完毕后,用Intersect做叠置。这里有两种打法:一种是所有图层Intersect后属性表里每个图斑带所有分值字段,然后加一个Total字段做加权求和;另一种是逐层Union后按等级组合查表。加权求和更灵活,权重可以调,比如交通权重 0.3、居民点权重 0.3、竞争权重 0.2、停车场权重 0.2。

# 依次叠置,最后得到综合评分 inputs = ["landuse_suit", "super_1000", "super_2000", "road_500", "park_300", "transit_500", "res_thiessen"] arcpy.analysis.Intersect( [os.path.join(out_gdb, i) for i in inputs], os.path.join(out_gdb, "final_intersect"), join_attributes="ALL" ) # 加权求和,权重按项目实际调整 arcpy.management.AddField(os.path.join(out_gdb, "final_intersect"), "Total", "FLOAT") with arcpy.da.UpdateCursor( os.path.join(out_gdb, "final_intersect"), ["Suit", "Score", "Score_1", "Score_2", "PopScore", "Total"] ) as cursor: for row in cursor: row[5] = row[0]*0.2 + row[1]*0.2 + row[2]*0.2 + row[3]*0.2 + row[4]*0.2 cursor.updateRow(row)

字段名Score、Score_1是Intersect自动加的后缀,实际跑的时候先看一眼属性表确认对应关系,别把竞争分和交通分搞反了。加权求和后按Total降序排,前几个图斑就是候选点位。

3. 栅格路线:距离图、重分类与栅格计算器的参数对齐

矢量路线适合精细地块评估,栅格路线适合大范围快速扫面。两条路线的底层逻辑一样,但栅格路线的坑集中在像元大小、分析环境和重分类断点上。PPT 里把栅格路线单独列了一节,说明作者也认可它在实际项目里的效率优势——尤其是研究区跨几个行政区、矢量数据量大的时候,栅格计算器跑一遍比Intersect快得多。

3.1 分析环境:像元大小和掩膜一个都不能少

栅格分析第一步是设环境。像元大小决定精度和计算量,城市尺度选址一般用 10 米到 30 米。如果研究区是建成区,10 米够用;如果包含郊区,30 米更稳,不然数据量爆炸。掩膜用行政区划面,保证所有输出栅格范围一致,不然后面栅格计算器对不齐行列号,直接报错。

# 设置栅格分析环境 arcpy.env.workspace = r"C:\data\site.gdb" arcpy.env.cellSize = 10 # 像元大小 10 米 arcpy.env.mask = os.path.join(out_gdb, "study_area") # 行政区划掩膜 arcpy.env.extent = os.path.join(out_gdb, "study_area") arcpy.env.snapRaster = os.path.join(out_gdb, "landuse_rast") # 对齐参考栅格

snapRaster这个参数很多人忽略,但它决定了所有输出栅格的像元对齐方式。不设的话,不同工具输出的栅格可能差半个像元,栅格计算器相加时边缘出现空值条带。

3.2 矢量转栅格与距离图:转换字段选对,距离图才准

土地利用图转栅格时,转换字段选Suit而不是地类编码,这样输出的栅格值直接就是适宜性分值,省一步重分类。道路、停车场、超市、公交站点转栅格后,用EuclideanDistance生成距离图。这里注意:距离图的单位是地理坐标系单位,如果数据是经纬度,输出的是度,不是米。所以转栅格前确认数据投影是投影坐标系,单位是米。

# 土地利用转栅格,值字段用 Suit arcpy.conversion.PolygonToRaster( os.path.join(out_gdb, "landuse_suit"), "Suit", os.path.join(out_gdb, "landuse_rast"), cell_assignment="MAXIMUM_AREA" ) # 道路距离图 arcpy.sa.EucDistance( os.path.join(out_gdb, "road_rast"), cell_size=10, out_direction_raster=None ).save(os.path.join(out_gdb, "road_dist"))

cell_assignment="MAXIMUM_AREA"表示像元值取覆盖面积最大的那个多边形,避免小图斑被忽略。距离图生成后,值域是 0 到最大距离,接下来要重分类。

3.3 重分类:断点定不好,评分全乱套

重分类是把连续距离值转成离散评分。道路距离图,0 到 500 米给 3 分,500 到 1000 米给 2 分,1000 米以上给 1 分。现有超市距离图反过来,0 到 1000 米给 1 分,1000 到 2000 米给 2 分,2000 米以上给 3 分。断点依据和矢量路线的缓冲区距离保持一致,两条路线结果才有可比性。

# 道路距离重分类 road_reclass = arcpy.sa.Reclassify( os.path.join(out_gdb, "road_dist"), "Value", arcpy.sa.RemapRange([[0, 500, 3], [500, 1000, 2], [1000, 99999, 1]]) ) road_reclass.save(os.path.join(out_gdb, "road_score"))

RemapRange的区间是左闭右开,所以 500 落在第二个区间。如果断点设成 500 和 1000,实际分类是 0 到 500、500 到 1000、1000 以上,不会重叠也不会漏值。

3.4 临近分配与栅格计算器:居民点权重怎么加

临近分配工具EucAllocation能把每个栅格分配给最近的居民点,同时输出每个居民点的影响范围。结合居民点人数字段,可以算出每个栅格的潜在客群规模。最后用栅格计算器把所有评分图层按权重相加。

# 临近分配,输出分配栅格和距离栅格 alloc = arcpy.sa.EucAllocation( os.path.join(out_gdb, "residential_rast"), maximum_distance=5000, cell_size=10 ) alloc.save(os.path.join(out_gdb, "res_alloc")) # 栅格计算器加权求和 final = (arcpy.sa.Raster(os.path.join(out_gdb, "landuse_rast")) * 0.2 + arcpy.sa.Raster(os.path.join(out_gdb, "road_score")) * 0.2 + arcpy.sa.Raster(os.path.join(out_gdb, "super_score")) * 0.2 + arcpy.sa.Raster(os.path.join(out_gdb, "park_score")) * 0.1 + arcpy.sa.Raster(os.path.join(out_gdb, "transit_score")) * 0.1 + arcpy.sa.Raster(os.path.join(out_gdb, "res_alloc")) * 0.2) final.save(os.path.join(out_gdb, "final_site"))

权重加起来必须等于 1,不然最终分值量纲不对。EucAllocation输出的分配栅格值是居民点 ID,不是人数,所以实际项目里要先用查找表把 ID 映射成人数再参与计算,这里为了演示简化了。

4. 避坑排查:选址分析里最容易翻车的五个地方

4.1 缓冲区融合没做,叠置后属性表爆炸

现象:Intersect跑完,属性表记录数是输入图层记录数的几倍甚至几十倍,加权求和结果完全不可信。原因:同一图层内相邻要素的缓冲区重叠,叠置时每个重叠区生成独立记录。解决:建缓冲区时勾选dissolve_option="ALL",或者事后用Dissolve按缓冲区距离字段融合。

4.2 投影坐标系没统一,距离图单位是度

现象:EucDistance输出的距离图值域是 0 到 0.5 这种小数,重分类断点按米设的完全对不上。原因:数据是地理坐标系(WGS84 或 CGCS2000),距离单位是度。解决:分析前用Project工具把所有图层转到投影坐标系,比如 UTM 或高斯克吕格,单位选米。

4.3 泰森多边形超出研究区,边缘评分虚高

现象:叠置后研究区边缘出现大片高分区域,实地一看是荒地。原因:泰森多边形默认覆盖点群凸包范围,边缘居民点生成的多边形延伸到研究区外,叠置时被裁切后仍保留高分值。解决:生成泰森多边形后用行政区划面Clip,或者叠置前先Intersect一次。

4.4 重分类断点重叠,栅格出现空值

现象:重分类后栅格出现 NoData 条带。原因:RemapRange区间设置时前后区间断点没衔接,比如前一个区间到 500,后一个从 501 开始,500 到 501 之间落空。解决:区间用左闭右开,前一个区间上限等于后一个区间下限,如[0,500,3]和[500,1000,2]。

4.5 栅格计算器权重和不为 1,最终分值量纲错

现象:最终栅格值域是 0 到 5 或者 0 到 0.8,跟预期 0 到 3 对不上。原因:各图层权重相加不等于 1,或者某个图层本身值域不是 0 到 3。解决:加权前用GetRasterProperties检查每个图层最大最小值,归一化到统一量纲后再乘权重。

5. 进阶技巧:用模型构建器把两条路线串成可复用工具

矢量路线和栅格路线各跑一遍后,我发现真正费时间的不是操作本身,而是每次换研究区都要重新设参数、重新对字段。后来我把整个流程拆成模型构建器里的两个子模型,矢量一个、栅格一个,输入输出用参数暴露出来,换数据时只改变量不碰工具。

具体做法:在 ArcGIS Pro 的 ModelBuilder 里新建模型,把Buffer、Intersect、AddField、CalculateField这些工具拖进去,用P标记参数。关键是把缓冲区距离、权重系数、像元大小做成模型参数,运行时弹窗输入。模型跑通后导出为 Python 脚本,放到工具箱里,下次直接调用。

# 模型导出后的脚本片段,参数化调用 import arcpy arcpy.env.overwriteOutput = True def site_selection(landuse, roads, supermarkets, parking, transit, residential, study_area, cell_size, out_gdb): arcpy.env.cellSize = cell_size arcpy.env.mask = study_area # 后续步骤省略,核心是把所有中间数据写入 out_gdb # 这样每次换研究区只改输入路径和 cell_size

验证方法:拿两个不同城市的数据分别跑一遍,对比最终高分区域是否落在实际商业中心附近。如果偏差大,优先检查土地利用分级字段和居民点人数映射,这两个是权重最大的输入。我现在的习惯是每次跑完模型,先看最终栅格的直方图,如果高分区域占比超过 30%,说明权重太松或者断点太宽,得收紧参数。从那以后我每次换研究区都强制走一遍直方图检查,省得后面返工。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 18:40:38

基于S7-200 PLC的换热站自控改造:闭环调节与工程实践

简介:这份文档面向自动化、暖通及热力工程相关专业的学生与技术人员,围绕基于PLC的热力公司换热站控制系统展开,可用于课程设计、毕业设计或工程方案参考。资源为单个doc文件,压缩包约277KB,内容以章节化文档形式组织&…

作者头像 李华
网站建设 2026/10/21 18:40:25

artcraft:从念头到成品的可复用创作方法论

1. 从“artcraft”这个名字说起:它到底想解决什么问题第一次看到“artcraft”这个标题,我脑子里蹦出来的第一反应是:这大概率不是一个单纯的绘画工具,也不是一个纯粹的手工教程合集。把“art”和“craft”拼在一起,本身…

作者头像 李华
网站建设 2026/10/21 18:39:17

SPX3819M5-3-3中文资料详解:500mA低噪声LDO选型与电路设计指南

简介:SPX3819M5-3-3中文资料.pdf面向电源管理与模拟电路方向的电子工程师、硬件设计人员及电子类专业学生,聚焦低噪声、低压差LDO稳压器的选型与应用设计。该资料围绕SPX3819系列展开,涵盖其低噪声(40μV)、1%输出精度…

作者头像 李华
网站建设 2026/10/21 18:39:11

AI写作工具怎么选:选题与降重的技术逻辑和9款实测拆解

1. 选型之前,先想清楚两件不同的事1.1 选题与降重,解决的其实是两类需求先说个我自己的判断:把“选题”和“降重”放进同一个工具清单里讨论,是当下智能写作市场最常见的分类方式,但这两件事本质上属于完全不同的工作流…

作者头像 李华
网站建设 2026/10/21 18:38:31

AI写作工具怎么选?围绕精准选题与高效降重搭建你的创作流程

上周帮一位朋友改稿,她对着空白的选题策划表发了两个小时呆,好不容易写出来的初稿又被系统判定重复率超标。这种两头受气的感觉,估计很多写作者都经历过。我自己从纸笔写作转到AI辅助写作,前后试过二十多款工具,最终稳…

作者头像 李华