如果我有一个 lat/lng,我假设它是 0,0,那么我如何计算另一个 lat/lng 对的 x、y 坐标?
Posted
技术标签:
【中文标题】如果我有一个 lat/lng,我假设它是 0,0,那么我如何计算另一个 lat/lng 对的 x、y 坐标?【英文标题】: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? 【发布时间】: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,以及与此相关的其余部分,通过从所有这些中减去相同的数量。 因为我的点非常接近( 【参考方案1】:首先要明确一些定义
设a
为纬度<-pi/2,+pi/2>
设b
为经度<0,+2*pi>
设re
,rp
为地球的赤道和两极半径
a0,b0, a1,b1, a2,b2
是您在球坐标中的点
和x0,y0, x1,y1, x2,y2
是您想要的笛卡尔坐标
将坐标转换为相对于 (a0,b0
)
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 答案中,以防链接将来失效。以上是关于如果我有一个 lat/lng,我假设它是 0,0,那么我如何计算另一个 lat/lng 对的 x、y 坐标?的主要内容,如果未能解决你的问题,请参考以下文章