我有两组 lat/lng 坐标,在视觉上我在它们之间画了一条线。当你沿着这条线“走”时,有没有一种方法可以推断出纬度/经度坐标
所以沿线的 10% 处,纬度/经度将是
沿线 20% 处,纬度/经度将为
沿线的 30% 处,纬度/经度将是
ETC..
我希望sql中的地理资料可能有一个简单的解决方案..
理想情况下在 SQL(SQL Server 2008 R2 数据库)中或 - 如果太棘手 - 可能在 C# 中
任何帮助,将不胜感激
谢谢
我有两组 lat/lng 坐标,在视觉上我在它们之间画了一条线。当你沿着这条线“走”时,有没有一种方法可以推断出纬度/经度坐标
所以沿线的 10% 处,纬度/经度将是
沿线 20% 处,纬度/经度将为
沿线的 30% 处,纬度/经度将是
ETC..
我希望sql中的地理资料可能有一个简单的解决方案..
理想情况下在 SQL(SQL Server 2008 R2 数据库)中或 - 如果太棘手 - 可能在 C# 中
任何帮助,将不胜感激
谢谢
C# 中的这个库提供了许多可能有帮助的工具:
http://www.gavaghan.org/blog/free-source-code/geodesy-library-vincentys-formula/
编辑这使用地图投影,因此它不使用直线。您需要注意,纬度之间的距离或多或少是恒定的,但经度之间的距离取决于纬度。
除了上面的库之外,还有一些更简单的近似值用于测量两点之间的距离以及给定距离处的点坐标以及从起点开始的方位角。
这是一些测量两点之间距离的代码:
double lat1 = FSConvert.DegreesToRadians(start.Latitude.Decimal);
double lon1 = FSConvert.DegreesToRadians(start.Longitude.Decimal) * -1;
double lat2 = FSConvert.DegreesToRadians(end.Latitude.Decimal);
double lon2 = FSConvert.DegreesToRadians(end.Longitude.Decimal) * -1;
double result = Math.Acos(Math.Sin(lat1) * Math.Sin(lat2) + Math.Cos(lat1) * Math.Cos(lat2) * Math.Cos(lon1 - lon2));
distance = FSConvert.DradtoMeters(result);
这是一些计算轴承的代码:
if (start == null || end == null)
{
return 0.0f;
}
double lat1 = FSConvert.DegreesToRadians(start.Latitude.Decimal);
double lon1 = FSConvert.DegreesToRadians(start.Longitude.Decimal) * -1;
double lat2 = FSConvert.DegreesToRadians(end.Latitude.Decimal);
double lon2 = FSConvert.DegreesToRadians(end.Longitude.Decimal) * -1;
double y = Math.Atan2(Math.Sin(lon1 - lon2) * Math.Cos(lat2), Math.Cos(lat1) * Math.Sin(lat2) - Math.Sin(lat1) * Math.Cos(lat2) * Math.Cos(lon1 - lon2));
const double x = 2 * Math.PI;
double result = y - x * Math.Floor(y / x);
bearing = FSConvert.RadiansToDegrees(result);
这是一些代码,用于根据距原点的距离和方位计算终端坐标
double lat1 = FSConvert.DegreesToRadians(start.Latitude.Decimal);
double lon1 = FSConvert.DegreesToRadians(start.Longitude.Decimal) * -1;
double d = FSConvert.MetersToDrad(distance);
double tc = FSConvert.DegreesToRadians(bearing);
double lat = Math.Asin(Math.Sin(lat1) * Math.Cos(d) + Math.Cos(lat1) * Math.Sin(d) * Math.Cos(tc));
double lon = ((lon1 - Math.Asin(Math.Sin(tc) * Math.Sin(d) / Math.Cos(lat)) + Math.PI) % (2 * Math.PI)) - Math.PI;
var returnPoint = new FSPoint {
Latitude = {
Decimal = FSConvert.RadiansToDegrees(lat)
},
Longitude = {
Decimal = FSConvert.RadiansToDegrees(lon) * -1
}
};
point = returnPoint;
对 FSConvert 的引用只会更改 RadiansToDegrees 等等 - 这是微不足道的。FSPoint 只是一个 lat/long 结构。
所以过程是:
如果您需要更多帮助,请告诉我
在 JAVA 中,您可以使用此代码并且效果很好(从 ScruffyDuck 的回复转换而来)
double x2 = next.latitude;
double y2 = next.longitude;
double x1 = current.latitude;
double y1 = current.longitude;
double lat1 = Math.toRadians(x1);
double lon1 = Math.toRadians(y1) * -1;
double lat2 = Math.toRadians(x2);
double lon2 = Math.toRadians(y2) * -1;
double distance = Math.acos(Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2));
double var1 = Math.atan2(Math.sin(lon1 - lon2) * Math.cos(lat2), Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(lon1 - lon2));
double var2 = 2 * Math.PI;
double bearing = var1 - var2 * Math.floor(var1 / var2);
double lat = Math.asin(Math.sin(lat1) * Math.cos(distance) + Math.cos(lat1) * Math.sin(distance) * Math.cos(bearing));
double lon = ((lon1 - Math.asin(Math.sin(bearing) * Math.sin(distance) / Math.cos(lat)) + Math.PI) % (2 * Math.PI)) - Math.PI;
double x = Math.toDegrees(lat);
double y = Math.toDegrees(lon) * -1;
//****************
Location l = new Location("temp");
l.setLatitude(x);
l.setLongitude(y);