Leaflet中经纬度(lat、lng)转游戏坐标的实现求助
经纬度转游戏坐标的反向实现方案
原转换函数采用线性映射逻辑,通过拆解原公式并反向推导,即可实现经纬度到游戏坐标的转换。
原函数核心逻辑拆解
convertToMap的本质是两组独立的线性转换:
- 游戏X坐标 → 经度(lng)
- 游戏Y坐标 → 纬度(lat)
整理后的核心公式(变量完全对应原函数):
lng = r.lng + (gameX - game_1_x) * (r.lng - o.lng) / (game_1_x - game_2_x) lat = r.lat + (gameY - game_1_y) * (r.lat - o.lat) / (game_1_y - game_2_y)
其中:
r = Map.unproject([0, 0], 0)o = Map.unproject([i/2, n - tileSize], 0)(i=2*tileSize,n=3*tileSize)
反向转换公式推导
对上述公式变形,解出gameX和gameY:
gameX = game_1_x + (lng - r.lng) * (game_1_x - game_2_x) / (r.lng - o.lng) gameY = game_1_y + (lat - r.lat) * (game_1_y - game_2_y) / (r.lat - o.lat)
最终实现代码
基于推导结果写出反向转换函数:
game_1_x = -4230, game_1_y = 8420, game_2_x = 370, game_2_y = -640; CurrentLayer.options.tileSize = 1024 function convertToGame(lat, lng) { const tileSize = CurrentLayer.options.tileSize; const n = 3 * tileSize; const i = 2 * tileSize; const r = Map.unproject([0, 0], 0); const o = Map.unproject([i / 2, n - tileSize], 0); // 计算游戏X坐标 const gameX = game_1_x + (lng - r.lng) * (game_1_x - game_2_x) / (r.lng - o.lng); // 计算游戏Y坐标 const gameY = game_1_y + (lat - r.lat) * (game_1_y - game_2_y) / (r.lat - o.lat); return { x: gameX, y: gameY }; } // 验证:代入原函数输出值,应得到输入(0,0) convertToGame(-1903.3289183222957, 941.6347826086957); // 预期输出接近{x: 0, y: 0}(浮点数精度误差可忽略)
内容的提问来源于stack exchange,提问作者Staffan Löwgren
相关产品推荐
相关产品推荐

