屏幕坐标转经纬度
概述
用 uniapp 开发APP,版本 vue3,HBuildX 4.75
map组件在 APP 平台(vue版)上,地图组件的点击事件无法直接返回经纬度。我们通过屏幕坐标和地图视野范围,计算出点击位置的经纬度。

核心思路
将屏幕上的点击位置,按照比例映射到地图的地理坐标上。
实现步骤
第一步:获取屏幕点击坐标
当用户点击地图时,我们从触摸事件中获取点击位置在屏幕上的坐标:
clickX:点击位置距离屏幕左边的像素距离clickY:点击位置距离屏幕顶部的像素距离
第二步:转换为地图容器内的相对坐标
地图组件在屏幕上有一个固定的位置和大小。我们需要计算点击位置相对于地图容器的坐标:
1 | 相对X = 屏幕X - 地图容器左边距离 |
第三步:计算比例
将相对坐标转换为比例值(0 到 1 之间):
ratioX = 相对X / 地图容器宽度(0 = 最左边,1 = 最右边)ratioY = 相对Y / 地图容器高度(0 = 最上边,1 = 最下边)
第四步:获取地图视野范围
通过地图 API 获取当前地图显示的地理范围:
- 西南角(左下角):
{ latitude: 39.91, longitude: 116.39 } - 东北角(右上角):
{ latitude: 39.92, longitude: 116.41 }
第五步:按比例计算经纬度
使用线性插值,根据点击位置的比例,在地图视野范围内计算对应的经纬度:
经度计算(从左到右):
1 | 经度 = 西边经度 + (东边经度 - 西边经度) × ratioX |
纬度计算(从下到上,注意屏幕Y轴和纬度方向相反):
1 | 纬度 = 南边纬度 + (北边纬度 - 南边纬度) × (1 - ratioY) |
举例说明
假设:
- 屏幕点击位置:
(375, 500)像素 - 地图容器位置:左边 32px,顶部 128px,宽度 686px,高度 822px
- 地图视野:西南角
(39.91, 116.39),东北角(39.92, 116.41)
计算过程:
相对坐标:
relativeX = 375 - 32 = 343relativeY = 500 - 128 = 372
比例:
ratioX = 343 / 686 = 0.5(水平中间)ratioY = 372 / 822 = 0.453(垂直中偏上)
经纬度:
经度 = 116.39 + (116.41 - 116.39) × 0.5 = 116.40纬度 = 39.91 + (39.92 - 39.91) × (1 - 0.453) = 39.91547
最终结果:点击位置的经纬度是 (39.91547, 116.40)
注意事项
精度:这种方法在小范围视野内(几公里)精度较好,误差通常在 10-50 米左右,对于围栏设置等场景足够使用。
纬度反转:屏幕坐标系 Y 轴向下增大,但地图纬度向上增大,所以计算纬度时需要使用
(1 - ratioY)来反转。线性插值:我们假设地图上两点之间的坐标变化是均匀的(线性),这在较小视野范围内是合理的近似。
总结
通过”屏幕坐标 → 相对坐标 → 比例 → 经纬度”的转换过程,我们实现了在 APP 平台上获取地图点击位置经纬度的功能。核心思想就是按比例映射:点击位置在地图上的相对位置,对应到地理坐标上的相对位置。
1 | <view |
1 | handleContainerTap(e) { |