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

时间:2015-08-31 12:46:37

标签: c# android unity3d gps

所以这是基本问题。我目前正在使用Unity 3D中的C#中的GPS系统(给我们这个任务的人正在让我们使用这个程序,所以我不能用其他任何东西)。

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

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

要快速说明我不确定我们的坐标类型是否是实际的小数点坐标,所以这就是它们的样子:

纬度:53.228888经度:6.5403559

这些坐标应最终落在" Wegalaan 3,格罗宁根,荷兰"如果你想在地图上查找它们。

谢谢!

编辑:(这也在评论中)

很抱歉,如果它可能令人困惑。老实说,我只知道这一切是如何运作的,无论如何要清除一些事情。我目前在Unity工作,我从我居住的城市(格罗宁根,荷兰)的互联网上获得了一个简单的2D地图,我正在尝试基本上从我的Android手机获取GPS坐标,然后在地图上显示它们使用红点,但要做到这一点,我需要能够将红点移动到地图上的右侧坐标。我想要做的是将GPS坐标(lon和lat)转换为X和Z(Unity3D平面坐标,也可能只是X和Y),这样如果我对齐地图,我会得到一个小型GPS系统市。如果你很好奇我为什么要这样做,那只是因为我和我的一个朋友正试图用我们的城市和这个GPS系统作为基础建立一个游戏

EDIT2:

除了我说实话我不知道笛卡尔坐标是如何工作的,但它们似乎是我正在寻找的是:P在平面上坐标并且用X,Y坐标我的意思基本上只是坐标我可以在Unity3D中使用平面2D平面,这正是我的工作。

EDIT3:

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

EDIT4:

我们确信无论如何我们的地图都不对,因为我们已将其与多个地点对齐。我们得到了这些位置的坐标,然后使用这个网站:http://www.gpscoordinaten.nl/converteer-rd-coordinaten.php将其转换为XY坐标,然后使用这些XY坐标检查我们的地图是否正确对齐。确实如此,所以我们确信我们使用的数学有问题,而不是我们的实际地图。

EDIT5:删除了许多语法错误。现在这里的写作方式太热了,所以如果其中任何一个都没有意义,我会非常抱歉。只是让我知道,我会编辑试图解释我们想要做的事情。

EDIT6:找到我自己的asnwer,如果你想知道我为解决我的问题做了什么,那么它介于所有其他答案之间

3 个答案:

答案 0 :(得分:1)

到目前为止,我已经找到了我自己的问题的答案(实际上已经发现它已经很久了,但完全忘了在这里发布)

基本上我制作了一个我自己的小公式,将坐标乘以一组数(取决于是否为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

答案 1 :(得分:0)

地图是否有mercator投影?这是世界地图吗? 如果是这样,地图的顶部通常在纬度85附近,纬度0在垂直中心。 经度0位于格林威治(通常是水平居中),180 / -180位于抗辩/日期线,位于地图的左右边缘。

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

This link should tell you what you need

答案 2 :(得分:0)

你看过这个剧本吗?它与您正在寻找的相反,但您可以反转公式。

http://wiki.unity3d.com/index.php/GPS_Global_Positioning_System