PostGIS में लाइनों से बहुभुज बनाएं


13

मैं एक बहुभुज को एक पंक्ति से छोटे बहुभुजों में विभाजित करने की कोशिश कर रहा हूं, लेकिन मुझे लगता है कि मैं st_split फ़ंक्शन का उपयोग नहीं कर सकता। लिनेस्ट्रिंग ग्रिड का उपयोग करके मुझे एक बड़े के अंदर छोटे बहुभुज बनाने की आवश्यकता है।

मैंने कुछ तरीके आजमाए हैं, लेकिन मुझे इसका परिणाम नहीं मिला। मैंने क्या कोशिश की है:

St_split () का उपयोग करते हुए एक रेखा से एक बहुभुज को विभाजित करें

एक सीमा बहुभुज से।

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

और लिनेस्ट्रिंग टेबल:

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

मुझे निम्न बहुभुजों की आवश्यकता होगी:

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

समस्या : मैं कई लाइनों से एक बहुभुज को विभाजित नहीं कर सकता, न ही बहुभुज से बहुभुज।

दूसरी विधि जो मैं कोशिश कर रहा हूं वह है कि st_polygonize () एसक्यूएल I के साथ लाइनों से एक बहुभुज बनाना है:

SELECT 
   g.path[1] as gid, 
   g.geom::geometry(polygon, 22033) as geom 
FROM
   (SELECT 
     (ST_Dump(ST_Polygonize(geom))).* 
   FROM linestable
) as g;

PostgreSQL और PostGIS का उपयोग करके लाइन सेगमेंट से बहुभुज बनाने से निकाला गया

समस्या : मैं केवल एक बहुभुज (सीमा) प्राप्त कर सकता हूं।

क्या कोई मुझे बता सकता है कि लिनेस्ट्रिंग से बहुभुज प्राप्त करने का सबसे अच्छा तरीका क्या होगा, या क्या मुझे कुछ याद आ रहा है?

नोट: टेबल्स एक ही SRID में हैं, और जियोमेट्री एक ग्रिड में फंस गए हैं। QGIS में मैं बहुभुज की प्रक्रिया को लाइनों से बहुभुज तक पूरी तरह से चला सकता हूं।

जॉन की मांग के रूप में, यहाँ लिनेस्ट्रिंग टेबल है। https://drive.google.com/file/d/0B603y_m735jfS014S0EyVnpMUEU/view?usp=sharing


1
आप कहीं linestring geometries पोस्ट कर सकते हैं? ST_Dump को ST_Dump के साथ काम करना चाहिए।
जॉन पॉवेल

ज़रूर। मैंने पोस्ट को तालिका के लिंक के साथ संपादित किया है।
पाब्लो पार्डो

@ JohnPowellakaBarça आप इसे देख सकते हैं। यह प्रश्न महान है। ST_Polygonize अपने नमूना सेट पर एक एकल बहुभुज देता है। हमें अनिवार्य रूप से खुले लिनेस्ट्रिंग्स की उसकी गंदगी को कम करने और उन सभी को खोजने की आवश्यकता है जो आयताकार बना सकते हैं?
इवान कैरोल

1
@EvanCarroll। ज़रूर। मैं पागलपन से व्यस्त हूं, इसलिए शायद कुछ दिनों के लिए नहीं।
जॉन पॉवेल

1
@ppardoz। एवेरो क्यू एस्टो ते अय्यूड। मैंने देखा कि आपकी तालिका में सभी स्पेनिश :-)
जॉन पॉवेल

जवाबों:


4

मैं का उपयोग करके यह काम कर रहे हो गया ST_Node पहले, के साथ संयोजन के रूप में ST_Collect , एक के भीतर noded LineStrings के एक सेट में लाइनों कन्वर्ट करने के लिए MultiLinestring

जैसा कि ST_Node के लिए डॉक्स में कहा गया है :

पूरी तरह से नोड्स का एक सेट नोड का उपयोग करते हुए कम से कम संभव संख्या में नोड्स का उपयोग करते हुए सभी इनपुट को संरक्षित करना।

