문제

다음과 같은 문제가 있습니다. 긴/LAT 값의 테이블과 프로젝트 ID 및 Long/LAT/RADIUS (원)가있는 다른 테이블이 있습니다.

이제 첫 번째 테이블의 긴/LAT 값과 일치하는 프로젝트를 찾아야합니다.

그렇게하는 쉬운 방법이 있습니까?

도움이 되었습니까?

해결책

구의 거리를 계산하기위한 여러 알고리즘이 있지만 다음을 사용합니다.

create function GetDistance(
    @latitudeFrom decimal(30,10), 
    @longitudeFrom decimal(30,10),
    @latitudeTo decimal(30,10), 
    @longitudeTo decimal(30,10)
)
RETURNS float
AS
BEGIN

DECLARE @distance float

    SET @distance = ROUND(6378.137 * ACOS(
            convert(decimal(30,10), 
            (SIN(RADIANS(@latitudeFrom)) * SIN(RADIANS(@latitudeTo))) +
            (COS(RADIANS(@latitudeFrom)) * COS(RADIANS(@latitudeTo)) *
             COS(RADIANS(@longitudeTo) - RADIANS(@longitudeFrom))))), 15)

 RETURN @distance
 END
 go

(여기서 6378.137- 지구의 반경입니다)

이제 지구의 2 점 사이의 거리를 계산할 수 있으면 쿼리를 만들 수 있습니다.

 select * 
     from Table1, Project 
     where dbo.GetDistance(
           Table1.lat, Table1.lon, 
           Project.lat, Project.lon) < @YouRadius

여기서 @youradius- 원의 반경 매개 변수

다른 팁

비교적 쉬운 : 원의 포인트와 중심 사이의 큰 원 거리는 계산합니다. 거리가 반경보다 작 으면 포인트는 원하지 않으면 원 안에 있습니다. 원의 둘레에 있으면 결정합니다. 회로 거리의 계산에 대한 몇 가지 토론이 있었으며, 그것들을 살펴보십시오.

속도를 높이기 위해 각 원의 정의로 최소 경계 상자의 LAT/Long Squares의 정의로 저장을 고려할 수 있습니다. 이렇게하면 포인트가 원 안에 있을지 여부를 빠르게 확인하는 데 필요한 정보를 제공합니다. 포인트가 MBB 내부에있을 때만 계산 거리 만 계산합니다.

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