给定折线的纬度和经度,转换为笛卡尔坐标并将结果参考绘制到另一个已知的纬度和经度

时间:2016-06-08 23:50:07

标签: c# unity3d coordinates coordinate-transformation cartesian-coordinates

如何根据在Unity中绘制为0,0的经度和纬度将经度和纬度转换为Unity 3D坐标?

关于如何做到这一点有很多建议,但我还没有看到这个问题的完整而简洁的答案。

我需要在Unity 3D中绘制一系列折线,用于表示在地图上绘制的线条。折线中的每个点由纬度和经度表示。坐标表示为EPSG:4269 NAD83。

当用户的经度和纬度作为空间查询发送到MongoDB服务器时,场景开始,服务器以包含代表折线中每个点的坐标数组的geojson feed进行响应。

Unity3D中的用户直接位于地图的中心(0,0)。用户设备内的指南针将Z轴指向北方。 X轴代表东/西。 Y轴代表高度。

目标是在屏幕上绘制代表用户的地理空间对象的线条。该程序能够正确地发出请求,解析geojson提要,并绘制线条,但如果没有从纬度/经度到Unity3D笛卡儿的正确转换,线条显然没有正确定位。

这个公式基本上是拼图的最后一部分。我正在使用C#编写Unity3D程序。

以下是线条在在线地图中的显示方式。蓝色图钉代表用户的位置:

enter image description here

以下是用户移动设备上用户界面的图示(未正确绘制线条):

enter image description here

代码示例我设法在尝试使其全部工作时成功:

//
// Longitude and Latitude to Unity
//
public Vector3 LatLonUnity(double longitude, float elevation, double latitude){
    // code based on http://stackoverflow.com/questions/32311647/converting-gps-coordinates-to-x-y-z-coordinates

    float u_lat = Convert.ToSingle ((latitude - DrawLines.user_latitude) / 0.00001 * 0.12179047095976932582726898256213);

    float u_lon = Convert.ToSingle ((longitude - DrawLines.user_longitude) / 0.000001 * 0.00728553580298947812081345114627);

    Vector3 geo_unity = new Vector3 (-u_lon, elevation, -u_lat);

    return geo_unity;

}

1 个答案:

答案 0 :(得分:0)

纬度θ和经度φ球 - 极坐标中的两个组件(另一个是行星的半径r,你是还必须指定)。

enter image description here

对于海拔h的坐标,只需替换enter image description here

即可