name: store-network-planner
version: 1.3.3
description: >
连锁门店网络布局规划与选址评估技能。支持多业态选址:餐饮/快消/服装/水果生鲜/娱乐场所。
核心目标:找出优质点位,开能盈利的门店。
V1.2 新增:地理空间分析(地图落位/距离/覆盖人口/等时圈/空白点扫描)
V1.3 增强:Streamlit Web 界面 / 真实人口栅格 / 预测闭环 / PPT 自动生成 / 4 个实战案例
V1.3.1 调整:Web界面在Agent场景不可用,已替换为图片模式(matplotlib PNG)
V1.3.2 增强:能力自检模块(matplotlib+AI文生图)+ AI 装修效果图
V1.3.3 增强:vision门店照片分析 / VI一致性 / 客流热力图 / 多Agent并行
V1.3.4 增强:图片智能压缩(4档位:微信/报告/缩略图/邮件)
V1.3.5 增强:analogy_predict_enhanced bug修复(兼容中英字段)+ 客流波动预测(4因子模型)
V1.3.6 增强:天气 API 自动接入(和风/心知/mock 降级)+ PDF 报告生成(fpdf2 + 中文字体)+ 25 个脚本全栈回归测试 25/25 通过
trigger_keywords:
# 选址类
- 新店选址 / 点位评估 / 门店布局规划 / 落位
- 商圈分析 / 商圈调研 / 客流统计 / 客流热力
- 竞争对标 / 竞品分析 / 跨业态竞争
- 周边配套 / 公共资源 / 聚客点
# PDF / 邮件附件(V1.3.6 新增)
- PDF 报告 / 邮件附件 / 打印版报告
- 客流周报 / 选址评估 PDF / 综合评估报告
# 财务类
- 盈利预测 / 盈亏平衡 / 回本周期 / 投资测算 / 投资回收期
# 规划类
- 年度开店计划 / 城市进入 / 区域规划 / 网络布局
- 门店加密 / 门店分级 / 攻防地图 / 自相竞争
- 门店关闭 / 门店迁移 / 门店升级 / 关店决策
# 督导类
- 区域督导 / 门店巡查 / 整改 / 经营异常
# 预测类
- 好店预测 / 预测模型 / 类比法 / 回归法
- 预测精度 / 置信区间 / 预测需要什么数据
- 渗透率 / 覆盖半径 / 覆盖效率
# 跨业态
- 餐饮选址 / 便利店选址 / 服装选址 / 水果店选址 / 娱乐场所选址
# 地理空间(V1.2 新增)
- 地图 / 落位图 / 选址图 / 落点
- 周边 / 半径 / 距离 / 自相竞争距离
- 覆盖人口 / 等时圈 / 空白点 / 区域扫描
- 攻防地图 / 竞品分布 / 网络规划
- 经纬度 / 地理坐标 / 缓冲区 / 通勤
# AI 文生图(V1.3.2 新增)
- 装修图 / 效果图 / 概念图 / 装修参考
- 菜品图 / 菜品拍摄 / 菜品图
- 门头图 / 招牌设计 / 视觉设计
- 选址概念图 / 商圈概念图
# V1.3.3 新增
- 门店照片 / 督导巡查 / 现场照片
- VI 一致性 / 品牌一致性 / VI 检测
- 客流热力 / 人流数据 / 热力图
- 多 Agent / 并行分析 / subagent
# V1.3.4 新增
- 图片压缩 / 照片太大 / 压缩图片 / 缩图
- 微信发图 / 飞书发图 / 钉钉发图 / 工作群发图
- 报告插图 / PPT 插图 / 文档插图
- 缩略图 / 列表预览 / 图片预览
# V1.3.5 新增
- 客流预测 / 客流波动 / 客流估算 / 客流预估
- 明天客流 / 这周客流 / 下周客流
- 节日客流 / 国庆 / 春节 / 中秋 / 情人节
- 天气影响 / 下雨 / 高温 / 暴雨 / 严寒
- 备货预测 / 排班建议 / 营业时间
# V1.3.6 新增
- 天气 API / 天气预报 / 和风天气 / 心知天气 / QWeather / Seniverse
- 7 天预报 / 未来天气 / 自动天气
- PDF 报告 / 邮件报告 / 打印版报告 / 客流周报 PDF
- fpdf2 / 中文 PDF / 字体 / wqy-zenhei
连锁门店网络布局规划(V1.3.2 · 触发式加载版)
> 加载方式说明:本文档为入口与路由表。详细参数/案例/公式请按 → 跳转 标记加载对应 reference 文件。
> 核心原则:用户问什么 → 路由表匹配 → 按需加载对应模块,避免一次性加载所有内容(节省 token + 提升精度)。
零、首次使用(必读 · 能力自检)
> ⭐ 首次使用本 Skill 时必须运行此检查,确认当前环境能否生成图片。
快速检查
python scripts/capability_check.py
检查 3 项能力
| 能力 | 作用 | 缺失时影响 | 修复方法 |
|---|---|---|---|
| matplotlib 图表生成 | 必检,落位图/柱状图/雷达图 | ❌ 无法生成任何可视化 | pip install matplotlib contextily |
| AI 文生图(可选) | 装修效果图/菜品图/概念图 | ⚠ 无法生成 AI 图片 | 配置 OPENAI_API_KEY 等 |
| Agent 图片发送 | 必检,MEDIA:xxx.png 发给用户 |
❌ 用户收不到图 | 需 Hermes Agent 本身支持 |
自检输出示例(当前环境)
============================================================
store-network-planner V1.3.2 能力自检
============================================================
✅ matplotlib 图表生成(核心): OK
• matplotlib: 3.10.9 / contextily: 1.7.0 / 中文字体: wqy-zenhei.ttc
✅ AI 文生图(可选,装修图/效果图): OK
• openai_dalle: True / provider: openai_dalle
✅ Agent 图片发送能力: OK
============================================================
整体状态: OK ✓ 所有能力正常,可以开始使用
检测时机
- ✅ 自动:3 个 geo 脚本(geo_helper/batch/advanced)每次运行时自动检测
- ✅ 手动:随时运行
python scripts/capability_check.py - ✅ Agent 决策:调用
capability_check.get_capability_summary()快速判断
配置 AI 文生图(可选)
如需生成装修效果图,请配置以下任一后端:
方法 1:OpenAI DALL-E 3(推荐)
pip install openai
export OPENAI_API_KEY=sk-xxx
方法 2:Replicate(多模型)
pip install replicate
export REPLICATE_API_TOKEN=r8_xxx
方法 3:Stability AI
pip install stability-sdk
export STABILITY_API_KEY=sk-xxx
方法 4:配置文件
# ~/.hermes/config.yaml
image_gen:
provider: openai # 或 replicate / stability
api_key: sk-xxx
未配置时:所有数据图表(落位图/柱状图/雷达图)正常生成,仅 AI 装修图功能不可用。
零、快速路由(用户提问 → 加载什么)
> ⚠️ 本表为本 Skill 的核心,匹配用户意图后按需加载对应章节/文件,不要默认加载全部内容。
| 用户提问关键词 | 加载章节 | 详细文件 |
|---|---|---|
| 这个位置好不好 / 给我打个分 / 综合评估 | 三、六维评估 | references/assessment-model.md |
| 周边有什么 / 配套如何 / 有什么聚客点 | 四、周边配套 | (已内置在主文档) |
| 能赚多少钱 / 盈亏平衡 / 多久回本 / 投资测算 | 六、盈利测算 | references/profit-calculation.md |
| 竞争对手 / 跨业态竞争 / 自相竞争 | 七、八、竞争分析 | references/competitive-analysis.md |
| 怎么开分店 / 年度计划 / 城市进入 / 加密决策 | 十三、十四、十五 | references/business-analysis.md |
| 关店决策 / 门店分级 / 巡查整改 | 十三、门店分级 | (已内置在主文档) |
| 预测日均来客 / 预测营业额 / 好店模型 | 十六、好店预测 | references/prediction-methods.md(类比+回归合并) |
| 聚客点叠加 / 覆盖效率 / 渗透率 | 十一、商圈人口 | references/pedestrian-analysis.md |
| 业态特征 / 选址特征 | 业务分析 | references/business-analysis.md |
| 需要什么数据 / 预测精度 | 模型选型 | references/prediction-methods.md |
多关键词时按优先级路由:盈利 > 选址 > 规划 > 预测 > 督导。
一、业态分类体系(本 Skill 支持的五大业态)
| 业态 | 子类 | 选址重点 |
|---|---|---|
| 餐饮 | 快餐/正餐/火锅/茶饮/烘焙/日料/烧烤 | 商圈客流/时段分布/外卖覆盖 |
| 快消 | 便利店/超市/药店/烟酒/母婴用品 | 社区入口/交通枢纽/写字楼底商 |
| 服装 | 女装/男装/童装/运动/鞋类/内衣 | 商场专柜/步行街/社区商业街 |
| 水果生鲜 | 水果/蔬菜/肉禽/水产/卤味 | 社区门口/菜市场旁/住宅密集区 |
| 娱乐 | 电影院/KTV/剧本杀/棋牌/健身房/儿童乐园 | 购物中心/商圈核心/社区配套 |
→ 详细业态特征/选址特征:加载 references/business-analysis.md
二、用户画像采集(首次使用必问)
1. 业态类型:餐饮/快消/服装/水果生鲜/娱乐(必选)
2. 子类选择:见各业态子类列表
3. 产品特征:标准型/短效期/高库存/低库存
4. 目标客群:年龄/消费力/职业/消费习惯
5. 开发角色:总部开发/区域督导/加盟商
> 💡 用户画像采集后保存到记忆,后续会话自动应用。
三、六维评估模型(→ 评估"位置好不好")
> ⚠️ 评估模型(专家打分,定性)≠ 预测模型(数据驱动,定量)。用户问"好店模型"实际想要的是预测模型(见十六)。
| 维度 | 权重范围 | 核心指标 |
|---|---|---|
| 商圈价值 | 20-30% | 客流/客群匹配/消费力/竞争度 |
| 位置价值 | 20-25% | 可见性/可达性/展示面/停车 |
| 周边配套 | 15-25% | 交通/停车/聚客点/公共资源/营商环境 |
| 物业条件 | 10-20% | 面积/层高/排烟/排水/电力 |
| 租金性价比 | 10-15% | 租金/月营业额占比 |
| 未来潜力 | 5-10% | 规划红利/客群增长 |
评级标准:≥80分优先开发 | 60-80分谨慎评估 | <60分放弃
→ 各维度详细参数/打分细则/业态差异化权重:加载 references/assessment-model.md
四、周边配套评估(第六维度 · 核心特色 · 内置概要)
4.1 交通条件(30%)
| 类型 | 标准 |
|---|---|
| 地铁 | 步行≤5min=10分,≤10min=7分,≤15min=4分 |
| 公交 | ≥3条线=10分,≥2条=7分,1条=4分 |
| 主干道 | 主动线=10分,支路=7分 |
| 停车 | ≥20免费车位=10分,付费≤5元/h=8分 |
4.2 聚客点叠加公式(重要)
有效客流 = 基础客流 × (1 + 聚客点加成系数)
商场/购物中心:+30-50%
地铁站:+20-40%
菜市场:+20-30%(生鲜/餐饮强相关)
写字楼:+15-25%(快餐/咖啡强相关)
学校:+10-20%
医院:+10-20%
公园:+5-15%
叠加规则:多聚客点可叠加,2个以上加分上限150%(边际递减)
→ 完整聚客点评估/商圈人口分析/覆盖效率公式:加载 references/pedestrian-analysis.md
4.3 公共资源影响(按业态)
| 资源 | 餐饮 | 快消 | 服装 | 水果 | 娱乐 |
|---|---|---|---|---|---|
| 医院 | ★★☆ | ★★★ | ★★☆ | ★★★ | ★★☆ |
| 学校 | ★★★ | ★★★ | ★★☆ | ★★★ | ★★☆ |
| 公园 | ★★☆ | ★★★ | ★☆☆ | ★★★ | ★★★★ |
| 运动场 | ★★☆ | ★★★ | ★★☆ | ★★☆ | ★★★★ |
| 政府 | ★★☆ | ★★★ | ★☆☆ | ★★☆ | ★☆☆ |
五、覆盖效率标准(按业态 · 内置速查)
| 业态 | 覆盖半径 | 同商圈最多 | 租金占比上限 | 典型面积 |
|---|---|---|---|---|
| 餐饮 | 1.5-3km | 3-8家 | ≤15-20% | 30-200㎡ |
| 快消 | 0.5-1km | 5-15家 | ≤25-35% | 20-100㎡ |
| 服装 | 1-2km | 3-6家 | ≤20-30% | 30-150㎡ |
| 水果生鲜 | 0.5-1km | 3-8家 | ≤20-30% | 20-80㎡ |
| 娱乐 | 2-5km | 1-3家 | ≤25-35% | 100-500㎡ |
单店覆盖人口基准(区域督导自查用):
- 快餐:3-5万人,渗透率≥15%
- 便利店:0.5-1万人,渗透率≥20%
- 水果生鲜:0.5-1.5万人,渗透率≥25%
六、盈利测算(→ 加载 references/profit-calculation.md)
6.1 成本结构差异(速查)
| 业态 | 商品成本 | 人工 | 毛利率 | 回本周期 |
|---|---|---|---|---|
| 餐饮 | 30-40% | 20-30% | 60-70% | 6-18月 |
| 快消 | 60-75% | 10-15% | 25-40% | 12-24月 |
| 服装 | 40-55% | 10-15% | 45-60% | 12-36月 |
| 水果生鲜 | 65-80% | 10-15% | 20-35% | 12-24月 |
| 娱乐 | 20-35% | 15-25% | 65-80% | 12-36月 |
6.2 盈亏平衡公式
月固定成本 = 租金 + 人工 + 水电 + 折旧 + 其他
月盈亏平衡营业额 = 月固定成本 ÷ 毛利率
日需来客数 = 月盈亏平衡营业额 ÷ 30 ÷ 客单价
→ 完整测算器/分业态明细模板:加载 references/profit-calculation.md + 运行 scripts/profit_model.py
七、竞争分析框架(→ 加载 references/competitive-analysis.md)
7.1 竞争强度分级
| 等级 | 系数 | 策略 |
|---|---|---|
| 蓝海 | <0.5 | 优先抢占 |
| 良性 | 0.5-1.0 | 差异化定位 |
| 红海 | 1.0-2.0 | 精细化运营/特色突围 |
| 过饱和 | >2.0 | 谨慎进入/寻找细分 |
7.2 跨业态竞争视角
- 互补业态 → 互相引流(餐饮+水果+便利店)
- 替代业态 → 争夺客流(同品类餐饮)
- 目的性业态 → 独立需求(影院 vs 快餐)
→ 完整分析框架/对标表/攻防地图:加载 references/competitive-analysis.md
八、自相竞争管控(警戒线 · 内置速查)
| 业态 | 警戒距离 | 触发动作 |
|---|---|---|
| 餐饮 | <1km(同品类) | 提交分流分析报告 |
| 快消 | <0.5km | 评估密度饱和度 |
| 服装 | <1km(同价位) | 评估客群分层 |
| 水果生鲜 | <0.5km | 评估生鲜需求容量 |
| 娱乐 | <2km | 评估目的性消费覆盖 |
九~十二、商圈评估 / 人群画像 / 人口分析 / 开发周期
这些章节为参考性内容,用户主动问到"商圈怎么评估/客群怎么分析"时再加载:
- 九、商圈评估标准(按业态) →
references/business-analysis.md - 十、人群画像与消费能力 →
references/business-analysis.md - 十一、商圈人口分析(聚客点叠加/覆盖效率公式) →
references/pedestrian-analysis.md - 十二、开发周期管控(90-120天开业前关键节点) →
references/business-analysis.md
十三、门店分级动态管理(区域督导核心 · 内置速查)
季度复盘 → 门店分级调整
A+店:连续3月营收超均值150% → 维持旗舰标准
A店:连续3月营收超均值100% → 观察升级
B店:连续3月营收低于均值70% → 预警整改
C店:连续3月亏损 → 评估关闭/转型/降级
关店标准:
- 连续6月亏损且无好转趋势
- 物业条件恶化(租金上涨/规划变更)
- 商圈客流整体下降>30%
→ 完整分级标准/整改流程:加载 references/business-analysis.md
十四、输出模板(按场景)
14.1 新店选址评估报告
【新店选址评估报告】
业态:___ 子类:___
门店名称/地址:___
商圈类型:___
评估总分:___/100(___等级)
一、商圈价值
二、位置评估
三、周边配套(核心新增)
- 交通/停车/聚客点/公共资源/商圈成熟度
四、业态匹配分析
五、盈利预测(投资估算/成本结构/盈亏平衡/回本周期)
六、风险提示(自相竞争/跨业态/物业规划/聚客点变化)
七、综合建议:✓ 建议开店 / ⚠ 谨慎评估 / ✗ 不建议
14.2 城市进入评估报告
【城市进入评估报告】
城市:___ 等级:___ 目标业态:___
一、城市基本面(GDP/人口/消费力/商业地产)
二、目标业态市场分析(市场容量/竞争格局)
三、进入机会(机会商圈/差异化空间)
四、开发策略(目标门店数/业态组合/开发节奏/资源投入)
五、综合建议
14.3 门店分级整改报告
【门店分级整改报告】
门店:___ 当前等级:___ 整改目标:___
一、问题诊断(营收/客单/客流/成本结构)
二、根因分析(商圈衰退?管理问题?竞争挤压?)
三、整改措施(保留/降级/关闭)
四、时间表与责任人
十五、自相竞争排查 SOP(区域督导专用 · 内置)
Step 1: 距离筛查 → 新店与已开门店距离是否触发警戒线
Step 2: 客流分流分析 → 历史曲线对比、营业额影响测算
Step 3: 客群重叠度分析 → 同一目标客群比例 > 60%?
Step 4: 商圈容量评估 → 商圈总客流 ÷ 各店分流后单店客流
Step 5: 决策输出
- 影响 < 10%:同意开店
- 影响 10-25%:老店整改+新店谨慎
- 影响 > 25%:新店选址调整/老店降级
十六、好店预测模型(→ 加载 references/prediction-methods.md)
> 用数据预测新店日均营业额,告别"凭经验"。
16.1 两种方法对比(用户最关心)
| 方法 | 适用场景 | 样本需求 | 预测精度 | 实施成本 |
|---|---|---|---|---|
| 类比法 | <30家已开门店、快速估算 | 3-30家 | 中等(±20%) | 低 |
| 回归法 | 30+门店数据、追求精度 | ≥30家 | 较高(±10%) | 中高 |
16.2 选型决策
| 场景 | 推荐 |
|---|---|
| 新城市进入 | 类比法 |
| 30+历史门店 | 回归法 |
| 快速估算 | 类比法 |
| 汇报需依据 | 回归法 |
| 数据质量差 | 类比法 |
16.3 模型评估标准(R²)
- R² ≥ 0.7:模型好,预测可信
- R² ≥ 0.5:模型一般,供参考
- R² < 0.5:模型弱,建议补充数据
16.4 常见陷阱速查
| 陷阱 | 应对 |
|---|---|
| 混淆评估与预测 | 用户要"好店模型"→ 优先预测模型 |
| 距离相似度分母错误 | 用绝对距离区间(≤200m=高相似) |
| 缺少人口密度维度 | 必须包含人口密度 |
| 线性回归假设过强 | 改用多项式/随机森林 |
| 没有置信区间 | 必须输出80%置信区间 |
| 参数硬编码 | 用配置文件 |
→ 完整相似度模型/特征工程/代码实现:加载 references/prediction-methods.md
→ 运行脚本:scripts/analogy_predictor.py 或 scripts/regression_predictor.py
→ Agent实现参考:加载 references/prediction-model-tech.md(陷阱与改进的技术细节)
十七、实战案例(持续沉淀)
> 此章节用于沉淀真实案例,每个案例包含:背景 → 决策依据 → 实际结果 → 反思。
| 案例编号 | 类型 | 状态 | 关键决策 |
|---|---|---|---|
| 案例1 | 北京方庄单店选址 | ✅ 已落地 | 评分82,类比法预测准确 |
| 案例2 | 北京海淀区域规划 | ✅ 已落地 | 空白点扫描发现TOP5 |
| 案例3 | 西单关停+酒仙桥补位 | ✅ 已落地 | 攻防地图辅助决策 |
| 案例4 | 上海茶饮+便利店组合 | 📋 计划中 | 跨业态选址分析 |
→ 完整案例(背景/过程/结果/教训):加载 references/cases.md
→ 案例数据文件:assets/cases/case*.csv(已有20家门店+8候选+10竞品的真实数据)
十八、文件索引(按用途分类)
核心文档(按场景加载)
| 文件 | 何时加载 |
|---|---|
references/assessment-model.md |
用户问"打分/评估/这个位置好不好" |
references/profit-calculation.md |
用户问"盈亏/回本/投资" |
references/competitive-analysis.md |
用户问"竞争/对标/自相竞争" |
references/business-analysis.md |
用户问"业态特征/商圈/客群/周期/分级" |
references/pedestrian-analysis.md |
用户问"聚客点/客流/覆盖效率" |
references/prediction-methods.md |
用户问"预测/好店模型/类比/回归" |
references/prediction-model-tech.md |
Agent内部实现参考(相似度缺陷/置信区间/配置化) |
references/geo-analysis.md |
用户问"地图/落位/距离/覆盖人口/等时圈/空白点"(V1.2 新增) |
可执行脚本
| 脚本 | 用途 | 何时运行 |
|---|---|---|
scripts/site_scoring.py |
交互式六维评分 | 用户需要打分时 |
scripts/profit_model.py |
盈亏平衡/回本周期 | 用户需要测算时 |
scripts/analogy_predictor.py |
类比法预测日均来客 | 新城市/样本少时 |
scripts/regression_predictor.py |
回归法精确预测 | 30+门店数据时 |
scripts/geo_helper.py |
阶段1:单店地图分析(5功能) | 评估新店/单点排查 |
scripts/geo_batch.py |
阶段2:批量地图分析(3功能) | 年度规划/多店落位 |
scripts/geo_advanced.py |
阶段3:高级地图分析(4功能) | 战略规划/区域扫描 |
scripts/map_providers.py |
多数据源适配器(高德/百度/腾讯/OSM) | 自动加载 |
scripts/visualizer.py |
静态图片生成器(替代 folium/plotly) | 所有可视化场景 |
scripts/capability_check.py |
能力自检(matplotlib + AI文生图 + Agent) | 首次使用 |
scripts/startup_check.py |
启动包装(geo脚本入口自动检测) | 自动 |
scripts/ai_image_gen.py |
AI 文生图(装修图/效果图/菜品图) | 可选 |
scripts/image_analyzer.py |
vision 图片分析(4场景) | 督导巡查 |
scripts/image_compressor.py |
图片智能压缩(4档位) | 微信/报告/缩略图 |
scripts/vi_checker.py |
VI 一致性检测(颜色+Logo) | 品牌合规 |
scripts/heatmap_gen.py |
客流热力图(3数据源) | 真实人流 |
scripts/multi_agent.py |
多 Agent 并行调度 | 加速分析 |
资产文件
| 文件 | 用途 |
|---|---|
assets/site-checklist.md |
选址检查清单(实地调研用) |
assets/stores-template.csv |
已有门店数据 CSV 模板 |
assets/candidates-template.csv |
候选店数据 CSV 模板 |
assets/cases/*.csv |
4 个实战案例数据 |
模板文件
| 文件 | 用途 |
|---|---|
templates/integration_pipeline.py |
端到端:天气+客流+PDF 一键集成(V1.3.6 新增) |
加载策略总结(Agent 必须遵守)
- 入口加载:仅加载本 SKILL.md(约 8K tokens),理解路由表
- 意图识别:根据用户提问匹配 trigger_keywords
- 按需加载:仅加载匹配的 reference 文件
- 避免陷阱:
- ❌ 不要默认加载所有 reference
- ❌ 看到"好店模型"不要先讲评估模型
- ❌ 不要在用户没问预测时主动展开第十六章 - 上下文感知:用户已说明业态/城市/角色后,跳过画像采集
依赖的可复用 Skill(类级能力)
本 Skill 大量使用了两个类级共享 Skill,新场景可直接套用:
software-development/agent-image-output:Agent 场景下的图片输出范式(matplotlib PNG + MEDIA: 协议 + 能力自检 + base64 嵌图)。本 Skill 的scripts/visualizer.py、scripts/capability_check.py、scripts/startup_check.py、scripts/ai_image_gen.py全部基于此范式实现。software-development/pptx-and-matplotlib-pitfalls:python-pptx 与 matplotlib 的真实踩坑集(font.size 单位、marker 名称、gridspec 索引、文件大小、Agg backend)。本 Skill 开发过程中踩中的坑已沉淀到该 reference。
→ 当你需要为新场景设计 Agent 友好的可视化脚本时,先加载这两个 Skill,再写代码。
十九、地理空间分析(V1.2/V1.3 增强 · 全阶段覆盖)
> 为不会编程的督导/网络规划同事提供地图能力。三阶段可选其一或全部。
19.1 触发词
- 地图 / 落位图 / 选址图 / 落点
- 周边 / 半径 / 距离 / 自相竞争
- 覆盖人口 / 等时圈 / 空白点 / 区域扫描
- 攻防地图 / 竞品分布 / 网络规划
- 经纬度 / 地理坐标 / 缓冲区 / 通勤
19.2 数据源选择(首次使用)
默认推荐:高德地图(国内 POI 最准,6000次/日免费)
| 数据源 | 是否需要 Key | 申请地址 |
|---|---|---|
| 高德(推荐) | ✅ | https://lbs.amap.com/dev/key/app |
| 百度 | ✅ | https://lbsyun.baidu.com/apiconsole/key |
| 腾讯 | ✅ | https://lbs.qq.com/webservice_v1/guide-geocoder |
| OpenStreetMap | ❌(数据较粗) | - |
> 切换数据源:直接修改 scripts/config.json 即可。
19.3 三阶段能力速览
| 阶段 | 适用场景 | 脚本 | 功能数 |
|---|---|---|---|
| 阶段1 轻量 | 单店选址/单点排查 | geo_helper.py |
5 |
| 阶段2 批量 | 年度规划/多店落位 | geo_batch.py |
3 |
| 阶段3 高级 | 战略规划/区域扫描 | geo_advanced.py |
4 |
用户选择规则(询问用户):
1. 仅评估一个店 → 阶段1
2. 评估多个候选店/做年度规划 → 阶段2
3. 区域级战略规划/城市进入 → 阶段3
4. 一次性用到所有功能 → 全部加载
19.4 阶段1 速查(5个核心)
# 1. 地址解析
python scripts/geo_helper.py geocode "北京西单北大街1号"
# 2. 两点距离
python scripts/geo_helper.py distance --from "A" --to "B"
# 3. 周边搜索(如 1km 内的商场)
python scripts/geo_helper.py nearby --address "A" --radius 1000 --type 商场
# 4. 简单落位图(HTML)
python scripts/geo_helper.py map --address "A" --with-poi
# 5. 自相竞争检查(与已有门店的距离)
python scripts/geo_helper.py cannibal --new "新店地址" --existing assets/stores-template.csv
19.5 阶段2 速查(3个核心)
# 1. 批量距离矩阵(多候选 × 多已有)
python scripts/geo_batch.py distance-matrix \
--input assets/candidates-template.csv \
--existing assets/stores-template.csv
# 2. 批量落位图(自店+候选+竞品)
python scripts/geo_batch.py map \
--stores assets/stores-template.csv \
--candidates assets/candidates-template.csv \
--competitors 竞品.csv
# 3. 攻防地图(自店 vs 竞品)
python scripts/geo_batch.py battlemap \
--self 自店.csv --competitor 竞品.csv
19.6 阶段3 速查(4个核心)
# 1. 真实覆盖人口分析
python scripts/geo_advanced.py population --stores stores.csv --radius 3000
# 2. 等时圈(步行15分钟真实可达)
python scripts/geo_advanced.py isochrone --address "A" --minutes 15 --mode walking
# 3. 空白点智能识别(区域扫描)
python scripts/geo_advanced.py gap-analysis --region "北京海淀区" --stores stores.csv
# 4. 完整商圈报告(综合输出)
python scripts/geo_advanced.py full-report --new-store "新店" --format html
19.7 输出格式
核心原则:本 Skill 在 Agent/Chatbot 场景下,所有可视化输出 PNG 图片(手机可看/QQ/微信可发)。
每个脚本运行时询问用户:
- 1. PNG 图片(推荐,50-150KB,手机可看)
- 2. Excel 文件(数据导向)
- 3. 两者都要
也可以直接用 --format 参数指定(image / excel / both)。
已删除的格式(V1.3.1):
- ❌ HTML 网页(需要浏览器,Agent 场景无法使用)
- ❌ Streamlit Web 界面(用户本地无 Python 环境)
- ❌ Folium 交互地图(同上)
保留的格式:
- ✅ PNG 静态图片(含底图、指北针、图例)
- ✅ Excel 数据报表
- ✅ PPT 演示文稿(图片嵌入)
19.8 用户友好入口(Agent 场景专用)
核心约束:本 Skill 由 OpenClaw/HermesAgent 调用,用户没有 Python 环境、没有浏览器、看不到 HTML。
Agent 必须做的:
- ✅ 所有可视化输出 PNG 图片(matplotlib 静态图)
- ✅ 用 MEDIA:/path/to/image.png 直接发图给用户
- ✅ 中文标注 + 底图 + 图例(白底,督导友好)
- ✅ 单图 ≤ 200KB(适合手机流量)
- ❌ 禁止生成 HTML(用户打不开)
- ❌ 禁止依赖 Web 界面(Streamlit/Flask)
输出文件清单(Agent 可直接 send_media):
| 脚本 | 输出文件 | 典型大小 |
|---|---|---|
geo_helper.py nearby |
nearby_商场.png |
~100KB |
geo_helper.py map |
location_map.png |
~100KB |
geo_helper.py cannibal |
cannibal_map.png + cannibal_chart.png |
50-150KB |
geo_batch.py distance-matrix |
distance_matrix_map.png |
~100KB |
geo_batch.py map |
batch_map.png |
~100KB |
geo_batch.py battlemap |
battle_map.png |
~100KB |
geo_advanced.py population |
population_chart.png |
~150KB |
geo_advanced.py gap-analysis |
gap_map.png |
~100KB |
geo_advanced.py full-report |
full_report_map.png + full_report_summary.png |
100-150KB |
report_generator |
store_report.pptx |
~40KB(10页) |
Agent 回复模板:
已为您生成 3 张分析图:
📊 落位图:MEDIA:/path/to/location_map.png
📊 自相竞争:MEDIA:/path/to/cannibal_chart.png
📈 完整报告:MEDIA:/path/to/full_report_summary.png
主要结论:
- 综合评分 82/100(推荐开店)
- 3km 覆盖人口 18.5万
- 月营业额预测 ¥194,400
- 自相竞争 0 家触发
19.10 V1.3.3+ 增强模块(vision + VI + 热力图 + 多Agent + 图片压缩)
| 增强 | 实现 | 使用方式 |
|---|---|---|
| 真实图片分析 | scripts/image_analyzer.py (13KB) |
vision_analyze 4场景:督导巡查/VI合规/装修验收/竞品分析 |
| VI 一致性检测 | scripts/vi_checker.py (14KB) |
OpenCV颜色直方图+Logo检测+评分卡,纯本地无需AI |
| 客流热力图 | scripts/heatmap_gen.py (15KB) |
3数据源:CSV/高德API/百度API,IDW插值+时段分析 |
| 图片智能压缩 | scripts/image_compressor.py (20KB) |
4档位:wechat(200-500KB)/report(50-150KB)/thumbnail(20-50KB)/email(400-800KB),批量+EXIF旋转+WebP |
| 多 Agent 并行 | scripts/multi_agent.py (9KB) |
3任务模板:单店/批量/预测,delegate_task 批量调用 |
| 能力自检 | scripts/capability_check.py (12KB) |
首次运行自动检测 |
| 启动包装 | scripts/startup_check.py (3KB) |
3个geo脚本入口自动检测 |
| AI 文生图 | scripts/ai_image_gen.py (11KB) |
OpenAI DALL-E / Stability / Replicate |
| 静态图片生成器 | scripts/visualizer.py (32KB) |
5 种核心图 |
| 真实人口栅格 | scripts/geo_enhanced/population.py (10KB) |
WorldPop/LandScan |
| 预测+落位图闭环 | scripts/geo_enhanced/prediction_integration.py (15KB) |
类比法/回归法 + matplotlib |
| PPT 自动生成 | scripts/geo_enhanced/report_generator.py (24KB) |
10页标准PPT |
| 5 个实战案例 | references/cases.md + assets/cases/*.csv |
用户问"案例"时自动加载 |
多 Agent 并行调用模板(V1.3.3 新):
# Agent 一次发起 3 个并行任务
from multi_agent import dispatch_parallel_tasks
from delegate_task import delegate_task # Hermes 内置
# 1. 构造共享 context
context = {
"new_store_address": "北京丰台区方庄南路",
"existing_stores_csv": "assets/cases/case1-existing-stores.csv",
"candidates_csv": "assets/cases/case1-candidates.csv",
"output_dir": "/tmp/store_analysis"
}
# 2. 调度 3 个任务
dispatch = dispatch_parallel_tasks(context)
# → 返回 3 个任务模板(单店/批量/预测)
# 3. Agent 用 delegate_task 并行执行(节省 60-180s)
results = delegate_task(tasks=[
{"goal": dispatch["tasks"][0]["task"]["instructions"], "context": context, "toolsets": [...]},
{"goal": dispatch["tasks"][1]["task"]["instructions"], "context": context, "toolsets": [...]},
{"goal": dispatch["tasks"][2]["task"]["instructions"], "context": context, "toolsets": [...]},
])
# 4. 汇总
from multi_agent import aggregate_results
summary = aggregate_results(results)
# → {"consensus_score": 78, "total_images": 9, "successful": 3}
vision 图片分析调用模板:
from image_analyzer import analyze_store_photo, parse_vision_response, generate_improvement_report, render_audit_report
# 1. 生成 prompt
action = analyze_store_photo("/path/to/store.jpg", "store_audit")
# 2. Agent 调用 vision_analyze(实际由 Agent 执行)
# vision_analyze(image=action["image_path"], question=action["prompt"])
# 3. 解析响应
parsed = parse_vision_response(vision_response)
# 4. 生成报告
report = generate_improvement_report(parsed, store_name="方庄店")
img = render_audit_report(report, "audit_report.png")
VI 检测(纯本地,无需 AI):
from vi_checker import full_vi_check, render_vi_report, DEFAULT_VI_CONFIG
result = full_vi_check("store.jpg", DEFAULT_VI_CONFIG, "方庄店")
img = render_vi_report(result, "vi_report.png")
# → 评分 65/100,违规:白超上限 / 主色集中
客流热力图:
from heatmap_gen import generate_heatmap
generate_heatmap(
"csv:heatmap_data.csv", # 或 "amap:API_KEY"
store_locations=[{"lng": 116.43, "lat": 39.86, "name": "方庄店"}],
output_path="heatmap.png"
)
能力自检一键运行:
python scripts/capability_check.py
# 输出 3 项检查:matplotlib / AI文生图 / Agent发送
AI 装修图生成(需配置文生图模型):
from ai_image_gen import generate_store_exterior, generate_dish_photo
generate_store_exterior(style="modern_chinese", output_path="store.png")
generate_dish_photo("宫保鸡丁", output_path="dish.png")
Web 界面:❌ 已删除(V1.3.1)
Agent 调用图片生成(一行代码):
from visualizer import plot_single_site
plot_single_site(
center_lng=116.43, center_lat=39.86,
address="北京方庄", radius_m=1500,
facilities={"商场": [(lng, lat, "名称")]},
output_path="output.png"
)
# 然后用 send_message(action="send", message="MEDIA:/abs/path/output.png")
19.10.5 图片智能压缩(image_compressor.py)
督导在门店用手机拍的照片(2-5MB)传到工作群经常被吐槽"太占内存"。本脚本提供 4 个档位的智能压缩:
4 档位:
| 档位 | 目标大小 | 最长边 | 适用场景 |
|---|---|---|---|
| 200-500KB | 1920px | 微信/飞书/钉钉群消息 | |
| report | 50-150KB | 1280px | Word/PPT 报告插图 |
| thumbnail | 20-50KB | 400px | 列表缩略图/预览 |
| 400-800KB | 2048px | 邮件附件(可接受稍大) |
4 阶梯压缩算法:
1. EXIF 自动旋转(手机横屏照片方向修正)
2. 智能缩尺寸(按最长边)
3. 调整 JPEG quality(85→70→50)
4. 转 WebP(同质量小 25-35%)
单图压缩:
python image_compressor.py photo.jpg --preset wechat
python image_compressor.py photo.jpg --use-for feishu # 智能选档
python image_compressor.py photo.jpg --target-size 300 --format webp
批量压缩:
python image_compressor.py /path/to/photos/ --preset wechat --output /path/out/ --recursive
python image_compressor.py "*.jpg" --preset report
链式调用(被其他脚本集成):
from image_compressor import compress_for_wechat, compress_for_report, compress_for_thumbnail
# 压到微信合适大小
out_path = compress_for_wechat("store_photo.jpg")
# 集成到 report_generator.py
def generate_vi_report(image_path, ...):
# 先压缩再插入报告
thumb = compress_for_thumbnail(image_path)
...
实测效果(模拟 10MB 手机照片):
- 单图:10582 KB → 490 KB(节省 95.4%)
- 批量 5 张:10810 KB → 1158 KB(节省 89.3%)
19.10.6 天气 API 自动接入(weather_api.py · V1.3.6 新增)
客流预测需要天气数据,本脚本自动从和风天气 / 心知天气 / mock 三个数据源获取:
3 个 Provider:
| Provider | 是否需要 Key | 限频 | 数据源 |
|---|---|---|---|
| 和风天气(qweather) | ✅(QWEATHER_KEY) | 1000 次/天 | 实测数据最准 |
| 心知天气(seniverse) | ✅(SENIVERSE_KEY) | 500 次/天 | 15 天预报 |
| mock | ❌ | - | 沙箱环境/无 Key 时降级 |
Key 配置:
export QWEATHER_KEY=xxx
export SENIVERSE_KEY=xxx
统一入口(带自动降级):
from weather_api import get_weather_forecast
# 沙箱环境/无 Key:自动降级到 mock(不抛异常)
forecast = get_weather_forecast(
location="北京方庄", # 支持 "城市名" 或 "lng,lat"
days=7,
provider="qweather", # 缺 Key 时自动降级 mock
use_mock_on_fail=True, # 默认 True
)
# → [{"date": "...", "temp_max": 28, "temp_min": 20,
# "precipitation": 0, "condition": "晴", "source": "..."}, ...]
# 与客流预测集成(一行集成)
from footfall_forecast import predict_week
results = predict_week(
baseline=280, start_date="2026-06-15",
weather_week=forecast,
)
CLI 模式(注意:INFO 信息走 stderr,JSON 干净输出到 stdout):
python weather_api.py --provider qweather --city 北京方庄 --days 7
python weather_api.py --provider mock --city 116.43,39.86 --days 5 --json
与客流预测联动公式:
最终客流 = 基线 × (工作日因子 × 节假日因子 × 天气因子 × 季节因子)
其中天气因子由 temp_max/precipitation 自动计算(参考 weather_factor() 函数)
19.10.7 PDF 报告生成(pdf_report.py · V1.3.6 新增)
为开店建议/客流预测生成可邮件发送的 PDF 报告。3 个场景:
| 函数 | 用途 | 输出页数 |
|---|---|---|
generate_site_pdf() |
选址评估(封面+摘要+配套+风险+建议) | 2-3 页 |
generate_footfall_pdf() |
客流周报(封面+概览+明细表+因子+建议) | 3-4 页 |
generate_comprehensive_pdf() |
综合报告(选址+客流+建议) | 4-5 页 |
3 个入口:
# 1. 选址 PDF
from pdf_report import generate_site_pdf
out = generate_site_pdf(
store_name="方庄店", address="北京方庄", score=78,
monthly_revenue=380000, payback_months=14, population=125000,
facility_data={"商场": 5, "地铁": 2},
risks=["自相竞争"], suggestions=["签 5 年租约"],
output_path="/tmp/report.pdf",
)
# 2. 客流 PDF
from pdf_report import generate_footfall_pdf
from footfall_forecast import predict_week
results = predict_week(280, "2026-06-15")
out = generate_footfall_pdf("A001", "北京方庄", results, "/tmp/footfall.pdf")
# 3. CLI
python pdf_report.py --demo --output test.pdf # 客流周报
python pdf_report.py --type site --data data.json --output site.pdf
依赖:
pip install fpdf2 pypdf # fpdf2 生成 + pypdf 验证
# 中文字体:系统需装 wqy-zenhei(/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc)
# 降级:没字体也能跑,中文变方块但不崩
19.11 详细文档
→ 完整功能说明/参数详解/常见场景:references/geo-analysis.md
→ 4 个实战案例(数据+背景+决策+结果+教训):references/cases.md
→ API 速查(真实函数名/参数格式/返回 key):references/api-quickref.md ⚠️ 链式调用前必看
19.12 链式调用 30 秒探测术
调用本 Skill 任何 from scripts.xxx import ... 之前,先用三件套确认真实 API:
# 1. 列真实函数名(防 score_candidate 这种乌龙)
grep -E "^def [a-z]" /home/ubuntu/.hermes/skills/store-network-planner/scripts/xxx.py
# 2. dump 真实返回结构(防 tasks vs dispatches 这种乌龙)
python3 -c "
import sys; sys.path.insert(0, '/home/ubuntu/.hermes/skills/store-network-planner/scripts')
from xxx import func; import json
print(json.dumps(func(real_args), ensure_ascii=False, indent=2)[:1500])
"
# 3. 看函数签名
grep -A 20 "def target_func" /home/ubuntu/.hermes/skills/store-network-planner/scripts/xxx.py
完整战例 + 通用原则见 systematic-debugging/references/api-surfacing.md。
19.13 V1.3.6 踩坑防御(必读 · 新增 5 个坑)
本节专门记录 V1.3.5 → V1.3.6 期间真实踩中的 5 个坑。任何修改 V1.3.6 新模块的代码前必看。
| 坑 | 触发场景 | 表现 | 修复 |
|---|---|---|---|
| 坑 A | from image_compressor import compress_for_wechat |
TypeError: compress_image() got an unexpected keyword argument 'description' |
PRESETS["wechat"] 包含 description/format 等元字段,不能 **PRESETS 解包。必须显式构造 params = {"max_size_kb":..., "format_name":...} 再传。 |
| 坑 B | fpdf2 输出中文 PDF |
FPDFException: Not enough horizontal space to render a single character |
fpdf2 对 .ttc 字体字符宽度估算崩。multi_cell(0, h, text) 改成 multi_cell(190, h, text)(固定宽度=A4-边距),100% 解决。 |
| 坑 C | CLI 输出 JSON 给其他程序解析 | JSON.parse 失败 "Expecting value: line 1 column 1" | CLI 的 INFO 信息写到 stdout 污染了 JSON。改成 print(..., file=sys.stderr)。-–json 标志开启时尤其要隔离。 |
| 坑 D | analogy_predict_enhanced 永远返回 0 |
静默失败(predicted_revenue=0, confidence=低) | 函数内部硬编码 s["地址"]/s.get("面积") 等中文字段。传英文 key 时全走默认值 0。修复 = 双重 fallback s.get("中文") or s.get("english"),任何模块内部硬编码字段名时要警惕此坑。 |
| 坑 E | 沙箱环境运行天气/地图 API | HTTPSConnectionPool: Network is unreachable |
设计降级链:真实 API → OfflineProvider(本地坐标库)→ mock 数据。所有外部依赖都要有"无 Key/无网络/无权限"三态降级。这是 Agent 友好 Skill 的标配。 |
通用防御原则(来自这 5 个坑):
- 不要用
**dict完整解包到函数,除非 dict 字段名 100% 对齐 — 静默失败最致命。 - CLI 程序:INFO 必须走 stderr,stdout 只输出结构化数据(JSON/CSV/纯数据)。
- PDF / 图片 / 报表类库:先用一个最小 demo 跑通再扩展,不要相信官方文档的"应该能工作"。
- 跨语言字段名:中英字段兼容要在 API 入口做 fallback,不要在内部硬编码。
- 外部依赖:网络、Key、权限三态降级。Agent 场景用户看不到 stack trace。
19.14 端到端回归测试(V1.3.6 新增)
全栈测试覆盖 11 章 / 25 个用例(每次发布前必跑):
| 章节 | 模块 | 用例数 | 验证内容 |
|---|---|---|---|
| 1. 选址评分 | site_scoring | 2 | 租售比 / 聚客点 |
| 2. 地图 Provider | map_providers | 2 | 4 个 Provider 创建 / URL |
| 3. 类比预测 | analogy + geo_enhanced | 3 | 基础 / 中文 key / 英文 key |
| 4. 客流预测 | footfall_forecast | 4 | 单日 / 节假日 / 一周 / 极端天气 |
| 5. 天气 API | weather_api | 4 | mock / Key 缺失 / 坐标 / CLI |
| 6. 视觉 | vi + compressor | 2 | VI 检测 / 图片压缩 |
| 7. 热力图 | heatmap_gen | 1 | CSV 源热力图 |
| 8. PPT | report_generator | 1 | 单店 10 页 |
| 9. PDF(新) | pdf_report | 4 | 客流 / 选址 / 中文 / CLI |
| 10. 多 Agent | multi_agent | 1 | 3 任务调度 |
| 11. 端到端 | weather+footfall+pdf | 1 | 完整链路 |
测试模板(/tmp/full_e2e_test.py 模式):用 try/except 包每个用例,FAIL 时记录 traceback.format_exc()[:500],最后输出 pass/fail/total 计数 + 健康度评分。
当前状态:25/25 通过(健康度 100/100)。