如何将经纬度(latitude/longitude)转换为图像对应X/Y像素坐标
经纬度转图像像素坐标的实现方案
前置准备
你需要先获取两个基础参数:
- 图像本身的宽高像素值:记为
img_width(X轴像素最大值)、img_height(Y轴像素最大值) - 四个角点的绑定映射表(推荐按左上、右上、右下、左下的固定顺序存储)
- 左上角图像像素坐标
(0, 0)→ 已知经纬度(lng_tl, lat_tl) - 右上角图像像素坐标
(img_width, 0)→ 已知经纬度(lng_tr, lat_tr) - 右下角图像像素坐标
(img_width, img_height)→ 已知经纬度(lng_br, lat_br) - 左下角图像像素坐标
(0, img_height)→ 已知经纬度(lng_bl, lat_bl)
- 左上角图像像素坐标
注:校园属于极小范围场景,地球曲率带来的经纬度误差可以完全忽略,不需要引入复杂的大地坐标系转换,以下两种方案均能满足精度需求。
方案1:最简线性插值法(无第三方依赖,代码量极小)
适用场景:图像为正射投影,无倾斜、旋转,校园区域范围小于1平方公里
- 计算当前校园区域的经纬度边界
lng_min = min(lng_tl, lng_tr, lng_br, lng_bl) lng_max = max(lng_tl, lng_tr, lng_br, lng_bl) lat_min = min(lat_tl, lat_tr, lat_br, lat_bl) lat_max = max(lat_tl, lat_tr, lat_br, lat_bl)
- 计算经纬度到像素的缩放系数
scale_x = img_width / (lng_max - lng_min) scale_y = img_height / (lat_max - lat_min)
- 任意目标经纬度
(lng_target, lat_target)转像素坐标
注意:常规图像的Y轴从上到下递增,而纬度值越大越靠北(对应图像上方),所以Y轴需要做翻转处理
pixel_x = (lng_target - lng_min) * scale_x pixel_y = (lat_max - lat_target) * scale_y
方案2:透视变换法(精度更高,适配倾斜/旋转拍摄场景)
适用场景:图像为航拍倾斜拍摄、存在旋转/变形的情况,精度不受角度影响
需要提前安装numpy、opencv-python依赖库。
- 将四个角点的经纬度、像素坐标分别存入数组
import numpy as np import cv2 # 像素坐标数组 pixel_points = np.array([[0,0], [img_width,0], [img_width,img_height], [0,img_height]], dtype=np.float32) # 经纬度坐标数组 lnglat_points = np.array([[lng_tl, lat_tl], [lng_tr, lat_tr], [lng_br, lat_br], [lng_bl, lat_bl]], dtype=np.float32)
- 计算经纬度到像素的透视转换矩阵
transform_matrix = cv2.getPerspectiveTransform(lnglat_points, pixel_points)
- 任意目标经纬度转像素坐标
target_point = np.array([[lng_target, lat_target]], dtype=np.float32) pixel_coords = cv2.perspectiveTransform(target_point, transform_matrix) pixel_x, pixel_y = pixel_coords[0][0]
可选边界校验
如果需要避免坐标超出图像范围,可追加校验逻辑:
pixel_x = max(0, min(round(pixel_x), img_width - 1)) pixel_y = max(0, min(round(pixel_y), img_height - 1))
内容的提问来源于stack exchange,提问作者Brandon Suiveng
相关产品推荐
相关产品推荐

