หากคุณต้องการวิธีการที่มั่นคงของการคำนวณระยะทางเนื้อที่ผมขอแนะนำเสื้อคลุมคาร์ไมเคิลริชชี่สำหรับเครื่องยนต์ฉาย ESRI ของ
ปรับปรุง:ฉันพยายามรหัสของริชชี่กับ ArcGIS 10.0 ใน Vista64 LoadLibrary
และได้รับการยกเว้นหลังจากเรียก ฉันจะดูในภายหลังว่า
ถึงตอนนี้นี่คือรหัสบางส่วนในการตอบคำถามในความคิดเห็นของคำตอบอื่น
รหัสเปรียบเทียบ IProximityOperator สำหรับจุดที่มีและไม่มีการอ้างอิงเชิงพื้นที่ จากนั้นจะแสดงวิธีใช้การฉายภาพระยะทางเท่ากันของ azimuthal (โดยมีจุดแรกเป็นจุดสัมผัส) เพื่อค้นหาระยะห่างของวงกลมที่ยิ่งใหญ่
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 - ความแตกต่างอย่างมีนัยสำคัญจากที่ได้จากวิธีระยะทางเท่ากันของ Azimuthal ด้านบน