आर्कजीआईएस गैर-समकालिक प्रक्षेपण के साथ दो बिंदुओं के बीच की दूरी की गणना कैसे करता है?


10

यह मेरे पिछले एक सवाल है, क्या आप समन्वय प्रणाली अनुमानों के बारे में कुछ अच्छी तरह से लिखे गए परिचयात्मक ग्रंथों का सुझाव दे सकते हैं?


चलो मान लें कि मैं CH1903 मानचित्र प्रक्षेपण के साथ काम कर रहा हूं, जो कि मुझे पता है कि सभी अनुरूप हैं, लेकिन समान नहीं हैं। मतलब, कोणों (आकार) को संरक्षित किया गया है, लेकिन क्षेत्रों, दूरी या पैमाने पर नहीं। (कम से कम इन्हें बिल्कुल संरक्षित नहीं किया गया है )। अब तक सब ठीक है।

मैं सोच रहा हूं कि जब मैं अब दो बिंदुओं के बीच की दूरी की गणना करना चाहता हूं तो आर्कजीआईएस किस प्रकार की गणना करता है। ArcObjects में, मैं IProximityOperatorइंटरफ़ेस का उपयोग इस प्रकार कर सकता हूं :

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

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

प्रश्न: जब मैं एक संदर्भ प्रणाली के साथ काम कर रहा हूं, जो दूरियों को सटीक रूप से संरक्षित नहीं करती है, तो दो बिंदुओं (जैसा कि ऊपर दिखाया गया है) के बीच की दूरी के लिए क्वेरी करते समय ArcGIS क्या करेगा?

  • क्या यह बस दूरी पाने के लिए कुछ पाइथोगोरियन गणित ( 2 + b 2 = c 2 ) करता है, जिसका अर्थ है कि लौटी दूरी केवल उतनी ही सटीक होगी जितनी प्रक्षेपण की अनुमति है?

  • या यह अधिक जटिल कुछ करेगा, जैसे कि अधिक सटीक दूरी प्राप्त करने के लिए पुन: प्रक्षेपण के कुछ रूप?

( एक ही सवाल है, लेकिन आम तौर पर: एक बार जब ज्यामितीय का अनुमान लगाया गया है, तो क्या आर्कगिस यूक्लिडियन अंतरिक्ष में सभी गणना करता है, या इस्तेमाल किया गया मानचित्र प्रक्षेपण अभी भी दूरी, कोण, क्षेत्र, आदि की गणना को प्रभावित करता है?)


2
कृपया अपने मूल को संशोधित करने के बजाय एक नया प्रश्न बनाएं। अन्यथा, आप इस साइट के सभी तंत्रों को हटा देते हैं: जब दो या दो से अधिक प्रश्न एक ही धागे में होते हैं, तो रेटिंग का क्या मतलब है? एक उत्तर को सही मानने का क्या मतलब होगा? आदि
whuber

1
@ वाउचर: हालाँकि यह सब इस धागे में लिखा गया है, फिर भी मूल प्रश्न पूछे गए विषय पर WRT है, मैं मानता हूँ कि यहाँ अब वास्तव में दो प्रश्न पूछे गए हैं। अब इसे बदलने में बहुत देर हो चुकी है, लेकिन अगली बार आपकी सलाह को ध्यान में रखेंगे।
21

जवाबों:


10

यदि आप जियोडेसिक दूरियों की गणना का एक स्थिर तरीका चाहते हैं, तो मैं ईएसआरआई के प्रोजेक्शन इंजन के लिए रिची कारमाइकल के रैपर की सलाह देता हूं ।

अपडेट: मैंने विस्टा 64 पर आरकेजीआईएस 10.0 के साथ रिची के कोड की कोशिश की और कॉल करने के बाद अपवाद प्राप्त किया LoadLibrary। मैं बाद में उस पर गौर करूंगा।

अभी के लिए, हालांकि, दूसरे उत्तर की टिप्पणियों में प्रश्नों के जवाब में कुछ कोड दिया गया है।

