मैं दुनिया भर में पॉलीलाइन लपेट कैसे बना सकता हूं?


14

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

यहाँ छवि विवरण दर्ज करें

मुझे लगता है कि यह संभवत: डेटलाइन और / या समन्वय प्रणालियों से संबंधित है, लेकिन विस्तार पर थोड़ा स्केच हूं। क्या कोई मुझे इस काम के लिए क्या करने की आवश्यकता के पीछे सिद्धांत की व्याख्या कर सकता है? मैं नासा से नीरस प्रक्षेपण का उपयोग कर रहा हूं:

var bluemarble = new L.TileLayer.WMS("http://demo.opengeo.org/geoserver/wms", {
layers: 'bluemarble',
attribution: "Data © NASA Blue Marble, image service by OpenGeo",
minZoom: 2,
maxZoom: 5
});

2
आपको पॉलीलाइन को + -180 डिग्री मेरिडियन पर तोड़ने की आवश्यकता है। इसके लिए अक्षांश को खोजने की आवश्यकता होती है, जिस पर पॉलीलाइन उस मेरिडियन को पार करती है। आपके जीआईएस में शायद ब्रेकिंग करने के तरीके हैं। यदि नहीं, तो संबंधित धागे में दिखाए गए कोड से एक सरल समाधान प्राप्त किया जा सकता है । क्या आप अपने प्लेटफ़ॉर्म पर इस तरह कोड निष्पादित कर सकते हैं?
whuber

मैं व्हीबर से सहमत हूं। मुझे पॉलीगॉन क्रॉसिंग + - 180 के साथ एक समान कार्य करना पड़ा है। जब भी आप + -180 को पार करते हैं तो आपको कई पॉलीलाइन / पॉलीगोन में विभाजित करना पड़ता है।
स्टीव

जवाबों:


13

आपको पॉलीलाइन को + -180 डिग्री मेरिडियन पर तोड़ने की आवश्यकता है। इसके लिए अक्षांश को खोजने की आवश्यकता होती है, जिस पर पॉलीलाइन उस मेरिडियन को पार करती है। आपके जीआईएस में शायद ब्रेकिंग करने के तरीके हैं। यदि नहीं, तो संबंधित धागे में दिखाए गए कोड से एक सरल समाधान प्राप्त किया जा सकता है । यहाँ कुछ विवरण हैं।

  • पॉलीलाइन को वर्टिकल के अनुक्रम के रूप में दर्शाया जाता है , प्रत्येक को (lat, lon) रूप में दिया जाता है, -180 <= lon <= 180 के साथ। आपको क्रमिक जोड़ी की जांच करने की आवश्यकता है कि क्या यह + -180 मेरिडियन को पार करता है। एक त्वरित परीक्षण है: यदि अनुदैर्ध्य के अंतर का पूर्ण मान 180 या अधिक है, तो एक क्रॉसिंग है।

  • प्रत्येक सेगमेंट के भीतर (lat0, lon0) -> (lat1, lon1) जो + -180 मेरिडियन को पार करता है, आपको पॉलीलाइन को दो टुकड़ों में तोड़ने की जरूरत है जहां यह पार करता है।

कुंजी उचित सटीकता के साथ विराम बिंदु का अक्षांश खोज रही है। यह सबसे आसानी से एक गोलाकार पृथ्वी मॉडल के साथ किया जाता है: त्रुटि (एक अधिक सटीक दीर्घवृत्त मॉडल की तुलना में) नोटिस करने के लिए बहुत छोटा होगा।

प्रश्न के खंड को बिंदु 0 पर (lat0, lon0) से बिंदु 1 पर (lat1, lon1) पर जाने दें। दो बिंदुओं के बीच 3 डी में एक सीधी रेखा खंड को चलाने से ब्रेक प्वाइंट पाया जा सकता है जैसा कि कार्टेशियन निर्देशांक में दर्शाया गया है और यह पता लगाना है कि कहां समन्वय शून्य है। कार्तीय निर्देशांक हैं

