PostGIS में एक केंद्र रेखा के साथ समानांतर रेखाओं की गणना करें


10

मेरे पोस्टग्रेक्यूएल डेटाबेस में मेरे पास स्ट्रीट (रोड सेंटर लाइन) और बहुभुज टेबल हैं। नमूना परिदृश्य इस प्रकार है:

नमूना परिदृश्य

मुसीबत:

मुझे गली के चारों ओर 50 मीटर बफर के चौराहे पर सड़क के साथ समानांतर रेखाओं की गणना करने की आवश्यकता है और दोनों तरफ निकटतम इमारत बहुभुज। वांछित आउटपुट परिदृश्य है:

वांछित उत्पादन परिदृश्य

मैंने क्या कोशिश की है:

मेरा दृष्टिकोण था:

 1) Generate 50m buffer around street layer
 2) get the intersection of buffer and polygons
 3) Compute the distance
 4) Draw offset curves (parallel lines) at both sides of street layer
 5) Merge both curves to get parallel lines at the intersection

यहाँ मेरा प्रयास है:

    WITH street_buffer AS (
     SELECT
      street.gid street_id,
      street.geom street_geom,
      ST_Buffer(street.geom, 50, 'endcap=square join=round') geom1,
      building.geom  geom2  
     FROM street
     LEFT JOIN building on ST_DWithin(building.geom, street.geom, 50)
     ORDER BY street_id
    ),
    selected_buildings AS (
     SELECT
      street_id,
      street_geom,
      ST_Intersection(geom1, geom2) geom
     FROM street_buffer
    ),
    distance AS (
     SELECT 
      street_id,
      street_geom,
      ST_Distance(street_geom, geom) as dist
     FROM selected_buildings 
    ),
    curves AS (
     SELECT 
      street_id,
      ST_OffsetCurve(ST_LineMerge(street_geom), dist) as curve1,
      ST_OffsetCurve(ST_LineMerge(street_geom), -dist) as curve2
     FROM distance
     ORDER BY street_id
    )
    SELECT 
     street_id,
     ST_Union(curve1, curve2) geom 
    FROM curves
    ORDER BY street_id

उपरोक्त कोड के साथ समस्या यह है कि यह वांछित आउटपुट के अनुसार समानांतर लाइनों को वापस नहीं करता है, अर्थात, सभी बहुभुज चौराहों पर समानांतर रेखाएं निकटतम बहुभुज के चौराहे पर उत्पन्न हो रही हैं।

EDIT_1:

उपरोक्त कोड का वास्तविक उत्पादन है:

code_output

हालांकि, उपरोक्त आउटपुट में केवल पीली समानांतर रेखाएं (सड़क के दोनों ओर निकटतम बहुभुजों के लिए वक्र घटती हैं) की आवश्यकता होती है:

वास्तविक आउटपुट में आवश्यक लाइनें

क्या कोई मुझे सुझाव दे सकता है कि वांछित आउटपुट कैसे प्राप्त करें?


क्या आप वास्तविक आउटपुट की एक छवि जोड़ सकते हैं? यह समस्या को समझने में मदद करता है।
झुकाव

@ विल्ट: मैंने प्रश्न संपादित किया है। बस वास्तविक आउटपुट को जोड़ा और वास्तविक आउटपुट में समानांतर लाइनों की आवश्यकता है।
khajlk

समस्या आपके विचार से अधिक जटिल है। प्यास आपको यह पता लगाना है कि गली के किस तरफ घर हैं। इसके बाद ही आप दोनों तरफ से सबसे नज़दीक पा सकते हैं । यहाँ एक पोस्ट है जिसमें सही पक्ष खोजने के लिए उदाहरण कोड है: gis.stackexchange.com/questions/156578/…
झुकाव

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

एक चीज जो मैं देख रहा हूं वह यह है कि बफर बेमानी है। आप बस स्टैडविथिन का उपयोग कर सकते हैं और दूरी के रूप में 50 का उपयोग कर सकते हैं। (सड़कों का चयन करें, भवनों जहां st_dwithin (सड़कों, भवनों, 50))
jbalk

जवाबों:


1

यदि आपने CTE को इस प्रकार संशोधित किया है:

distance AS (
 SELECT 
  street_id,
  street_geom,
  MIN(ST_Distance(street_geom, geom)) as dist
 FROM selected_buildings
 GROUP BY street_id, street_geom
)

तब प्रत्येक सड़क के लिए केवल सबसे छोटी दूरी वापस आ जाएगी, और उस दूरी पर एक जोड़ी ऑफसेट लाइनें उत्पन्न होंगी।


सुझाव के लिए धन्यवाद। मैं इसका परीक्षण करूंगा और देखूंगा कि क्या यह अपेक्षित परिणाम देता है। मैं इस मुद्दे को हल करने के लिए चारों ओर खुदाई कर रहा हूं। मैंने एक पागल विचार की खोज की: सड़क के चारों ओर 1 मीटर बफर के साथ शुरू करने के लिए और क्रमिक रूप से बफर को बढ़ाएं और दोनों तरफ की इमारतों की खोज करें जब तक कि इमारतों की गिनती 2 न हो, तब इस बफर दूरी को सड़क की चौड़ाई के रूप में वापस करें। उपरोक्त सभी व्यायाम का अंतिम उद्देश्य।
khajlk

यह सच है कि आपके सुझाव का उपयोग करके केवल एक जोड़ी ऑफसेट उत्पन्न होता है। हालाँकि, ऊपर दिखाई गई पीली
समानांतर रेखाएँ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.