【问题标题】:If I have one lat/lng which I assume is at 0,0 then how do I calculate the x, y coordinates of another lat/lng pair?如果我有一个 lat/lng,我假设它是 0,0,那么我如何计算另一个 lat/lng 对的 x、y 坐标?
【发布时间】:2014-10-16 00:38:59
【问题描述】:

我已经看到这个问题的许多变体,但无法将它们的答案与我的特定需求联系起来。

我有几组 3 lat/lng 坐标对。任何集合中的坐标都在几公里范围内。

对于每个集合,我想将坐标转换为 x/y 值,以便绘制它们。

我想将 1 个坐标分配给 0,0,然后计算其他两个坐标的相对 x/y 值。

这个网站做我想做的事,但不幸的是没有分享算法: http://www.whoi.edu/marine/ndsf/cgi-bin/NDSFutility.cgi?form=0&from=LatLon&to=XY

【问题讨论】:

  • 当然,既然地球是一个球体,那就要看扁平化的策略了。我不知道您的问题是什么,但是任何用于地图绘制的好的 API 都可以让您仅通过它们的 lat/lng 值绘制一些点。例如,谷歌地图的 API 就是这样做的。
  • 您希望达到的准确度。您可以使用所谓的球形墨卡托(从纬度/经度到平面的投影,为谷歌地图开发)将您的坐标转换为米,然后标准化是一件简单的事情,以便其中一个为 0 ,0,以及与此相关的其余部分,通过从所有这些中减去相同的数量。
  • 因为我的点非常接近(

标签: javascript math coordinates geo


【解决方案1】:
  1. 首先要明确一些定义

    • a为纬度<-pi/2,+pi/2>
    • b为经度<0,+2*pi>
    • re,rp 为地球的赤道和两极半径
    • a0,b0, a1,b1, a2,b2 是您在球坐标中的点
    • x0,y0, x1,y1, x2,y2 是您想要的笛卡尔坐标
  2. 将坐标转换为相对于 (a0,b0)

    • 假设东方与 X 轴对齐,北极与 Y 轴对齐
    • x0=0.0;
    • y0=0.0;
    • r1=re*cos(a1)+rp*sin(a1) // 点 1 的实际半径
    • r2=re*cos(a2)+rp*sin(a2) // 点 2 的实际半径
    • x1=x0+((b1-b0)*r1);
    • x2=x0+((b2-b0)*r2);
    • y1=y0+((a1-a0)*re); // 这里不是 re 应该是从 0 到 a1-a0 的椭圆曲线的长度
    • y2=y0+((a2-a0)*re); // 这里不是 re 应该是从 0 到 a2-a0 的椭圆曲线的长度

如果 re!=rp 则 y1,y2 坐标将不太准确

  • 纠正这个问题,只需将 ((a1-a0)*re) 替换为正确的公式
  • 用于椭圆弧->长度计算(这个用于圆)
  • 我懒得计算那个积分
  • 无论如何,即使这样也足够好(地球偏心度没那么糟糕)
  • 您还可以在减法后归一化角度
  • while (a<-pi)a+=2.0*pi;`
  • while (a>+pi)a-=2.0*pi;`
  • 为了安全起见...

【讨论】:

    【解决方案2】:

    实际上,这并不完全正确。该网站确实共享算法,只是不是以人们期望的方式。

    http://www.whoi.edu/marine/ndsf/utility/NDSFutility.js

    希望对您有所帮助。

    【讨论】:

    • 虽然您提供的链接可能会回答问题,但最好将解决方案的基本部分直接发布在您的 Stack Overflow 答案中,以防链接将来失效。
    猜你喜欢
    • 2016-02-01
    • 2013-04-13
    • 1970-01-01
    • 2012-03-11
    • 2018-11-12
    • 2018-02-19
    • 1970-01-01
    • 2018-05-20
    • 2011-05-26
    相关资源
    最近更新 更多