2012-06-12 5 views
-3

"좌표"를 게시해야하는 앱을 만들고 다른 하나의 기능은 데이터베이스를 거쳐 근처의 좌표를 찾는 것입니다. 내 데이터베이스에 1.000.000 개의 항목이 있고 어떤 알고리즘을 사용한다고 가정 해 봅시다. 주어진 좌표에서 100m 떨어진 좌표를 어떻게 비교할 수 있습니까? 많은 앱이 그렇게하고 있지만 어려운 것처럼 보입니다.가까운 좌표

업데이트 : 좌표로는 lon-lat를 의미합니다. 이 같은하지 "진짜"질문을 고려 왜 몰라하지만 난

덕분에

+0

이 질문은 스택 오버플로가 너무 광범위합니다. 또한 너무 애매하고 세부적으로 부족합니다. – Oded

+0

좌표 란 2D 점을 의미합니까? 귀하의 질문에 "좌표"가 무엇인지 예를 들어주십시오. 그리고 @Oded가 말한 것. – Ryan

+0

데이터베이스에서 데이터를 가져오고, 공간 데이터베이스가 아닌 데이터에 대한 검색 알고리즘을 사용하십시오. – UmNyobe

답변

1

내가 뭔가 수행 할 Great Circle Distance 전화 사용했습니다이 "일반"질문을 왜 출발점이 필요합니다 이 과거에. 그것은 지구를 완벽한 구 (대칭이 아닌)로 취급하고 그 구의 두 점 사이의 거리를 결정하기 위해 두 개의 long long을 사용합니다. 지구가 완벽한 구체가 아니기 때문에 이러한 거리는 완벽하게 정확하지 않습니다. 작은 거리를 다루고 계산 된 것과 실제와의 작은 차이가 있다면 괜찮을 것입니다. 다음은 GCD를 계산하는 함수입니다.

SET QUOTED_IDENTIFIER ON 
GO 
SET ANSI_NULLS ON 
GO 
CREATE FUNCTION dbo.GreatCircleDistance 
(
    @Latitude1 float = NULL, 
    @Longitude1 float = NULL, 
    @Latitude2 float = NULL, 
    @Longitude2 float = NULL 
) 
RETURNS float 
AS 
BEGIN 
    IF @Latitude1 IS NULL RETURN 0.0 
    IF @Longitude1 IS NULL RETURN 0.0 
    IF @Latitude2 IS NULL RETURN 0.0 
    IF @Longitude2 IS NULL RETURN 0.0 

    DECLARE @sin1 float 
     ,@sin2 float 
     ,@sind float 
     ,@cos1 float 
     ,@cos2 float 
     ,@cosd float 

    SELECT @sin1 = SIN(RADIANS(@Latitude1)) 
     ,@sin2 = SIN(RADIANS(@Latitude2)) 
     ,@sinD = SIN(RADIANS(@Longitude2 - @Longitude1)) 
     ,@cos1 = COS(RADIANS(@Latitude1)) 
     ,@cos2 = COS(RADIANS(@Latitude2)) 
     ,@cosD = COS(RADIANS(@Longitude2 - @Longitude1)) 

    RETURN ATN2  (SQRT(SQUARE(@cos2 * @sinD) + SQUARE(@cos1 * @sin2 - @sin1 * @cos2 * @cosD)) 
       ,@sin1 * @sin2 + @cos1 * @cos2 * @cosD 
      ) * 3959.871 
END 
GO 

도난당한 here.

+0

이웃에 대해 데이터베이스를 검색 할 때 매우 느릴 수 있습니다. mssql을 위해 나는 공간 도구에 내장 된 것이 좋습니다 – Andrey

+0

그럴 수도 있습니다. 과거에이 작업을 수행했을 때 한 번만 처리 했으므로 성능 고려 사항은 없었습니다. 나는 그것을 사용하여 속도를 높이는 솔루션을 추천하는 느린 쿼리를보아야 할 것이다. –

0

위도, 경도 (단위 : 분 - 초 또는 소수)? 십진수이면 dist^2 ~ = lat^2 + lon^2입니다. 사분면을 확인하는 것을 잊지 마십시오. 여러 개의 조회를 수행하는 경우 검색 목록을 2 차원 검색 트리로 정렬 할 수 있습니다.