You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:50:26