高程数据(Elevation Data)是指地球表面某一点相对于海平面的高度值。在GIS和地图应用中,获取特定经纬度位置的高程信息对于地形分析、3D可视化等场景非常重要。
Leaflet本身不提供高程数据,但可以通过插件或第三方服务实现:
// 首先引入Leaflet和Leaflet-Elevation插件
<link rel="stylesheet" href="https://unpkg.com/leaflet-elevation@latest/dist/leaflet-elevation.css" />
<script src="https://unpkg.com/leaflet-elevation@latest/dist/leaflet-elevation.js"></script>
// 创建地图
var map = L.map('map').setView([51.505, -0.09], 13);
// 添加高程控制
var elevationControl = L.control.elevation({
elevationDiv: "#elevation-div",
followMarker: false,
theme: "steelblue-theme"
}).addTo(map);
// 获取某点高程
function getElevation(lat, lng) {
// 使用第三方高程API
fetch(`https://api.opentopodata.org/v1/eudem25m?locations=${lat},${lng}`)
.then(response => response.json())
.then(data => {
console.log("Elevation:", data.results[0].elevation);
});
}
// 示例使用
getElevation(51.505, -0.09);
function getElevationFromOpenTopo(lat, lng) {
return fetch(`https://api.opentopodata.org/v1/eudem25m?locations=${lat},${lng}`)
.then(response => response.json())
.then(data => data.results[0].elevation);
}
// 使用示例
getElevationFromOpenTopo(51.505, -0.09)
.then(elevation => console.log('Elevation:', elevation));
Mapbox提供了更直接的高程数据访问方式:
// 初始化Mapbox地图
mapboxgl.accessToken = 'YOUR_MAPBOX_ACCESS_TOKEN';
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v11',
center: [-122.420679, 37.772537],
zoom: 13
});
// 获取高程函数
async function getElevation(lng, lat) {
// 等待地图加载完成
await new Promise(resolve => map.on('load', resolve));
// 查询地形数据
const elevation = await map.queryTerrainElevation([lng, lat], { exaggerated: false });
return elevation;
}
// 使用示例
getElevation(-122.420679, 37.772537)
.then(elevation => console.log('Elevation:', elevation));
async function getElevationFromMapboxAPI(lng, lat) {
const response = await fetch(
`https://api.mapbox.com/v4/mapbox.terrain-rgb/${zoom}/${x}/${y}.pngraw?access_token=YOUR_MAPBOX_ACCESS_TOKEN`
);
// 处理返回的RGB值并转换为高程
// 具体转换方法参考Mapbox文档
}
问题1:获取的高程数据不准确
问题2:跨域请求被阻止
问题3:大量请求导致API限制
问题4:地形数据加载缓慢
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>Get Elevation with Mapbox</title>
<script src='https://api.mapbox.com/mapbox-gl-js/v2.9.2/mapbox-gl.js'></script>
<link href='https://api.mapbox.com/mapbox-gl-js/v2.9.2/mapbox-gl.css' rel='stylesheet' />
<style>
body { margin: 0; padding: 0; }
#map { position: absolute; top: 0; bottom: 0; width: 100%; }
#info { position: absolute; top: 10px; left: 10px; background: white; padding: 10px; }
</style>
</head>
<body>
<div id='map'></div>
<div id='info'>Click on the map to get elevation</div>
<script>
mapboxgl.accessToken = 'YOUR_MAPBOX_ACCESS_TOKEN';
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v11',
center: [-122.420679, 37.772537],
zoom: 13,
terrain: { source: 'mapbox-dem', exaggeration: 1 }
});
map.on('load', () => {
// 添加地形数据源
map.addSource('mapbox-dem', {
type: 'raster-dem',
url: 'mapbox://mapbox.terrain-rgb',
tileSize: 512,
maxzoom: 14
});
// 点击地图获取高程
map.on('click', async (e) => {
const elevation = await map.queryTerrainElevation(e.lngLat, { exaggerated: false });
document.getElementById('info').innerHTML = `
Longitude: ${e.lngLat.lng.toFixed(4)}<br>
Latitude: ${e.lngLat.lat.toFixed(4)}<br>
Elevation: ${elevation ? elevation.toFixed(1) + ' meters' : 'N/A'}
`;
});
});
</script>
</body>
</html>
这个示例展示了如何使用Mapbox GL JS获取点击位置的高程数据。在实际应用中,您需要替换YOUR_MAPBOX_ACCESS_TOKEN
为您自己的访问令牌。
没有搜到相关的文章