वेब मर्केटर प्रोजेक्शन में बेहतर दूरी माप


10

मैं एक ESRI स्टैक के साथ काम कर रहा हूं, मेरी परतों को एक sql-spatial-enable-SDE- geodatabase (जियोमेट्री टाइप, वेब मर्केटर -3857) में स्टोर कर रहा हूं।

मैं एक वेब मैपिंग एप्लिकेशन का निर्माण कर रहा हूं, इसलिए डिफ़ॉल्ट रूप से, टाइलें वेब मर्चेंट, 3857 में भी हैं।

स्टोर किए गए प्रोक्स, मैं उपयोगकर्ता के स्थान से दूरी के लिए STDistance का उपयोग करता हूं (विभिन्न दिशाओं में निर्देशांक भी वेब व्यापारी में)।

समस्या यह है कि वेब व्यापारी की विकृति के कारण, मेरी दूरी के कैल्सेज़ तेजी से बढ़ रहे हैं, आगे भूमध्य रेखा से वे बने हैं।

मैंने अपनी परतों को sql-spatial-geography (ज्योमेट्री के बजाय) टाइप करने के बारे में सोचा है, लेकिन:

  • मुझे लगता है कि मेरी दूरी के प्रश्नों में अधिक समय लगेगा (गोलाकार सतह पर दूरी बछड़े)
  • मुझे बहुत सारे डेटा को पुनः प्राप्त करने की आवश्यकता होगी
  • आर्कगिस सेवाएं उतनी तेज नहीं होंगी जितनी उन्हें उड़ान भरने की जरूरत होगी

यदि मैं Google मानचित्र पर जाता हूं, और एक दूरी की कैल्क करता हूं, तो लौटी हुई दूरी नॉर्टन / दक्षिणी क्षेत्रों में भी अधिक सटीक है, इसलिए मुझे लगता है कि वेब व्यापारी प्रक्षेपण के कारण हुई विकृति के लिए Google को सही होना चाहिए।

मेरा प्रश्न तब है: क्या "सही" दूरी पाने के लिए वेब मर्चेंट प्रोजेक्शन में की गई दूरी के बछड़ों पर लागू होने वाला एक साधारण कारक मूल्य है?

जवाबों:


12

छोटी दूरी के लिए, आप गणना की गई दूरी को गुणा कर सकते हैं cos(lat), क्योंकि व्यापारी प्रक्षेपण का पैमाना अक्षांश (सेकंड के सेकंड 1/cos) के आनुपातिक है । इसके अलावा http://en.wikipedia.org/wiki/Mercator_projection#Mathematics_of_the_project देखें


परिशिष्ट @ jeremiah-england के लिए धन्यवाद : जबकि उपरोक्त सुधार सही होगा जब यह सही मर्केटर अनुमानों की बात आती है, वेब मर्केटर (EPSG: 3857) एक व्यापारी नहीं है। ईपीएसजी इसे "छद्म व्यापारी" कहता है। समस्या यह है कि यह WGS84, एक अण्डाकार मॉडल का उपयोग करता है, और इसे गोलाकार पारा गणना (जो Google उपयोग करता है क्योंकि वे तेज हैं) का उपयोग करके प्रोजेक्ट करते हैं। यदि आप 1/cos(phi)वेब मर्केटर के साथ अपनी दूरी को मापते हैं, तो आप भूमध्य रेखा पर लगभग 0.6% दूर होंगे। देखें वेब मर्केटर पर नोएल जिन की प्रस्तुति अधिक जानकारी के लिए।

उपर्युक्त प्रस्तुति के अनुसार, वेब व्यापारी निर्देशांक से अधिक सटीक दूरी की गणना करने के लिए निम्न विधि का उपयोग किया जा सकता है। दिया dx- क्षैतिज समन्वय अंतर (हम दिशा), और dy- ऊर्ध्वाधर समन्वय अंतर (एसएन दिशा):

e = 0.081819191
adjustedX = dx * cos(lat) / sqrt(1 - e^2 * sin(lat)^2)
adjustedY = dy * cos(lat) * (1 - e^2) / pow(1 - e^2 * sin(lat)^2, 3/2)
adjustedDistance = hypot(adjustedX, adjustedY)

इस समायोजन के बीच का अनुपात और cos(lat)एसएन दिशा में बड़ा है, 0.9933भूमध्य रेखा से लेकर 1.0034ध्रुवों तक। WE दिशा अनुपात 1भूमध्य रेखा से शुरू होता है और 1.0034ध्रुवों पर बढ़ता है ।

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


