ArcGIS คำนวณระยะห่างระหว่างจุดสองจุดด้วยการฉายภาพที่ไม่เท่ากันได้อย่างไร


10

นี่เป็นคำถามที่ตามมากับคำถามก่อนหน้าของฉันคุณช่วยแนะนำข้อความเบื้องต้นเกี่ยวกับการคาดคะเนระบบพิกัดได้ไหม?


สมมติว่าฉันทำงานกับเครื่องฉายแผนที่ CH1903 ซึ่งสำหรับทั้งหมดที่ฉันรู้นั้นเป็นไปในทิศทางเดียวกัน แต่ไม่เท่ากัน ความหมายมุม (รูปร่าง) ได้รับการอนุรักษ์ แต่ไม่ใช่พื้นที่ระยะทางหรือมาตราส่วน (อย่างน้อยสิ่งเหล่านี้ยังไม่ได้รับการรักษาอย่างแน่นอน ) จนถึงตอนนี้ดีมาก

ฉันสงสัยว่าการคำนวณแบบใดที่ ArcGIS ดำเนินการเมื่อฉันต้องการคำนวณระยะทางระหว่างจุดสองจุด ใน ArcObjects ฉันสามารถใช้IProximityOperatorอินเตอร์เฟสดังต่อไปนี้:

IPoint a = ...,
       b = ...;

double distance = ((IProximityOperator)a).ReturnDistance(b);

คำถาม:เมื่อฉันทำงานกับระบบอ้างอิงที่ไม่รักษาระยะทางอย่างแม่นยำ ArcGIS จะทำอย่างไรเมื่อฉันค้นหาระยะห่างระหว่างจุดสองจุด (ดังที่แสดงด้านบน)

  • มันแค่ทำคณิตศาสตร์พีทาโกรัส (a 2 + b 2 = c 2 ) เพื่อให้ได้ระยะทางซึ่งหมายความว่าระยะทางที่คืนมาจะมีความแม่นยำเท่ากับที่ฉายอนุญาตหรือไม่

  • หรือว่าจะทำอะไรที่ซับซ้อนกว่านี้เช่นการฉายภาพในบางรูปแบบเพื่อให้ได้ระยะทางที่แม่นยำยิ่งขึ้น?

( คำถามเดียวกัน แต่โดยทั่วไปแล้ว:เมื่อมีการประมาณการรูปทรงเรขาคณิตแล้ว ArcGIS จะทำการคำนวณทั้งหมดในอวกาศแบบยุคลิดหรือไม่หรือการฉายแผนที่ที่ใช้ยังคงมีผลต่อการคำนวณระยะทางมุมพื้นที่ ฯลฯ )


2
โปรดสร้างคำถามใหม่แทนที่จะแก้ไขต้นฉบับของคุณ มิฉะนั้นคุณจะล้มล้างกลไกทั้งหมดในเว็บไซต์นี้: การให้คะแนนหมายถึงอะไรเมื่อมีคำถามสองข้อขึ้นไปที่เล่นในกระทู้เดียว การทำเครื่องหมายคำตอบเดียวว่าถูกต้องหมายความว่าอย่างไร อื่น ๆ
whuber

1
@whuber:แม้ว่าทั้งหมดที่เขียนไว้ในกระทู้นี้ยังคงอยู่ในหัวข้อ WRT ของคำถามเดิมที่ถาม แต่ฉันยอมรับว่าตอนนี้มีสองคำถามที่ถามจริงที่นี่ มันสายเกินไปที่จะเปลี่ยนแปลงในตอนนี้ แต่จะเก็บคำแนะนำไว้ในใจในครั้งต่อไป
stakx

คำตอบ:


10

หากคุณต้องการวิธีการที่มั่นคงของการคำนวณระยะทางเนื้อที่ผมขอแนะนำเสื้อคลุมคาร์ไมเคิลริชชี่สำหรับเครื่องยนต์ฉาย 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 ด้านบน


