2010-07-16 6 views
5

시작 위도와 경도 및 거리를 가져 와서 경계 상자 (최대 위도, 최소 위도, 최대 경도, 최소 경도)를 찾는 간단한 C# 클래스를 찾고 싶습니다. 그래서 여기에 다른 유사한 질문들이 있지만 그들 중 누구도 이것에 정말로 대답하지 않으며 C#에없는 질문은 대답하지 않습니다.C#의 위도와 경도 경계 상자?

도움말.

+5

몇 가지 관련 게시물을 살펴보면 C#에서 구현 한 내용을 종합하기에 충분한 정보와 참조가있는 것 같습니다. 당신이 그렇게 할 필요가 없도록 누군가에게 코드를 작성해달라고한다면, 여기에 많은 행운이 없을 것입니다. –

+0

게시물에 대한 특정 링크가 없으면 귀하의 의견을 기쁘게 무시하겠습니다. 내 검색을 했어. C# 여기가 아니야. –

+4

글쎄,이 페이지의 오른쪽에있는 관련 링크 중 첫 번째를 복사 해 보도록하겠습니다. http://stackoverflow.com/questions/1648917/given-a-latitude-and-longitude-and-distance-i-want-to-find-a-bounding-box 최소한 Java에서의 구현에 대한 참조와 문제에 대한 수학적 접근에 관한 몇 가지 기사를 찾아보십시오. 원하는 언어로 원하는 구현을 찾을 수 없습니다. 아이디어는 생각을 돕는 것입니다. 사람들이 생각하고 코딩하지 않고 컴파일하는 첫 번째 클래스 만 사용하십시오. –

답변

9

여기에 당신이 요구하는거야. Python here으로 원본을 쓴 Federico A. Ramponi에게 감사드립니다.

public class MapPoint 
{ 
    public double Longitude { get; set; } // In Degrees 
    public double Latitude { get; set; } // In Degrees 
} 

public class BoundingBox 
{ 
    public MapPoint MinPoint { get; set; } 
    public MapPoint MaxPoint { get; set; } 
}   

// Semi-axes of WGS-84 geoidal reference 
private const double WGS84_a = 6378137.0; // Major semiaxis [m] 
private const double WGS84_b = 6356752.3; // Minor semiaxis [m] 

// 'halfSideInKm' is the half length of the bounding box you want in kilometers. 
public static BoundingBox GetBoundingBox(MapPoint point, double halfSideInKm) 
{    
    // Bounding box surrounding the point at given coordinates, 
    // assuming local approximation of Earth surface as a sphere 
    // of radius given by WGS84 
    var lat = Deg2rad(point.Latitude); 
    var lon = Deg2rad(point.Longitude); 
    var halfSide = 1000 * halfSideInKm; 

    // Radius of Earth at given latitude 
    var radius = WGS84EarthRadius(lat); 
    // Radius of the parallel at given latitude 
    var pradius = radius * Math.Cos(lat); 

    var latMin = lat - halfSide/radius; 
    var latMax = lat + halfSide/radius; 
    var lonMin = lon - halfSide/pradius; 
    var lonMax = lon + halfSide/pradius; 

    return new BoundingBox { 
     MinPoint = new MapPoint { Latitude = Rad2deg(latMin), Longitude = Rad2deg(lonMin) }, 
     MaxPoint = new MapPoint { Latitude = Rad2deg(latMax), Longitude = Rad2deg(lonMax) } 
    };    
} 

// degrees to radians 
private static double Deg2rad(double degrees) 
{ 
    return Math.PI * degrees/180.0; 
} 

// radians to degrees 
private static double Rad2deg(double radians) 
{ 
    return 180.0 * radians/Math.PI; 
} 

// Earth radius at a given latitude, according to the WGS-84 ellipsoid [m] 
private static double WGS84EarthRadius(double lat) 
{ 
    // http://en.wikipedia.org/wiki/Earth_radius 
    var An = WGS84_a * WGS84_a * Math.Cos(lat); 
    var Bn = WGS84_b * WGS84_b * Math.Sin(lat); 
    var Ad = WGS84_a * Math.Cos(lat); 
    var Bd = WGS84_b * Math.Sin(lat); 
    return Math.Sqrt((An*An + Bn*Bn)/(Ad*Ad + Bd*Bd)); 
} 
+0

여기에 halfSideInKm은 무엇입니까? –

+0

@DharmikBhandari : 원하는 바운딩 박스의 절반 길이입니다. –

+0

KM으로 거리를 흘려야합니까? –

-1

시작 위도, 경도 및 고도가있는 경우 공간에서 단일 점만 정의 했으므로 경계 상자가 없습니다. 모든 직사각형/경계 상자를 정의하려면 최소한 두 점이 필요합니다.

+0

그래, 그게 거리가 무엇입니까 ... 그 지점 주위에 반경이있는 점을 경계 상자로 생성하는 것입니다. – samiq

+0

'점까지 반경으로 거리가있는'정보가 없으면 제가 지적한 것처럼 질문이 의미가 없습니다. 지리적 지점을 사용할 때의 거리는 일반적으로 고도 (지면으로부터의 거리)를 나타냅니다. 당신이 가지고있는 것이 모두 위도와 경도 그리고 고도가 아니라면 어떻게 그 상자를 계산하여 그것을 적합하게 할 수 있습니까? – Fraser

4

나는 2 년 된 질문을 부활 시키지만, 누군가가 Google에서 여기 도착하면, 정확히 이것과 조금 더 많은 것을하는 C# 클래스 라이브러리를 작성했습니다. 나는 코드를 호스트하기 위해 Github repository을 만들었고, 곧 그것을 다루는 블로그 포스트를 쓸 것이다.

Geolocation repository

+1

감사합니다. Scott이 코드를 매우 유용하게 사용했습니다. –

+0

지오 코딩뿐만 아니라 전체 Google Maps API (https://github.com/maximnovak/google-maps)를 포함하는 다른 프로젝트도 확인하고 싶을 것입니다. 포크 가치가있을 수도 있습니다 – Pete

+0

사실이 레포는 Google API를 전혀 활용하지 않습니다. 거리, 방향, 경계 상자 등을 결정하기 위해 단순히 수식을 사용합니다. 그러나 지오 코딩 위치를 처리하는 관련 지오 코딩 API (Github에도 있음)가 있습니다. 내가 언급 한 레포를 조사해 보겠다. 흥미 롭다. 감사! – Scott

관련 문제