将 GPS 坐标转换为 X、Y、Z 坐标
Converting GPS coordinates to X, Y, Z coordinates
这是基本问题。我目前正在 Unity 3D 中用 C# 开发 GPS 系统(给我们分配任务的人让我们使用这个程序,所以我不能用其他任何东西来做)。
现在我 运行 遇到了一个小问题,基本上我们可以从 android phone 请求(我们认为是十进制的)坐标,但现在我们正在尝试将这些坐标转换为 X、Y、Z 坐标。最好是 X 和 Z,因为我们实际上并不需要高度。然而,到目前为止,我们在互联网上找到的所有内容都是为了转换为球体地图,因为我们只有一个基本的平面数字地图。
如果有人知道如何将我们的坐标转换为基本的 X 和 Z 坐标(即我们的经度和纬度),那就太棒了。
快速说明一下,我不确定我们拥有的那种坐标是否是实际的十进制坐标,所以它们看起来像这样:
纬度:53.228888 经度:6.5403559
如果您在地图上查找这些坐标,它们应该在 "Wegalaan 3, Groningen, The Netherlands" 上结束。
已经谢谢了!
编辑:(这也在评论中)
对不起,如果它可能会造成混淆。老实说,我对这一切是如何工作的只有一半的了解,无论如何要澄清一些事情。我目前在 Unity 中使用从我居住的城市(荷兰格罗宁根)的互联网上获得的简单 2D 地图工作,我试图基本上获取从我的 android [=48= 获得的 GPS 坐标] 然后用红点在地图上显示它们,但是要做到这一点,我需要能够将红点移动到地图上的正确坐标。我想做的是将 GPS 坐标(经度和纬度)转换为 X 和 Z(Unity3D 平面坐标,也可能只是 X 和 Y),这样如果我正确对齐地图,我就会得到一个小型 GPS 系统,仅供我使用城市。如果你对我为什么这样做感到好奇,那只是因为我和我的一个朋友正在尝试使用我们的城市和这个 GPS 系统作为基础来构建一个游戏
编辑 2:
除了说实话我不知道笛卡尔坐标是如何工作的,但它们似乎是我正在寻找的是的:P平面坐标和X,Y坐标我的意思是基本上只是坐标我可以在平面 2D 平面上使用 Unity3D,这就是我正在使用的平面。
编辑 3:
感谢您的回答,开始吧。这不是重复的,其次我的朋友和我已经找到了你发给我的 Whosebug 主题,但它似乎对我们不起作用(也许我们做错了什么)。基本上,我们使用该公式测试的不同地点之间的南北距离有效,但它们之间的东西距离比应有的大得多。我们认为这可能是因为该公式适用于球形地球,但也许我们做错了什么。如果有人能进一步解释那就太棒了!
编辑 4:
我们确信我们的地图不会有任何错误,因为我们已经将它与多个位置对齐。我们得到了这些位置的坐标,然后使用这个网站:http://www.gpscoordinaten.nl/converteer-rd-coordinaten.php 将其转换为 XY 坐标,然后使用这些 XY 坐标来检查我们的地图是否正确对齐。的确如此,所以我们确信我们使用的数学有问题,而不是我们的实际地图。
EDIT5:删除了很多很多语法错误。这里太热了,现在不能正常写作,所以如果其中任何一个没有意义,我非常非常抱歉。请告诉我,我会进行编辑以尝试解释我们正在尝试做的事情。
EDIT6:找到我自己的答案,如果你想看看我做了什么来解决我的问题,它就在所有其他答案之间
地图有mercator投影吗?是世界地图吗?
如果是这样,地图的顶部通常在纬度 85 左右,纬度 0 位于垂直中心。
经度 0 在格林威治(通常水平居中),180/-180 在 antimeridian/date 线上,在地图的左右边缘。
当纬度为-180时,x为0,当为180时,x ==地图宽度。
至此我找到了我自己的问题的答案(其实前一阵子已经找到了,但是完全忘了post这里)
基本上我自己做了一个小公式,将坐标乘以一个设定数(取决于是否是 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 和 6.something 从 lon 和 lat 上取下来是因为我在 Unity 中的 0 X 和 0 Z 点的坐标对应于底部我地图的左角,这是我谈到的用于此计算的两个点之一。
我希望这能帮助其他可能遇到类似问题的人,如果您有任何问题,请随时问他们。
-LAKster
这是基本问题。我目前正在 Unity 3D 中用 C# 开发 GPS 系统(给我们分配任务的人让我们使用这个程序,所以我不能用其他任何东西来做)。
现在我 运行 遇到了一个小问题,基本上我们可以从 android phone 请求(我们认为是十进制的)坐标,但现在我们正在尝试将这些坐标转换为 X、Y、Z 坐标。最好是 X 和 Z,因为我们实际上并不需要高度。然而,到目前为止,我们在互联网上找到的所有内容都是为了转换为球体地图,因为我们只有一个基本的平面数字地图。
如果有人知道如何将我们的坐标转换为基本的 X 和 Z 坐标(即我们的经度和纬度),那就太棒了。
快速说明一下,我不确定我们拥有的那种坐标是否是实际的十进制坐标,所以它们看起来像这样:
纬度:53.228888 经度:6.5403559
如果您在地图上查找这些坐标,它们应该在 "Wegalaan 3, Groningen, The Netherlands" 上结束。
已经谢谢了!
编辑:(这也在评论中)
对不起,如果它可能会造成混淆。老实说,我对这一切是如何工作的只有一半的了解,无论如何要澄清一些事情。我目前在 Unity 中使用从我居住的城市(荷兰格罗宁根)的互联网上获得的简单 2D 地图工作,我试图基本上获取从我的 android [=48= 获得的 GPS 坐标] 然后用红点在地图上显示它们,但是要做到这一点,我需要能够将红点移动到地图上的正确坐标。我想做的是将 GPS 坐标(经度和纬度)转换为 X 和 Z(Unity3D 平面坐标,也可能只是 X 和 Y),这样如果我正确对齐地图,我就会得到一个小型 GPS 系统,仅供我使用城市。如果你对我为什么这样做感到好奇,那只是因为我和我的一个朋友正在尝试使用我们的城市和这个 GPS 系统作为基础来构建一个游戏
编辑 2:
除了说实话我不知道笛卡尔坐标是如何工作的,但它们似乎是我正在寻找的是的:P平面坐标和X,Y坐标我的意思是基本上只是坐标我可以在平面 2D 平面上使用 Unity3D,这就是我正在使用的平面。
编辑 3:
感谢您的回答,开始吧。这不是重复的,其次我的朋友和我已经找到了你发给我的 Whosebug 主题,但它似乎对我们不起作用(也许我们做错了什么)。基本上,我们使用该公式测试的不同地点之间的南北距离有效,但它们之间的东西距离比应有的大得多。我们认为这可能是因为该公式适用于球形地球,但也许我们做错了什么。如果有人能进一步解释那就太棒了!
编辑 4:
我们确信我们的地图不会有任何错误,因为我们已经将它与多个位置对齐。我们得到了这些位置的坐标,然后使用这个网站:http://www.gpscoordinaten.nl/converteer-rd-coordinaten.php 将其转换为 XY 坐标,然后使用这些 XY 坐标来检查我们的地图是否正确对齐。的确如此,所以我们确信我们使用的数学有问题,而不是我们的实际地图。
EDIT5:删除了很多很多语法错误。这里太热了,现在不能正常写作,所以如果其中任何一个没有意义,我非常非常抱歉。请告诉我,我会进行编辑以尝试解释我们正在尝试做的事情。
EDIT6:找到我自己的答案,如果你想看看我做了什么来解决我的问题,它就在所有其他答案之间
地图有mercator投影吗?是世界地图吗? 如果是这样,地图的顶部通常在纬度 85 左右,纬度 0 位于垂直中心。 经度 0 在格林威治(通常水平居中),180/-180 在 antimeridian/date 线上,在地图的左右边缘。
当纬度为-180时,x为0,当为180时,x ==地图宽度。
至此我找到了我自己的问题的答案(其实前一阵子已经找到了,但是完全忘了post这里)
基本上我自己做了一个小公式,将坐标乘以一个设定数(取决于是否是 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 和 6.something 从 lon 和 lat 上取下来是因为我在 Unity 中的 0 X 和 0 Z 点的坐标对应于底部我地图的左角,这是我谈到的用于此计算的两个点之一。
我希望这能帮助其他可能遇到类似问题的人,如果您有任何问题,请随时问他们。
-LAKster