किसी दिए गए बिंदु पर एक लिनेस्ट्रिंग पर निकटतम बिंदु कैसे प्राप्त करें?


28

मैं लंबे समय से PostGIS का उपयोग कर रहा हूं, लेकिन कभी भी LINESTRINGज्यामिति का उपयोग नहीं करना पड़ा ...! :)

यहां मैं क्या करना चाहूंगा: मेरे पास एक लाइनस्ट्रेस की तालिका है (किसी दिए गए शहर की सड़कों का प्रतिनिधित्व करना, SRID 3395) और मैं किसी दिए गए बिंदु (जीपीएस स्थिति, एसआरआईडी 4326) के लिए निकटतम लाइनस्ट्रेस ढूंढना चाहूंगा।

मैंने जो हल खोजा है वह expand()विधि का उपयोग करके मेरे बिंदु के भीतर के सभी अलंकारों का चयन करना है और विधि का उपयोग करते हुए प्रत्येक लिनेस्ट्रिंग और मेरे बिंदु के बीच की दूरी को निर्धारित करना है ST_Distance()

यहाँ एसक्यूएल है:

SELECT myLineId, myLineName, ST_Distance(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395),myLineGeom) AS myLineDistance
FROM myLines
WHERE myLineGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)
ORDER BY myLineDistance;

परिणाम मुझे ठीक लग रहे हैं, लेकिन मुझे लगता है कि मेरे कार्यान्वयन में कुछ गलत है।

1) क्या आप लोगों को लगता है कि expand()सभी संबंधित linestrings मिल सकते हैं?

2) क्या आप लोग सोचते हैं कि ST_Distance()उपयोग करने की सही विधि है? मुझे लगता है कि मैं यह गलत कर रहा हूं क्योंकि मैं जिस दूरी को प्राप्त करना चाहता हूं वह बिंदु और मेरी रेखा के बीच की सबसे छोटी दूरी है न कि बिंदु के बीच की दूरी और रेखा के एक बिंदु के बीच की दूरी।

उदाहरण:

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

जवाबों:


11

विज्ञापन 1) आपके उपयोग किए गए कार्यों के दस्तावेज़ीकरण को देखते हुए, मैं कहूंगा: "हां, सभी संबंधित linestrings मिलेंगे।"

विस्तार (ज्यामिति, फ्लोट)

यह फ़ंक्शन इनपुट ज्योमेट्री के बाउंडिंग बॉक्स से सभी दिशाओं में विस्तारित एक बाउंडिंग बॉक्स लौटाता है, दूसरे तर्क में निर्दिष्ट राशि से। क्वेरी के लिए एक इंडेक्स फ़िल्टर जोड़ने के लिए दूरी () प्रश्नों के लिए बहुत उपयोगी है।

A && बी

"&&" ऑपरेटर "ओवरलैप्स" ऑपरेटर है। यदि A का बाउंडिंग बॉक्स B के बाउंडिंग बॉक्स को ओवरलैप करता है तो ऑपरेटर सही लौटाता है।

विज्ञापन 2) आपको वह हासिल करने में सक्षम होना चाहिए जो आप चाहते हैं:

line_interpolate_point(linestring, line_locate_point(LineString, Point))

line_interpolate_point (लिनेस्ट्रिंग, स्थान)

एक रेखा के साथ एक बिंदु को इंटरपोल करता है। पहला तर्क एक LINESTRING होना चाहिए। दूसरा तर्क 0 और 1 के बीच एक फ्लोट 8 है जो कि कुल 2d लंबाई के अंश का प्रतिनिधित्व करता है।

line_locate_point (LineString, पॉइंट)

कुल 2d लाइन लंबाई के एक अंश के रूप में, दिए गए बिंदु पर निकटतम बिंदु के स्थान पर 0 और 1 के बीच एक फ्लोट देता है। आप किसी पॉइंट को निकालने के लिए दिए गए स्थान का उपयोग कर सकते हैं (line_interpolate_point)

स्रोत: http://main.merlin.com.ua/doc/postgis/docs/ch06.html


बिंदु 2 के लिए), मैं बस सोच रहा था कि एक बिंदु ज्यामिति और एक लाइनिंग ज्यामिति के बीच ST_Distance theses (उर्फ POINT और LINGESTRING के बीच लंबवत रेखा की लंबाई) के बीच सबसे छोटी दूरी संभव है; मैं हर LINESTRING ज्यामिति से दूरी चाहता हूँ :)
Vivi