कोड स्थानिक संदर्भों के साथ और बिना बिंदुओं के लिए IPro निकटता की तुलना करता है। फिर यह दर्शाता है कि महान वृत्त दूरी को खोजने के लिए अज़ीमुथल समतुल्य प्रक्षेपण (पहले बिंदु पर स्पर्शरेखा के बिंदु के साथ) का उपयोग कैसे करें।

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) के खिलाफ परीक्षण करना दिलचस्प होगा। यदि मुझे कभी रिची कोड काम करने के लिए मिलता है तो परिणाम पोस्ट करेंगे।

अपडेट: एक बार जब मैंने x86 के संकलन के लिए रिचीज़ कोड को बदल दिया, तो मुझे इसे चलाने के लिए मिला। दिलचस्प ... यह मेरे द्वारा दी जाने वाली महान सर्कल दूरी 1960273.80162999 है - जो कि एज़िमुथल इक्विडिस्टेंट विधि से ऊपर से लौटा है।


विसंगति का कारण होने की संभावना है क्योंकि बिंदुओं को जोड़ने वाला लाइन सेगमेंट (पीसीएस में) एक अनुमानित जियोडेसिक नहीं है, जिसे प्रोजेक्ट किए जाने पर वक्रता होगी। तदनुसार आपको जितना चाहिए उससे कम मूल्य मिलता है। इस सिद्धांत का एक परीक्षण सरल है: एक साधारण जियोडेसिक (जैसे भूमध्य रेखा) लें और जियोडेसिक पर दो व्यापक रूप से अलग-अलग बिंदुओं के बीच की दूरी की दो गणना करें। एक प्रत्यक्ष गणना है, जैसा कि आपके कोड में है; अन्य भू-खंडों को खंडों में तोड़ता है, सीधे खंड की लंबाई की गणना करता है, और उन्हें जोड़ता है। उत्तरार्द्ध अधिक सटीक होना चाहिए।
whuber

9

ArcGIS 10 में, IGeometryServer2 देखें, जिसमें अब GetDistanceGeodesic (दो ज्यामितीयों के बीच की जियोडेसिक दूरी) है, GetLengthsGeodesic (प्रत्येक पॉलीलाइन की जियोडेसिक लंबाई लौटाएं), और DensifyGeodesic (जियोडेसिक लाइनों को पॉलीटिक्स रेखाओं से घेरते हुए जियोडेसिक रेखाओं के साथ बिंदुओं को जोड़ते हुए) : GeodesicDensify) विधियाँ।

जैसा कि अन्य उत्तरों में उल्लेख किया गया है, आर्कजीआईएस अभी भी ज्यादातर प्लानर गणनाओं का उपयोग करता है।

मेलिटा कैनेडी


अन्य उत्तरों पर कुछ टिप्पणी (सीधे टिप्पणी करने के लिए अभी तक पर्याप्त प्रतिनिधि नहीं!)।

एस्री का एज़िमुथल इक्विडिस्टेंट प्रोजेक्शन दीर्घवृत्त का समर्थन करता है। GreatCircleDist कोड एक PCS बना रहा है जो एक दीर्घवृत्त / गोलाकार-आधारित GCS का उपयोग करता है, इस प्रकार केंद्र / मूल बिंदु से दूरी जियोडेसिक दूरी होगी, महान वृत्त दूरी नहीं। इसका सरलीकरण भी किया जा सकता था। हम पहले बिंदु के अनुमानित कोर्ड्स को जानते हैं क्योंकि यह प्रक्षेपण का केंद्र है: 0,0। इसलिए केवल 2 अंक को प्रोजेक्ट करने की आवश्यकता है। एक सरल यूक्लिडियनडिस्टेंस फ़ंक्शन का उपयोग किया जा सकता है।

मैंने pe.dll के जियोडेसिक कार्यों के खिलाफ परिणामों की जाँच की और यह मेल खाता है। ऐसा लगता है कि रिची का ऐप एक गोले का उपयोग कर रहा है, इसलिए यह अपने परीक्षण एप्लिकेशन में महान सर्कल की दूरी / निर्देशांक लौटा रहा है। यही कारण है कि परिणाम मेल नहीं खाते। मैंने त्रिज्या मूल्यों को नहीं पहचाना; मुझे लगता है कि मुझे इसके बारे में उससे बात करने की ज़रूरत है!


2
मेलिता - आपको यहाँ देखकर बहुत अच्छा लगा!
किर्क कुएकेन्डल

