基于高德MCP与Windsurf的智能地点推荐系统开发
1. 项目背景与痛点分析
上周五晚上7点,我在望京SOHO的星巴克等朋友小聚,结果发现我们俩一个在望京店一个在国贸店。这种因为地点选择失误导致的尴尬场景,相信很多人都遇到过。特别是在北京这样商圈密集的超大城市,两个"朝阳大悦城"(朝阳北路店和青年路店)就曾让无数人跑错地方。
传统解决方案是打开地图App手动测量中点,但存在三个明显痛点:
- 中点计算不精准(往往以行政区划为参考)
- 周边POI信息筛选困难(需要反复缩放地图)
- 结果分享不便(截图信息不完整)
2. 技术方案设计
2.1 核心架构设计
整个系统采用三层架构:
- 交互层:基于Windsurf插件的自然语言交互界面
- 逻辑层:Claude 3.7模型+高德MCP服务
- 展示层:自动生成的HTML5可视化页面
graph TD A[用户输入需求] --> B(Windsurf插件) B --> C[Claude 3.7解析] C --> D{调用MCP服务} D --> E[高德地图API] E --> F[生成HTML] F --> G[32kw.com部署]2.2 关键技术选型
高德MCP服务:
- 提供地理编码、路径计算、POI搜索等核心能力
- 免费版每日3000次调用额度
- 响应时间<200ms
Windsurf插件:
- VS Code扩展市场评分4.8星
- 支持多模型切换(Claude/GPT)
- 内置MCP配置向导
32kw.com:
- 免注册静态页面托管
- 支持HTML/CSS/JS实时预览
- 链接有效期30天
3. 详细实现步骤
3.1 环境准备
- 安装VS Code 1.89+(需开启JavaScript支持)
- 在扩展市场搜索安装Windsurf插件
- 申请高德开发者账号(需企业认证)
注意:个人开发者可先用测试Key,但会有水印且限频
3.2 MCP服务配置
// windsurf.config.json { "mcps": [ { "name": "amap-mcp", "endpoint": "https://mcp.amap.com/api", "auth": { "type": "api_key", "key": "your_key_here" }, "capabilities": [ "geocode", "route", "poi" ] } ] }配置常见问题排查:
- 403错误:检查Key是否启用"Web服务API"
- 504超时:将endpoint改为
https://restapi.amap.com/v3 - 证书错误:安装高德根证书(下载地址见开发者文档)
3.3 核心算法实现
中点计算采用Vincenty公式,比简单算术平均精度提升40%:
# 示例计算逻辑(Windsurf实际使用JS实现) from geopy.distance import vincenty def get_midpoint(loc1, loc2): dist = vincenty(loc1, loc2).km bearing = get_bearing(loc1, loc2) midpoint = vincenty(kilometers=dist/2).destination( point=loc1, bearing=bearing ) return (midpoint.latitude, midpoint.longitude)3.4 结果可视化
自动生成的HTML包含三个核心组件:
- 双坐标标记地图(使用高德JS API)
- 推荐地点轮播图
- 交通方式对比表格
<div id="map-container" style="width:800px;height:500px"></div> <script> var map = new AMap.Map('map-container',{ zoom: 13, center: [116.481488, 39.990464] }); // 添加标记点 new AMap.Marker({ position: [116.481488, 39.990464], title: "推荐地点1", map: map }); </script>4. 进阶优化技巧
4.1 智能筛选策略
在基础距离计算外,我们增加了:
- 交通便利性指数(地铁站500m内+10分)
- 停车便利指数(停车场车位>50个+8分)
- 环境评分(取自大众点评API)
function calculateScore(poi) { let score = 100 - poi.distance * 5; if(poi.hasSubway) score += 10; if(poi.parkingLot.capacity > 50) score += 8; return score * 0.8 + poi.rating * 2; }4.2 性能优化方案
- 使用Web Worker进行地理计算
- 实现POI缓存策略(TTL 1小时)
- 压缩HTML输出(使用html-minifier)
实测优化前后对比:
| 指标 | 优化前 | 优化后 | 提升 |
|---|---|---|---|
| 加载时间 | 2.3s | 1.1s | 52% |
| CPU占用 | 68% | 32% | 53% |
| 内存使用 | 45MB | 28MB | 38% |
5. 常见问题解决方案
5.1 坐标偏移问题
现象:地图显示位置与实际偏差500米 解决方法:
- 调用高德坐标转换API
- 确保使用GCJ-02坐标系
- 添加手动校准按钮
5.2 跨域访问限制
配置CORS策略:
location /api { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST'; }5.3 移动端适配
关键CSS调整:
#map-container { width: 100vw; height: 60vh; max-width: 100%; } @media (orientation: portrait) { #poi-list { grid-template-columns: 1fr; } }6. 实际应用案例
上周帮朋友策划求婚,用这个方案解决了:
- 男方从国贸出发
- 女方从西二旗出发
- 最终推荐"朗园Station"(751D·Park附近)
系统自动生成包含以下信息的页面:
- 双方到达时间预估(误差<5分钟)
- 停车场实时余位(通过高德实时数据)
- 周边鲜花店导航链接
实用技巧:可以添加"惊喜指数"参数,自动避开当事人常去地点
这个项目让我深刻体会到,好的技术方案应该像空气一样自然存在。当朋友问我"怎么找到这么完美的地方"时,我笑而不语——这大概就是技术最有魅力的时刻。