आइसोपायगोन से आइसोलेटिन को पोस्टगिस से कैसे बदलें?


9

मेरे पास एक टेबल है आइसोलेट्स की एक पोस्टगिस टेबल जो इस तरह परिभाषित है:

CREATE TABLE myisolines
(
  gid serial NOT NULL,
  isotime timestamp without timezone,
  val numeric(10,4),
  geom geometry(LineString,4326)
);

नेत्रहीन रूप से यह लिनेस्ट्रिंग ऑब्जेक्ट इस तरह दिखते हैं:

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

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

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

मैं isopolygons की एक तालिका का निर्माण करना चाहते myisopolygonsसे myisolinesबहुभुज के साथ तालिका,, कि ओवरलैप नहीं लेकिन एक सतत सतह बना सकते हैं और एक कॉलम होगा valन्यूनतम के साथ valisolines की है, जिसमें से बहुभुज गठन किया गया था। मैं समझता हूं कि इसे स्वयं-बंद आइसोलिन (द्वीप), या आइसोलिन को बॉक्स के साथ बंद करके बनाया valजा सकता है , उस स्थिति में उस विशेष आइसोलिन से लिया जाना चाहिए। नेत्रहीन को इस तरह दिखना चाहिए:

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

मैंने सोचा कि मैं किसी तरह टोपोलॉजी बना सकता हूं और फिर पॉलीगोन में चेहरे बदल सकता हूं, लेकिन मुझे समझ नहीं आता कि इसे कैसे ठीक से किया जाए। यह कैसे किया जा सकता है?

एक अन्य विकल्प बॉक्स और प्रत्येक बनाए गए बहुभुज के बीच अंतर फ़ंक्शन का पुनरावर्ती उपयोग करना होगा, लेकिन मुझे लगता है कि ऐसा करने का सही तरीका नहीं है, और निश्चित रूप से बिल्कुल भी तेज़ नहीं है।


ST_Split या ST_BuildArea आपकी समस्या के लिए अच्छा उम्मीदवार हैं
nickves

जवाबों:


3

यहाँ एक समाधान का उपयोग कर रहा है ST_Polygonize। यह प्रत्येक सीमा के लिए एक बहुभुज बनाता है, और बहुभुज द्वारा कवर किया गया न्यूनतम और अधिकतम ऊंचाई प्रदान करता है। एल्गोरिथ्म एक चोटी और एक अवसाद के बीच अंतर नहीं कर सकता है और इन मामलों में न्यूनतम और अधिकतम दोनों के लिए समान ऊंचाई लौटाएगा।

WITH closed_contours AS (
    SELECT 
      ST_Union(geom) AS geom 
    FROM 
      (SELECT geom FROM contours 
       UNION ALL 
       SELECT ST_SetSRID(ST_Boundary(ST_Expand(ST_Extent(geom), -1e-10)), 4326) 
       FROM contours) 
sq)

SELECT
  poly_id, 
  min(polys.geom) AS geom, 
  min(elevation)  AS min_elev, 
  max(elevation)  AS max_elev
FROM
  (SELECT row_number() OVER () AS poly_id, geom FROM
      (SELECT 
         (ST_Dump(ST_Polygonize(geom))).geom
       FROM closed_contours) dump
  ) polys
INNER JOIN contours ON ST_Intersects(polys.geom, contours.geom)
GROUP BY poly_id;

WITHक्वेरी का क्लॉज किसी भी ओपन कंट्रोस को मौजूदा कॉन्ट्रोवर्सी की थोड़ी-सी कॉन्ट्रैक्ट सीमा के साथ जोड़कर "बंद" कर देता है। (यह सीमा किसी भी राउंड-ऑफ त्रुटियों पर धोने के लिए अनुबंधित है ST_Extent, जिसके उपयोग से एकल-सटीक बॉक्स का उत्पादन होता है ST_Polygonize, जिसके साथ पूरी तरह से बंद होने की आवश्यकता होती है और डॉल्ब-प्रिसिजन में न्यूड इनपुट की आवश्यकता होती है)। यदि आपके कंट्रोल्स पहले से ही बंद हैं (यानी, आप एक द्वीप के साथ काम कर रहे हैं), तो यह कदम छोड़ा जा सकता है।


0

मैं बहुत एक्साइटेड नहीं हूं, लेकिन मैं फंक्शन ज्योमेट्री ST_MakePolygon (ज्योमेट्री आउटरलिनेस्ट्रिंग, ज्योमेट्री [] इंटीरियरलाइनस्ट्रेस) की कोशिश करूंगा;


यह वास्तव में पूरी तरह से सवाल का जवाब नहीं है।
जॉन पॉवेल

0

अपने बॉक्स का उपयोग करके और प्रत्येक समोच्च रेखा पर पुनरावृत्ति करते हुए, आप ST_ConcaveHullप्रत्येक क्षेत्र को बहुभुज में बदलने के लिए उपयोग कर सकते हैं ।

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