पोस्टजीआईएस ज्यामिति को एक प्रतिशत से बढ़ाना


10

मैं एक PostGIS ज्यामिति के चारों ओर एक बफर जोड़ने का एक तरीका ढूंढ रहा हूं, लेकिन बफर का आकार ज्यामिति के आकार पर निर्भर होना चाहिए। यही है, मैं चाहता हूं कि प्रत्येक ज्यामिति 5% से बढ़े, कहे।

विचार यह है कि मैं जियोमैट्रीज़ को इंटरसेक्ट कर रहा हूं, लेकिन हर एक के साथ 5% तक की त्रुटि हो सकती है जिसे मैं ध्यान में रखना चाहता हूं।

किसी को भी इस बारे में जाने का सबसे अच्छा तरीका पता है?

डेटाबेस में एक लाख पंक्तियाँ हैं, इसलिए मैं इसे बहुत तेज़ होना पसंद करूँगा।


2
5% क्या? मान लें कि आप बहुभुज का उपयोग कर रहे हैं, तो क्या यह सबसे बड़ी चौड़ाई का 5% है, सबसे लंबी चौड़ाई, बाउंडिंग बॉक्स, सेंट्रो से एक शीर्ष की दूरी ...? यदि आप बिंदुओं या रेखाओं के बारे में बात कर रहे हैं, तो यह और भी कम समझ में आता है!
M20Viking

मुझे वर्टेक्स-सेंटीमीटर की दूरी का अनुमान है - या संभवतः क्षेत्र में 5% की वृद्धि भी ठीक होगी। बाउंडिंग बॉक्स को बढ़ाना ठीक है यदि ज्यामिति को स्केल किया जाता है तो उस बाउंडिंग बॉक्स को भरें। सभी जियोमेट्री बंद बहुभुज हैं (बहुसंख्यक चतुर्भुज हैं)।
जेम्स बेकर

जवाबों:


8

टिप्पणियों का सुझाव है कि 5% को उच्च सटीकता के साथ प्राप्त करने की आवश्यकता नहीं है। (यदि ऐसा है, यह एक ले जाएगा लंबे समय से एक लाख बहुभुज बफ़र होना!) इसलिए हम आह्वान कर सकते हैं पिज्जा सिद्धांत : रैखिक एक 2D सुविधा एक पहलू से rescaling एक rescales अपने क्षेत्र से एक ^ 2।

यहाँ कैसे तर्क दिया जाता है:

  • जब आकार बहुत जटिल नहीं होता है - खासकर अगर यह उत्तल है - तो बफरिंग एक केंद्रीय बिंदु के चारों ओर आकृति को आकार देने के लिए तुलनीय परिणाम पैदा करता है। (यह समझना महत्वपूर्ण है, हालांकि, बफ़रिंग कभी भी डिस्क के अलावा किसी भी आकार के लिए एक rescaling के बराबर नहीं है । कुछ अवतल आकृतियों के लिए, rescaling के माध्यम से गणना की गई "बफर" वास्तव में मूल आकृति के कुछ हिस्सों को शामिल नहीं कर सकती है! इसलिए अंततः! हम आकृति के एक वास्तविक बफर की गणना करेंगे , लेकिन अनुमान लगाने के लिए केवल अनुमान के रूप में इस अनुमानित समानता का उपयोग कर रहे हैं कि कितना बफर द्वारा अनुमान लगाया जाए ।)

  • यदि बफ़र्ड क्षेत्र 5% से अधिक होना है, तो पुनर्विक्रय की मात्रा sqrt (1 + 5/100) होनी चाहिए, जो 1.025 के करीब है: अर्थात, हमें सभी दिशाओं में 2.5% द्वारा आकार का विस्तार करना चाहिए। ।

  • समान रूप से, अगर हम आकार को "व्यास" (एक विशिष्ट दूरी के बराबर) के रूप में मानते हैं, तो इसकी त्रिज्या 2.5% तक बढ़नी चाहिए। यह 2.5% / 2 = 1.25% व्यास के बराबर है।

  • हम आकृति के बाउंडिंग बॉक्स से एक विशिष्ट व्यास का अनुमान लगा सकते हैं। बॉक्स के साइड की लंबाई के एक अंकगणितीय या ज्यामितीय माध्य का उपयोग करें, कहें।

यह निम्नलिखित वर्कफ़्लो का सुझाव देता है:

  1. आकृति के बाउंडिंग बॉक्स को प्राप्त करें।

  2. बॉक्स के साइड की लंबाई का औसत होने दें ।

  3. ई के 1.25% द्वारा आकार को बफर करें ; वह है, (5/100) / 4 *

