दो या अधिक प्रक्षेपवक्रों के बीच समानता


11

मेरे पास ट्रकों का डेटा है ( http://www.chorochronos.org/ )।

यह डेटा एथेंस में ट्रकों के कई प्रक्षेप पथ के निर्देशांक हैं।

मुझे ट्रैजेटरीज के बीच समानता की गणना करनी है, ताकि जो समान हैं उन्हें हटाने के लिए!

मुसीबत:

रेड और ग्रीन समान हैं, लेकिन नीले, काले और (लाल या हरे) विभिन्न प्रक्षेपवक्र हैं। मैं एक समान लाल या हरे रंग को हटाना चाहता हूं।

डेटा बिंदुओं में हैं (ज्यामिति, अक्षांश और लंबा, x और y) (निर्देशांक जीपीएस), छवि प्रक्षेपवक्र के उदाहरण हैं


1
यदि लाल और हरा समान हैं, और हरे और काले समान हैं, तो क्या होता है, लेकिन लाल और काला समान नहीं हैं? इसके अलावा, आप "समान" को कैसे परिभाषित करते हैं - क्या यह दूसरी पंक्ति की दूरी के भीतर गिरने वाली रेखा का अनुपात है, या कुछ अन्य मीट्रिक है?
फ्लोएम

मैं सिर्फ उन विशेषणों के साथ रहना चाहता हूं जो दूसरों से अलग हैं। ट्रैजेटरीज जीपीएस निर्देशांक हैं, न कि रेखाएं ...
23:28 पर user2883056

1
आपके पास पोस्टगिस और पोस्टग्रेजल के लिए टैग हैं, लेकिन आपके प्रश्न निकाय में भी इसका उल्लेख नहीं है। टैगिंग महत्वपूर्ण है, यदि आप उन उत्पादों का उपयोग कर रहे हैं, तो मैं दृढ़ता से उन्हें आपके प्रश्न के शरीर में रिकॉर्ड करने की सलाह देता हूं, क्योंकि शीर्षक पर नज़र रखने के बाद, यह आपके प्रश्न का एक भाग होगा जिसे सभी का ध्यान जाता है।
PolyGeo

2
मैं @ एम्फ्लोम से सहमत हूं - महत्वपूर्ण सवाल यह है कि "आप समान कैसे परिभाषित करते हैं"? सभी मार्ग AB से जाते हैं, इसलिए वे उस अर्थ में 'समान' हैं। आपको एक सफल परिणाम का मूल्यांकन करने के बारे में अधिक जानकारी प्रदान करने की आवश्यकता है
स्टीफन लीड

जवाबों:


10

वास्तव में आसान, लेकिन शानदार उपाय नहीं है कि प्रत्येक संयोजन के बीच हॉसडॉर्फ दूरी प्राप्त की जाए , जो ST_HausdorffDistance फ़ंक्शन के साथ की जाती है। अपने चित्र से अनुमानित रेखा-रेखाओं का उपयोग करते हुए, ये सभी नीले रंग में दिखाए गए हैं, और हौसडॉर्फ़ दूरी को लाल रंग की लाइनों में से एक जोड़ी के लिए दिखाया गया है:

हौसडॉर्फ़ दूरी

और क्वेरी को अवरोही क्रम में 6 संयोजनों को क्रमबद्ध करने के लिए:

WITH data AS (
  SELECT 'blue' AS name, 'LINESTRING (60 200, 110 290, 200 320, 330 320, 430 240, 450 200)'::geometry AS geom
  UNION SELECT 'black', 'LINESTRING (60 200, 120 270, 235 297, 295 207, 450 200)'::geometry
  UNION SELECT 'green', 'LINESTRING (60 200, 280 190, 450 200)'::geometry
  UNION SELECT 'red', 'LINESTRING (60 200, 150 210, 257 195, 360 210, 430 190, 450 200)'::geometry)
SELECT a.name || ' <-> ' || b.name AS compare, ST_HausdorffDistance(a.geom, b.geom)
FROM data a, data b WHERE a.name < b.name
ORDER BY ST_HausdorffDistance(a.geom, b.geom) DESC;

     compare     | st_hausdorffdistance
-----------------+----------------------
 blue <-> green  |                  130
 blue <-> red    |                  125
 black <-> blue  |     110.102502131467
 black <-> green |     104.846289061163
 black <-> red   |     97.9580173908678
 green <-> red   |     15.2677257073823
(6 rows)

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


अच्छा उत्तर। मैंने शायद ST_Interpolate बिंदु जैसी किसी चीज़ का उपयोग किया होगा और फिर संबंधित बिंदुओं के प्रत्येक सेट के लिए एक औसत दृष्टिकोण के रूप में औसत दूरी की गणना की। बहुत बेहतर तरीकों से आपके मन में क्या था?
जॉन पॉवेल

1
जॉनबोर्का बेहतर तरीके प्रत्येक पंक्ति के कवरेज के स्थानिक आंकड़ों की तुलना करेंगे। एक विधि प्रत्येक पंक्ति को rasterise करेगी, raus के साथ एक गाऊसी धब्बा करेगी, फिर प्रत्येक संयोजन से संयोग रेखापुंज मानों के सहसंबंध का निर्धारण करेगी। ST_Segmentize और ST_Interpolate टूल पर आधारित एक विधि भी काम करेगी।
माइक टी

4

मेरे पास PostGres / PostGIS तक पहुंच नहीं है, लेकिन यहां है कि मैं इसके बारे में ArcGIS (या अन्य) में कैसे जाऊंगा।

  1. एक स्थिर कॉलम में मूल लाइनों की लंबाई की गणना करें
  2. अपनी रेखाओं को इस तरह से बफ़र करें कि आप "समान" को कैसे परिभाषित करें। बफ़र्स को भंग न करें। परिणामी बफ़र्स में मूल पंक्ति के बराबर FID होगा।
  3. बफ़र्स और मूल पंक्तियों को सम्मिलित करें। परिणामी परत उस विशिष्ट चौराहे में भाग लेने वाले FID की पहचान करेगी (उदाहरण के लिए, "FID_lines" और "FID_buff")।
  4. दो मूल FID कॉलम और मूल लंबाई कॉलम # 3 से परत भंग करें
  5. परिणामी लाइनों को अनदेखा करें, जिसमें परिभाषा क्वेरी का उपयोग करके दो मूल FID स्तंभों के लिए समान मूल्य है, या अन्य साधन (निश्चित रूप से एक पंक्ति बफ़र्ड और अपने स्वयं के बफर के साथ पूरी तरह से ओवरलैप होंगे)।
  6. एक संख्यात्मक कॉलम जोड़ें और इसे नई लंबाई के साथ आबाद करें
  7. मूल लंबाई के साथ नई लंबाई को विभाजित करें (एक नए कॉलम में) मूल रेखा के अनुपात को प्राप्त करने के लिए जो प्रत्येक पास की रेखा के बफर में आती है।
  8. अनुपात के लिए मानों का निरीक्षण करें। उन लोगों को रखें जिन्हें आपने "समान पर्याप्त" के रूप में परिभाषित किया है। उदाहरण के लिए, शायद 75% की लंबाई के लिए किसी अन्य रेखा के बफर के भीतर गिरने वाली रेखा समान है, शायद आपका कटऑफ 50% समझौता है, आदि।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.