नि: शुल्क जीआईएस सॉफ्टवेयर में छद्म नोड ढूँढना?


16

सॉफ्टवेयर gvSIG OA डिजिटल संस्करण 2010 में रेखीय ज्यामिति में छद्म नोड खोजने के लिए उपकरण टोपोलॉजी है। मैंने क्लस्टर सहिष्णुता 0.00002 और त्रुटियों की अधिकतम संख्या -10000 को 20000 लिंक गिनती रैखिक ज्यामिति के लिए निर्धारित किया है। लेकिन असफल परिणाम।

क्या ऐसे कोई समाधान हैं जो नि: शुल्क जीआईएस सॉफ्टवेयर में छद्म नोड्स ढूंढते हैं?

मुझे छद्म नोड्स को परत करने की जरूरत है (इस समस्या का एक समाधान - आर्कइन्फो के टूल टोपोलॉजी का उपयोग करने के लिए, लेकिन मेरे लिए प्राथमिकता मुफ्त सॉफ्टवेयर का उपयोग करना है)। रैखिक ज्यामिति ने QGIS 1.8.0 में PostGIS (v। 2.0.1) डेटाबेस में कई उपयोगकर्ता बनाए।

नई छवि जोड़ें: ए (लाइन 4/5), बी (लाइन 6/7), सी (लाइन 9/10) में तीन छद्म नोड्स के साथ 12 रैखिक विशेषताएं। इसके बजाय छद्म नोड्स होना चाहिए - एक बिंदु (नोड) में चौराहे के साथ दो रैखिक विशेषताएं एक रैखिक सुविधा (पंक्ति 4/5 - पंक्ति 4, ...) होनी चाहिए।

क्या PostGIS में एक अनुरोध करना संभव है, जिसके परिणामस्वरूप छद्म नोड्स की एक परत होगी?

उदाहरणों की नई छवि जोड़ें छद्म नोड्स: यदि मुझे रैखिक परत बिंदु परत छद्म नोड्स (नीली परतें) के लिए प्राप्त होता है, तो मैंने रैखिक परत में त्रुटियों को ठीक किया: ए - लापता ज्यामिति, बी - चौराहे में लाइन को जोड़ दिया, सी - छद्म नोड को हटा दें।

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

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

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


2
GRASS में कमांड rmdangle मौजूद है, लेकिन परिणाम में ppudo नोड्स के बिना shp-file। परिणाम में छद्म नोड्स का shp-file (या अन्य) होना चाहिए (जैसे gvSIG OA डिजिटल संस्करण 2010)
HasT

क्या आप PostGIS 2.0 का उपयोग करते हैं? यदि हाँ, तो Is_Valid और Makevalid फ़ंक्शन को आज़माएँ।
जियोवानी मंगी

हां, मैं PostGIS 2.0 का उपयोग करता हूं। छद्म नोड की खोज के लिए मुझे इन कार्यों का उपयोग कैसे करना चाहिए? क्या उन्हें "QGIS के लिए PgQuery" के साथ ढूंढना संभव है?
हस

हां, आप उन्हें QGIS के भीतर किसी भी टूल का उपयोग कर सकते हैं जो आपको PostGIS क्वेरी चलाने की अनुमति देता है, उदाहरण के लिए DB प्रबंधक (जो वाक्यविन्यास हाइलाइटिंग और ऑटो पूर्णता का समर्थन करता है)।
जियोवानी मंगी

दूसरी तस्वीर में लाल बिंदु दो वैध ज्यामितीयों का एक चौराहा है?
विनयनय

जवाबों:


8

यहां एक सामान्य समाधान है, जिसे आप पोस्टजीआईएस या किसी अन्य ओजीसी-अनुपालन सॉफ्टवेयर के साथ लागू कर सकते हैं।

नोट: जैसा कि मैंने पहले कहा , FOSS और GIS में एक प्रमुख अवधारणा मानकीकरण है : सबसे अच्छा समाधान मानकों को अपनाते हैं, जैसे OGC वाले।


आपकी समस्या "छद्म नोड्स ढूंढना" है ... लेकिन मुझे लगता है कि यह थोड़ा अधिक है, "गैर-छद्म नोड्स ढूंढें और छद्म नोड्स की रेखाओं में शामिल हों"। मेरे समाधान का उपयोग दोनों के लिए किया जा सकता है।

OGC मानकों की पेशकश:

  • ST_Boundary (geom) : लाइनों के नोड्स का पता लगाने के लिए

  • ST_Dump (geom) : प्रत्येक एकल नोड को SQL टेबल रिकॉर्ड में डालने के लिए।

  • ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap का उपयोग परिवर्तन सहिष्णुता के लिए किया जा सकता है। मैं ST_DWithin का उपयोग कर रहा हूं।