क्योंकि चरण 1 और 2 को बहुत कम गणना की आवश्यकता होती है, यह स्वयं को सबसे अधिक संभव समाधानों में से एक के रूप में प्रस्तुत करता है। सटीकता की जांच के रूप में, आप (निश्चित रूप से) बफ़र्ड आकृतियों के क्षेत्रों की गणना कर सकते हैं और मूल क्षेत्रों से उनकी तुलना करके देख सकते हैं कि वे वांछित 5% वृद्धि के कितने निकट आते हैं। कभी-कभी बफ़र किए गए क्षेत्र 5% से भी अधिक होंगे, लेकिन यह दुर्लभ होना चाहिए कि वे कम हैं, और उनके लिए सराहना कम होना असंभव है।

उदाहरण

एक जांच और चित्रण के रूप में, आइए कुछ सरल आकृतियों पर विचार करें।

  1. त्रिज्या r की एक डिस्क में एक बाउंडिंग बॉक्स होता है जिसकी लंबाई 2 r होती है । हमारा सूत्र = (5/100) / 4 * 2 * आर = आर / 40 की गणना करता है । बफर आकार स्पष्ट रूप से त्रिज्या आर + आर / 40 = 1.025 आर की एक गाढ़ा डिस्क है । पुराना क्षेत्र pi * r ^ 2 था जबकि नया क्षेत्र pi * (1.025 r ) ^ 2 = pi * 1.0506 * r ^ 2 है, जो 5.06% अधिक है।

  2. पक्षों लंबाई के निर्देशांक कुल्हाड़ियों के समानांतर के साथ एक आयत r और रों देता = ( आर + रों ) / 2। आयत को बफ़र करने का अतिरिक्त क्षेत्र चौड़ाई के चार आयतों (5/100) / 4 e = e / 80 = ( r + s ) / 160 से होता है जो कि किनारों पर त्रिज्या e / 80 की भुजाओं के साथ-साथ चार चौथाई हलकों की भी सीमा होती है । क्वार्टर-सर्कल की उपेक्षा करना, जो अन्य क्षेत्रों की तुलना में छोटा होगा, कुल नया क्षेत्र बराबर होता है

    2 ( आर + एस ) * ( आर + एस ) / 160 = ( आर ^ 2 + एस ^ 2 + 2 आर * एस ) / 80।

    जब r और s बहुत भिन्न नहीं होते हैं, तो हम r ^ 2 + s ^ 2 का आंकड़ा लगभग 2 r * s कर सकते हैं । यह सन्निकटन से 4 कुल नए क्षेत्र को सरल आर * रों / 80 = 5 की वास्तविक क्षेत्रफल% r * रों के रूप में इरादा,।


4

आप मेरे विचार से ST_Scale ( http://postgis.net/docs/ST_Scale.html ) और ST_Translate ( http://postgis.net/docs/ST_Translate.html ) के संयोजन का उपयोग करना चाहते हैं । हमारे पास PostGIS इन एक्शन और चैप्टर 8 में इसका उदाहरण है। यदि आपके पास पुस्तक नहीं है, तो आप यहाँ उस अध्याय के लिए कोड डाउनलोड कर सकते हैं:

http://www.postgis.us/chapter_08

पुस्तक से स्निपेट उदाहरण के लिए देखें 8.26:

    -- Listing 8.26 Combining Scale and Translation to maintain centroid
    SELECT xfactor, yfactor, 
       ST_Translate(ST_Scale(hex.the_geom, xfactor, yfactor), 
       ST_X(ST_Centroid(the_geom))*(1 - xfactor), 
       ST_Y(ST_Centroid(the_geom))*(1 - yfactor) ) As scaled_geometry
    FROM 
 ( SELECT ST_GeomFromText('POLYGON((0 0,64 64,64 128,0 192,-64 128,-64 64,0 0))') As the_geom)  As hex
    CROSS JOIN (SELECT x*0.5 As xfactor 
        FROM generate_series(1,4) As x) As xf
    CROSS JOIN (SELECT y*0.5 As yfactor
        FROM generate_series(1,4) As y) As yf;

काम करता है। अब वहाँ भी लगता है, ST_Transscaleलेकिन किसी तरह मैं समझ नहीं पा रहा हूँ कि कैसे काम करें ...
n1000

0

यह पार्टी के लिए बहुत देर हो चुकी है लेकिन मैंने हाल ही में एक कस्टम PostGIS फ़ंक्शन विकसित किया है जो ऐसा करता है, साथ ही यदि आवश्यक हो तो इसे सिकुड़ रहा है:

ST_Dilate

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