Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Oracle Spatial - chọn các đối tượng rơi trong khu vực

Bạn có thể làm điều này theo một trong hai cách. Trước tiên, như bạn đã đề cập, SDO_WITHIN_DISTANCE là một cách tiếp cận hợp lệ.

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'
;

Trong trường hợp này, khoảng cách được tính bằng đơn vị tuyến tính được xác định bởi tham chiếu không gian của a. Oracle xử lý các tọa độ là Descartes, vì vậy bạn sẽ cần đảm bảo rằng mình có một hệ tọa độ tuyến tính trước khi sử dụng toán tử này (trái ngược với các đơn vị vĩ độ / kinh độ góc). Vì bạn đang làm việc với phía bắc / khu vực mở rộng, tôi nghĩ bạn sẽ ổn miễn là các điểm bạn đang so sánh với cùng một tham chiếu không gian.

Cách tiếp cận này sử dụng vòng lặp bên trong để giải quyết truy vấn nên không hiệu quả lắm nếu bạn có nhiều điểm để so sánh. Ngoài ra, Oracle Spatial RẤT kén chọn thứ tự của các toán hạng trong các hàm SDO, vì vậy bạn có thể cần phải thử với thứ tự tham số để tìm điểm ngọt. Nếu truy vấn của bạn chạy trong một khoảng thời gian dài, hãy thử chuyển tham số thứ nhất và thứ hai của toán tử sdo của bạn. Bạn cũng có thể chơi theo thứ tự của bảng 'từ' và 'tham gia bên trong' bằng cách sử dụng /*+ ORDERED */ sau SELECT .

Một cách tiếp cận khác là đệm hình học và so sánh với bộ đệm.

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'
;

Hãy nhớ rằng bất kỳ thứ gì trong tham số thứ hai của SDO_RELATE (được gọi là cửa sổ) sẽ không có chỉ mục không gian nếu bạn biến đổi nó giống như chúng ta đang ở đây với bộ đệm.

Nếu bạn định làm điều này với một số điểm, bạn nên xây dựng một bảng trong đó tất cả các điểm nguồn được lưu vào bộ đệm. Sau đó, tạo chỉ mục không gian dựa trên các khu vực được lưu vào bộ đệm và so sánh chỉ số đó với điểm mục tiêu của bạn.

Ví dụ:

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'
;

LƯU Ý:Khi các điểm giao nhau với đa giác, bạn luôn muốn đa giác ở vị trí cửa sổ của sdo_relate (là tham số thứ hai). Điều này sẽ đảm bảo chỉ mục không gian của bạn được sử dụng đúng cách.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle ngủ đông ORA-01461 CLOB

  2. oracle trong giới hạn 1000 / hibernate

  3. Lọc theo ngày trong tuần

  4. Chuyển đổi Unixtime sang Datetime SQL (Oracle)

  5. PL / SQL gán kết quả truy vấn cho CLOB