हम मान सकते हैं कि आपकी मुख्य समस्या इन वस्तुओं और गुणों के साथ निर्दिष्ट की जा सकती है,

  • एक लाइन सेगमेंट के (केवल एक टेबल लैनिनेशन के ) होते हैं, जो एक LINESTRING ज्यामिति द्वारा दर्शाया जाता है ... मैंने MULTILNE के साथ परीक्षण नहीं किया है, यदि आपके पास ज्यामिति = MULTIPOINT है, तो आप M_ILILINE को ST_Dump और ST_LineMerge से विभाजित और कास्ट कर सकते हैं;

  • प्रत्येक पंक्ति खंड में एक (ज्यामिति आईडी) gid और एक (रंग ID) आइडलाइन होती है

तो, पहला कदम उन नोड्स को प्राप्त करना है जो जुड़ने वाली लाइनों से आते हैं,

CREATE TABLE cache_bounds AS
  SELECT gid as gid_seg, (ST_Dump(ST_Boundary(the_geom))).geom AS the_geom,
         gid as color 
         -- if you not have something for "color label" of lines, use gid.
  FROM linesegment;
ALTER TABLE cache_bounds ADD column gid serial PRIMARY KEY;

CREATE TABLE cache_joinnodes AS
  -- Use your TOLERANCE instead "1" at ST_DWithin and ST_Buffer.
  SELECT *, array_length(colors,1) as ncolors FROM (
   SELECT gid, array_distinct(array_cat(a_colors,b_colors)) as colors, the_geom FROM (
    SELECT 
      a.gid, array_agg(a.color) as a_colors, array_agg(b.color) as b_colors
      , st_buffer(a.the_geom,1) as the_geom -- any one to represent the join point.
    FROM cache_bounds a, cache_bounds b 
    WHERE a.gid>b.gid AND ST_DWithin(a.the_geom,b.the_geom,1)
    -- use ST_equals(a.the_geom,b.the_geom) if no tolerance.
    GROUP BY a.gid, a.the_geom
   ) as t
  ) as t2;

नोट: कैश का उपयोग करना क्योंकि वे विचारों की तुलना में तेज़ हैं। CPU समय की जांच करने के लिए "EXPLAIN SELECT ..." का उपयोग करें, इसमें लंबा समय लग सकता है।

यहाँ चक्र और निरंतर (समान रंग) रेखाओं को ncolors=1बिंदुओं के रूप में और ncolors=2बिंदुओं द्वारा छद्म नोड्स का पता लगाया जाता है , इसलिए, आपके पास उस बिंदुओं के साथ एक परत है।

"अच्छे नोड्स" की आपकी तालिका मूल "बाउंडिंग पॉइंट्स" के साथ और "छद्म नोड्स" के बिना है।

CREATE VIEW vw_joinnodes_full AS
  SELECT b.*, j.ncolors
  FROM cache_joinnodes j INNER JOIN cache_bounds b 
       ON j.gid=b.gid;

CREATE TABLE cache_good_nodes AS
  SELECT *  
  FROM vw_joinnodes_full 
  WHERE ncolors=1 OR ncolors>2;

-- IF NEED ... CREATE VIEW vw_correct_linesegment AS ... 

समाधान के लिए धन्यवाद! मैं क्वेरी चलाने की कोशिश करता हूं (pgAdmin में) लेकिन मुझे अपवाद मिलता है: "फ़ंक्शन array_distinct (पूर्णांक []) मौजूद नहीं है"। मैं क्या गलत कर रहा हूं?
हस

क्षमा करें, उद्धृत array_distinctफ़ंक्शन पोस्टग्रैज़.ज़ लाइब्रेरी से नहीं है । कोई अन्य त्रुटियां, कृपया रिपोर्ट करें, मैं यहां और स्पष्टीकरण जोड़ सकता हूं।
पीटर क्रस

मैंने array_distinct फ़ंक्शन जोड़ा। डेटाबेस में रैखिक परत में "the_geom" ज्यामिति कॉलम नाम (इसके बजाय क्वेरी में "geom") होता है। मैं "geom" को "ST_oundary (the_geom)" के लिए चलाता हूं, रन क्वेरी के बाद मुझे संदेश "कॉलम" geom "" रंगों में मौजूद नहीं है, "geom FROM" जगह मिलती है। मैं "रंग, जियोम फॉरम" को "रंगों, the_geom FROM" के रूप में प्रतिस्थापित करता हूं, लेकिन मुझे फिर से संदेश "कॉलम" the_geom "मौजूद नहीं है"।
१३

