using UnityEngine;
namespace MyFrameworkPure
{
///
/// gps工具类
///
public static class GPSTool
{
///
/// 笛卡尔坐标系转换为gps
///
///
///
///
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); //Calc current lat
geoLocation.y = (localOrigin.y + (position.x) / metersPerLon); //Calc current lon
return geoLocation;
}
///
/// gps转换为笛卡尔坐标
///
///
///
///
private static Vector3 GPStoUCS(Vector2 gps, Vector2 localOrigin)
{
FindMetersPerLat(localOrigin.x, out float metersPerLat, out float metersPerLon);
float zPosition = metersPerLat * (gps.x - localOrigin.x); //Calc current lat
float xPosition = metersPerLon * (gps.y - localOrigin.y); //Calc current lat
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; // latitude calculation term 1
float m2 = -559.82f; // latitude calculation term 2
float m3 = 1.175f; // latitude calculation term 3
float m4 = -0.0023f; // latitude calculation term 4
float p1 = 111412.84f; // longitude calculation term 1
float p2 = -93.5f; // longitude calculation term 2
float p3 = 0.118f; // longitude calculation term 3
lat = lat * Mathf.Deg2Rad;
// Calculate the length of a degree of latitude and longitude in meters
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));
}
#if Vectord
public static Vector2d USCToGPS(Vector3d position, Vector2d localOrigin)
{
FindMetersPerLat(localOrigin.x, out double metersPerLat, out double metersPerLon);
Vector2d geoLocation = new Vector2d(0, 0);
geoLocation.x = (localOrigin.x + (position.z) / metersPerLat);
geoLocation.y = (localOrigin.y + (position.x) / metersPerLon);
return geoLocation;
}
private static Vector3d GPStoUCS(Vector2d gps, Vector2d localOrigin)
{
FindMetersPerLat(localOrigin.x, out double metersPerLat, out double metersPerLon);
double zPosition = metersPerLat * (gps.x - localOrigin.x);
double xPosition = metersPerLon * (gps.y - localOrigin.y);
return new Vector3d(xPosition, 0, zPosition);
}
private static void FindMetersPerLat(double lat, out double metersPerLat, out double metersPerLon) // Compute lengths of degrees
{
double m1 = 111132.92; // latitude calculation term 1
double m2 = -559.82; // latitude calculation term 2
double m3 = 1.175; // latitude calculation term 3
double m4 = -0.0023; // latitude calculation term 4
double p1 = 111412.84; // longitude calculation term 1
double p2 = -93.5; // longitude calculation term 2
double p3 = 0.118; // longitude calculation term 3
lat = lat * Mathd.Deg2Rad;
metersPerLat = m1 + (m2 * Mathd.Cos(2 * lat)) + (m3 * Mathd.Cos(4 * lat)) + (m4 * Mathd.Cos(6 * lat));
metersPerLon = (p1 * Mathd.Cos(lat)) + (p2 * Mathd.Cos(3 * lat)) + (p3 * Mathd.Cos(5 * lat));
}
#endif
}
}