Install
openclaw skills install @ruiduobao/open-elevationBatch query elevation data from the Open-Elevation public API. Supports single-point and multi-point queries by latitude/longitude coordinates. Outputs CSV or JSON. No API key required.
openclaw skills install @ruiduobao/open-elevationQuery elevation (in meters) for any lat/lon coordinate on Earth using the free, public Open-Elevation API. No API key required.
# Single point
python scripts\open-elevation.py lookup --lat 39.9042 --lon 116.4074
# JSON output
python scripts\open-elevation.py lookup --lat 39.9042 --lon 116.4074 --json
# Batch from CSV
python scripts\open-elevation.py batch --input coords.csv --output results.csv
# Batch to JSON
python scripts\open-elevation.py batch --input coords.csv --output results.json --json
pip install requests>=2.28.0 tqdm
# Or: pip install -r scripts/requirements.txt
lookup| Argument | Required | Default | Description |
|---|---|---|---|
--lat | Yes | — | Latitude (-90 to 90) |
--lon | Yes | — | Longitude (-180 to 180) |
--json | No | false | Output as JSON |
batch| Argument | Required | Default | Description |
|---|---|---|---|
--input | Yes | — | Input CSV path (must contain lat/lon or latitude/longitude columns) |
--output | Yes | — | Output file path |
--json | No | false | Output as JSON instead of CSV |
--chunk | No | 100 | Points per API request (max 100) |
https://api.open-elevation.com/api/v1/lookup--timeout flagCSV columns: latitude, longitude, elevation
JSON format:
{
"results": [
{"latitude": 39.9042, "longitude": 116.4074, "elevation": 43.5}
]
}
0 (sea level) or negative values (bathymetry) depending on data availability0If you use SRTM data in publications, please cite:
@misc{srtm2000,
title = {Shuttle Radar Topography Mission (SRTM) Global Data},
author = {{NASA Jet Propulsion Laboratory}},
year = {2000},
howpublished = {\url{https://www2.jpl.nasa.gov/srtm/}},
note = {Accessed: YYYY-MM-DD}
}
matplotlib: plt.plot(distance, elevation)imshow() using terrain colormaps (cmap='terrain')contextily or folium| Error | Cause | Solution |
|---|---|---|
ConnectionError | Network issue | Check internet, retry |
HTTP 429 | Rate limit | Wait 60s, retry |
ValueError | Invalid input | Check parameter format |
| Empty output | No data | Try different parameters |
ModuleNotFoundError | Missing dep | Run pip install |
| Timeout | Slow network | Increase --timeout value |
| All zeros in ocean | No SRTM coverage | Expected behavior for ocean points |
import csv, time, subprocess
with open('points.csv') as f:
reader = csv.DictReader(f)
for row in reader:
for attempt in range(3):
result = subprocess.run(
['python', 'scripts/open_elevation.py', 'lookup',
'--lat', row['lat'], '--lon', row['lon']],
capture_output=True, text=True
)
if result.returncode == 0:
break
time.sleep(2 ** attempt)
# .github/workflows/elevation-update.yml
name: Elevation Data Update
on:
workflow_dispatch:
jobs:
query:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- run: |
python scripts\open-elevation.py batch \
--input points.csv --output elevations.json
python scripts\open-elevation.py batch --input points.csv --output elevations.json
# Convert to CSV then import
python -c "import json, csv; d=json.load(open('elevations.json'));
csv.writer(open('elev.csv','w',newline='')).writerows(
[('lat','lon','elevation')] + [(p['lat'],p['lon'],p['elevation']) for p in d]
)"
psql -d gis_db -c "\COPY elevations(lat, lon, elevation) FROM 'elev.csv' CSV HEADER"
sleep 1 between batches to respect rate limitsWHERE elevation != 0使用免费的 Open-Elevation 公开 API 查询任意经纬度的海拔高度(米)。无需 API 密钥。
# 单点查询
python scripts\open-elevation.py lookup --lat 39.9042 --lon 116.4074
# JSON 输出
python scripts\open-elevation.py lookup --lat 39.9042 --lon 116.4074 --json
# 批量查询
python scripts\open-elevation.py batch --input coords.csv --output results.csv
# 批量 JSON 输出
python scripts\open-elevation.py batch --input coords.csv --output results.json --json
https://api.open-elevation.com/api/v1/lookup--timeout 参数配置CSV 列: latitude, longitude, elevation
JSON 格式:
{
"results": [
{"latitude": 39.9042, "longitude": 116.4074, "elevation": 43.5}
]
}
0(海平面)或负值(水深),取决于数据可用性0如果发表使用 SRTM 数据,请引用:
@misc{srtm2000,
title = {Shuttle Radar Topography Mission (SRTM) Global Data},
author = {{NASA Jet Propulsion Laboratory}},
year = {2000},
howpublished = {\url{https://www2.jpl.nasa.gov/srtm/}},
note = {Accessed: YYYY-MM-DD}
}
matplotlib 绘制高程剖面: plt.plot(distance, elevation)imshow() + terrain 色标 (cmap='terrain') 创建 DEM 热力图contextily 或 folium 叠加到地图上| 错误 | 原因 | 解决方案 |
|---|---|---|
ConnectionError | 网络问题 | 检查网络,重试 |
HTTP 429 | 速率限制 | 等待 60 秒后重试 |
ValueError | 无效输入 | 检查参数格式 |
| 空输出 | 无数据 | 尝试不同参数 |
ModuleNotFoundError | 缺少依赖 | 运行 pip install |
| 超时 | 网络慢 | 增加 --timeout 值 |
| 海洋区域全为 0 | SRTM 无覆盖 | 海洋点的预期行为 |