如果您想要一种稳定的测地距离计算方法,我推荐Richie Carmichael的ESRI投影引擎包装器。
更新:我刚刚在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的代码,它将发布结果。
更新:
将Richies代码更改为针对x86进行编译后,就可以运行它。有趣的是...它给我的大圆弧距离是1960273.80162999-与上面的方位等距方法返回的明显不同。