1
और लंबी दूरी के लिए, आप दो अंत बिंदुओं के मध्य अक्षांश का उपयोग कर सकते हैं: cos((l1 + l2)/2)जो आपको एक महान-सर्कल दूरी के बजाय तुकांत-पंक्ति / निरंतर पाठ्यक्रम की दूरी देगा।
MerseyViking

यह केवल गोलाकार को बदलता है, लेकिन स्थानीय प्रक्षेपण जैसी सटीकता नहीं देता है।
बाज़ीपुर

1
@falcibar - मैं नहीं देखता कि कैसे माध्य अक्षांश का चयन करने से गोलाकार बदल जाता है
mkadunc

@MerseyViking: धन्यवाद, यह उल्लेख करना भूल गया कि गणना के लिए उपयोग करने के लिए सबसे अच्छा अक्षांश दो तुलनात्मक बिंदुओं का मतलब होगा।
mkadunc

1
जवाब के लिए +1। @ जर्सी: माध्य अक्षांश सुधार कार्य क्यों करता है? आखिरकार, मर्केटर में विकृतियां मनमाने ढंग से बड़ी हो सकती हैं और जियोडेसिक्स से लॉक्सोड्रोम के प्रस्थान भी बड़े हो सकते हैं। ऐसा लगता है कि कुछ संभावित भारी त्रुटियां हैं, जिनके लिए एक सरल सुधार अविश्वसनीय हो सकता है।
whuber

6

GEOGRAPHYयदि आप वैश्विक डेटा पर सटीक परिणाम खोज रहे हैं तो मैं आपके डेटा को प्रारूप में संग्रहीत करने के दूसरे विकल्प पर विचार करूंगा ।

एक तालिका में दो स्थानिक क्षेत्र होने से आपको कुछ भी नहीं रोक रहा है - एक व्यापारी के रूप में एक GEOMETRYऔर एक प्रकार के WGS84 में एक GEOGRAPHYप्रकार के रूप में (कम से कम SQL सर्वर में नहीं, मैं आर्कएसडीई के बारे में निश्चित नहीं हूं)।

आपको एक सरल जियोप्रोसेसिंग स्क्रिप्ट बनाने में सक्षम होना चाहिए जो आपके मूल डेटा के साथ दोनों क्षेत्रों को आबाद करेगा। यदि संपादन और लगातार अद्यतन हो रहा है तो यह एक विकल्प नहीं हो सकता है।

एक बार जब आपके पास दो फ़ील्ड होते हैं, तो आप अपने मर्केटर का उपयोग तेज़ प्रदर्शन के लिए कर सकते हैं, और उपयोगकर्ता को दूरी के लिए लाट / लोन में प्रवेश किए गए बिंदुओं को परिवर्तित कर सकते हैं।

इसके दो प्रमुख लाभ हैं:

  • उपयोगकर्ता प्रश्नों के आधार पर आप अधिक सटीक क्षेत्र और सुविधाओं की लंबाई भी प्राप्त कर सकते हैं
  • आपको माप से संबंधित प्रत्येक क्वेरी के लिए कस्टम कोड जोड़ने के बारे में भूलने की चिंता करने की आवश्यकता नहीं है

क्वेरी गति अधिक जटिल होगी, लेकिन यह किसी उपयोगकर्ता के लिए ध्यान देने योग्य नहीं हो सकती है। किसी समाधान पर निर्णय लेने से पहले आप एक सुविधा वर्ग के साथ परीक्षण करना चाहते हैं। आपको Mercator (जो तुच्छ होना चाहिए, और ब्राउज़र में किया जा सकता है) से दर्ज किए गए उपयोगकर्ता को परिवर्तित करना होगा।

भूगोल प्रकार के साथ हालांकि अभी भी एक त्रुटि मार्जिन है:

भूगोल के तरीकों के लिए त्रुटि सहिष्णुता 1.0e-7 * extents जितनी बड़ी हो सकती है

से MSDN


दुर्भाग्य से SDE केवल एक स्थानिक कॉलम के लिए अनुमति देगा: help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//… - मैंने एसडीई के साथ एक दृश्य बनाने और इसे पंजीकृत करने की कोशिश नहीं की है, लेकिन ऐसा हो सकता है एक संभावित दृष्टिकोण हो।
एलन अदैर

@ आलन - जानकर अच्छा लगा। एसडीई का उपयोग करने के लिए फिर एक और सकारात्मक! के साथ सिर्फ 4326 ज्यामिति एक मेज और एक मूल तालिका पर वापस शामिल होने + स्थानिक दृश्य ही उद्देश्य को प्राप्त करना चाहिए
geographika

