2014-05-14 2 views
2

Noaa API에서 데이터를 가져오고 있습니다.중앙 위도/경도에서 SW & NE 위도/정사각형 X 마일을 계산하십시오.

Noaa API와 대화 할 때 사각형 내의 기상 관측소 목록을 얻을 수 있습니다. 그들은 그것을 "범위"라고 부르며 그들은 2 세트의 위도/경도입니다. 왼쪽 아래 위도/경도 여기에 설명 된 오른쪽 상단 위도/경도

로 :

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

나는 미국과 나는 도시의 숫자에 대한 위도/갈망의 목록이 제공되어 주위에 박스를 넣는 최선의 방법을 찾으려고 노력 중입니다.

그래서 내 첫 번째 추측은 중앙/위도를 가져 와서 서쪽으로 75 마일을 위도/경도로 계산 한 다음 그 지점의 75 마일 남쪽 지점의 위도/경도를 계산하는 것입니다.

이상적으로 저는 이것을 C# 함수로 사용하고 싶습니다.

누군가 코드를 작성하는 가장 좋은 방법에 대한 아이디어가 있습니까?

감사합니다.

답변

1

지저귀다! 새로운 위치를 계산하는 그런 기능을

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! Trev

+0

특정 계산을 여러 번 반복하고 있기 때문에, 당신이 유용 명확성을 위해, 그들에 대한 상수를 정의 할 찾을 수 있습니다 - 예를 들어 DegreesToRadians''와'인 Math.PI/180'를 교체합니다. –

+0

@AdrianWragg Im on it! –