之間的線路不同的地方我有兩套緯度/經度座標和視覺上我畫一條線愨他們。 有推斷LAT的方式/ LNG的座標爲你「走」沿線演繹緯度 LNG座標上的兩個位置
因此在10%沿線的緯度/經度將
在20%沿線緯度/ LNG將
在沿線30%的緯度/經度將
等。
我希望在SQL地理的東西可能有一個簡單的解決方案..
理想的SQL(SQL Server 2008 R2的數據庫),或者 - 如果太有難度的 - 可能是在C#
任何幫助,將不勝感激
感謝
之間的線路不同的地方我有兩套緯度/經度座標和視覺上我畫一條線愨他們。 有推斷LAT的方式/ LNG的座標爲你「走」沿線演繹緯度 LNG座標上的兩個位置
因此在10%沿線的緯度/經度將
在20%沿線緯度/ LNG將
在沿線30%的緯度/經度將
等。
我希望在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只是一個緯度/長度的結構。
所以其過程是:
如果您需要更多的幫助,讓我知道
在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);
線條是在球體的表面還是平坦的? – James
它只是在一個國家的兩個地點 - 如果這有幫助 - 可以在該國的任何地方 - 例如在兩個城市之間 –
一條直線 - 如烏鴉蒼蠅 - 就足夠了 - 正如你可以告訴地球的東西(和術語)是不是我的強項 - 想象它在兩個位置之間的谷歌地圖上的直線。對不起,如果我沒有正確解釋這個 –