เหตุผลของความคลาดเคลื่อนน่าจะเป็นเพราะส่วนของเส้นตรง (ใน PCS) ที่เชื่อมต่อจุดนั้นไม่ใช่ geodesic ที่คาดการณ์ไว้ซึ่งจะเป็นเส้นโค้งเมื่อคาดการณ์ ดังนั้นคุณจะได้รับค่าน้อยกว่าที่ควร การทดสอบทฤษฎีนี้เป็นเรื่องง่ายที่จะทำ: ใช้ geodesic อย่างง่าย (เช่นเส้นศูนย์สูตร) ​​และเปรียบเทียบการคำนวณระยะทางสองจุดระหว่างจุดสองจุดที่แยกจากกันอย่างกว้างขวางบนพื้นผิว หนึ่งคือการคำนวณโดยตรงเช่นเดียวกับในรหัสของคุณ อีกอันหนึ่งแบ่งเนื้อที่ทางภูมิศาสตร์ออกเป็นเซ็กเมนต์คำนวณความยาวของเซกเมนต์โดยตรงและเพิ่มขึ้น หลังควรมีความแม่นยำมากขึ้น
whuber

9

ใน ArcGIS 10 ให้ตรวจสอบ IGeometryServer2 ซึ่งขณะนี้มี GetDistanceGeodesic (ระยะทางมาตรวิทยาระหว่างสอง geometries), GetLengthsGeodesic (คืนค่าความยาว geodesic ของแต่ละ polyline) และ DensifyGeodesic (สร้างความหนาแน่นของรูปหลายเหลี่ยม : วิธี GeodesicDensify)

ดังที่กล่าวไว้ในคำตอบอื่น ๆ ArcGIS ยังคงใช้การคำนวณภาพถ่ายส่วนใหญ่

Melita Kennedy


ความเห็นบางส่วนเกี่ยวกับคำตอบอื่น ๆ (ตัวแทนไม่เพียงพอที่จะแสดงความคิดเห็นโดยตรง!)

การฉายภาพระยะทางเท่ากันของ Azimuthal ของ Esri รองรับรูปวงรี รหัส GreatCircleDist กำลังสร้างพีซีที่ใช้ GCS ทรงรี / ทรงกลมดังนั้นระยะทางจากจุดศูนย์กลาง / จุดกำเนิดจะเป็นระยะทางมาตรวิทยาไม่ใช่ระยะทางวงกลมที่ยิ่งใหญ่ มันอาจจะง่ายขึ้น เรารู้ coords ที่ฉายของจุดแรกเพราะมันเป็นศูนย์กลางของการฉาย: 0,0 ดังนั้นจุดที่ 2 เท่านั้นที่ต้องถูกฉาย สามารถใช้ฟังก์ชัน EuclidianDistance ที่เรียบง่ายได้

ฉันตรวจสอบผลลัพธ์กับฟังก์ชันทางธรณีวิทยาของ pe.dll และจับคู่ ดูเหมือนว่าแอปของ Richie กำลังใช้ทรงกลมดังนั้นมันจึงกลับมาเป็นระยะทาง / พิกัดของวงกลมที่ยิ่งใหญ่ในแอปพลิเคชันทดสอบ นั่นเป็นเหตุผลที่ผลลัพธ์ไม่ตรงกัน ฉันไม่รู้จักค่ารัศมี ฉันคิดว่าฉันต้องพูดคุยกับเขาเกี่ยวกับเรื่องนี้!


2
Melita - ดีใจที่ได้พบคุณที่นี่!
Kirk Kuykendall

1
ฉันเห็นด้วยยินดีต้อนรับบนเรือ!
matt wilkie

8

