Locusync服务器
](https://badge.fury.io/py/locusync-server)   
模型上下文协议(MCP)服务器,为AI代理提供地理空间工具。使Claude、GPT和其他LLM能够执行地理编码、路由、空间分析和文件操作。
特性
- 地理编码:将地址转换为坐标,反之亦然(通过Nominim/OSM或Pelias)
- 批量地理编码:在单个请求中对多个地址进行地理编码(最多10个)
- 高程:获取沿路径的点和高程剖面的高度
- 路由:使用距离、持续时间和几何图形计算点之间的路线(通过OSRM)
- 空间分析:缓冲区、交点、并线、距离计算
- 文件I/O:读/写Shapefiles、GeoJSON、GeoPackage
- CRS转换:在坐标参考系之间转换
安装
# From PyPI (when published)
pip install locusync-server
# From source
git clone https://github.com/matbel91765/locusync-server.git
cd locusync-server
pip install -e .快速开始
使用克劳德桌面
添加到您的 claude_desktop_config.json:
{
"mcpServers": {
"locusync": {
"command": "uvx",
"args": ["locusync-server"]
}
}
}直接使用
# Run the server
locusync-server可用工具
地理编码
geocode
将地址转换为坐标。
Input: "1600 Pennsylvania Avenue, Washington DC"
Output: {lat: 38.8977, lon: -77.0365, display_name: "White House..."}reverse_geocode
将坐标转换为地址。
Input: lat=48.8566, lon=2.3522
Output: {display_name: "Paris, Île-de-France, France", ...}batch_geocode
一次对多个地址进行地理编码(最多10个)。
Input: addresses=["Paris, France", "London, UK", "Berlin, Germany"]
Output: {results: [...], summary: {total: 3, successful: 3, failed: 0}}海拔
get_elevation
获取一个点的高度。
Input: lat=48.8566, lon=2.3522
Output: {elevation_m: 35, location: {lat: 48.8566, lon: 2.3522}}get_elevation_profile
沿路径获取高程。
Input: coordinates=[[2.3522, 48.8566], [2.2945, 48.8584]]
Output: {profile: [...], stats: {min: 28, max: 42, gain: 14}}几何
distance
计算两点之间的距离。
Input: lat1=48.8566, lon1=2.3522, lat2=51.5074, lon2=-0.1278
Output: {distance: {meters: 343556, kilometers: 343.56, miles: 213.47}}buffer
在几何图形周围创建缓冲区。
Input: geometry={type: "Point", coordinates: [2.3522, 48.8566]}, distance_meters=1000
Output: {geometry: {type: "Polygon", ...}, area_km2: 3.14}spatial_query
执行空间操作(交集、并集、包含、内部等)。
Input: geometry1={...}, geometry2={...}, operation="intersection"
Output: {geometry: {...}}transform_crs
在CRS之间转换坐标。
Input: geometry={...}, source_crs="EPSG:4326", target_crs="EPSG:3857"
Output: {geometry: {...}}路由
route
计算两点之间的路线。
Input: start_lat=48.8566, start_lon=2.3522, end_lat=48.8606, end_lon=2.3376
Output: {distance: {...}, duration: {...}, geometry: {...}, steps: [...]}isochrone
计算在规定时间内可到达的区域。
Input: lat=48.8566, lon=2.3522, time_minutes=15, profile="driving"
Output: {geometry: {type: "Polygon", ...}}文件
read_file
读取地理空间文件(Shapefile、GeoJSON、GeoPackage)。
Input: file_path="data/cities.shp"
Output: {type: "FeatureCollection", features: [...]}write_file
将要素写入地理空间文件。
Input: features={...}, file_path="output.geojson", driver="GeoJSON"
Output: {file_path: "...", feature_count: 10}配置
环境变量:
| 变量 | 默认值 | 描述 |
|---|---|---|
NOMINATIM_URL | https://nominatim.openstreetmap.org | API名称URL |
NOMINATIM_USER_AGENT | locusync-server/1.0.0 | Nominatim的用户代理 |
OSRM_URL | https://router.project-osrm.org | OSRM API URL |
OSRM_PROFILE | driving | 默认路由配置文件 |
PELIAS_URL | (空) | Pelias地理编码API URL |
PELIAS_API_KEY | (空) | Pelias API密钥(可选) |
OPEN_ELEVATION_URL | https://api.open-elevation.com | 开放式提升API URL |
GIS_DEFAULT_CRS | EPSG:4326 | 默认CRS |
GIS_TEMP_DIR | /tmp/locusync | 临时目录 |
响应格式
所有工具都返回一致的JSON结构:
{
"success": true,
"data": { ... },
"metadata": {
"source": "nominatim",
"confidence": 0.95
},
"error": null
}速率限制
- 提名:1个请求/秒(自动执行)
- OSRM演示:尽最大努力,考虑自托管生产
发展
# Install dev dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run with coverage
pytest --cov=src/locusync --cov-report=html
# Type checking
mypy src/locusync
# Linting
ruff check src/locusync建筑
src/locusync/
├── server.py # MCP server entry point
├── config.py # Configuration management
├── utils.py # Common utilities
└── tools/
├── geocoding.py # geocode, reverse_geocode, batch_geocode
├── elevation.py # get_elevation, get_elevation_profile
├── routing.py # route, isochrone
├── geometry.py # buffer, distance, spatial_query, transform_crs
└── files.py # read_file, write_file许可证
MIT许可证-请参阅 许可证 了解详情。
贡献
欢迎投稿!请在提交PR之前阅读投稿指南。
路线图
- \[x\] Pelias地理编码支持(更高精度)
- \[x\] 高程/地形数据
- \[x\] 批量地理编码
- \[\]瓦尔哈拉路由集成(本地等时线)
- \[\]PostGIS空间查询
- \[\]实时交通数据
- \[\]ESRI FileGDB完全支持
