2013-09-30 3 views
5

를 사용하는 방법 네임 스페이스 System.Spatial 내가 필요 정확히 것 같다,하지만 난 그것을 사용하는 방법을 알아낼 수 없습니다나는 점 A와 점 B 사이의 거리를 계산하는 함수를 필요 System.Spatial.GeographyPoint

.

IPoint은 모두 인 LatitudeLongitude을 제공하는 인터페이스입니다.

첫 번째 시도 :

public static double CalculateDistance(IPoint pointA, IPoint pointB) 
    { 
    var gp1 = GeographyPoint.Create(pointA.Latitude, pointA.Longitude); 
    var gp2 = GeographyPoint.Create(pointB.Latitude, pointB.Longitude); 

    return gp1.Distance(gp2) ?? 0; 
    } 

point1.Distance(point2)NotImplementedException로 끝납니다. 메시지는 프랑스어이지만 기본적으로 "등록 된 작업 없음. SpatialImplementation.CurrentImplementation.Operations 속성을 사용하여 작업을 제공하십시오."

좋아, 다음이 시도됩니다

public static double CalculateDistance(IPoint pointA, IPoint pointB) 
{ 
    var gp1 = GeographyPoint.Create(pointA.Latitude, pointA.Longitude); 
    var gp2 = GeographyPoint.Create(pointB.Latitude, pointB.Longitude); 

    return SpatialImplementation.CurrentImplementation.Operations.Distance(gp1, gp2); 
} 

가 지금은 SpatialImplementation.CurrentImplementation.OperationsNullReferenceException을 얻었다.

Msdn에 대한 자세한 내용은 많지 않습니다.

누구든지 이러한 구현 방법을 설명 할 수 있습니까?

+0

어떻게 그 메소드를 호출하고 클래스와 함께'IPoint' 인터페이스를 구현 했습니까? – Habib

+0

물론 구현했습니다. 위도와 경도를 제공합니다. 오류는 제가 말한 것과 정확히 같습니다. 나는 지금 이것을 단위 테스트에서 호출하고있다. – Johnny5

답변

4

IMHO System.Spatial을 사용하지 마십시오. Spatial과의 OData 상호 운용성, 즉 WCF Data-Services 용으로 제작 된 절반짜리 라이브러리입니다.

자세한 내용은 here을 확인하십시오. 또한 해당 라이브러리의 대부분의 클래스는 추상 클래스이므로 대부분의 구현을위한 최신 기능을 제공합니다.

더 나아가 Entity Framework 공간 지원과 호환되지 않습니다.

나는 당신에있어 어떤 종류의 프로젝트 모르겠지만 나는이 가이드 라인을 제안 : 당신이 단지 바로 Haversine Formula 또는 Vincenty's Formula에서의 구현을 복사 점 사이의 거리를 계산해야하는 경우

  • 을 기음#.

  • DB에서 공간이 필요한 경우 Entity Framework 5/6과 함께 사용하십시오.

  • C#에서 추가 공간 작업이 필요한 경우 NetTopologySuite와 같은 것을 사용하십시오. 그것을위한 NuGet가 있으며 사용하기가 정말 쉽습니다.

+1

최소한 DB 지원은 필요 없습니다. 모든 caculation은 메모리 내에서 이루어집니다. 난이 대답에서 알고리즘을 사용하고 올바른 결과를 줄 것으로 보인다 : http://stackoverflow.com/a/6545031/607162. 즉, 나는 .net 제공 알고리즘을 선호했다. – Johnny5

+1

데이터베이스를 사용하지 않고도 Sql Server 2008/2012 형식 라이브러리에 포함되어있는 SqlGeography/SqlGeometry 형식을 참조 할 수 있습니다. 그들은 C#에서 완벽하게 작동합니다. – psousa

+0

"그 라이브러리에있는 대부분의 클래스는 추상적이어서 대부분의 것을 구현할 수 있습니다."- 음, 사실이 아닙니다.인스턴스를 생성하는 것은 약간의 고통입니다 (그리고 문서는 빠름). 포인트 이외에는'GeographyPipeline' 또는'GeometryPipeline'을 사용하여 빌더를 얻으려면 SpatialBuilder.Create()를 수행해야합니다. – mheyman