ठीक है, बदल (संपादित उत्तर देखें) geomकरने के लिए the_geom(ST_Dump (x)) जियोम के रूप में रहना, एक डेटाबेस विशेषता नहीं है।
पीटर क्रस

धन्यवाद! क्वेरी काम करती है। मैंने ST_Disin को ST_equals पर बदल दिया और ST_Buffer के लिए 0.00002 DD सहिष्णुता दे दी। परिणाम में मुझे सही नोड्स प्राप्त हुए (जहां एक नोड में 3 और अधिक रैखिक विशेषताएं हैं)। मैं परिणाम प्राप्त करना चाहता हूं जहां एक नोड में 2 रेखीय विशेषताएं (FROM vw_joinnodes_full WHERE nEREors = 2?) है, लेकिन बिंदु परत जहां एक नोड 2 और अधिक रैखिक सुविधाओं में प्राप्त की है। कैसे परिणाम प्राप्त होता है जहां एक नोड में केवल 2 रैखिक विशेषताएं हैं?
हस

7

रिफ्रैक्शंस रिसर्च ने एक लाइन क्लीनर टूल बनाया है जो ऐसा लगता है कि आप क्या चाहते हैं।

लाइन क्लीनर जटिल, चक्रीय, बहुत छोटी और शून्य-लंबाई वाले ज्यामितीयों को सरल बनाने और छद्म नोड्स और नगण्य शीर्षों को हटाकर नेटवर्क को साफ करता है। सबसे महत्वपूर्ण रूप से, सफाई के चरण में, यह सुनिश्चित करने में सक्षम है कि फीचर मैचों को स्वचालित रूप से माना जा सकता है

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

स्रोत कोड GitHub पर पाया जा सकता।


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

ऐसा लग रहा है कि यह काम करना चाहिए। यहाँ आप जो कहना चाह रहे हैं उसे समझने में कठिनाई हो रही है। "त्रुटियों के परिणामस्वरूप छद्म नोड को एक बिंदु परत की आवश्यकता होती है" मुझे समझ में नहीं आता कि आप इसका क्या मतलब है। क्या आपको इस काम के लिए प्रत्येक पंक्ति के अंत में तले हुए बिंदुओं के साथ एक बिंदु परत की आवश्यकता है?
रेनर

@ रेयान, उदाहरणों की नई छवि जोड़ें छद्म नोड्स (3): यदि मुझे रैखिक परत बिंदु परत छद्म नोड्स (नीली परतें) के लिए प्राप्त होता है तो मैं मैन्युअल रूप से ठीक करता हूं (स्वचालित रूप से नहीं) रैखिक परत में अगली त्रुटियां: ए - लापता ज्यामिति, बी - जोड़ चौराहे में लाइन, सी - छद्म नोड को हटा दें। अगर मैं स्वचालित रूप से छद्म नोड्स ठीक कर रहा हूं तो मैंने ए, बी स्थानों में त्रुटियों को छोड़ दिया।
हस

ठीक है, मैं बी और सी को समझता हूं। जब आप कहते हैं कि "ए - मिसिंग ज्योमेट्री जोड़ें" का क्या मतलब है? क्या कोई ऐसा बिंदु है जिसे जोड़ने की आवश्यकता है जहां 2 लाइनें मिलती हैं?
रनर

@ रेनर, इसका मतलब है कि 'ए' में लीनियर फीचर जोड़ा जाना चाहिए (इमेजरी के अनुसार सड़क / सड़क)। सभी में - नोड को इमेजरी के अनुसार नई ज्यामिति जोड़ने के लिए तैयार किया गया था, लेकिन ज्यामिति को नहीं जोड़ा गया (लेयर छद्म नोड्स जो मुझे चित्रित ज्यामिति नहीं मिल रहा है) का उपयोग करें
HasT

2

गैर-मुक्त समाधान: FME + MRF + SmartCleaner ट्रांसफार्मर

नि: शुल्क समाधान GRASS v.clean (नवीनतम QGIS 1.8.0 GRASS टूल्स के साथ इसका उपयोग करने का सबसे आसान तरीका है) और अन्य टोपोलॉजी सफाई उपकरण


