GIS는 긴 LAT의 컬렉션으로 표현 된 다각형에 의해 포함 된 포인트 (긴 LAT)를 찾습니다.

StackOverflow https://stackoverflow.com/questions/788469

  •  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#에서 초기 계산을 수행하여 데이터 항목을 매우 거친 방식으로 제한하는 것일 수 있습니다. 그래서 다음과 같은 것입니다.

  1. C#에서 다각형의 거친 경계를 계산하십시오.
  2. SQL 서버에서 이러한 경계 내부의 모든 것을 얻으십시오.
  3. C#에서 최종 정확한 필터링을 수행하십시오.

물론 성능은 초기 경계를 얼마나 잘 계산할 수 있는지에 달려 있습니다. 먼저 간단한 경계 사각형부터 시작하여 성능이 충분한 지 확인합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top