चौराहों पर ओएसएम सड़कों को अलग-अलग खंडों में कैसे विभाजित किया जाए?


11

मैं OpenStreetMap डेटा का उपयोग करके pgRout के साथ उपयोग के लिए एक सड़क-नेटवर्क बनाना चाहता हूं। मैंने GeoFabrik से एक Postgres तालिका (PostGIS सक्षम के साथ) में एक आकृतिफल लोड किया। हालाँकि, मुझे एक समस्या यह थी कि सड़कें हमेशा चौराहों पर समाप्त नहीं होती हैं, इसलिए मैंने उन सभी को हर चौराहे या क्रॉसिंग पर विभाजित करने का निर्णय लिया।

उन सभी अंतर्संबंधों की पहचान करने के लिए जहां सड़कें पार हुईं या खंडित हुईं, मैंने निम्नलिखित का उपयोग किया SQL( पिछले प्रश्न के समान ):

CREATE TABLE split_points as
SELECT DISTINCT    
   ST_GeometryN(ST_Intersection(a.geom, b.geom),1) as geom      
FROM
   roads as a,
   roads as b
WHERE
    ST_Touches(a.geom, b.geom)
OR
    ST_Crosses(a.geom, b.geom)    
    AND a.gid != b.gid
GROUP BY
   ST_Intersection(a.geom, b.geom);

मैं अब इन बिंदुओं का उपयोग करके सड़कों को विभाजित करना चाहता हूं। मैंने निम्नलिखित दृष्टिकोण का उपयोग किया:

CREATE TABLE split_roads as
SELECT     
    ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))).geom) As geom,
    generate_series(1,ST_NumGeometries((ST_Split(g.geom, blade.geom)))) as gid
FROM    
    split_points as blade,
    roads as g
WHERE
    ST_Intersects(g.geom, blade.geom);

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

DELETE FROM split_roads USING roads
WHERE ST_Equals(split_roads.geom, roads.geom)

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


प्रलेखन के अनुसार, ST_Split मूल, अनसैपिट ज्यामिति वापस नहीं करता है। आपके चुने हुए बयान की पहली पंक्ति में अंतिम बंद कोष्ठक में लटका हुआ अतिरिक्त '.geom' क्या है? इसे हटाने के रूप में सरल हो सकता है।
20

@ एससीआरओ जिसका .geomआप जिक्र कर रहे हैं? इसे हाजिर नहीं कर सकते!
djq

मैं तकनीकी रूप से अनुमान लगाता हूं, कि SELECT स्टेटमेंट की दूसरी लाइन होगी। इसके अलावा, मैं "स्प्लिट_रॉड्स" टेबल निर्माण की बात कर रहा हूं। यह वह रेखा है जो ')))) के साथ समाप्त होती है)।
स्कॉर

हम्म, मुझे एक त्रुटि मिलती है जब मैं ऐसा करता हूं। ERROR: function st_geomfromewkb(geometry_dump) does not exist LINE 4: ST_GeomFromEWKB((ST_Dump(ST_Split(g.geom, blade.geom))))... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.
djq

क्या पूरी लाइन इस तरह दिखती थी: ST_GeomFromEWKB ((ST_Dump (ST_Split (g.geom, flex.geom))))
जियोम के

जवाबों:


6

आपकी समस्या का वास्तविक समाधान नहीं है, लेकिन osm2po का प्रयास करें ... यह pgrout में रूटिंग के लिए एकदम सही SQL कोड बनाता है: http://osm2po.de/


सलाह के लिये धन्यवाद। मैंने कोशिश की है, osm2pgroutingलेकिन इसे मेरे सर्वर से अधिक मेमोरी की आवश्यकता है और यह बिना परिष्करण के समाप्त हो जाता है।
djq

2
@djq osm2po, osm2pgrout की तुलना में बहुत बड़ी फ़ाइलों को संभाल सकता है। यह भी planet.osm लोड कर सकते हैं
UnderDark

आह, मुझे लगता है कि मूल रूप osm2poसे एक टाइपो था। वहाँ इसे ubuntu में स्थापित करने का एक सीधा है?
djq

यह एक तैयार संकलित JAR फ़ाइल (जावा) है। वेबसाइट पर बताए अनुसार ही इसे चलाएं।
जीआईएस स्टूडेंट

12

सरल उत्तर: नहीं। आपको ऐसा नहीं करना चाहिए।

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

यदि आपको OSM2grgrout (जहां नेटवर्क काफी छोटा है) या osm2po जैसे मौजूदा उपकरण का उपयोग नहीं करना है, तो आपको मूल OSM फ़ाइल से अपने हाथों को गंदा करना होगा।


1
बिल्कुल सही । यह भी एक और गलती है कुछ लोग करते हैं जब वे navteq और teleatlas डेटा संसाधित करते हैं। अंडरपास / ओवरपास एक दर्द है लेकिन एक वास्तविकता है।
रागी यासर बुरहुम

1
इस बात से सहमत। GIS में आपका स्वागत है जहाँ डेटा कम या ज्यादा खराब है
simplexio

3

आपकी सामान्य समस्या के बारे में, pgRout का उपयोग करते हुए: मुझे लगता है कि @Uffer, @GisStudent और अन्य जो दिखा रहे हैं कि "OSC & etc" का उपयोग कैसे किया जाए, वे सही हैं। "सर्वोत्तम प्रथाओं" और "मानकों" के सुरागों का पालन करें ...

आपके प्रश्न के बारे में: "चौराहों पर अलग-अलग खंडों में सड़कों को विभाजित करें" या "मूल अनप्लिट ज्यामितीय सभी को कैसे निकालना है"। मैं यहाँ आपके परिणाम यहाँ, चरण-दर-चरण दिखाने में मदद कर सकता हूँ ...

पहला कदम: टोपोलॉजी विश्लेषण

 CREATE TABLE split_points_topo as
  SELECT     
    a.gid as gid_a, b.gid  as gid_b, ST_Relation(a.geom, b.geom) as DE9IM_code
  FROM
    roads as a,
    roads as b
  WHERE a.gid != b.gid AND a.geom && b.geom;

 SELECT DISTINCT st_geometryType(geom) FROM roads;
 SELECT DISTINCT DE9IM_code FROM split_points_topo;
 -- list here the results o these two queries!  ... after we can continue.

2

एक और "आपकी समस्या का वास्तविक समाधान नहीं", लेकिन हमारा OSM कनवर्टर चौराहों पर विभाजित होता है, जबकि यह OSM से SHP में परिवर्तित हो जाता है। यह उस तरह से अधिक कुशल है, क्योंकि यह ज्यामितीय गणना करने के बजाय नोड्स की आईडी की तुलना कर सकता है।


1

इसे हल करने का एक तरीका एल्गोरिदमिक रूप से "चौराहों" के सेट पर प्रत्येक पूरी सड़क के प्रारंभ और अंत बिंदु को जोड़ना होगा, ताकि आप यह सुनिश्चित कर सकें कि हर खंड दो चौराहों के बीच है।

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