Đây là một câu hỏi hình học SQL Server có vẻ đơn giản mà tôi nghĩ sẽ có một giải pháp vượt trội, nhưng tôi không gặp may mắn khi tìm thấy một câu hỏi.
Mục đích của tôi là chọn tất cả các bản ghi trong một bảng có đa giác được lồng (chứa) trong một đa giác lớn hơn từ một bảng khác. Tôi đã có các chức năng mong đợi STWithin
và STContains
là giải pháp tôi cần, nhưng thật không may, cả hai chỉ xác định các đa giác bên trong trong các đa giác được lồng trong đa giác lớn hơn, chứ không phải các đa giác lồng nhau chạm vào ranh giới của đa giác lớn hơn. Xem hình ảnh chẳng hạn.
Một lựa chọn thay thế phù hợp với nhu cầu của tôi là STIntersection
. Tuy nhiên, vấn đề với chức năng này là nó chỉ trả về cột hình học! Tôi muốn lấy ID hồ sơ thay thế. Có ai có một đề nghị về cách này có thể được thực hiện?
STWithin
:
select a.bg10 from
gis.usa_10_block_group a
join gis.usa_10_mkt_definition b
on a.shape.STWithin(b.shape) = 1
where b.mktname = 'Loop'
STContains
:
select a.bg10 from
gis.usa_10_block_group a
join gis.usa_10_mkt_definition b
on b.shape.STContains(a.shape) = 1
where b.mktname = 'Loop'
STIntersection
:
select a.shape.STIntersection(b.shape)
from gis.usa_10_block_group a
join gis.usa_10_mkt_definition b
on a.shape.STIntersects(b.shape) = 1
where b.mktname = 'Loop'
Biên tập:
Một gợi ý là bỏ qua STIntersection
và chỉ sử dụng STIntersects
như sau:
STIntersects
:
select a.bg10
from gis.usa_10_block_group a
join gis.usa_10_mkt_definition b
on a.shape.STIntersects(b.shape) = 1
where b.mktname = 'Loop'
Vấn đề với cách tiếp cận này, là STIntersects
dường như chọn tất cả các đa giác trong hoặc ngoài và chạm vào đa giác lớn hơn, không chỉ những đa giác bên trong. Xem hình ảnh chẳng hạn.
STContains
hoặcSTWithin
. Không thực sự là một hack tốt, nhưng sẽ mang lại cho bạn kết quả bạn muốn. Tùy chọn khác sẽ là thực hiện STIntersects với việc so sánh khu vực Giao lộ và khu vực đa giác.