2014-05-14 31 views
2

我正在努力從Noaa API獲取數據。從中心緯度/長度計算平方英里的緯度/長度X方向

在與Noaa API交談時,您可以獲得廣場內的氣象站列表。他們稱他們爲「範圍」,他們是2套經緯度。左下緯度/經度和右上方經/緯

如這裏詳述:

http://www.ncdc.noaa.gov/cdo-web/webservices/v2#stations

我一直在考慮緯度/多頭的列表在美國和我一批的城市我正試圖找出放置箱子的最佳方式。因此,我的第一個猜測是採取中央緯度/經度,計算出西經75英里的緯度/經度,然後計算出該點南緯75英里的緯度/經度。

理想情況下,我想這是一個C#函數。

有沒有人有任何想法的代碼這個最好的方式嗎?

謝謝

回答

1

yippee! - 找到了解決辦法...

首先一個簡單的類:

public class LatLonAlt 
    { 
     public double Latitude { get; set; } 
     public double Longitude { get; set; } 
     public double Altitude { get; set; } 
    } 

然後一個函數來計算一個新的位置:

public static HelpersModel.LatLonAlt CalculateDerivedPosition(HelpersModel.LatLonAlt source, double range, double bearing) 
    { 
     double latA = Convert.ToDouble(source.Latitude) * (Math.PI/180); 
     double lonA = Convert.ToDouble(source.Longitude) * (Math.PI/180); 
     double angularDistance = range/6371; 
     double trueCourse = bearing * (Math.PI/180); 

     double lat = Math.Asin(
      Math.Sin(latA) * Math.Cos(angularDistance) + 
      Math.Cos(latA) * Math.Sin(angularDistance) * Math.Cos(trueCourse)); 

     double dlon = Math.Atan2(
      Math.Sin(trueCourse) * Math.Sin(angularDistance) * Math.Cos(latA), 
      Math.Cos(angularDistance) - Math.Sin(latA) * Math.Sin(lat)); 

     double lon = ((lonA + dlon + Math.PI) % (Math.PI * 2)) - Math.PI; 

     HelpersModel.LatLonAlt results = new HelpersModel.LatLonAlt(); 
     results.Latitude = lat * (180/Math.PI); 
     results.Longitude = lon * (180/Math.PI); 
     results.Altitude = source.Altitude; 

     return results; 
    } 

那時,我知道我可以做得更好。但它現在可行...

2個功能可以計算出瓶頸和瓶蓋的範圍:

public static HelpersModel.LatLonAlt FindBottomLeftExtent(HelpersModel.LatLonAlt startpoint) 
    { 
     // first move left 
     HelpersModel.LatLonAlt movedleft = CalculateDerivedPosition(startpoint, 72.42, 270); 
     // move down 
     HelpersModel.LatLonAlt moveddown = CalculateDerivedPosition(movedleft, 72.42, 180); 

     return moveddown; 
    } 
    public static HelpersModel.LatLonAlt FindTopRightExtent(HelpersModel.LatLonAlt startpoint) 
    { 
     // first move right 
     HelpersModel.LatLonAlt movedright = CalculateDerivedPosition(startpoint, 72.42, 90); 
     // move up 
     HelpersModel.LatLonAlt movedup = CalculateDerivedPosition(movedright, 72.42, 0); 

     return movedup; 
    } 

HTH!

崔佛

+0

因爲你重複某些計算的次數,你會發現它有用的定義常量對他們來說,爲了清晰 - 例如,用'DegreesToRadians'代替'Math.PI/180'。 –

+0

@AdrianWragg我就可以了! –