इसका मतलब यह है, यह है कि सभी अलंकारों को सभी संभव संयोजनों में संयोजित किया जाता है, ताकि बहुभुज की बाहरी रिंग के बराबर हो सके। जबकि, यदि आप लाइनस्ट्रीम का एक सेट ST_Polygonize करने का प्रयास करते हैं, तो इनमें से कोई भी स्वयं एक बहुभुज का वर्णन नहीं करता है, तो आप बस लाइनस्ट्रीम वापस प्राप्त करते हैं। तो, यह काम करता है:

WITH multi(geom) AS (
  SELECT ST_Node(ST_Collect(geom))
  FROM leyenda_digitalizar00
)
SELECT ST_AsText( (ST_Dump(ST_Polygonize(geom))).geom )
FROM multi;

यदि आप इसका पहला भाग चलाते हैं, अर्थात, CTE बहु, आउटपुट जैसा दिखता है:

बहुभाषी ((204.5 69.9000000000004,204.5 69.9000000000004), (204.5 68.9,205.4 68.9), (204.5 68.9,204.5 69,204.5 69.2,204.5 69.2,204.5 69.3,204.5 69.4,204.5 69.5,204.5 69,204, 69.65,204,69,69,69,69,80,69,204) एक दिन का समय है। 204.5 69.9000000000004), (209.5 68.9,209.5 68.8,209.5 68.7,209.5 68.6,209.5 68.5,209.5 68.4,209.5 68.3,209.5 68.2,209.5 68.1,209.5 68,209.5 68,209.5 68.8,209.5, 67.8,209.5, 68.8,209.5, 68.8,209.5, 68.8,209.5, 68.8,209.5, 68.8,209.5 है। , 209.5 ……।

अब, जब आप अब इस MultiLinestring को ST_Polygonize को खिलाते हैं, तो यह अपेक्षित रूप से काम करता है, जैसे,

POLYGON ((205.4 68.9,204.5 68.9,204.5 69,204.5 69.1,204.5 69.2,204.5 69.3,204.5 69.4,204.5 69.5,204.5 69.6,204.5 69.7,204.5 69.8,204.5 69.9,204.5 69.9,000000000004,205.4 69.9,205.4 69.45, 69.3,204.5 69,204, 69,204, 69,204, 69,204, 69,204,69.5, 69,204, 69,80,69,69,204, एक अमावस्या)।

POLYGON ((204.5 69.9000000000004,204.5 70,204.5 70.1,204.5 70.2,204.5 70.3,204.5 70.4,206.8 70.4,209.5 70.4,209.5 70.3,209.5 70.2,209.5 70.1,209.5 70,209.5 70,209.5 69,205) 69.95.59.55.55

POLYGON ((206.8 70.4,204.5 70.4,204.5 70.5,204.5 70.6,204.5 70.7,204.5 70.8,204.5 70.9,204.5 71,204.5 71.1,204.5 71.2,204.5 71.3,204.5 71.4,206.8 71.4,206.8 70.4,206.8 70.4)

जाहिर है, ST_AsText केवल चित्रण के लिए है, और आपको पथ आईडी भी चाहिए, तो आपको ट्विक करना होगा।

मुख्य टेकअवे यह है कि ST_Polygonize लाइनस्ट्रेग की अपेक्षा करता है जो पहले से ही बहुभुज की रूपरेखा का वर्णन करता है , जो कि ST_Node (ST_Collect (.... ऊपर) करता है।


यह वास्तव में अच्छा है, मैं पुष्टि कर सकता हूं कि यह समाधान काम करता है! दूसरी तरफ, मुझे आश्चर्य है कि ST_Polygonize()यह क्यों कहता है कि यह लाइन स्ट्रिंग्स लेता है, या इसके लिए उपयोग का मामला क्या है, ST_Node()पहली कॉल के बिना
इवान कैरोल

1
@EvanCarroll। मुझे लगता है कि उत्तर यह है कि ST_Polygonize Linestrings लेता है जो पहले से ही एक बहुभुज का प्रतिनिधित्व करने वाले सेट में होता है, जबकि इस प्रश्न में linestrings कई संभावित बहुभुजों से बना है। मेरी समझ यह है कि यह वही है जो ST_Node करता है। मैं आगे की जांच करने और उत्तर को अपडेट करने का प्रयास करूंगा।
जॉन पॉवेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.