और मुझे लगता है कि यह वह दूरी नहीं है जिसकी मैं तलाश कर रहा हूं क्योंकि "लाइन_लोकैट_पॉइंट फ़ंक्शन आपको 0 और 1 के बीच का मान देता है जो दिए गए बिंदु पर लाइनस्ट्रीम पर निकटतम बिंदु के स्थान का प्रतिनिधित्व करता है":
Vivi

मुझे डर है कि आपने अपनी आखिरी टिप्पणी में मुझे खो दिया। ); अब मुझे यकीन है कि अब और आप क्या चाहते हैं नहीं कर रहा हूँ
UnderDark

1
क्षमा करें :) मुझे यह पसंद है: एक LINESTRING ज्यामिति (एक पथ का प्रतिनिधित्व करते हुए) और एक POINT ज्यामिति देते हुए, मैं निकटतम POINT ज्यामिति रखना चाहता हूं जो पथ पर है (जो कि LINESTRING ज्यामिति परिभाषा का एक बिंदु नहीं हो सकता है)। यह स्पष्ट है? शायद मुझे अपनी पोस्ट को ड्राइंग के साथ अपडेट करना चाहिए: D
Vivi

मैं अपनी पोस्ट को यहाँ अपडेट नहीं कर सकता, जो मैं प्राप्त करना चाहता हूँ, उसकी एक ड्राइंग के लिए एक लिंक है: i.imgur.com/UwPxo.jpg
Vivi

7

अभिनंदन

पहला सवाल कि ST_Distance क्या देता है। ST_Distance लाइन और बिंदु के बीच की सबसे छोटी दूरी लौटाता है (या क्या ज्यामिति प्रकार इनपुट किए जाते हैं) इसका मतलब है कि ST_Distance बिंदु (1 3) और linestring (0 0,0 10) के बीच वापस आ जाएगी। दूरी को बीच में नहीं मापा जाएगा। बिंदु और (0 0) या बिंदु और (0 10) लेकिन बिंदु (1 3) से (0 3) तक।

इसलिए मैं जो समझता हूं कि ST_Distance आपको वह उत्तर देता है जो आप चाहते हैं।

यदि आप बिंदु (0 3) को ऊपर के उदाहरण में खोजना चाहते हैं तो आप ST_Closestpoint का उपयोग कर सकते हैं यदि आपके पास PostGIS 1.5 है तो मेरे उदाहरण के लिए आप इसे इस तरह उपयोग करते हैं: ST_Closestpoint ('LINESTRING (0 0,0 10' ':: ज्यामिति,') बिंदु (1 3) ':: ज्यामिति) तब आपको बदले में बिंदु (0 3) प्राप्त करना चाहिए, उस बिंदु पर बिंदु जो आपके बिंदु के सबसे करीब है।

HTH निकलस


5

मैंने इसे पाया :) (वैसे मुझे लगता है: P)

का उपयोग करते हुए ST_Line_Locate_Point()और ST_Line_Interpolate_point()मैं एक बिंदु प्राप्त करने में कामयाब रहा, जो कि LINESTRING परिभाषा का हिस्सा नहीं है, लेकिन उक्त पंक्ति पर IS :) मुझे बस इतना करना है कि मुझे अपने बिंदु से इस बिंदु तक दूरी प्राप्त करनी है और मैं कर रहा हूं।

SELECT AsText(ST_Line_Interpolate_Point(myLineGeom,ST_Line_Locate_Point(myLineGeom,ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395))))
FROM myLines
WHERE myGeom && expand(ST_Transform(GeomFromText('POINT(LON LAT)',4326),3395), 100)

ST_Line_Locate_Point()विधि भी बिंदु को लाइन पर निकटतम बिंदु के स्थान, खोजने के ST_Line_Interpolate_Pointविधि एक बिंदु में इस स्थान बदल जाते हैं।


1
बिंदु और रेखा के बीच St_distance आपको एक ही उत्तर देगा। आप ऐसा क्यों सोचते हैं कि आपको यह करना है?
निकलैस एवन

1
मुझे लगता है कि ST_Distance का उपयोग किसी भी ज्यामिति प्रकार के साथ किया जा सकता है। postgis.refractions.net/docs/ST_Distance.html :ST_Distance(geometry g1, geometry g2)
मैग्नो C

2

यह पोस्टगिस आर्काइव थ्रेड आपको http://postgis.refractions.net/pipermail/postgis-users/2007-June/016045.html पर जवाब दे सकता है


Refractions.net मेरे लिए काम नहीं करता है: "refractions.net 09/14/2010 को समाप्त हो गया और नवीकरण या विलोपन लंबित है।"
UnderDark

@underdark यह मेरे लिए काम करता है
dassouki

@dassouki: यह अजीब है: |
UnderDark

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