ความถูกต้องของคำตอบใด ๆ เกี่ยวกับ ArcGIS อาจเปลี่ยนแปลงได้ตลอดเวลา - สำหรับทุกสิ่งที่เรารู้ขั้นตอนใหม่จะถูกนำเสนอในเซอร์วิสแพ็คถัดไปโดยไม่มีคำเตือนหรือเอกสารประกอบ ที่ถูกกล่าวว่าซอฟต์แวร์ ESRI ใช้เวลานานในการคำนวณแบบยุคลิด ( เช่นสูตร Pythagorean สำหรับระยะทาง) เป็นเวลานานเมื่อใดก็ตามที่ใช้พิกัดที่คาดการณ์ไว้ บ่อยครั้งในการคำนวณเช่นเดียวกับที่คุณแสดงซอฟต์แวร์ไม่สามารถเข้าถึงข้อมูลการฉายภาพได้ดังนั้นจะทำอะไรได้อีกบ้าง

คำถามของคุณดูเหมือนว่าจะแนะนำว่าการคำนวณระยะทางแบบยุคลิดสำหรับการฉายภาพระยะเท่ากันนั้นถูกต้อง ไม่มีอะไรจะเพิ่มเติมจากความจริง สำหรับการฉายภาพระยะห่างเท่ากันหนึ่งจุดระยะทางแบบยุคลิดไปยังจุดฐานจะรับประกันว่าเท่ากับระยะทางมาตรวิทยา สำหรับการฉายภาพระยะยาวเท่ากันสองจุดระยะทางแบบยุคลิดไปยังจุดฐานทั้งสองจะรับประกันว่าจะเท่ากับระยะทางมาตรวิทยา ในทางกลับกันสำหรับการค้ำประกันเหล่านั้นความผิดเพี้ยนของตัวชี้วัดระหว่างคู่คะแนนอื่น ๆ โดยทั่วไปจะเพิ่มขึ้นอย่างมากเมื่อเทียบกับการคาดการณ์อื่น ๆ


@whuber:ขอบคุณสำหรับการตอบ เกี่ยวกับการย่อหน้าแรก:ผมคิด ArcGIS อาจเห็นว่าการฉายแผนที่ CH1903 (ซึ่งใช้ Bessel 1841 ทรงรี) ถูกนำมาใช้และจากนั้นโครงการจุดกลับเข้าสู่รีที่ผ่านตัวเลขและจากนั้นจะคำนวณระยะทางบนทรงรี จากคำตอบของคุณฉันคิดว่า ArcGIS จะไม่ทำสิ่งนั้นทั้งหมดและจะยังคงอยู่ในอวกาศยูคลิดแดน XY เพื่อทำการคำนวณ (แล้วซอฟต์แวร์ GIS อื่น ๆ ล่ะ) - ย่อหน้าที่ 2:คุณพูดถูกต้องขอบคุณที่ชี้แจงประเด็นนี้
stakx

กลไกการคัดลอกที่ซ่อนอยู่เป็นไปได้เฉพาะในกรณีที่วัตถุจุดรักษาการอ้างอิงถึงการฉาย ฉันไม่เชื่อว่าพวกเขาทำ
whuber

@whuber:มันจะเพียงพอหรือไม่ (สำหรับการคำนวณที่แม่นยำยิ่งขึ้น) ที่จะรู้ว่าทรงรีที่ใช้สำหรับการฉายภาพ? AFAIK, ArcGIS เก็บการอ้างอิงถึงการฉายภาพที่ใช้กับคลาสแต่ละฟีเจอร์ (ชั้นข้อมูล)
stakx

1
จริง ๆ แล้ว IPoint ซึ่งมาจาก IGeometry มี SpatialReference เป็นคุณสมบัติ help.arcgis.com/th/sdk/10.0/arcobjects_net/componenthelp/ ......อย่างไรก็ตามฉันไม่คิดว่า ReturnDistance ใช้งานได้ อาจเป็นการทดสอบที่คุ้มค่าเพื่อดูว่ามีการเปลี่ยนแปลงหรือไม่
Kirk Kuykendall

1
@stakx ฉันได้อัปเดตคำตอบของฉันเพื่อรวมรหัสที่แสดงว่าการตั้งค่า spatialref ไม่มีผลกระทบต่อ ReturnDistance
Kirk Kuykendall
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.