unity 实现经纬度和utm坐标转换代码
时间: 2023-09-12 13:07:37 浏览: 38
以下是 Unity 中实现经纬度和 UTM 坐标转换的代码示例:
```csharp
using UnityEngine;
public class GPSToUTM : MonoBehaviour
{
public double longitude;
public double latitude;
void Start()
{
double easting, northing;
int zone;
LatLonToUTM(latitude, longitude, out easting, out northing, out zone);
Debug.Log("UTM Zone: " + zone + " Easting: " + easting + " Northing: " + northing);
}
void LatLonToUTM(double lat, double lon, out double easting, out double northing, out int zone)
{
double a = 6378137.0; // GRS80 ellipsoid
double k0 = 0.9996;
double eccSquared = 0.00669438;
double eccPrimeSquared;
double e1 = (1 - Mathf.Sqrt(1 - (float)eccSquared)) / (1 + Mathf.Sqrt(1 - (float)eccSquared));
double N, T, C, A, M;
double latRad = lat * Mathf.Deg2Rad;
double lonRad = lon * Mathf.Deg2Rad;
zone = Mathf.FloorToInt((float)((lon + 180.0) / 6.0) + 1.0);
int nHemi = (lat >= 0) ? 1 : 0;
double latRadTemp = (nHemi == 1) ? latRad : (-latRad);
double lonRadTemp = lonRad - ((zone - 1) * 6.0 + 3.0) * Mathf.Deg2Rad;
eccPrimeSquared = (eccSquared) / (1 - eccSquared);
N = a / Mathf.Sqrt(1 - (float)eccSquared * Mathf.Sin((float)latRadTemp) * Mathf.Sin((float)latRadTemp));
T = Mathf.Tan((float)latRadTemp) * Mathf.Tan((float)latRadTemp);
C = eccPrimeSquared * Mathf.Cos((float)latRadTemp) * Mathf.Cos((float)latRadTemp);
A = Mathf.Cos((float)latRadTemp) * (float)(lonRadTemp);
M = a * ((1 - (float)eccSquared / 4 - 3 * (float)eccSquared * (float)eccSquared / 64 - 5 * (float)eccSquared * (float)eccSquared * (float)eccSquared / 256) * (float)latRadTemp - (3 * (float)eccSquared / 8 + 3 * (float)eccSquared * (float)eccSquared / 32 + 45 * (float)eccSquared * (float)eccSquared * (float)eccSquared / 1024) * Mathf.Sin(2 * (float)latRadTemp) + (15 * (float)eccSquared * (float)eccSquared / 256 + 45 * (float)eccSquared * (float)eccSquared * (float)eccSquared / 1024) * Mathf.Sin(4 * (float)latRadTemp) - (35 * (float)eccSquared * (float)eccSquared * (float)eccSquared / 3072) * Mathf.Sin(6 * (float)latRadTemp));
easting = (double)(k0 * N * (A + (1 - T + C) * (float)(A * A * A) / 6 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * (float)(A * A * A * A * A) / 120) + 500000.0);
northing = (double)(k0 * (M + N * Mathf.Tan((float)latRadTemp) * ((A * A / 2) + (5 - T + (9 * C) + (4 * C * C)) * (float)(A * A * A * A) / 24 + (61 - (58 * T) + (T * T) + (600 * C) - (330 * eccPrimeSquared)) * (float)(A * A * A * A * A * A) / 720)));
if (nHemi == 0)
{
northing += 10000000.0; //10000000 meter offset for southern hemisphere
}
}
}
```
其中,`LatLonToUTM()` 函数接受经度和纬度作为输入参数,并计算出相应的 UTM 坐标。在 `Start()` 函数中,我们可以将经度和纬度传递给函数,并打印出计算得到的 UTM 坐标。请注意,该代码示例中使用了 GRS80 椭球体和 UTM 投影,您可以根据需要进行修改。