PostGIS बहुभुज बढ़त विश्लेषण (अभिविन्यास, किनारे की लंबाई)


9

मैं जीआईएस और विशेष रूप से पोस्टगिस की दुनिया के लिए नया हूं, इसलिए कृपया मुझे क्षमा करें यदि उत्तर स्पष्ट लगता है ...

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

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

एक परिणाम तालिका इस तरह दिख सकती है :

building_id | edge_id | orientation | edge_length
-------------------------------------------------
      1     |    1    |     315     |    10.0
      1     |    2    |      45     |     7.0
      1     |   ...   |     ...     |     ...

हालांकि, मुझे यकीन नहीं है कि यह आगे की प्रक्रिया के लिए परिणाम को स्टोर करने का एक स्मार्ट तरीका है (उदाहरण के लिए किनारे से अगली इमारत, आदि की दूरी की गणना)। तो मेरा सवाल दुगना है:

  1. क्या एक कुशल PostGIS फ़ंक्शन है जो बहुभुज के किनारों का विश्लेषण कर सकता है? यदि कोई मूल PostGIS फ़ंक्शन नहीं है, तो मैं वैकल्पिक रूप से पायथन-आधारित दृष्टिकोण में रुचि रखूंगा।
  2. पोस्टगिस तालिका में परिणाम को संग्रहीत करने का एक स्मार्ट तरीका क्या होगा, क्योंकि बहुभुजों में किनारों की संख्या अलग-अलग हो सकती है?

2
पहले बहुभुज के खंड बनाएं: stackoverflow.com/questions/7595635/… फिर स्टार्टपॉइंट और समापन बिंदु निर्देशांक X1, y1 और x2, y2 और ST_Azimuth (ST_Startpoint (geometries), ST_Endpoint (geometries) की तुलना में स्तंभों पर जाना चाहिए। । ( postgis.org/docs/ST_Azimuth.html )
तमस कोसा

1
@ तमसकोसा: आपके पास एक अच्छे उत्तर का सार है। एक में इसका विस्तार क्यों नहीं? इसके अलावा, मानदंडों के लिए, अज़ीमुथ को +/- पी / 2 की आवश्यकता है।
मार्टिन एफ

1
@TamasKosa यह एक दृष्टिकोण है जिसके बारे में मैं भी सोच रहा था। ST_ExteriorRing का उपयोग करें और फिर जैसा कि आप कहते हैं कि azimuths प्राप्त करें। मैं आदर्श रूप से परिणामों को कैसे संग्रहीत करूंगा, क्योंकि इमारतों में किनारों की संख्या भिन्न हो सकती है? जैसा कि मैंने ऊपर वर्णित एक तालिका में? मैं मार्टिनएफ के साथ सहमत हूं, यह लगभग एक उत्तर है;)
n1000

बस जिज्ञासु, आप मानदंड क्यों चाहते हैं ... सूरज एक्सपोजर?
मार्टिन एफ

1
आपके प्रश्न के पहले भाग का उत्तर दिया गया है - आप ST_Dumppoints और ST_Azimuth का उपयोग कर सकते हैं। दूसरे भाग के लिए, जैसा कि आउटपुट में कोई स्थानिक तत्व नहीं हैं, मुझे लगता है कि बहुभुज और धार_एड का एक लिंक होगा जैसा कि आपको मिल जाएगा।
जॉन पॉवेल

जवाबों:


10

कल मेरे पास इसे विवरण में बनाने का समय नहीं था ... 4 चरणों में मेरा समाधान देखें:

CREATE OR REPLACE VIEW bd_segment AS
SELECT
      ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) AS sp,
      ST_PointN(geom, generate_series(2, ST_NPoints(geom)  )) AS ep
    FROM
       -- extract the individual linestrings
       (SELECT (ST_Dump(ST_Boundary(the_geom))).geom
       FROM bd) AS linestrings;

CREATE OR REPLACE VIEW bd_segment_geom AS
SELECT sp, ep, st_makeline(sp, ep) 
FROM bd_segment;

CREATE OR REPLACE view bd_segment_id AS 
SELECT bd.gid, row_number() 
    OVER (order by bd.gid), degrees(st_azimuth(ff.sp, ff.ep)-1.57079633) AS az_deg,
    ST_LENGTH(ff.st_makeline) , ff.st_makeline FROM bd_segment_geom ff
JOIN bd ON st_touches(ff.st_makeline, bd.the_geom)
GROUP BY bd.gid, ff.sp, ff.ep, ff.st_makeline;

UPDATE bd_segment_id
SET az_deg = az_deg + 360
WHERE az_deg < 0;

अंतिम क्वेरी आपको st_touches का उपयोग करते हुए एक स्थानिक जुड़ने के साथ बिल्डिंग आईडी देती है। आशा है ये मदद करेगा। अद्यतन - qgis में समाधान इस तरह दिखता है: यहां छवि विवरण दर्ज करें


1
प्रभावशाली! मुझे यह काम करने के लिए मिला है। आपको बहुत - बहुत धन्यवाद! यह बड़ी संख्या में इमारतों के साथ थोड़ा धीमा हो जाता है। अज़ीमुथ अभी आदर्श नहीं हैं। क्या आपको इस बात का भी अंदाजा होगा कि इसे कैसे संबोधित किया जाए? मुझे यकीन नहीं है कि बहुभुज के "बाहरी" पक्ष को कैसे खोजना है।
n1000

1
इस तरह रेडियन में अजिमुथ में 90 डिग्रेसेज जोड़ें: डिग्री (st_azimuth (ff.sp, ff.ep) +1.57079633)। यह कभी-कभी 360 से बड़ा मान उत्पन्न करेगा। लेकिन एक अद्यतन क्वेरी के साथ आप उन को बदल सकते हैं। यदि आप एक स्थिर दृश्य के रूप में उपयोग करना चाहते हैं "क्रिएट मैटेरियलाइज्ड व्यू" बनाएं और यह पहली बार में धीमा नहीं होगा।
तमस कोसा

2
काफी नहीं। मान लें कि उत्तर 0 ° है, तो यह बहुभुज / भवन के अंदर की ओर सामान्य स्थिति देगा (जैसा कि आपके स्क्रीनशॉट में भी देखा गया है)। लेकिन आप सही कह रहे हैं - एक सरल UPDATEचाल चलनी चाहिए। इस महान समाधान के लिए फिर से धन्यवाद। मैं कुछ और दिनों की प्रतीक्षा करूंगा यदि स्वीकार करने से पहले अन्य उत्तर दिखाई दें।
n1000

1
किस बारे में ST_ForceRHR? यह जवाब वास्तव में ठीक लगता है।
जैकब कानिया

@JakubKania मैंने एक ST_ForceRHRसमाधान के साथ आने की कोशिश की , लेकिन सफल नहीं रहा। संकेत के लिए आभारी होंगे ... मैंने कोशिश कीST_Dump(ST_Boundary(ST_ForceRHR(the_geom)))
n1000
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.