PostGIS में एक तरफा बफ़र या समानांतर रेखाएँ बनाना?


19

मैं PostGIS में तथाकथित एकतरफा बफ़र या समानांतर रेखाएँ बनाने का एक रास्ता खोज रहा हूँ। उदाहरण: 1. बफर, 2. एक तरफ़, 3. दोनों तरफ़

वैकल्पिक शब्द

मुझे 2009 से मेलिंग सूची पर कुछ चर्चा मिली है और यह जानकारी है कि इसे GEOS में लागू किया गया है , लेकिन वर्तमान PostGIS स्थिति के बारे में कुछ भी नहीं है।

यदि फ़ंक्शन अभी तक कार्यान्वित नहीं किया गया है, तो क्या आपको कोई वर्कअराउंड पता है? क्या एक सामान्य बफर के एक तरफ काट करना संभव है?


तो आप ऑटोकैड में "ऑफसेट" के बराबर की तलाश कर रहे हैं?
dassouki

@dassouki: क्षमा करें, मुझे ऑटोकैड का पता नहीं है। लेकिन मुझे लगता है कि UMN Mapserver के पास एक "ऑफसेट" विकल्प है जो कि मैं जो चाह रहा हूं वह करूंगा।
UnderDark

600 पंक्तियों वाली तालिका से एक तरफा बफ़र या समानांतर रेखाएँ कैसे बनाएँ?

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

मैं एक MULTILINESTRING तालिका में समानांतर लाइनें कैसे बना सकता हूं?
फेलिप कोस्टा

जवाबों:


13

उचित एक तरफा बफ़र्स 1.5 में उतरने वाले थे , लेकिन यह मुझे दिखता है कि जब शैलियों ने भूमि की थी, तब तक पक्षपात नहीं हुआ था। हालांकि एक मौजूदा पैचसेट है जो GEOSSingleSidedBufferउम्मीद के मुताबिक एकतरफा बफर को उजागर और निष्पादित करता है। , नाम के तहत ST_OffsetCurve; टिकट # 413 में आगे की पृष्ठभूमि देखें । उपयोग में:

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1,'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)

नमस्ते, मैं इस समाधान का उपयोग करने की कोशिश कर रहा हूं, लेकिन अक्सर पोस्टगिस का उपयोग नहीं करता हूं - मैंने इस क्वेरी का परीक्षण किया है और कुछ अलग मान प्राप्त कर रहा हूं, लेकिन मैं उन सुविधाओं में अनुवाद कैसे करूं? मुझे बस अंत में लाइनें चाहिए, या तो मूल तालिका के भाग के रूप में, या एक नया। यह मेरी क्वेरी है: ST_AsText (ST_OffsetCurve (test_data_.geom, test_data__buffer_dis), 'join = miter mitre_limit = 5.0') का चयन करें। test_data_ से;
kflaw

@kflaw - आपने शायद इसे पहले ही समझ लिया है, लेकिन आपको केवल क्वेरी की शुरुआत में जोड़ने की आवश्यकता है: "नए रूप में बनाएं" या किसी दृश्य के लिए, "नया दृश्य बनाएं या बदलें" के रूप में चयनित कथन का अनुसरण करें।
jbalk

4

यह नमूना एक अलसी के दोनों ओर दो बहुभुज बनाता है। इसके लिए PostGIS 1.5 या उससे अधिक की आवश्यकता होती है। मुझे यकीन नहीं है कि यह खुद को पार करने वाली लाइनों के साथ कितनी अच्छी तरह से सामना करेगा।

SELECT ST_AsText(geom)

FROM ST_Dump ((

SELECT 
  ST_Polygonize(GEOMUNION(ST_Boundary(ST_Buffer(the_geom, 0.5, 'endcap=flat join=round')), the_geom)) AS buffer_sides 
FROM
  (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') AS the_geom) AS table1

));

यह आउटपुट:

                        st_astext

------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------
 POLYGON((0.5 5,0.509607359798385 5.09754516100806,0.538060233744357 5.19134171618254,0.584265193848727 5.2777851165098,
0.646446609406726 5.35355339059327,0.722214883490199 5.41573480615127,0.808658283817455 5.46193976625564,0.9024548389919
36 5.49039264020162,1 5.5,5 5.5,5 5,1 5,1 1,0.5 1,0.5 5))
 POLYGON((5 5,5 4.5,1.5 4.5,1.5 1,1 1,1 5,5 5))
(2 rows)

कोड निम्नलिखित तरीके से काम करता है:

  1. ST_Buffer का उपयोग करके linestring बफर करें। हम कस्टम एंडकैप का समर्थन करने वाले PostGIS 1.5 फीचर का लाभ उठाते हैं ताकि कोई भी एंड कैप न हो। नीचे उदाहरण देखें।
  2. विकी में प्रलेखित विधि का उपयोग करके, मूल लाइन का उपयोग करते हुए, दो बहुभुज को विभाजित करें ।

इससे भविष्य में सेल्फ-क्रॉसिंग लाइनों का सामना करने के लिए सुधार किया जा सकता है।

एक फ्लैट के साथ एक बफ़र किया गया है


3

यह संशोधन दो समानांतर लिनेस्ट्रिंग बनाता है। इसके लिए PostGIS 1.5 या उससे अधिक की आवश्यकता होती है।

आवश्यक ज्यामिति या wkt, और बफर में दूरी


SELECT astext(
     st_removepoint( 
     st_removepoint(        st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)')))         ,0),
      st_npoints(st_linemerge(ST_Difference(st_boundary(geom),ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)'))))-2)

    ) as parallel
    FROM ST_Dump ((
    SELECT 
    ST_Polygonize(st_union(ST_Boundary(ST_Buffer(geometria, 0.5, 'endcap=flat join=mitre mitre_limit=5.0')), geometria)) AS buffer_sides 
    FROM
    (SELECT ST_GeomFromText('LINESTRING(1 1, 1 5, 5 5)') 
        AS geometria) AS tabla))

-------------- परिणाम

"LINESTRING(0.5 1,0.5 5.5,5 5.5)"
"LINESTRING(5 4.5,1.5 4.5,1.5 1)"


0

क्योंकि मैं अभी भी यहाँ टिप्पणी नहीं कर सकता, इसलिए मैं इस उत्तर को जोड़ता हूँ

SCW सबसे अच्छा जवाब दे,

select ST_AsText(ST_OffsetCurve(
ST_GeomFromText('LINESTRING(10 10,10 20, 20 20 )'),
1, 'right', 'join=mitre mitre_limit=5.0'));
--------------
LINESTRING(20 19,11 19,11 10)

लेकिन फ़ंक्शन परिवर्तन की तरह दिखता है
http://postgis.refractions.net/docs/ST_OffsetCurve.html

अब 'right'पैरामीटर आवश्यक नहीं है। सकारात्मक दूरी का उपयोग करने से बाईं ओर का निर्माण होगा और नकारात्मक दूरी से दाईं ओर का निर्माण होगा

इसके अलावा मेरी डाक के साथ कोई पैच की जरूरत नहीं है

SELECT PostGIS_full_version();
"POSTGIS="2.0.3 r11132" GEOS="3.3.8-CAPI-1.7.8" 
PROJ="Rel. 4.8.0, 6 March 2012" GDAL="GDAL 1.9.2, 
released 2012/10/08" LIBXML="2.7.8" LIBJSON="UNKNOWN" RASTER"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.