3

ESRI का एक वैकल्पिक सुझाव "जियोमेट्री सेवा" का उपयोग करना है, जिसमें ज्यामिति को एक आर्कगिस सर्वर पर भेजना और परिणाम वापस आना शामिल है। यदि आप वेब सेवा का उपयोग करके किसी भी अड़चन के मुद्दों की उम्मीद नहीं करते हैं, तो यह एक बहुत प्रभावी तरीका हो सकता है। मैंने सिल्वरलाइट एप्लिकेशन में उसी दृष्टिकोण का उपयोग किया है।

यहाँ ESRI से एक मूल ब्लॉग प्रविष्टि है: http://blogs.esri.com/Dev/blogs/arcgisserver/archive/2010/03/03//Measuring-distances-and-areas-when-your-map-use-the -Mercator-projection.aspx

ब्लॉग में एक सरलीकृत जावास्क्रिप्ट उदाहरण है, और यहाँ एक पूर्ण उदाहरण अनुप्रयोग भी है: http://serverapps.esri.com/javascript_examples/compare_measurements.htm


0

जैसा कि Google धरती करता है, आप ज्यामिति को स्थानीय WGS84 ज़ोन प्रक्षेपण, या दक्षिण अमेरिका में SIRGAS जैसे वर्धित WGS84 प्रक्षेपण में बदल सकते हैं।

आप लगभग सभी "ज़ोनिफ़ाइड" प्रक्षेपण के निर्देशांक के लिए http://www.spatialreference.org में देख सकते हैं , और आप उन्हें ज़ोन पर निर्भर करने के लिए एक तालिका आदि बना सकते हैं।

हम एक टेबल ज़ोन की कल्पना करते हैं

|   minx     |    miny    |    maxx    |   maxy     |  srid  |
+------------+------------+------------+------------+--------+
|234567.34314|234567.34334|234567.34334|234567.34334|  1234  |

गोलाकार मर्केटर (वेब ​​मर्केटर) में संग्रहित सभी मिक्स, मिन्टी, मैक्सएक्स, मैक्सी वैल्यू। इसलिए मैं उदाहरण के रूप में पोस्टगिस का उपयोग करूंगा।

SELECT ST_Distance(
         ST_Transform( -- transform/reproject
            ST_SetSRID(geom_line, 3857) -- geom_line with forced srid assignation to web mercator
            , ( -- here we get the first SRID from the spatial position of geom_line
                 SELECT  srid
                 FROM    zones
                 WHERE   ST_Contains(
                           ST_MakeBox2d(ST_Point(minx,miny),ST_Point(maxx,maxy))
                           , geom_line
                         )
                 LIMIT 1
            ))

आशा है कि यह उपयोगी हो, एक अच्छा दिन हो।


मैं निश्चित नहीं हो सकता, लेकिन ब्लोमस्टर के अपने प्रश्न में "STDistance" के उपयोग के आधार पर ऐसा लगता है कि वह PostGIS का उपयोग नहीं कर रहा है। यदि Blomster SQL Server का उपयोग कर रहा है तो कोई ST_Transform कार्यक्षमता नहीं है।
एलन एडेयर

मैं इस प्रक्रिया और सबसे अच्छा तरीका है कि मैं इसे हल कर सकता था, वह बाकी के साथ सौदा कर सकता था, एक मार्ग वह एक सॉफ्टवेयर अस्वीकृति का उपयोग कर सकता था, लेकिन वास्तव में अफ़सोस की बात है कि एक SQL सर्वर अनुमानों के साथ सौदा नहीं करता है।
फाल्सीबाईर

शायद CLR सक्षम और .net पुस्तकालय nettopologysuite मदद कर सकता है?
फाल्सीबार

0

OpenLayers के पास एक ईपीएसजी पर दो EPSG: 4326 (WGS84) बिंदुओं के बीच की दूरी की गणना करने के लिए एक उपयोगिता विधि है। चूँकि OpenLayers खुला स्रोत है, आप देख सकते हैं कि इसे यहाँ कैसे लागू किया गया है: https://github.com/openlayers/openlayers/blob/release-2.12/lib/OpenLayers/Util.jn#L750

OpenLayers और माप नियंत्रण का उपयोग करने वालों के लिए, इस गणना का उपयोग करने के लिए विकल्पों में से ज्यामितीय को सक्षम करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.