参考:
https://github.com/MichaelTaylor3D/UnityGPSConverter/blob/master/GPSEncoder.cs
参考方法里使用了单例,实际上没有必要。
修改后的静态类
public static class GPSTool{public static Vector2 USCToGPS(Vector3 position, Vector2 localOrigin){FindMetersPerLat(localOrigin.x, out float metersPerLat, out float metersPerLon);Vector2 geoLocation = new Vector2(0, 0);geoLocation.x = (localOrigin.x + (position.z) / metersPerLat);geoLocation.y = (localOrigin.y + (position.x) / metersPerLon); return geoLocation;}public static Vector3 GPStoUCS(Vector2 gps, Vector2 localOrigin){FindMetersPerLat(localOrigin.x, out float metersPerLat, out float metersPerLon);float zPosition = metersPerLat * (gps.x - localOrigin.x); float xPosition = metersPerLon * (gps.y - localOrigin.y); return new Vector3((float)xPosition, 0, (float)zPosition);}private static void FindMetersPerLat(float lat, out float metersPerLat, out float metersPerLon) // Compute lengths of degrees{float m1 = 111132.92f; float m2 = -559.82f; float m3 = 1.175f; float m4 = -0.0023f; float p1 = 111412.84f; float p2 = -93.5f; float p3 = 0.118f; lat = lat * Mathf.Deg2Rad;metersPerLat = m1 + (m2 * Mathf.Cos(2 * (float)lat)) + (m3 * Mathf.Cos(4 * (float)lat)) + (m4 * Mathf.Cos(6 * (float)lat));metersPerLon = (p1 * Mathf.Cos((float)lat)) + (p2 * Mathf.Cos(3 * (float)lat)) + (p3 * Mathf.Cos(5 * (float)lat));}}
使用方法
private const float CKlatitude;//参考坐标的纬度常量
private const float CKlongitude;//参考坐标的经度常量
public float ScaleCoe;public void SetLocalPos(float latitude,float longitude){
Vector3 pos = GPSTool.GPStoUCS(new Vector2(latitude, longitude), new Vector2(CKlatitude, CKlongitude));
go.transform.localPosition = pos * ScaleCoe;
}
在同一个场景中,参考坐标的常量是唯一的,这样经纬度转化的坐标相对位置才是正确的。ScaleCoe是一个缩放系数,取决于Unity中位置的相对位置大小,可以将这些坐标的节点放到一个父级下方,通过移动父级的坐标,使位置对应。