如何将坐标转换为纬度和经度?

7

我正在逆向工程一款交通可视化应用程序。我需要找出数据源原点的纬度。具体来说,我需要知道XY坐标系中的0,0是什么。我找到的唯一公式都是计算两点之间的距离或者方位/距离的位置。

他们使用XY坐标系在一个非常老旧的应用程序中显示地图。XY坐标的单位是英尺。

我有这些坐标:

47.70446615506108, -122.34469839507263: x=1268314, y=260622
47.774182540800616,-122.3412994737105:  x=1269649, y=286031
47.60024792289405, -122.32767331735774: x=1271767, y=222532
47.57012494413499, -122.29129609983679: x=1280532, y=211374

我需要找出 x=0, y=0 的纬度和经度,并确定用于查找此信息的公式。

他们有两个数据源,一个比另一个更为实时。最新数据的源不包括纬度和经度,而只包括 XY 坐标。我正在尝试根据他们较旧但更详细(包括纬度和经度)的数据源推算出 0,0 是什么,以便我可以将他们(更实时)的数据源的 XY 坐标简单地转换为纬度和经度。


当您的经度为负数时,为什么您的X值不是负数? - Bhushan Bhangale
这是一个非常令人困惑的问题。X和Y距离是从给定的纬度/经度点向北和向南吗? - slacy
...或者是纬度/经度地图坐标,而x/y则是某个巨大位图上的坐标? - Jaanus
感谢您的分数。我已经在我的问题中添加了更多的冗长说明。 - rwl4
还取决于您所需要的精度级别。 - luapyad
显示剩余2条评论
6个回答

9

如果您查看前两行数据,并减去纬度

47.7044 - 47.7741 = -0.06972 degrees

每纬度有60海里,每海里有6076英尺。

-.06972 * 60 * 6076 = 25,415 ft

减去两个“Y”值:

260662 - 286031 = 25,409 ft

因此,这确实证明了X和Y值是以英尺为单位的。

如果您将任何一个Y值转换回度数,例如

260622 ft / ( 6076 ft/nm ) / ( 60 nm/degree ) = .71
286031 ft / 6076 / 60 = .78

因此,将47.70和47.77的纬度值减去这些值,可以得到非常接近于47度的结果,这应该是您的y=0点。
对于经度而言,在赤道上一度经度相当于60海里,而在极地则为0英里。因此,每度经度的英里数必须乘以纬度的余弦值,即约为cos(47度)或0.68。所以,每度经度的英里数不再是6076海里,而是约为4145海里。
因此,对于X值,
1268314 ft / ( 4145 ft/nm ) / ( 60 nm/degree ) = 5.10 degrees
1269649 ft / 4145 / 60 = 5.10 degrees

这些X数字随着纬度的增加而增加(变得更小),因此我认为您应该添加5.1度,这意味着X基点大约是。
-122.3 + 5.1 = 117.2 West longitude for your x=0 point.

这大致是斯波坎市的位置。

因此,如果X=1280532,Y=211374。

Lat = 47 + ( 211374 / 6096 / 60 ) = 47.58
Lon = -117.2 - ( 1280532 / ( 6096 * cos(47.58)) / 60 ) = -122.35

这大致相当于给定的数据47.57和-122.29。

方差可能是由于不同的投影方式 - X,Y系统可能是“平面”投影,而不是适用于球形投影的纬度/经度?因此,为了准确,您可能需要更高级的数学知识或那个开源库:)

这个问题也可能会有帮助,它包含了计算大圆距离的代码:

计算两个纬度经度点之间的距离?(Haversine公式)


如果领域不是很大且您不需要非常高的准确性,这种草率的估算方法将是可行的。 - MarkJ
是的,现在只是试图理解数据。它涉及基本的数学计算,计算大圆距离。 - MikeW
2
我真的不建议使用这种方法,如果没有使用适当的计算方法,地面上的误差会非常大,这真的很令人惊讶。 - Cruachan
只是试图帮助他理解数据以及x=0,y=0点可能在哪里。正如MarkJ所说,这是一些初步的估算。 - MikeW

6

有许多不同的坐标系。首先需要找出纬度/经度(例如WGS84等)和x/y(可能是某种投影系统)的坐标系是什么。

一旦获取了这些信息,就可以使用多个工具进行转换和操作。其中一个例子(免费开源编码库)是proj4


我曾经用过Proj.4来处理类似的事情——强烈推荐。 - Roger Lipscombe
更加严谨一些,但是proj4不是一个编程库,而是一个命令行工具,对吧?(当然你可以从代码中调用它) - MarkJ
MarkJ:它两者兼备。我们将其用作库,而且非常出色。 - Peter

5

询问他们使用的坐标系统!(或者如果您从某个数据库中获取了数据集,请查看数据集的元数据,它应该会告诉您。否则,我会对其价值持怀疑态度)

最有可能的是其中之一州平面坐标系统。它们用于地球的本地化区域(有点像UTM),并经常用于测量。

您可以使用CORPSCON(或其他GIS程序;ExpertGPS将在您拥有GIS选项包但不免费时执行此操作。我忘记了GPSBabel是否进行转换)在纬度/经度和任何州平面坐标系统之间进行转换。您还需要知道坐标所在的基准面。WGS84和NAD83非常接近,但NAD27不同。


由于OP在西雅图给出了经纬度,因此+1表示美国特定的答案。最高投票的更一般的答案仍然不错,因为我们中的一些人居住在其他地方 ;) - MarkJ

1

你已经得到了关于坐标系统的好建议,所以我只想加入我过去使用过并且非常成功的库。

Geotrans已获得美国国防部批准使用,因此您可以确信它经过了充分的测试。您可以从这里获取:

http://earth-info.nga.mil/GandG/geotrans/index.html

那可能不是正确的链接,因为该页面讨论的是应用程序而不是库。我预计该库在开发人员包中。据我记忆,许可条款非常自由,但在商业使用之前请确保您已经审查了条款。

编辑:

关于Geotrans许可证的有趣讨论可以在这里找到:

http://www.mail-archive.com/debian-legal@lists.debian.org/msg39263.html

0

在这里,我说过这个:

在Java中,我会使用OpenMap转换器,将UTM坐标系中的点表达式转换为使用纬度和经度的表达式(假设为WGS-84椭球体,这是GPS中最常用的)。

OpenMap是开源的,我可以把他们的下载页面链接发出来,但它们有一个短暂的许可脚本。所以,为了避免无礼,我不会插入深链接。相反,前往他们的主页点击下载

这应该可以直接解决你的问题,或者至少指向一个有用的算法。


0

我曾经在几个场合使用过Brenor Brophey的gPoint PHP类。结果可靠,代码遵循GPL协议,易于部署。强烈推荐。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接