PostGIS में निकटतम ज्यामिति ढूँढना


16

मैं कार्यों के PostGIS "एपीआई" को देख रहा हूं, और मैं ध्यान देता हूं कि उनमें से अधिकांश की तुलना करने के लिए दो तत्व हैं। उदाहरण के लिए, ST_Distance फ़ंक्शन दूरी को खोजने के लिए दो ज्यामिति / भूगोल तत्वों को लेता है।

ऐसा करने के लिए कोई फ़ंक्शन नहीं है: "एक ज्यामिति जी को देखते हुए, मुझे टेबल टी में निकटतम ज्यामिति GClosest दें जहां Gid <> GClosest.id"

मुझे लगता है कि मैं एक PL / PgSQL फ़ंक्शन को टेबल पर पुनरावृत्त करने और प्रत्येक तत्व पर ST_Distance को कॉल करने के लिए लिख सकता हूं, लेकिन मुझे उम्मीद है कि एक बेहतर, अधिक कुशल, समाधान है।


1
आप निकटतम ज्यामिति, जांच के लिए दूरी में रुचि रखते हैं gis.stackexchange.com/questions/11979/...
UnderDark

मुझे बताएं कि क्या मैं सही समझ रहा हूं ... आप अगली विशेषता चाहते हैं जो सबसे निकटतम से समान दूरी है?
फाल्सीबार

जवाबों:


7

आपके प्रश्न का उत्तर एकल (यद्यपि जटिल) क्वेरी द्वारा दिया जा सकता है, जो निम्नलिखित की तरह है जो पूरे रिकॉर्ड और संदर्भ ज्यामिति की दूरी को लौटाता है। कृपया ध्यान दें कि यदि एक से अधिक रिकॉर्ड न्यूनतम दूरी से मेल खाते हैं, तो वे सभी वापस आ जाते हैं ।

SELECT 
  i.*,
  md.min_distance
FROM
  address AS i, 
  (SELECT 
     ga.address_geom,
     min( ST_Distance(
            ga.address_geom,
            gb.address_geom)
        ) AS min_distance
   FROM
     address AS ga,
     address AS gb 
   WHERE 
     ga.id <> gb.id 
   AND 
     ga.id = 3
   GROUP BY 
     ga.address_geom
  ) AS md 
WHERE 
  ST_Distance( i.address_geom, md.address_geom) = md.min_distance;

मैंने पते की तालिका पर इस प्रश्न का परीक्षण किया है और यह काम करता है। उपरोक्त क्वेरी में मैं id = 3 के साथ निकटतम बिंदु की तलाश कर रहा हूं।


यह अच्छी जानकारी है - धन्यवाद ... मैं परिभाषा से मिनट (..) को समझता हूं, लेकिन मैं इस बात पर उलझन में हूं कि यह आपके उदाहरण में कैसे उपयोग किया जा रहा है। st_distance (X, Y) दो ज्यामिति प्रकार लेता है और उन दोनों के बीच एक दूरी लौटाता है, जो एक एकल मान है। फिर आप उस एकल मान परिणाम पर एक समग्र कार्य क्यों कह रहे हैं? शायद मैं अंदर के चुनिंदा बयान की गलत व्याख्या कर रहा हूं ...
Jmoney38

द्वारा समूह गे ज्यामिति पर है जो पूरे परिणाम सेट के लिए एक स्थिर है (याद रखें कि जीए को आईडी = 3 द्वारा चुना गया है) इसलिए यह मूल रूप से कुछ भी नहीं है। यह सिर्फ दो बार फिर से तालिका में शामिल किए बिना बाहरी क्वेरी के st_distance में उपलब्ध जी ज्यामिति को प्राप्त करने की एक चाल है । आज मैं सोच रहा था कि शायद मैं विभाजन खंड का उपयोग करके पूरी तरह से सहज क्वेरी से दूर हो सकता हूं । इससे प्रदर्शन में भी सुधार होना चाहिए। मैं इसे आजमाऊंगा और आपको बताऊंगा।
unicoletti

दुर्भाग्य से विंडो फ़ंक्शंस 8.4 में पेश किए गए थे और अब मेरे पास एक ऐसे सर्वर तक पहुंच नहीं है जिसमें पोस्टगिस और वह संस्करण दोनों हैं, इसलिए मैं भाग खंड के साथ फिर से लिखे गए एक प्रश्न का परीक्षण नहीं कर सकता।
unicoletti

7

जॉर्ज मैककेरन ने एक सरलतम निकटतम पड़ोसी समारोह लिखा है, जिसे मैंने काफी उपयोगी पाया है। यह फ़ंक्शन किसी दिए गए फ़ीचर के निकटतम पड़ोसी की आईडी लौटाता है:

create or replace function 
  nn(nearTo                   geometry
   , initialDistance          real
   , distanceMultiplier       real 
   , maxPower                 integer
   , nearThings               text
   , nearThingsIdField        text
   , nearThingsGeometryField  text)
 returns integer as $$
declare 
  sql     text;
  result  integer;
begin
  sql := ' select ' || quote_ident(nearThingsIdField) 
      || ' from '   || quote_ident(nearThings)
      || ' where st_dwithin($1, ' 
      ||   quote_ident(nearThingsGeometryField) || ', $2 * ($3 ^ $4))'
      || ' order by st_distance($1, ' || quote_ident(nearThingsGeometryField) || ')'
      || ' limit 1';
  for i in 0..maxPower loop
     execute sql into result using nearTo              -- $1
                                , initialDistance     -- $2
                                , distanceMultiplier  -- $3
                                , i;                  -- $4
    if result is not null then return result; end if;
  end loop;
  return null;
end
$$ language 'plpgsql' stable;

उपयोग उदाहरण:

SELECT id, nn(pt_geom,0.00001,2,100,'nw_node','node_id','node_geom') FROM my_point_table;

... my_point_table में प्रत्येक प्रविष्टि के लिए nw_node तालिका में निकटतम नोड का चयन करता है।

बोस्टन जीआईएस साइट पर एक अधिक सामान्य कार्य भी है ।


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

हो सकता है कि आप इसे थोड़ा स्पष्ट करने के लिए अपने प्रश्न को पुनः प्रकाशित कर सकें, @ Jmoney48। तो आप विशेष रूप से निकटतम पड़ोसी समस्या में रुचि नहीं रखते हैं, बल्कि एक तालिका में सभी ज्यामितीयों के साथ एक ज्यामिति की तुलना कैसे करें?
UnderDark

हमेशा बोस्टन जीआईएस साइट के सामान्य कार्य का उपयोग करते हैं, सरल एक बड़ी तालिकाओं के लिए अविश्वसनीय रूप से धीमा है और इसे लागू करने का प्रयास बड़ा नहीं है।
१२:२५ पर व्लाद्न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.