.NET/SQL의 원 (경도/위도)
-
20-09-2019 - |
문제
다음과 같은 문제가 있습니다. 긴/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 내부에있을 때만 계산 거리 만 계산합니다.
제휴하지 않습니다 StackOverflow