首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重新创建从船只(EPSG:4326到EPSG:3857)的坐标变换?

如何重新创建从船只(EPSG:4326到EPSG:3857)的坐标变换?
EN

Stack Overflow用户
提问于 2022-08-13 16:29:24
回答 1查看 219关注 0票数 3

目前,我正试图弄清楚vesselfinder.com如何计算其Box边界(Box),用于从后端查询数据。

给出如下输入:lat, lon = 59.8230, 22.9586

他们使用bbox获取数据: 13761899,35886447,13779795,35898097

如果我试图通过使用2553560.4710,8358928.9331,2556565.4293,8360514.8411获得类似的bbox,就会得到以下值,这些值甚至与我所期望的不太接近:

以上网站默认使用EPSG:4326 (WGS 84)到EPSG:3857 (WHS 84 /伪Mercator)。我试图在容器查找器的JS代码中验证他们也在使用这种转换。

代码语言:javascript
复制
    var c = new s.geom.MultiLineString(t);
    return c.transform('EPSG:4326', 'EPSG:3857'),

还有下面提到的,但我很肯定,它必须是上面显示的转换。

代码语言:javascript
复制
it = [
  new $('EPSG:3857'),
  new $('EPSG:102100'),
  new $('EPSG:102113'),
  new $('EPSG:900913'),

现在的问题是:我做错了什么?/我认为哪里错了?

我还尝试使用Python进行转换,甚至尝试了其他提到的EPSG:XXXXXX类型,但没有得到想要的结果。在创建转换器时,我还更改了这两种EPSG类型的顺序,但也没有达到预期的结果。

代码语言:javascript
复制
from pyproj import Transformer

TRAN_4326_TO_3857 = Transformer.from_crs("EPSG:4326", "EPSG:3857", always_xy=True)

lat = 59.823002
lon = 22.958583
expansion = 2000

res = TRAN_4326_TO_3857.transform(lng, lat)
bbox = (round(res[0]-expansion), round(res[1]-expansion), round(res[0]+expansion), round(res[1]+expansion))

print(bbox)
# (2455738, 8260436, 2655738, 8460436)

这个离我从bboxfinder那里得到的那个很近,但也不太接近bbox的船只查找器。

EN

回答 1

Stack Overflow用户

发布于 2022-08-21 19:00:52

https://gis.stackexchange.com/a/370496似乎掌握了数学知识。

代码语言:javascript
复制
convertCoordinates(lon, lat) {
    var x = (lon * 20037508.34) / 180;
    var y = Math.log(Math.tan(((90 + lat) * Math.PI) / 360)) /
                  (Math.PI / 180);
    y = (y * 20037508.34) / 180;
    return [x, y];
}

或,在C# ( https://gis.stackexchange.com/a/325551 )中

代码语言:javascript
复制
public static double[] latLonToMeters(double lat, double lon)
{
    //Debug.Log(Mathd.Tan((90d + lat) * Mathd.PI / 720));
    //Debug.Log(Mathd.Tan((90d + lat) * Mathd.PI / 360d));
    double[] meters = new double[2];
    meters[0] = lat * originShift / 180d;
    meters[1] = Mathd.Log(Mathd.Tan((90d+lon) * Mathd.PI / 360d)) /
                   (Mathd.PI / 180d);
    //meters[1] = Mathd.Log(5) / (Mathd.PI / 180d);
    meters[1] = meters[1] * originShift / 180d;
    return meters;
}

无论如何,请注意来自哪个网站;这可能是获取算法的一个更好的地方。(然后,如果您需要帮助转换成您喜欢的语言,请回到这里。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73345967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档