QGIS 1.8.0। C: \ Program Files \ क्वांटम GIS लिस्बोआ \ apps \ qgis \ python \ plugins निर्देशिका (1.0.7) में SEXTANTE प्लगइन स्थापित करें। QGIS परियोजना (CRS लेयर और प्रोजेक्ट WGS1984, 'फ्लाई' परिवर्तन पर 'में रैखिक shp-file लोड करें)। फिर मैं 'कैनवास पर GRASS क्षेत्र' (GRASS कमांड्स - टूल्स) लागू करता हूं और कमांड v.clean - rmdangle (Thershold = 0) चलाता हूं, आउटपुट वेक्टर / त्रुटियों के लिए dir / name दर्ज करता हूं)। रन प्रक्रिया के बाद त्रुटि प्राप्त होती है 'परत लोड नहीं कर सका: D: /error.shp त्रुटियों को देखने के लिए SEXTANTE लॉग की जाँच करें'। TOC में नई परत जोड़ी गई, त्रुटियों के साथ परत लोड नहीं हुई।
हसोट

1
GRASS में कमांड v.build.polylines मौजूद है - मुझे दो पंक्तियों में से एक प्राप्त होता है, जो एक वर्टेक्स (डिलीट किए गए छद्म नोड) में अंतर करता है, लेकिन यह कमांड मुझे SEXTANTE प्लगइन में नहीं मिलती है
HasT

@simplexio क्या आप सुझाव दे सकते हैं कि छद्म नोड्स की पहचान करने के लिए v.clean के किस विकल्प का उपयोग किया जा सकता है
ऑसमजीत

2

यहाँ OpenJump एक मुक्त GIS का उपयोग कर अपने छद्म नोड्स खोजने के लिए कदम हैं।
QGIS और gvSIG में Sextante Plugin है, इसलिए इन समान चरणों में उनका भी काम होना चाहिए,
Spatial Join थोड़ा अलग हो सकता है।
मैंने परीक्षण के लिए संस्करण 1.2 का उपयोग किया।

- लाइन एंडपॉइंट्स को सेव करें
Sextante टूलबॉक्स, टोपोलॉजी, लाइनों के एंडपॉइंट्स निकालें -> endpt_0

- अपनी लाइनों को अनसप्लीट करें Sextante
टूलबॉक्स, लाइन लेयर्स के लिए टूल्स, आसन्न लाइनों से जुड़ें - Unsplit लाइन पॉइंट्स सेक्स्टेंट टूलबॉक्स, टोपोलॉजी को

सेव करें
, एंड पॉइंट्स के एंड पॉइंट्स को सेव करें पंक्ति -> endpt_1

- "समीपवर्ती रेखाओं से जुड़ें" द्वारा हटाए गए अंतिम बिंदु हैं छद्म नोड

उपकरण, प्रश्न, स्थानिक प्रश्न,
स्रोत परत "endpt_0"
संबंध " अंतर "
मास्क परत "endpt_1"

पूरक परिणाम को सक्षम या क्लिक करें


जवाब के लिए धन्यवाद! मैं हूँ QGIS Sextante में theses कदम बनाने की कोशिश, लेकिन मैं "लाइनों के समापन बिंदु" और "आसन्न लाइनों में शामिल हों" आदेश वहाँ नहीं मिलता है। यह QGIS Sextante (gvSIG 1.12 थिसिस कमांड में मौजूद है) या कमांड v.build.polylines में संभव है?
11

मैंने अभी QGIS sextante प्लगइन स्थापित किया है। मुझे पूर्ण फ़ंक्शंस दिखाई नहीं देते हैं, कई गायब हैं। एक आकृति पर gvSIG में चरणों का परीक्षण करना आसान होना चाहिए।
क्लेविस

मैंने अभी उपरोक्त वर्कफ़्लो को gvSIG 2.4.0.2834 में सत्यापित किया है और यह ठीक काम करता है। मैंने अन्य दो टूलबॉक्स जियोप्रोसेस के साथ अंतिम चरण को प्रतिस्थापित किया है: पहला, gvSIG "स्पैटियल जॉइन" , दूसरा "फिल्टर वेक्टर लेयर" का उपयोग DIST > 0अभिव्यक्ति के रूप में। इसके अलावा, एक नया उपकरण बनाने के लिए सभी जियोप्रोसेस को SEXTANTE मॉडल में एक साथ जंजीर किया जा सकता है, जैसे "Find pseudonodes"
एंटोनियो फाल्कियानो


1

PostGIS के साथ, आप इस विषय में चर्चा किए गए खतरों को खोजने के लिए क्वेरी के एक संशोधित संस्करण का उपयोग कर सकते हैं , क्योंकि स्यूडोनोड्स नोड्स हैं जो 2 लाइनस्ट्रेक्ट्स को इंटरसेप्ट करते हैं और 1 नोड्स को इंटरसेप्ट करने वाले खतरे नोड्स हैं।

WITH nodes AS 
(SELECT ST_StartPoint(geom) AS pt FROM
linestring_table UNION ALL 
SELECT ST_EndPoint(geom) AS pt FROM
linestring_table) 
SELECT pt FROM nodes
GROUP BY pt HAVING count(*) = 2;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.