关于 carto-site-selection
carto-site-selection 指导构建 CARTO Workflows,用空间数据评估新设施选址、现有地点间的客流蚕食风险,以及与高绩效地点相似的区域。适用于零售、交通等地点规划分析。
主要功能
- 01按需求信号为候选地点评分排序
- 02分析新旧地点服务区重叠
- 03发现与高绩效地点相似的区域
- 04使用 H3 或 Quadbin 网格分析
- 05结合人口、收入和兴趣点数据
适用场景
- 01筛选新门店候选位置
- 02估算新店对现有门店的影响
- 03寻找类似优秀门店的扩张区域
MCP 相关
指导通过 CARTO MCP 服务的工作流工具创建、验证和运行 Workflow;未连接时可改用 CARTO CLI。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ cartodb/ agent-skills --skill carto-site-selection安装后在 Claude Code 中输入/carto-site-selection确认已加载。
详细介绍
选址与蚕食分析
构建 CARTO 工作流,通过组合空间条件,识别新设施(商店、车站、办公室)的最佳位置,并量化重叠商圈带来的蚕食风险。还涵盖双生区域和相似位置发现。
前提条件:加载 carto-create-workflow,了解开发流程、JSON 结构和验证方式。该指南涵盖两种访问路径:连接 MCP 服务时,使用 MCP 服务的工作流工具(create_workflow、validate_workflow、run_workflow);否则使用 carto workflows CLI。路由提示:carto-basics/references/access-paths.md。如果工作流涉及等时圈、缓冲区或商圈丰富化,请加载 carto-trade-area-analysis,其中详细介绍了商圈处理流程。
决策树
| 用户意图 | 模式 |
|---|---|
| “我应该在哪里开一家新店?” | 选址(评分 + 排名) |
| “开一家新店会影响现有门店吗?” | 蚕食分析 |
| “找到与表现最佳门店相似的位置” | 双生区域 / 相似位置 |
说明
模式 A:选址(评分 + 排名)
Existing locations + Target area -> Spatial indexing -> Enrich with demographics/POIs -> Score/Rank -> Filter top candidates -> Save
步骤 1:加载数据
使用 native.gettablebyname 加载两个数据集:
- 现有位置(当前门店 / 设施)
- 目标区域(例如城市边界、区级多边形,或覆盖研究区域的网格)
当候选位置和现有网络位于同一张表时进行拆分。 如果用户的数据源是单张表,且通过数值阈值定义“候选位置”(例如 revenue ≥ X、size ≥ Y),则使用一个 native.where 应用该条件,并将其 match 输出连接到候选位置处理流程,将 unmatch 输出连接到现有网络处理流程。从一个节点分出两条数据流——这比 orderby + limit + customsql NOT IN 简洁得多,而且完全不需要 customsql。该阈值近似于“前 N 个”;如果用户明确要求“恰好排名前 25”,仍应使用 orderby + limit,但要清楚这会增加节点数。
成功标准:两张表均已加载,包含几何列和唯一标识符。
步骤 2:构建候选网格
使用 native.h3polyfill 或 native.quadbinpolyfill 将目标区域填充为 H3 或 Quadbin 单元格。每个单元格都是一个候选微观位置。
成功标准:生成覆盖研究区域的连续单元格网格。
步骤 3:丰富候选位置
使用 native.h3enrich、native.joinv2 或 Data Observatory,为每个单元格添加需求信号,例如人口、收入、人流量和 POI 密度。
如果候选区域是连续多边形(商圈 / 区域)而非网格,那么选择 native.enrichpolygons 还是 native.spatialjoin + native.groupby 会很重要——有关取舍(AT 依赖、节点数、谓词 / 连接控制),请参阅 carto-spatial-enrichment 的步骤 4。
成功标准:每个网格单元格都包含表示需求 / 适宜性因素的数值列。
第 4 步:按与现有位置的距离筛选
使用 native.h3distance 计算每个候选网格单元到最近现有位置的跳数距离。筛除距离过近(存在蚕食风险)或过远(物流成本过高)的网格单元。输出的是跳数,而非度量距离——请根据分辨率的边长换算(参见注意事项)。
距离语义——应根据服务范围多边形,而非候选点来衡量蚕食。 当候选位置是带有生成的服务区域(等值线/缓冲区——参见 carto-trade-area-analysis)的点时,应计算候选位置的服务范围多边形到现有竞争对手点的 native.distance,而不是从候选点本身计算。原因:只要竞争对手位于服务区域内,ST_DISTANCE(polygon, point) = 0——这正是你需要的蚕食信号。点到点距离只会显示“最近的竞争对手有多远”,却掩盖了重叠情况。选择与服务区域大小相符的 radius(例如,10 分钟步行服务范围可设为约 5 公里);半径过大会稀释信号。这种多边形到点的模式介于模式 A 的 H3 跳数筛选和模式 B 的完整网格重叠分析之间——只要候选位置已有连续的服务区域几何形状,就应使用它。
成功标准:候选网格单元与现有位置的距离处于合理范围内;若存在服务范围多边形,则从该多边形衡量蚕食信号。
第 5 步:评分与排序
使用 trade-area-analysis 中的评分模式:
- 使用
native.normalize将每个变量归一化至 [0,1] - 使用
native.selectexpression和用户定义的权重计算综合得分 - 使用
native.orderby(降序)和native.limit(前 N 个)进行排序
成功标准:得到按综合得分和贡献变量排序的候选网格单元清单。
第 6 步:保存
使用 native.saveastable。H3/Quadbin 列可直接在 CARTO Builder 中可视化。
成功标准:已验证且可上传的工作流。
模式 B:蚕食分析
Existing + Proposed locations -> Trade areas (isoline/buffer) -> Polyfill to grid -> Intersect/Join -> Measure overlap -> Save
第 1 步:加载数据
加载现有位置和拟议位置(或加载带有标志列、用于区分两者的单个表)。如果两组数据位于同一个表中,且通过数值阈值(例如 revenue ≥ X)定义划分方式,请参见模式 A 第 1 步中的 native.where 匹配/不匹配划分——它可以从一个节点生成两条数据流,避免使用 customsql。
成功标准:两组数据均已加载,并包含几何信息和唯一标识符。
第 2 步:生成服务区域
使用 native.isolines(真实路网)或 native.buffer(简单缓冲区),为现有位置和拟议位置生成服务区域。两组位置使用相同参数,以确保结果可比。
成功标准:每个位置都有一个参数一致的服务范围多边形。
第 3 步:填充空间索引
使用 native.h3polyfill 将所有服务范围多边形转换为 H3 或 Quadbin 网格单元。保留位置标识符和 is_proposed 标志。
成功标准:每个位置的每个网格单元各占一行,并包含位置 ID 和类型标志。
第 4 步:查找重叠
在现有位置网格单元和拟议位置网格单元之间,使用 native.joinv2 基于空间索引列执行内连接。结果包含至少同时属于一个现有位置和一个拟议位置的网格单元。
成功标准:输出仅包含同时落入现有位置和拟议位置服务范围内的网格单元。
第 5 步:衡量影响
使用 native.groupby 汇总重叠情况:
- 按现有位置统计:重叠网格单元数量/该位置服务范围内的网格单元总数 = 重叠百分比
- 为重叠网格单元添加数据:关联人口或收入数据,以量化共享需求
使用 native.selectexpression 计算重叠率。
成功标准:每个现有位置都有一个重叠指标,显示其服务范围中与拟议位置共享的比例。
第 6 步:保存
使用 native.saveastable。
成功标准:已验证的工作流,并包含各位置的蚕食指标。
模式 C:孪生区域/相似位置
Top-performing locations -> Trade areas -> Enrich -> Build similarity model -> Score all candidate areas -> Rank -> Save
步骤 1:确定参考位置
加载完整的位置数据集。使用 native.wheresimplified 或 native.orderby + native.limit,筛选表现最佳的位置(例如,按收入排名位于前四分位数的位置)。
成功标准:筛选出一组表现出色的位置,作为参考集。
步骤 2:生成并丰富商圈
在参考位置周围创建等时圈或缓冲区商圈。填充到 H3/Quadbin。使用人口统计数据、POI 和任何相关变量进行丰富。
成功标准:每个参考位置都有丰富的人口统计资料。
步骤 3:构建孪生区域模型
使用 native.buildtwinareasmodel(BUILD_TWIN_AREAS_MODEL),根据经过丰富的参考位置创建基于 PCA 的相似度模型。
- 输入:带有数值特征列的经过丰富的参考位置
- 模型捕捉表现出色位置的多变量“特征”
成功标准:生成一个编码了表现出色位置人口统计特征的模型产物。
步骤 4:查找相似位置
使用 native.findsimilarlocations(FIND_SIMILAR_LOCATIONS),根据孪生区域模型为所有候选区域评分。
- 输入:使用与构建模型时相同变量进行丰富的候选区域
- 输出:每个候选区域的相似度分数
成功标准:每个候选区域都有相对于参考集的相似度分数。
步骤 5:排序并保存
按相似度分数降序排序。保存排名靠前的候选区域。
成功标准:生成一份排名列表,其中包含与表现出色位置最相似的区域。
商业热点变体
对于由需求驱动的选址(例如“未满足需求最高的地方在哪里?”),请使用 native.commercialhotspots:
- 在研究区域上构建 H3 网格
- 使用目标需求变量丰富网格(例如 15-34 岁人口)
- 使用
variablecolumns和weights运行native.commercialhotspots - 按显著性筛选结果(
p_value < 0.05) - 可选择使用
native.h3distance筛选与现有位置的距离,聚焦服务不足的区域
注意:variablecolumns 使用 Python 风格的列表语法(['col1', 'col2']),而 weights 使用逗号分隔;详情请参阅 trade-area-analysis 中的注意事项。
注意事项
- 提供商的大小写规则和 SQL 方言。 此技能使用小写列名(
h3、is_proposed、population等),符合 BigQuery / Databricks / Postgres / Redshift 的惯例。在 Snowflake 上,未加引号的标识符会显示为大写;请使用H3、IS_PROPOSED、POPULATION引用。有关大小写规则和 SQL 方言等效项,请参阅carto-create-workflow/references/providers/<provider>.md。 native.commercialhotspots需要 Analytics Toolbox 的 Retail 模块。使用--connection验证是否可用。- 孪生区域和相似位置在内部使用 PCA;结果对变量选择和缩放方式很敏感。仅包含相关且不冗余的变量。如果输入的尺度差异很大,请先进行归一化。
- 侵蚀重叠高度依赖于商圈定义(缓冲半径、等时线时间)。参数的微小变化就可能导致结果反转。请记录所选参数及其理由。
native.h3distance返回的是跳数,而不是物理距离。将跳数乘以对应分辨率下的近似网格边长,可得粗略的公制距离(例如,分辨率 8 时每跳约为 460m,分辨率 9 时每跳约为 174m)。- 比较不同规模的区域时,请将人口统计数据归一化为人均值或单位面积值,以避免规模偏差(例如,使用人口密度而非总人口)。
- “最佳”位置完全取决于所选的标准和权重;不存在客观正确的答案。请务必记录假设,并允许用户调整权重。
- 对于孪生区域模型,参考位置和候选位置必须使用相同的一组丰富变量。变量不匹配会导致模型失败或生成毫无意义的分数。
参考模板
Academy 教程
| 教程 | 提供方 | URL |
|---|---|---|
| 夏威夷檀香山 Pizza Hut — 使用商业热点进行选址 | BigQuery | 链接 |
| 夏威夷檀香山 Pizza Hut — 使用商业热点进行选址 | Snowflake | 链接 |
| 门店蚕食 — 量化新门店的影响 | BigQuery | 链接 |
| Starbucks 蚕食 — H3 网格重叠分析 | BigQuery | 链接 |
| 门店蚕食 — Quadkey 网格重叠 | Snowflake | 链接 |
| 查找业绩最佳门店的孪生区域 | BigQuery | 链接 |
| 根据商圈查找相似地点 | BigQuery | 链接 |
| 电动汽车充电站选址 | Workflows | 链接 |
常见变体
| 变体 | 方法 |
|---|---|
| 零售扩张 | 等时圈 -> 使用人口统计数据和竞争对手密度进行丰富 -> 综合评分 -> 选取前 N 个 |
| 特许经营区域规划 | 采用蚕食模式,在授予经营区域前确保服务范围互不重叠 |
| 电动汽车充电/公共服务 | 基于网格的需求(人口、交通)+ 筛除距现有设施过近的区域 -> 对服务不足的网格单元排序 |
| 广告牌/户外广告投放 | 缓冲区 -> 受众数据丰富 -> 归一化并加权 -> 选取前 N 个(参见 trade-area-analysis) |
| 银行网点优化 | 根据业绩最佳网点查找孪生区域 -> 查找相似的服务不足区域 -> 提议新网点 |
| 竞争对手邻近度分析 | 计算与竞争对手位置的 H3 距离 -> 筛选出远离竞争对手但靠近需求区域的网格单元 |