如何使用PostGIS函数将MVT几何转换回4326经纬度
将MVT瓦片几何坐标转换回WGS84(EPSG:4326)坐标系
要把MVT瓦片内的像素坐标(如POINT(1591 890))结合瓦片级别、行列号(8, 75, 96)转换回WGS84坐标系,需要反向还原ST_AsMvtGeom的转换逻辑,具体实现如下:
核心逻辑
- 获取目标瓦片在Web墨卡托(EPSG:3857)下的边界范围
- 将瓦片内的像素坐标映射到该边界范围内的实际3857坐标(注意MVT的Y轴向下递增,与3857的Y轴方向相反)
- 将3857坐标转换为WGS84(EPSG:4326)坐标
实现SQL
提供两种等价的实现方式:
方式一:直接计算坐标偏移
SELECT ST_AsText( ST_Transform( ST_SetSRID( ST_MakePoint( -- 计算X:瓦片左边界 + 像素X占extent的比例 × 瓦片宽度 ST_X(ST_TileEnvelope(8, 75, 96)) + (1591 / 4096.0) * (ST_XMax(ST_TileEnvelope(8, 75, 96)) - ST_XMin(ST_TileEnvelope(8, 75, 96))), -- 计算Y:瓦片上边界 - 像素Y占extent的比例 × 瓦片高度(反转Y轴) ST_YMax(ST_TileEnvelope(8, 75, 96)) - (890 / 4096.0) * (ST_YMax(ST_TileEnvelope(8, 75, 96)) - ST_YMin(ST_TileEnvelope(8, 75, 96))) ), 3857 ), 4326 ) );
方式二:用ST_Scale和ST_Translate简化计算
SELECT ST_AsText( ST_Transform( ST_SetSRID( ST_Translate( ST_Scale( ST_GeomFromText('POINT(1591 890)'), (ST_XMax(env) - ST_XMin(env)) / 4096.0, -- X方向缩放比例 -(ST_YMax(env) - ST_YMin(env)) / 4096.0 -- Y方向缩放并反转轴 ), ST_XMin(env), -- X方向平移至瓦片左边界 ST_YMax(env) -- Y方向平移至瓦片上边界 ), 3857 ), 4326 ) ) FROM (SELECT ST_TileEnvelope(8, 75, 96) AS env) AS tile_env;
注意事项
- 执行结果会与原始值
POINT(-73.985130 40.748817)存在细微差异,原因是原始转换为整数像素坐标时丢失了精度 - 代码中的
4096是ST_AsMvtGeom默认的extent值,若你转换时使用了自定义extent,需替换为对应数值
内容的提问来源于stack exchange,提问作者Yuri Astrakhan
相关产品推荐
相关产品推荐