1
मैं सहमत हूँ, नाव पर आपका स्वागत है!
मैट विल्की

8

आर्कजीआईएस के बारे में किसी भी उत्तर की सटीकता किसी भी समय परिवर्तन के अधीन है - हम सभी जानते हैं, नई प्रक्रियाओं को चेतावनी या प्रलेखन के बिना बहुत अगले सर्विस पैक में पेश किया जाएगा। कहा जा रहा है, जब भी अनुमानित निर्देशांक का उपयोग किया जाता है , तो ESRI सॉफ्टवेयर में लंबे समय तक यूक्लिडियन गणना ( जैसे , दूरी के लिए पायथागॉरियन सूत्र) का उपयोग किया जाता है। अक्सर, आप जो वर्णन करते हैं, जैसे गणनाओं में, सॉफ्टवेयर के पास प्रक्षेपण जानकारी तक पहुंच नहीं होती है, इसलिए और क्या किया जा सकता है?

आपका प्रश्न स्वयं यह सुझाव देता प्रतीत होता है कि एक समकालिक प्रक्षेपण के लिए यूक्लिडियन दूरी की गणना सही है। सच्चाई से आगे कुछ भी नहीं हो सकता है। एक-बिंदु समकालिक प्रक्षेपण के लिए, बेस बिंदु के लिए यूक्लिडियन दूरी को जियोडेसिक दूरी के बराबर करने की गारंटी है; दो-बिंदु समकालिक प्रक्षेपण के लिए, यूक्लिडियन दूरी या तो आधार बिंदु के लिए, जियोडेसिक दूरी के बराबर होने की गारंटी है। उन गारंटियों के बदले में, अन्य अनुमानों के मुकाबले मीट्रिक विकृति आम तौर पर अन्य अनुमानों की तुलना में बहुत बढ़ जाती है, जिसे कोई भी चुन सकता है।


@ उत्तर : जवाब देने के लिए धन्यवाद। पहले पैराग्राफ के संबंध में : मुझे लगा कि आर्कगिस देख सकता है कि CH1903 मानचित्र प्रक्षेपण (जो बेसेल 1841 दीर्घवृत्त का उपयोग करता है) का उपयोग किया जाता है, और फिर उस दीर्घवृत्त पर डेटा के माध्यम से बिंदुओं को प्रोजेक्ट करें, और फिर दीर्घवृत्त पर दूरी की गणना करें। आपके उत्तर से मुझे लगता है कि आर्कगिस वह सब नहीं करेगा और गणना करने के लिए यूक्लिडियन XY स्थान में रहेगा। (अन्य जीआईएस सॉफ्टवेयर के बारे में कैसे?) - दूसरा पैराग्राफ: आप निश्चित रूप से सही हैं, इस बिंदु को स्पष्ट करने के लिए धन्यवाद।
stakx

एक छिपी हुई अस्वीकृति तंत्र केवल तभी संभव है जब बिंदु ऑब्जेक्ट एक प्रक्षेपण के संदर्भ को बनाए रखें। मुझे विश्वास नहीं होता कि वे करते हैं।
whuber

@whuber: क्या यह प्रक्षेपण के लिए इस्तेमाल किए जाने वाले दीर्घवृत्त को जानने के लिए पर्याप्त (अधिक सटीक गणना के लिए) होगा? AFAIK, ArcGIS प्रत्येक सुविधा वर्ग (डेटा लेयर) के साथ उपयोग किए गए प्रक्षेपण के लिए एक संदर्भ संग्रहीत करता है।
स्टैकएक्स

1
दरअसल IPoint, जो IGeometry से निकला है, के पास एक संपत्ति के रूप में SpatialReference है। help.arcgis.com/en/sdk/10.0/arcobjects_net/componenthelp/… हालाँकि, मुझे नहीं लगता कि ReturnDistance इसका उपयोग करता है। यह देखने के लिए परीक्षण योग्य हो सकता है कि क्या यह हालांकि बदला गया है।
कर्क कुक्केंडल

1
@stakx मैंने कोड शामिल करने के लिए अपने उत्तर को अपडेट कर दिया है जो दिखाता है कि स्पैटियलएफ़ सेट करने का रिटर्नडिस्टेंस पर कोई प्रभाव नहीं पड़ता है।
कर्क कुक्केंडल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.