Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle Spatial - क्षेत्र के भीतर आने वाली वस्तुओं का चयन करें

आप इसे दो तरीकों में से एक कर सकते हैं। सबसे पहले, जैसा कि आपने बताया, SDO_WITHIN_DISTANCE एक मान्य तरीका है।

select 
    *
from center_point a
inner join target_points b
    on a.id = 1
    and sdo_within_distance( b.shape, a.shape, 'distance = 10' ) = 'TRUE'
;

इस मामले में, दूरी एक स्थानिक संदर्भ द्वारा परिभाषित रैखिक इकाइयों में है। ओरेकल निर्देशांक को कार्टेशियन के रूप में मानता है, इसलिए आपको यह सुनिश्चित करने की आवश्यकता होगी कि इस ऑपरेटर का उपयोग करने से पहले आपके पास एक रैखिक समन्वय प्रणाली है (कोणीय अक्षांश/लोन इकाइयों के विपरीत)। चूंकि आप नॉर्थिंग्स/ईस्टिंग्स के साथ काम कर रहे हैं, मुझे लगता है कि आप तब तक ठीक रहेंगे जब तक आप जिन बिंदुओं की तुलना कर रहे हैं, वे एक ही स्थानिक संदर्भ में हैं।

यह दृष्टिकोण क्वेरी को हल करने के लिए एक आंतरिक-लूप का उपयोग करता है, इसलिए यदि आपके पास तुलना करने के लिए बहुत सारे बिंदु हैं तो यह बहुत कुशल नहीं है। इसके अलावा, ओरेकल स्पैटियल एसडीओ कार्यों में ऑपरेंड के क्रम के बारे में बहुत पसंद है, इसलिए आपको स्वीटस्पॉट खोजने के लिए पैरामीटर ऑर्डर के साथ खेलने की आवश्यकता हो सकती है। यदि आपकी क्वेरी लंबी अवधि तक चलती है, तो अपने एसडीओ ऑपरेटर के पहले और दूसरे पैरामीटर को स्विच करने का प्रयास करें। आप /*+ ORDERED */ का उपयोग करके 'से' और 'इनर जॉइन' तालिकाओं के क्रम के साथ भी खेल सकते हैं SELECT . के बाद hind ।

दूसरा तरीका है ज्यामिति को बफर करना और बफर से तुलना करें।

select 
    *
from center_point a
inner join target_points b
    on a.id = 1
    and sdo_relate( b.shape, sdo_buffer(a.shape, 0.05 ), 'mask=anyinteract' ) = 'TRUE'
;

ध्यान रखें कि SDO_RELATE (जिसे विंडो कहा जाता है) के दूसरे पैरामीटर में जो कुछ भी है, उसमें स्थानिक इंडेक्स नहीं होगा यदि आप इसे ऐसे बदलते हैं जैसे हम यहां बफर के साथ हैं।

यदि आप इसे कई बिंदुओं के साथ करने की योजना बना रहे हैं, तो एक तालिका बनाने की अनुशंसा की जाती है जहां सभी स्रोत बिंदु बफ़र किए जाते हैं। फिर बफ़र किए गए क्षेत्रों के विरुद्ध एक स्थानिक अनुक्रमणिका बनाएं और उसकी तुलना अपने लक्षित बिंदुओं से करें।

उदाहरण के लिए:

create table point_bufs unrecoverable as
select sdo_buffer (a.shape, b.diminfo, 1.35)
from centerpoint a, user_sdo_geom_metadata b
where table_name='CENTERPOINT'
  and column_name='SHAPE';

select
    a.gif,
    b.gid 
from target_points a, 
     point_bufs b
where sdo_relate(a.shape, b.shape, 'mask=anyinteract querytype=join') = 'TRUE'
;

नोट:पॉलीगॉन के साथ पॉइंट्स को इंटरसेक्ट करते समय, आप हमेशा पॉलीगॉन को विंडो पोजिशन में रखना चाहते हैं sdo_relate (जो दूसरा पैरामीटर है)। यह सुनिश्चित करेगा कि आपका स्थानिक सूचकांक सही ढंग से उपयोग किया गया है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एसक्यूएल फाइंडिंग पर्सन एंट्री में सबसे ज्यादा कुत्ते हैं

  2. पीएल/एसक्यूएल में फॉर्म-डेटा और पैरामीटर के साथ एक पोस्ट अनुरोध कैसे भेजा जाए

  3. Oracle - एक क्वेरी के रूप में कई मायने रखता है

  4. चर के साथ सरल चयन लेकिन बिना INTO

  5. Oracle में CHARTOROWID () फ़ंक्शन