namespace PBS.WinFrmUI.Hydro
|
{
|
public class AmapBoundsHelper
|
{
|
public class Coordinate
|
{
|
public Coordinate(double lat, double lon)
|
{
|
this.lat = lat;
|
this.lon = lon;
|
}
|
|
/// <summary>
|
/// 纬度
|
/// </summary>
|
public double lat { get; set; }
|
|
/// <summary>
|
/// 经度
|
/// </summary>
|
public double lon { get; set; }
|
|
}
|
|
public static (double Width, double Height) CalcSize(Yw.Model.Map.Point southWest, Yw.Model.Map.Point northEast)
|
{
|
double lat = northEast.Y;
|
double lon = northEast.X;
|
|
//右上角坐标
|
Coordinate coordinate1 = new Coordinate(lat, lon);
|
|
double lat2 = southWest.Y;
|
double lon2 = southWest.X;
|
|
//左下角坐标
|
Coordinate coordinate2 = new Coordinate(lat2, lon2);
|
|
|
//右下角坐标
|
Coordinate coordinate3 = new Coordinate(coordinate1.lat, coordinate2.lon);
|
|
//左上角坐标
|
Coordinate coordinate4 = new Coordinate(coordinate2.lat, coordinate1.lon);
|
|
double distanceWidth = Distance(coordinate1, coordinate3);
|
double distanceHeight = Distance(coordinate1, coordinate4);
|
|
return (distanceWidth,distanceHeight);
|
}
|
|
public static double Distance(Coordinate coordinate1, Coordinate coordinate2)
|
{
|
var a = coordinate1;
|
var lat1 = a.lat;
|
var lon1 = a.lon;
|
var b = coordinate2;
|
var lat2 = b.lat;
|
var lon2 = b.lon;
|
|
if (lat1 == lat2 && lon1 == lon2)
|
{
|
return 0;
|
}
|
|
a.lon = VC(a.lon, -180, 180);
|
a.lat = aD(a.lat, -74, 74);
|
b.lon = VC(b.lon, -180, 180);
|
b.lat = aD(b.lat, -74, 74);
|
double ret;
|
ret = JF(JK(a.lon), JK(b.lon), JK(a.lat), JK(b.lat));
|
return ret;
|
}
|
|
|
public static double aD(double a, double b, double c)
|
{
|
if (b != null)
|
{
|
a = Math.Max(a, b);
|
}
|
if (b != null)
|
{
|
a = Math.Min(a, c);
|
}
|
return a;
|
}
|
public static double VC(double a, double b, double c)
|
{
|
if (a > c)
|
{
|
a -= c - b;
|
}
|
if (a < b)
|
{
|
a += c - b;
|
}
|
return a;
|
}
|
public static double JK(double a)
|
{
|
double ret = Math.PI * a / 180.0;
|
return ret;
|
}
|
public static double JF(double a, double b, double c, double e)
|
{
|
const double Ou = 6370996.81;
|
return Ou * Math.Acos(Math.Sin(c) * Math.Sin(e) + Math.Cos(c) * Math.Cos(e) * Math.Cos(b - a));
|
}
|
|
}
|
|
}
|