20

SQL Server 2008 공간 데이터 형식을 사용하고 있습니다. 나는 데이터 유형 GEOMETRY로서 모든 상태 (다각형)를 가진 테이블을 가지고있다. 이제 데이터 유형 GEOGRAPHY 인 지점의 좌표 (위도, 경도)가 해당 주 내에 있는지 확인하고 싶습니다.SQL Server 2008 공간 : 다각형의 한 점 찾기

새 공간 데이터 유형을 사용하는 예를 찾을 수 없습니다. 현재 몇 년 전에 구현 된 해결 방법이 있지만 몇 가지 단점이 있습니다.

저는 SQL Server 2008과 2012를 모두 사용했습니다. 새 버전에 약간의 개선이 있으면 그것도 작업을 시작할 수 있습니다.

감사합니다.

UPDATE 1 :

나는 좀 더 명확하게하기 위해 코드 샘플을 추가하고있다.

declare @s geometry --GeomCol is of this type too. 
declare @z geography --GeogCol is of this type too. 

select @s = GeomCol 
from AllStates 
where STATE_ABBR = 'NY' 

select @z = GeogCol 
from AllZipCodes 
where ZipCode = 10101 
+0

그것은 성능이 좋지 않을거야, 난 1600000 개 기록을 통해이 쿼리를 시도하고에 평균 이분했다 완전한. –

답변

26

내가 지리 방법 STIntersects 생각() 당신이 원하는 것을 할 것입니다 : 당신이 GEOGRAPHY에 저장 다각형의 데이터 유형을 변경할 수없는 경우

DECLARE @g geography; 
DECLARE @h geography; 
SET @g = geography::STGeomFromText('POLYGON((-122.358 47.653, -122.348 47.649, -122.348 47.658, -122.358 47.658, -122.358 47.653))', 4326); 
SET @h = geography::Point(47.653, -122.358, 4326) 

SELECT @g.STIntersects(@h) 
+0

감사합니다. 그러나 내 다각형 인 상태는 GEOMETRY 데이터 형식입니다. GEOGRAPHY 변수로 먼저 변경해야합니까? – Farhan

+0

아 ... 아! 나는 그 부분을 놓쳤다. 주 (지리 데이터)가 기하 데이터로 저장되는 이유가 있습니까? –

+0

사실, 그럴 이유가 없습니다. 튜토리얼을 진행하면서 GEOGRAPHY 데이터 유형은 좌표/점에 대한 것이며 GEOMETRY는 지역/다각형에 대한 것이라고 가정했습니다. – Farhan

2

당신은 입력 위도을 변환 할 수 있습니다 경도를 GEOMETRY으로 변경하고 STContains 또는 STIntersects을 변환 된 값과 비교하십시오. GEOGRPAHYGEOMETRY 다각형을 변환하려고 - - 반대 방향으로가는

DECLARE @PointGeography GEOGRAPHY = geography::Point(43.365267, -80.971974, 4326) 
DECLARE @PointGeometry GEOMETRY = geometry::STGeomFromWKB(@PointGeography.STAsBinary(), 4326); 

SELECT @PolygonGeometry.STContains(@PointGeometry); 

오류가 발생하기 쉬운 내 경험에서 실패 할 가능성이 높다.

그리고

은 (때 그들이해야 즉 경기를주지 않을 것이다) 당신이 위도와 경도 값에서 직접 GEOMETRY 지점을 만들려고하면 다음 STContains (또는 STIntersects)가 작동하지 않습니다.

0
declare @g geometry 
set @g=geometry::STGeomFromText('POLYGON((-33.229869 -70.891988, -33.251124 -70.476616, -33.703094 -70.508045, -33.693931 -70.891052,-33.229869 -70.891988))',0) 

DECLARE @h geometry; 

SET @h = geometry::STGeomFromText('POINT(-33.3906300 -70.5725020)', 0); 
SELECT @g.STContains(@h); 
0
  1. 당신은 기하학과 지리를 혼합 할 수 없습니다. 기하학은 평평한면을, 지형은 (지구와 같은) 단층을위한 것입니다.
  2. 이 문제를 해결하려면 SRID를 조정해야합니다. 각 SRID (예 : 2913 = NZG2000)는 변환 관계를 설명합니다. 각 SRID를 사용하여 단일 영역에서 매핑하는 데 사용할 수 있습니다.
  3. 두 값 모두에서 "동일한"SRID가 될 때까지 .STxXX 함수의 많은 함수는 NULL을 반환합니다. 두 경우 모두 기본값이 0 일 수 있습니다.
  4. 동일하지 않지만 가장 유사한 경우, 가장자리의 경우에 오류가 발생할 수 있습니다.
  5. "precalc"시간을 소비하는 경우 관련된 경계 사각형의 위쪽/왼쪽 및 아래쪽/오른쪽 점을 결정하고 인덱스에 값을 사용하여 검사 할 레코드를 제한 할 수 있습니다. 아니라면 AT/L < BB/R 및 AB/R하여 STWithin 여기

를 검사의 I는 SRID에 사용되는 일례를 제한 할 것이다 WHERE에서 4 단순 숫자 체크 수단들이 겹칠 수> BT/L, 2193.모든 특정 시점의 3km 반경 내 도로 및 데이터베이스에 큰 기록이있는 경우 특정 학교 구역 내에서

DECLARE @g geometry 

SELECT @g = GEO2193 FROM dbo.schoolzones WHERE schoolID = 319 

SELECT DD.full_road_name, MIN(convert(int, dd.address_number)), MAX(convert(int, dd.address_number)) 
FROM (

select A.* from dbo.[street-address] A 

WHERE (((A.Shape_X - 1566027.50505) * (A.Shape_X - 1566027.50505)) + ((A.Shape_Y - 5181211.81675) * (A.Shape_Y - 5181211.81675))) < 9250000 

and a.shape_y > 5181076.1943481788 

and a.shape_y < 5185097.2169968253 

and a.shape_x < 1568020.2202472512 

and a.shape_x > 1562740.328937705 

and a.geo2193.STWithin(@g) = 1 
) DD 
GROUP BY DD.full_road_name 
ORDER BY DD.full_road_name