2013-02-26 11 views
3

에 특정 건물 코드 (bldg_code = 3)의 중점이 포함 된 소포를 선택하는 쿼리를 작성하려고합니다.건물의 중심을 포함하는 소포를 표시하는 공간적 SQL 쿼리

소포는 "city.zoning"표에 나열되어 있으며 각 소포의 PIN, 지오메트리 및 면적에 대한 열을 포함합니다. "buildings"테이블에는 건물 유형 및 해당 코드를 나타내는 bldg_type 및 bldg_code 열이 있습니다.

select a.* 
from city.zoning a, username.buildings b 
where b.bldg_code = 3 and sdo_anyinteract(a.geom,b.geom) = 'TRUE'; 

어떤 아이디어 :이 쿼리에 대한 관심의 건물 유형은 내가 관심있는 건물 유형 상호 작용 소포를 표시하는 쿼리를 개발했습니다 지금까지 3

의 bldg_code이있다?

답변

2

SDO_GEOM.SDO_CENTROID (documentation)을 사용하여 형상의 중심을 찾을 수 있습니다.

이 함수에서 제공하는 중심 값은 수학 중심 값이며, 내부에 인 다각형 (예 : 다각형이 L 모양 인 경우)이 항상있는 것은 아닙니다. SpatialDB 고문은 a good article on this이 있지만, 여기에 간단한 그림입니다 : 이것은 당신을 위해 문제가되지 않습니다 방금 내장,하지만 경우를 사용, 정확도 수준이 필요하지 않은 경우

Centroid laying outside its parent geometry

당신 이 문제가 (과거에했던 것처럼) 문제라고 생각하면 SpatialDB 고문은 a standalone PL/SQL package that corrrectly calculates centroids입니다.

성능 요구 사항에 따라 즉석에서 중심을 계산하여 쿼리에서 직접 사용하거나 테이블에 중심 좌표 열을 추가하고 응용 프로그램 코드로 값을 계산하고 캐시 할 수 있습니다 케이스) 또는 트리거 (최악의 경우).

귀하의 질의는 다음과 같이 보일 것입니다 : 이것은 a.geom 열이 공간적 인덱스와 추가 된 새 열 b.centroid과 인구 (주되는 기초 SDO_CONTAINS를 사용하고 있음을

SELECT a.* 
FROM city.zoning a 
JOIN username.buildings b ON sdo_contains(a.geom, b.centroid) = 'TRUE' 
WHERE b.bldg_code = 3 

주 - 쿼리를 검증되지 않은). 존 지정 지오메트리가 공간적으로 인덱싱되지 않은 경우 SDO_GEOM.RELATE을 사용하거나 센트로이드 열을 인덱싱하고 SDO_INSIDE을 사용하도록 로직을 반전해야합니다.

+0

이 질문에 대한 답변입니다. 도와 줘서 고마워! – user2109092