उन सुविधाओं का चयन करें जो PostGIS में प्रतिच्छेद नहीं करते हैं


41

यह मुझे इतना आसान सवाल लगता है (और शायद यह है) फिर भी मुझे ऐसा उदाहरण नहीं मिल रहा है जो मुझे इसका जवाब दे। PostGIS का उपयोग करते हुए, मैं केवल उन बिंदुओं का चयन करना चाहता हूं जो बहुभुज के बाहर आते हैं । अंततः यह ST_Intersects का व्युत्क्रम है, जहाँ तक मैं इसे देख सकता हूँ।

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

CREATE table t_intersect AS
SELECT 
  hp.gid, 
  hp.st_address, 
  hp.city, 
  hp.st_num,
  hp.the_geom
FROM 
  public.parcel as par,
  public.housepoints as hp
WHERE 
  ST_Intersects(hp.the_geom,par.the_geom);

मेरे पास एक ही विचार प्रक्रिया थी, सोचा था कि नहीं भी चाल को किसी भी अन्य स्थिति की तरह कर देगा
Luffydude

जवाबों:


41

कारण यह "नहीं intersects" के साथ काम नहीं करता है कि आप केवल जोड़े में ज्यामितीय तुलना करते हैं; असहमति के साथ भी यही समस्या होगी। हर घरवाली कुछ पार्सलों को खारिज कर देगी, भले ही वह एक पार्सल को काटे।

अंडरडार्क के सुझाव में यह समस्या नहीं है। वहाँ भी एक और चाल है कि शायद सूचकांक का अधिक प्रभावी उपयोग करेगा:

CREATE TABLE t_intersect AS
SELECT 
  hp.gid, 
  hp.st_address, 
  hp.city, 
  hp.st_num,
  hp.the_geom
FROM 
  public.housepoints AS hp LEFT JOIN
  public.parcel AS par ON
  ST_Intersects(hp.the_geom,par.the_geom)
WHERE par.gid IS NULL;

यह विचार उन्हें st_intersects के साथ जुड़ने और उन पंक्तियों को प्राप्त करने के लिए है जहाँ पार्सल आईडी मौजूद नहीं है।

यहाँ ज़रूरी इंडेक्स एक स्थानिक इंडेक्स और पार्सल में gid पर एक इंडेक्स है (पार्सल टेबल में उस आईडी को gid भी कहा जाता है)।


2
आपका बहुत बहुत धन्यवाद! निकलैस बिल्कुल सही है कि ST_Disjoint सही परिणाम नहीं देगा। ST_Disjoint सभी विशेषताओं को लौटाता है, क्योंकि जैसा कि उन्होंने बताया, प्रत्येक बिंदु तालिका में कुछ पार्सल बहुभुज के साथ जुड़ा हुआ है , जबकि इस कोड स्निपेट ने मुझे वे परिणाम दिए जिनकी मैं उम्मीद कर रहा था।
रयानडाल्टन

इस क्वेरी को इस एक gis.stackexchange.com/a/136177/6052 के समान नियोजित किया जाएगा, इसलिए यह विशुद्ध रूप से शैली की बात है जिसे आप पसंद करते हैं। =) उन खरीदारी के जवाब के लिए।
इवान कैरोल

14

आप ST_Disjoint की तलाश में हो सकते हैं

ST_Disjoint - रिटर्न सही है अगर ज्यामिति "स्थानिक रूप से प्रतिच्छेद" नहीं करते हैं - यदि वे एक साथ कोई स्थान साझा नहीं करते हैं।


2
हालांकि ST_Disjoint ऐसा करता है, लेकिन यह स्थानिक अनुक्रमित का उपयोग नहीं करता है। आप एक loooooong समय प्रतीक्षा करने के लिए जा रहे हैं
nickves

9

मामले में कोई विशेष कार्य नहीं है:

CREATE table t_intersect AS
SELECT 
  hp.gid, 
  hp.st_address, 
  hp.city, 
  hp.st_num,
  hp.the_geom
FROM
  public.housepoints as hp
WHERE
  hp.gid NOT IN 
  (
    SELECT 
      h.gid
    FROM 
      public.parcel as p,
      public.housepoints as h
    WHERE 
      ST_Intersects(h.the_geom,p.the_geom)
  ) AS foo

5

यहाँ हम उपयोग करते हैं NOT EXISTSऔर CREATE TABLE AS SELECT(CTAS)

CREATE table t_intersect
AS
  SELECT 
    hp.gid,
    hp.st_address,
    hp.city, hp.st_num,
    hp.the_geom
  FROM public.housepoints AS hp
  WHERE NOT EXISTS (
    SELECT 1
    FROM public.parcel AS par 
    WHERE ST_Intersects(hp.the_geom,par.the_geom)
  );

3

कैसे ST_Disjoint के बारे में? - रिटर्न सही है अगर जियोमेट्री "स्थानिक रूप से प्रतिच्छेद" नहीं करते हैं - यदि वे एक साथ कोई स्थान साझा नहीं करते हैं।


4
whoops - उत्तर देने से पहले एक पृष्ठ ताज़ा करने की आवश्यकता है :-)
इयान टर्टन

1

कुछ मामलों में बहुत उपयोगी है LATERAL JOIN, यह बहुत तेज़ हो सकता है यह दिखना चाहिए

SELECT * FROM houses h
LEFT JOIN LATERAL (
   SELECT True t FROM parcels p
   WHERE ST_Intersects(p.geom, h.geom)
   LIMIT 1
) p ON True
WHERE p.t IS NULL;

1

बस पहले ST_Intersects ट्रिक नहीं करता है:

यह उन सभी पतों को प्राप्त करता है जो पड़ोस में नहीं हैं # 62:

select 
a.*
from denver.neighborhoods as n
join denver.addresses as a on not ST_Intersects(n.geom, a.geom)
where n.nbhd_id = '62'

भू-स्तंभों के क्रम पर ध्यान दें - बहुभुज पहले, दूसरे बिंदु, जो ST_Intersects के सामान्य उपयोग से उलट है।

त्वरित और सरल! सोच रहा था कि कुछ समय के लिए इसे सही तरीके से कैसे किया जाए!


"NOT ST_Within" के लिए भी काम किया। मेरी क्वेरी ~ 30.0 सेकंड में दोनों ST_Within के लिए पूरी नहीं हुई और बाहरी जोड़ का उपयोग करते हुए फिर दाईं ओर नल की जाँच कर रहा है, इसलिए कोई प्रदर्शन हिट नहीं लगता है। धन्यवाद!
नैट वनर

@NateWanner जानकर अच्छा लगा! मैं विश्वास नहीं कर सकता कि यह कितना आसान और तेज़ है !!!
DPSSpatial

यह वास्तव में एक बहुत बुरा विचार है क्योंकि आपको कार्टेशियन उत्पाद मिल रहा है
इवान कैरोल

@ EvanCarroll का क्या मतलब है?
DPSSpatial

इसका मतलब है कि अगर आपको सिर्फ 1 डेन्वर नहीं मिल रहा है, तो आप हर नहीं-मैचिंग डेनेवर के लिए एक हो रहे हैं।
इवान कैरोल

-1

यह सबसे तेज़ समाधान नहीं हो सकता है ... लेकिन मैं आमतौर पर अन्य तालिका की सभी विशेषताओं में शामिल होकर धोखा देता हूं।

Create table blah as
select
  d.*
from
  data_i_want d,
  (select st_union(geom) geom from not_in_here) n
where
  st_disjoint(d.geom,n.geom);

अच्छा और तड़क-भड़क वाला अगर not_in_here टेबल वह जटिल नहीं है।


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