PostGIS এ ছেদ না করে এমন বৈশিষ্ট্য নির্বাচন করুন


41

এটি আমার কাছে এ জাতীয় সাধারণ প্রশ্নের মতো মনে হয় (এবং এটি সম্ভবত) তবুও আমি এমন কোনও উদাহরণ খুঁজে পাই না যা আমাকে উত্তর দেয়। পোস্টজিআইএস ব্যবহার করে, আমি কেবল পয়েন্টগুলি নির্বাচন করতে চাই যা বহুভুজের বাইরে পড়ে । শেষ পর্যন্ত এটি 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);

আমার একই চিন্তাভাবনা প্রক্রিয়া ছিল, ভেবেছিলাম যে পরিস্থিতি অন্য যে কোনও অবস্থার মতো
কৌশলটিও করবে না

উত্তর:


41

এটি "ছেদ না করে" দিয়ে কাজ না করার কারণটি হল আপনি কেবল জোড়ায় জ্যামিতির তুলনা করুন; বিরক্তি নিয়ে একই সমস্যা থাকবে। প্রতিটি হাউসপয়েন্ট কোনও পার্সেল ছেদ করে এমনকি কিছু পার্সেলকে ছিন্নভিন্ন করে দেবে।

আন্ডারডार्কের পরামর্শে এই সমস্যা নেই। আরও একটি কৌশল আছে যা সম্ভবত সূচকের আরও কার্যকর ব্যবহার করতে পারে:

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 এ যোগ দিতে হবে এবং পার্সেল আইডি উপস্থিত নেই এমন সারিগুলি পাওয়ার ধারণা।

এখানে প্রয়োজনীয় সূচকগুলি একটি স্থানিক সূচক এবং পার্সেলগুলিতে জিডের উপর একটি সূচক (ধরে নিলে পার্সেল টেবিলের আইডিটিকে গিডও বলা হয়)।


2
আপনাকে অনেক ধন্যবাদ! নিক্লাস হ'ল সঠিক এসT_ডিজিন্ট সমস্ত বৈশিষ্ট্য ফিরিয়ে দেয় কারণ তিনি উল্লেখ করেছেন যে, প্রতিটি পয়েন্টটি টেবিলের কিছু পার্সেল বহুভুজ দিয়ে বিরক্ত হয়, যখন এই কোড স্নিপেট আমাকে যে ফলাফল আশা করে ছিল তা দিয়েছিল।
রায়ানডাল্টন

এই ক্যোয়ারীটি এই এক gis.stackexchange.com/a/136177/6052 এর মতোই পরিকল্পনা করা হবে সুতরাং এটি আপনার পছন্দের স্টাইলের নিখুঁত বিষয়। =) Shopping শপিং উত্তরের জন্য।
ইভান ক্যারল

14

আপনি ST_Disjoint খুঁজছেন হতে পারে

ST_DisjPoint - জ্যামিতিগুলি "স্থানিকভাবে ছেদ না করে" - সত্য যদি তারা একসাথে কোনও স্থান ভাগ না করে তবে সত্য ফেরায়।


2
এস এসডিজিওন্ট এটি করার সময় এটি স্থানিক সূচকগুলি ব্যবহার করে না। আপনি একটি দীর্ঘ সময় অপেক্ষা করতে যাচ্ছেন
নিকোভস

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(সিটিএএস)

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

কীভাবে এসT_ডিজিওন্ট? - জ্যামিতিগুলি "স্থানিকভাবে ছেদ না করা" - যদি তারা একসাথে কোনও স্থান ভাগ না করে তবে সত্য ফেরায়।


4
ওফস - উত্তর দেওয়ার আগে একটি পৃষ্ঠা রিফ্রেশ করতে হবে :-)
ইয়ান টার্টন

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 এর স্বাভাবিক ব্যবহার থেকে বিপরীত।

দ্রুত এবং সহজ! কিছুক্ষণ ধরে ভাবছি কীভাবে এটি সঠিকভাবে করবেন?


"নন এস এস বিথিন" এর জন্যও কাজ করেছেন। আমার ক্যোয়ারী এসএনটি এসইউইন উইথিন উভয়ের জন্য .0 30.0 সেকেন্ডে শেষ করেছে এবং একটি বাহ্যিক জোড় ব্যবহার করে ডানদিকে নুলের জন্য চেক করছে, সুতরাং কোনও পারফরম্যান্স হিট বলে মনে হচ্ছে না। ধন্যবাদ!
ন্যাট ওয়ানার

@ নেটওয়ানার জেনে ভাল! আমি বিশ্বাস করতে পারি না যে এটি কত সহজ এবং দ্রুত !!!
ডিপিএসএসপিশিয়াল

এটি আসলে একটি খুব খারাপ ধারণা কারণ আপনি কার্টেসিয়ান পণ্যটি পেয়ে যাচ্ছেন
ইভান ক্যারল

@ ইভানক্রোল এর অর্থ কী?
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);

যদি না_ইন_এখানে টেবিলটি জটিল না হয় তবে খুব সুন্দর এবং চটজলদি


এটি কখনও চটজলদি নয়। এটি ঠিক যতটা অসন্তুষ্ট নয় তা যদি না হয় তবে_যেমন জটিল নয়। ;)
ইভান ক্যারল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.