2014-05-14 26 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我就可以了! –