2012-04-23 11 views
8

मुझे ऐसी समस्या है और मैं अच्छा होगा अगर कोई मेरी मदद कर सके। मेरे पास गिस्ट इंडेक्स के साथ पॉइंट टेबल है। वे बिंदु समय में नहीं बदलते हैं।निर्दिष्ट दूरी सीमा में लिनेस्ट्रिंग के साथ निकटतम बिंदु खोजें और

मैं कुछ दिए गए लिनेस्ट्रिंग के पास बिंदु लाने के लिए चाहता हूं। उदाहरण: कल्पना करें कि लिनेस्ट्रिंग सड़क है और सड़क सड़क के साथ poi हैं। मैं पीओआई प्राप्त करना चाहता हूं जो दी गई सड़क से 5 किमी की दूरी पर हैं। मैं उन pois को सही क्रम में (सड़क के साथ ड्राइविंग आदेश) लाने के लिए चाहता हूँ। 5 इंगित 1 से दी गई सड़क के लिए

image

मैं POIs सड़क के साथ सड़क से और क्रम में बिंदु 1 से 5 किमी दूर अधिकतम करने के लिए 5 में है कि लाने के लिए करना चाहते हैं: छवि को देखो। तो परिणाम होना चाहिए:

POI_ID 
1 
5 
6 
8 
9 
10 
12 
13 

यह मैं बताना चाहिए क्या POI मैं कम से कम लागत के साथ सड़क के साथ यात्रा के दौरान यात्रा कर सकते हैं।

क्या किसी के पास कुछ विचार हैं कि पोस्टग्रेस और पोस्टगिस के साथ इसे कैसे किया जाए?

उत्तर

8

आप यह मानते हुए ज्यामिति कॉलम geom कि तालिकाओं में मीटर की अनुमानित SRID का उपयोग road (LINESTRING) और poi (इशारा करें), आपकी क्वेरी सड़क के 5 किमी (जहां आईडी = 123 के भीतर सभी POIs खोजने के लिए) होना चाहिए कुछ की तरह:

SELECT poi.*, ST_Distance(road.geom, poi.geom)/1000.0 AS distance_km 
FROM road, poi 
WHERE road.id = 123 AND ST_DWithin(road.geom, poi.geom, 5000.0) 
ORDER BY ST_LineLocatePoint(road.geom, poi.geom), 
     ST_Distance(road.geom, poi.geom); 

ST_LineLocatePoint के साथ पहली ORDER हिस्सा 0.0 और 1.0 के बीच एक अंश का उपयोग करता है, निर्भर करता है, जहां बिंदु LINESTRING साथ है। यदि सड़क की दिशा "गलत तरीका" जा रही है, तो ऑर्डर को रिवर्स करने के लिए DESC संलग्न करें। दूसरा ORDER भाग दूरी पर आधारित है, जिसका उपयोग तब किया जा सकता है जब बिंदु LINESTRING के प्रारंभ/अंत से थोड़ा सा हो (जहां ST_LineLocatePoint क्रमश: 0.0 या 1.0 लौटाएगा)।

यह क्वेरी भी काम कर सकती है यदि आप geography प्रकार का उपयोग लंबे/अक्षांश मानों के साथ कर रहे हैं, क्योंकि यह स्वचालित रूप से मीटर की गणना करता है - डिग्री नहीं। अधिक जानकारी के लिए डॉक्स की जाँच करें:

+0

अपने जवाब के लिए धन्यवाद (या PostGIS के पुराने संस्करणों के लिए ST_Line_Locate_Point)। मुझे लगता है कि यह काम नहीं करेगा क्योंकि आदेश गलत होगा। यदि आईडी = 123 के साथ सड़क (लिनेस्ट्रिंग) अंक 1,2,3,4 है तो मैं अंक (pois) लाने के लिए चाहता हूं ताकि आप सड़क के साथ गुज़र जाएंगे, तो पहले बिंदु 1 के पास सबसे नज़दीकी पोई, फिर 2, 3 और linestring के अंतिम बिंदु से समाप्त 4. –

+0

आह मैं देखता हूं, 'ST_Line_Locate_Point' का उपयोग करने के लिए उत्तर अद्यतन करें। –

+0

मैं अपने दोस्त की कोशिश करूंगा :) इसके अलावा मैंने प्रश्न को और अधिक समझने के लिए अद्यतन किया। –

0

ऐसा लगता है कि आप पिछले गर्मियों के पोस्टग्रेएसक्यूएल 9.1 रिलीज से केएनएन-जीआईएसटी फीचर से लाभ उठा सकते हैं और पोस्टजीआईएस संस्करण 2.0 द्वारा समर्थित हैं।

http://blog.opengeo.org/2011/09/28/indexed-nearest-neighbour-search-in-postgis/

संबंधित मुद्दे