Godot中Mercator投影渲染GeoJSON建筑图形畸变问题求助
解决Godot中Mercator投影GeoJSON图形畸变问题
问题根源
你遇到的畸变是因为全局Mercator投影的y轴缩放随纬度变化,而Leaflet会自动对局部区域做缩放校正,手动实现的全局Mercator公式没有处理这一点:
- Mercator投影的y坐标公式
y = R * ln(tan(π/4 + lat/2)),其缩放比例是1/cos(lat),纬度越高拉伸越严重 - 你取第一个点作为原点计算相对偏移时,没有统一局部区域的缩放基准,导致图形被错误拉伸
两种可行解决方案
方案1:局部缩放校正(快速修复)
以第一个点的纬度为基准,对所有点的y坐标做缩放校正,保证局部区域的缩放一致性:
var sm_a = 6378137.0 var base_lat_rad = 0.0 # 存储基准点的弧度纬度 func latlngToCorrectedMeters(lat, lng): var lat_rad = deg2rad(lat) var lng_rad = deg2rad(lng) # 计算原始墨卡托坐标 var x = sm_a * lng_rad var y_mercator = sm_a * log(tan(PI/4 + lat_rad/2)) # 用基准纬度校正y值,抵消局部缩放差异 var y = y_mercator * cos(base_lat_rad) return Vector2(x, y)
使用方式:
# 初始化基准纬度 var first_lat = your_geojson_points[0].lat base_lat_rad = deg2rad(first_lat) # 转换第一个点并设为原点 var first_point = latlngToCorrectedMeters(first_lat, your_geojson_points[0].lng) # 处理其余点的相对偏移 for point in your_geojson_points: var projected = latlngToCorrectedMeters(point.lat, point.lng) var relative_pos = projected - first_point # 将relative_pos添加到Godot的Mesh/Polygon节点中
方案2:使用UTM投影(精准匹配米单位)
如果要让世界单位直接对应米,推荐用UTM投影(通用横轴墨卡托),它分带处理,每个带内的投影近似等距,坐标本身就是米单位:
- 可以使用Godot的
godot-proj4插件,直接调用Proj4库完成经纬度到UTM的转换 - 转换后直接计算相对偏移,无需额外缩放校正,图形不会畸变,且单位就是实际米数
额外说明
你之前尝试的DotSpatial.Projections如果还是出错,大概率是因为没有指定正确的投影参数(比如没有设置局部基准),用UTM投影并指定对应分带即可解决。
内容的提问来源于stack exchange,提问作者Philip Magyar
相关产品推荐
相关产品推荐

