측지 거리를 안정적으로 계산하는 방법을 원한다면 ESRI의 Projection Engine에 Richie Carmichael의 래퍼를 사용하는 것이 좋습니다 .
업데이트 : Vista64에서 ArcGIS 10.0으로 Richie의 코드를 시험해 보았고을 호출 한 후 예외가 발생했습니다 LoadLibrary
. 나중에 자세히 살펴 보겠습니다.
그러나 지금은 다른 답변의 의견에 대한 질문에 대한 답변이있는 코드가 있습니다.
이 코드는 공간 참조가 있거나없는 점에 대한 IProximityOperator를 비교합니다. 그런 다음 방위각 등거리 투영법 (첫 번째 점이 접선의 점임)을 사용하여 큰 원 거리를 찾는 방법을 보여줍니다.
private void Test()
{
IPoint p1 = new PointClass();
p1.PutCoords(-98.0, 28.0);
IPoint p2 = new PointClass();
p2.PutCoords(-78.0, 28.0);
Debug.Print("Euclidian Distance {0}", EuclidianDistance(p1, p2));
Debug.Print("Distance with no spatialref {0}", GetDistance(p1, p2));
ISpatialReferenceFactory srf = new SpatialReferenceEnvironmentClass();
IGeographicCoordinateSystem gcs =
srf.CreateGeographicCoordinateSystem((int)esriSRGeoCSType.esriSRGeoCS_WGS1984);
p1.SpatialReference = gcs;
p2.SpatialReference = gcs;
Debug.Print("Distance with spatialref {0}", GetDistance(p1, p2));
Debug.Print("Great Circle Distance {0}", GreatCircleDist(p1, p2));
}
private double GetDistance(IPoint p1, IPoint p2)
{
return ((IProximityOperator)p1).ReturnDistance(p2);
}
private double EuclidianDistance(IPoint p1, IPoint p2)
{
return Math.Sqrt(Math.Pow((p2.X - p1.X),2.0) + Math.Pow((p2.Y - p1.Y), 2.0));
}
private double GreatCircleDist(IPoint p1, IPoint p2)
{
ISpatialReferenceFactory srf = new SpatialReferenceEnvironmentClass();
IProjectedCoordinateSystem pcs =
srf.CreateProjectedCoordinateSystem((int)esriSRProjCSType.esriSRProjCS_WGS1984N_PoleAziEqui);
pcs.set_CentralMeridian(true, p1.X);
((IProjectedCoordinateSystem2)pcs).LatitudeOfOrigin = p1.Y;
p1.SpatialReference = pcs.GeographicCoordinateSystem;
p1.Project(pcs);
p2.SpatialReference = pcs.GeographicCoordinateSystem;
p2.Project(pcs);
return EuclidianDistance(p1, p2);
}
출력은 다음과 같습니다.
Euclidian Distance 20
Distance with no spatialref 20
Distance with spatialref 20
Great Circle Distance 1965015.61318737
프로젝션 엔진 dll (pe.dll)에 대해 이것을 테스트하는 것이 흥미로울 것이라고 생각합니다. Richie의 코드가 작동하면 결과를 게시합니다.
업데이트 :
x86 용 컴파일을 위해 Richies 코드를 변경하면 실행되었습니다. 흥미롭게도 ... 그것이주는 원 거리는 1960273.80162999입니다-위의 방위 등거리 방법에서 반환 된 것과 큰 차이가 있습니다.