Unity 世界位置经纬度 转为Unity坐标

参考:
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中位置的相对位置大小,可以将这些坐标的节点放到一个父级下方,通过移动父级的坐标,使位置对应。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值