(x0, y0, z0) = (cos(lon0)*sin(lat0), sin(lon0)*sin(lat0), cos(lat0))

और बिंदु 1 के लिए एक समान अभिव्यक्ति दे रहा है (X1, y1, z1)। समीकरण को हल करें

t * y0 + (1-t) * y1 = 0

टी के लिए; अर्थात्,

t = y1 / (y1 - y0).

चौराहे के निर्देशांक इसलिए हैं

(x, y, z) = (t * x0 + (1-t) * x1, 0, t * z0 + (1-t) * z1)

यह बिंदु (जो + -180 मेरिडियन के नीचे पृथ्वी की सतह के नीचे स्थित है) में अक्षांश समान है

lat2 = ATan(z/x).

ब्रेक प्वाइंट को दो तरीकों से दर्शाने की जरूरत है। टूटी हुई पॉलीलाइन के पहले भाग को समाप्त करने के लिए (lat0, lon0) के बाद इसे संलग्न करते समय यदि lon0 नकारात्मक है और अन्यथा (lat2, 180) का उपयोग करें (lat2, -180)। टूटी हुई पॉलीलाइन के दूसरे भाग को शुरू करने के लिए इसे (lat1, lon1) से पहले संलग्न करते समय एक समान नियम का पालन करें।

असाधारण मामलों में, एक या दोनों बिंदु 0 और बिंदु 1 + -180 मेरिडियन पर हो सकते हैं। इस प्रक्रिया का अनुसरण करने से आप अपने द्वारा बनाए गए पॉलीलाइन टुकड़ों में से एक शून्य-लंबाई वाला खंड रख सकते हैं। यदि यह जीआईएस के साथ समस्या पैदा कर सकता है, तो इस स्थिति के लिए परीक्षण करें।

ध्यान दें कि एक पॉलीलाइन इस मेरिडियन को एक से अधिक बार पार कर सकती है। इसलिए, पहले ब्रेक और पॉलीलाइन को दो भागों में तोड़ने के बाद, आपको दूसरे भाग को उसी तरह से संसाधित करने की आवश्यकता है।


1
व्हाटबेर ने जो कहा वह ठीक है, लेकिन मुझे लगता है कि निम्नलिखित वाक्य में एक टाइपो है:> जब टूटने के बाद (lat0, lon0) को जोड़ते हैं तो टूटे हुए> पॉलीलाइन के पहले भाग को समाप्त करने के लिए, (lat2, -180) lat0 नकारात्मक है और अन्यथा उपयोग करें (lat2, 180)। मुझे लगता है कि यह होना चाहिए:> उपयोग (lat2, -180) अगर lon0 नकारात्मक है और अन्यथा उपयोग करें (lat2, 180)
जॉर्जी

@Georgi कि पकड़ने के लिए धन्यवाद; मुझे लगता है कि आप सही हैं और मैं बदलाव करूंगा।
whuber

मुझे इसे USC.js में लागू करना था, यहाँ मेरा कोड है: gist.github.com/mikeatlas/0b69b354a8d713989147
माइक एटलस

धन्यवाद, @ मायके। मुझे ज़िग-ज़ैग चित्रण बहुत पसंद है: यह बिल्कुल वैसा ही परिस्थिति है जैसा मैं इस उत्तर को लिखते समय कल्पना कर रहा था। यदि आप वास्तव में गंभीर परीक्षा चाहते हैं, तो देखें कि क्या पॉलीलाइन होता है जो + -180 डिग्री मेरिडियन के साथ ही चलता है (और दोनों ध्रुवों को पार करता है)!
whuber

@ मुझे पूरी कोशिश करने की जरूरत है कि: / परिणाम पोस्ट करेंगे
माइक एटलस

0

संबंधित चर्चा के लिए, शायद यह टिकट दिलचस्प है:

"रैपिंग बाउंड्री पर वेक्टर प्रक्षेपण विभाजित है"

https://trac.osgeo.org/grass/ticket/1527

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