PostGIS: लेयर B में लेयर A से निकटतम बिंदु तक बिंदु की ID असाइन करें


15

यह मेरे अन्य प्रश्न के लिए एक स्पष्ट अग्रदूत होना चाहिए था (जो मैंने नहीं पूछा): पोस्टजीआईएस में स्पाइडर आरेख (हब लाइनें) कैसे बनाएं?

अगर मुझे लेयर A (स्टोर्स) के एक पॉइंट और लेयर B (कस्टमर्स) के बीच के रिश्ते के बारे में नहीं पता है, तो मैं आम तौर पर कहना चाहूंगा कि "कस्टमर 1 को नजदीकी स्टोर द्वारा सेवित किया जाता है।" जबकि मुझे एहसास है कि यह सच नहीं हो सकता है, यह एक सभ्य सरोगेट हो सकता है।

PostGIS का उपयोग करना, लेयर B (ग्राहकों) के प्रत्येक बिंदु पर लेयर A (स्टोर्स) में निकटतम बिंदु की आईडी को असाइन करने का सबसे कुशल तरीका है। मैं जिस आउटपुट की तलाश कर रहा हूं, वह नीचे जैसा कुछ है।

Customer | Store
    1    |   A
    2    |   A
    3    |   B
    4    |   C

जवाबों:


6

इसी तरह:

CID_ID के रूप में A.ID का चयन करें, (A से B_ का चयन करें। B क्रम से st_distance (A.geom, B.geom) सीमा 1) A से STORE_ID के रूप में चुनें।


यह कार्य को पूरा करने का सबसे अच्छा तरीका था। मेरे द्वारा उपयोग किए गए वास्तविक कोड के लिए नीचे मेरा नोट देखें।
रयानकल्डन

8

ऐसा लगता है कि अगर आपके पास स्टोर करने की तुलना में बहुत अधिक ग्राहक हैं, तो इसकी एक परत बनाने के लिए अधिक कुशल हो सकता है स्टोरों के लिए वोरोनोई पॉलीगॉन , फिर स्टोर पॉलीगॉन के खिलाफ ग्राहकों का एक स्थानिक जुड़ाव करें।


1
मुझे यह तरीका पसंद है!
UnderDark

वोरोनोई पॉलिस बनाने के लिए कौन सा दृष्टिकोण सबसे आसान होगा? क्या अन्य विकल्प हैं कि यहाँ क्या नोट किया गया है: bostongis.com/ ...... bostongis.com/…
RyanKDalton

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


5

से http://www.bostongis.com/?content_name=postgis_nearest_neighbor :

यदि आपको किसी तालिका में सभी रिकॉर्ड के लिए निकटतम पड़ोसी प्राप्त करने की आवश्यकता है, लेकिन आपको केवल प्रत्येक के लिए पहले निकटतम पड़ोसी की आवश्यकता है, तो आप सिंटैक्स पर PostgreSQL के विशिष्ट DISTINCT का उपयोग कर सकते हैं। जो कुछ इस तरह दिखेगा:

SELECT DISTINCT ON(g1.gid)  g1.gid As gref_gid, 
       g1.description As gref_description, 
       g2.gid As gnn_gid, 
       g2.description As gnn_description  
FROM sometable As g1, sometable As g2   
WHERE g1.gid <> g2.gid 
      AND ST_DWithin(g1.the_geom, g2.the_geom, 300)   
ORDER BY g1.gid, ST_Distance(g1.the_geom,g2.the_geom) 

इससे 300 यूनिट तक की न्यूनतम दूरी तय की जा सकेगी। तो, आपको पहले अपने डेटा की जांच करनी होगी और पता लगाना होगा कि आपकी न्यूनतम दूरी कितनी बड़ी होने वाली है।


3

आपको एक खोज बॉक्स में सबसे छोटी जोड़ी ढूंढनी है, और यदि बॉक्स में कुछ भी नहीं है, तो उसका विस्तार करें। यह सुंदर नहीं है, लेकिन यह काम करता है। यहाँ उदाहरण है PL / PgSQL कोड यहाँ http://trac.osgeo.org/postgis/wiki/UsersWikiNestest


3

सभी के इनपुट के लिए धन्यवाद। मैं अंततः ईपेंड और अंडरडार्क के सुझावों के संयोजन के साथ गया। अंतिम कोड जिसका मैंने उपयोग किया था:

CREATE TABLE closest_point as
SELECT DISTINCT ON (A.GID) A.GID AS CUST_ID, 
      (SELECT B.GID FROM "STORES" as B 
       ORDER BY ST_Distance(A.the_geom, B.the_geom) limit 1) as STORE_ID, 
       A.the_geom 
FROM "CUSTOMERS" as A, "STORES" as B;

फिर मैंने सही ढंग से काम किए गए परिणामों की पुष्टि करने के लिए दुकानों की परत पर एक वोरोनोई आरेख बनाया, जो निश्चित रूप से उन्होंने किया था। सभी महान काम के लिए धन्यवाद!

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