GIS는 긴 LAT의 컬렉션으로 표현 된 다각형에 의해 포함 된 포인트 (긴 LAT)를 찾습니다.
-
16-09-2019 - |
문제
긴 위도 배열로 구성된 다각형이 포함 된 Long/LAT가있는 모든 데이터 항목을 찾으려고 노력하고 있습니다. SQL 2008의 새로운 지리 공간 데이터 유형으로 이런 종류의 작업을 수행 할 수 있지만 SQL 2005 및 C#을 사용하고 있습니다. 이것은 DB 끝이나 C#에서 가장 잘 수행 될 것입니다.
감사.
해결책
이를 위해 SQL2000에 대해 작성된 코드가 있습니다. 포인트가 다각형 내에 있는지 여부를 결정하기 위해 '각도'방법을 사용합니다.
먼저 Getangle 사용자 정의 함수 :
ALTER Function [dbo].[GetAngle](
@Ax Decimal(8,5),
@Ay Decimal(8,5),
@Bx Decimal(8,5),
@By Decimal(8,5),
@Cx Decimal(8,5),
@Cy Decimal(8,5))
시작대로 플로트를 반환합니다
Declare @dot_product Float
Declare @cross_product Float
Declare @BAx Decimal(8,5)
Declare @BAy Decimal(8,5)
Declare @BCx Decimal(8,5)
Declare @BCy Decimal(8,5)
--' Get the vectors' coordinates.
Set @BAx = Sign(@Ax - @Bx) * dbo.CalculateDistance(@Ax, @Ay, @Bx, @Ay)
Set @BAy = Sign(@Ay - @By) * dbo.CalculateDistance(@Ax, @Ay, @Ax, @By)
Set @BCx = Sign(@Cx - @Bx) * dbo.CalculateDistance(@Cx, @Cy, @Bx, @Cy)
Set @BCy = Sign(@Cy - @By) * dbo.CalculateDistance(@Cx, @Cy, @Cx, @By)
--' Calculate the dot product.
Set @dot_product = @BAx * @BCx + @BAy * @BCy
--' Calculate the Z coordinate of the cross product.
Set @cross_product = @BAx * @BCy - @BAy * @BCx
--' Calculate the angle.
return ATn2(@cross_product, @dot_product)
끝
다음으로 위도/경도 쌍의 테이블 변수와 시퀀스 번호가 있다고 가정합니다 (LAT/긴 쌍이 다각형을 정의하는 순서를 나타냅니다). 이 테이블의 첫 번째 요점은 테이블의 마지막 지점과 동일해야합니다.
또한 최소 및 최대 위도 및 경도에 대한 몇 가지 변수가 있습니다. 이것은 효과적으로 경계 상자를 생성하여 다각형과 경계를 이루는 직사각형 영역 내에서 빠르게 제거 할 수 있도록합니다.
Select Address.AddressId
From @Temp As A
Inner Join @Temp As B
On A.SequenceNumber = B.SequenceNumber - 1
Inner Join Address
On Address.XCoord Between @MinLongitude And @MaxLongitude
And Address.YCoord Between @MinLatitude And @MaxLatitude
Group By Address.AddressId
Having Abs(Sum(dbo.GetAngle(A.Longitude, A.Latitude, Address.XCoord, Address.YCoord, B.Longitude, B.Latitude))) > 3.14
다른 팁
T-SQL에서 수행하면 두통을주는 것처럼 들립니다 (그래도 다소 모든 것이 있습니까?). 물론 그것은 다각형의 복잡성과 데이터 항목의 위치에 따라 다르지만 일반적으로 가장 쉽고 효율적인 접근 방식은 C#에서 초기 계산을 수행하여 데이터 항목을 매우 거친 방식으로 제한하는 것일 수 있습니다. 그래서 다음과 같은 것입니다.
- C#에서 다각형의 거친 경계를 계산하십시오.
- SQL 서버에서 이러한 경계 내부의 모든 것을 얻으십시오.
- C#에서 최종 정확한 필터링을 수행하십시오.
물론 성능은 초기 경계를 얼마나 잘 계산할 수 있는지에 달려 있습니다. 먼저 간단한 경계 사각형부터 시작하여 성능이 충분한 지 확인합니다.