将GPS坐标转换为X, Y, Z坐标

本文关键字:坐标 GPS 转换 | 更新日期: 2023-09-27 18:10:36

这就是最基本的问题。我目前正在Unity 3D中使用c#开发GPS系统(给我们布置作业的人让我们使用这个程序,所以我不能在其他任何地方做)。

现在我遇到了一个小问题,基本上我们能够从android手机请求(我们认为是十进制)坐标,但现在我们正试图将这些坐标转换为X, Y, Z坐标。最好是X和Z,因为我们实际上不需要高度。然而,到目前为止,我们在互联网上找到的一切都是为了转换为球体地图,而我们只有一个基本的平面数字地图。

如果有人知道如何将我们拥有的坐标转换为基本的X和Z坐标(也就是我们的经度和纬度),那就太棒了。

快速说明一下,我不确定我们拥有的坐标是否是实际的十进制坐标,所以它们看起来是这样的:

经度:6.5403559

如果你在地图上查找的话,这些坐标应该是"Wegalaan 3, Groningen, The Netherlands"。

谢谢了!

编辑:(这也是在评论中)

对不起,如果它可能是混乱的。老实说,我只了解一半的这一切是如何工作的,无论如何要澄清一些事情。我目前正在Unity中使用我从我居住的城市(荷兰格罗宁根)的互联网上获得的简单2D地图,我试图基本上从我的安卓手机获得GPS坐标,然后在地图上用红点显示它们,但是要做到这一点,我需要能够将红点移动到地图上的正确坐标。我要做的是将GPS坐标(长和晚)转换为X和Z (Unity3D平面坐标,也可能只是X和Y),这样如果我正确对齐地图,我就会得到一个针对我的城市的小型GPS系统。如果你好奇我为什么这么做,那很简单,因为我和我的一个朋友正试图用我们的城市和这个GPS系统作为基础制作一款游戏

EDIT2:

除了我要诚实,我不知道笛卡尔坐标是如何工作的,但他们似乎是我正在寻找的是的:平面上的p坐标和X,Y坐标,我的意思是基本上只是坐标,我可以在Unity3D平面上使用二维平面,这是我正在工作。

EDIT3:

首先感谢你的回答。这不是重复的,其次,我的朋友和我已经找到了你发给我的stackoverflow主题,但它似乎不适合我们(也许我们做错了什么)。基本上,我们用这个公式测试的不同地方之间的南北距离是有效的,但是它们之间的东西距离比应该的要大得多。我们认为这可能是因为这个公式适用于球形地球,但也许我们做错了什么。如果有人能进一步解释,那就太棒了!

标:

我们确信它不会是我们的地图有任何错误,因为我们已经与多个位置对齐。我们得到了这些位置的坐标,然后使用这个网站:http://www.gpscoordinaten.nl/converteer-rd-coordinaten.php将其转换为XY坐标,然后使用这些XY坐标来检查我们的地图是否会正确对齐。它确实存在,所以我们可以肯定,我们使用的数学方法有问题,而不是实际的地图。

EDIT5:删除了很多语法错误。这里太热了,现在没法写了,所以我非常非常抱歉,如果这些没有意义的话。只要让我知道,我会编辑并尝试解释我们正在尝试做什么。

EDIT6:找到了我自己的答案,它在所有其他答案之间,如果你想看看我做了什么来解决我的问题

将GPS坐标转换为X, Y, Z坐标

现在我已经找到了我自己的问题的答案(实际上发现它已经有一段时间了,但完全忘记在这里发布)

基本上,我自己做了一个小公式,将坐标乘以一个集合数(取决于它是x轴还是y轴),这是两个集合坐标点之间的差。这两个点是我的地图的外围点。

基本上,通过这样做,我可以得到非常精确的测量,我甚至还没有与实际位置相差一米。

我知道这听起来有点模糊,我不完全知道如何解释它,但是对于任何感兴趣的人来说,这里是我使用的代码:

void RetrieveGPSData()
{
    currentGPSPosition = Input.location.lastData;
    System.DateTime dateTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0);
    dateTime = dateTime.AddSeconds(currentGPSPosition.timestamp);
    float z = latToZ (Input.location.lastData.latitude);
    float x = lonToX (Input.location.lastData.longitude);
    this.transform.position = new Vector3 (x, 0f, z);
    gpsString = ("Last Location: " + Input.location.lastData.latitude.ToString () + " " + Input.location.lastData.longitude.ToString () + " " + Input.location.lastData.altitude.ToString () + " " + Input.location.lastData.horizontalAccuracy.ToString () + " " + dateTime.ToShortDateString() +" "+ dateTime.ToShortTimeString());
}
float latToZ (double lat){
    lat = (lat - 53.178469) / 0.00001 * 0.12179047095976932582726898256213;
    double z = lat;
    return (float)z;
}
float lonToX (double lon){
    lon = (lon - 6.503091) / 0.000001 * 0.00728553580298947812081345114627;
    double x = lon;
    return (float)x;
}

如果有人想知道我为什么选53。Something和the 6。这是因为我在Unity中0 X和0 Z点的坐标对应于我的地图的左下角,这是我在这个计算中使用的两个点之一。

我希望这能帮助到其他可能被类似问题困住的人,如果你有任何问题,请随时问他们。

-LAKster

地图有墨卡托投影吗?是世界地图吗?如果是这样,地图的顶部通常在纬度85左右,纬度0垂直在中心。经度0是在格林威治(通常是水平中心),180/-180是在反中点/日期线,在地图的左右边缘。

当纬度为-180时,x = 0,当纬度为180时,x ==地图宽度

这个链接应该告诉你你需要什么