2012-10-27 16 views
0

之間的線路不同的地方我有兩套緯度/經度座標和視覺上我畫一條線愨他們。 有推斷LAT的方式/ LNG的座標爲你「走」沿線演繹緯度 LNG座標上的兩個位置

因此在10%沿線的緯度/經度將

在20%沿線緯度/ LNG將

在沿線30%的緯度/經度將

等。

我希望在SQL地理的東西可能有一個簡單的解決方案..

理想的SQL(SQL Server 2008 R2的數據庫),或者 - 如果太有難度的 - 可能是在C#

任何幫助,將不勝感激

感謝

+0

線條是在球體的表面還是平坦的? – James

+0

它只是在一個國家的兩個地點 - 如果這有幫助 - 可以在該國的任何地方 - 例如在兩個城市之間 –

+0

一條直線 - 如烏鴉蒼蠅 - 就足夠了 - 正如你可以告訴地球的東西(和術語)是不是我的強項 - 想象它在兩個位置之間的谷歌地圖上的直線。對不起,如果我沒有正確解釋這個 –

回答

1

該庫在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只是一個緯度/長度的結構。

所以其過程是:

  1. 10 0R任何
  2. 計算距離和你的兩個點之間的軸承
  3. 鴻溝的距離計算使用所述增量距離和方位的終端座標。
  4. 保持'走行,直到你到達另一端

如果您需要更多的幫助,讓我知道

0

在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);