2012-09-24 3 views
10

본인의 의견을 알고 싶습니다. 사용자가 경로를 만들고이 경로를 추적하고 데이터베이스의 모든 경로를 저장하는 응용 프로그램을 만들었습니다. 그런 다음 응용 프로그램은 사용자 웨이 포인트를 비교합니다.웨이 포인트를 저장하고 비교하는 가장 효율적인 방법은 무엇입니까?

현재 두 테이블을 사용하는 MSSQL 서버를 사용합니다. 하나는 경로 용이고 다른 하나는 웨이 포인트 저장 용 (공간 데이터 유형 포함)입니다. 비교는 st_distance와 같은 SQL Server 지리적 함수를 사용하여 저장 프로 시저에서 수행됩니다. ...

다른 옵션을 조사했습니다. 내가 구현 한 것은 Oracle 11g에서 객체를 사용하는 것입니다. 모든 데이터를 하나의 객체 테이블에만 저장하고 웨이 포인트는 위도 및 경도 특성이있는 유형의 Varray에 저장됩니다. 이 방법은 데이터를 매우 효율적으로 저장 및 검색하지만 비교할 때 다소 복잡해집니다.

NoSQL 솔루션을 찾으려면이 알고리즘을 사용하는 것이 좋습니다. 어떻게 생각해?

+0

내 대답이 도움이 되었습니까? –

+0

예, 도움이되었습니다, 감사합니다! 나는 솔루션이 정보를 저장하는 방식이 아니라 웨이 포인트를 비교하는 알고리즘에 있다고 생각한다. 이렇게하려면 먼저 다른 경로와 일치 할 수있는 가장 관련성이 높고 균일 한 웨이 포인트 수를 줄이면서 비교를 수행해야합니다 (응답 상태와 동일). 나는 실제로 그것을 테스트하지 않았고, 더 나은 성능으로 결과를 얻는다면 내 솔루션을 게시 할 것입니다. –

답변

15

n 개의 레코드 모두에 대해 STDistance과 같은 데이터베이스 기능을 사용하면 차선책입니다. CPU 오버 헤드가 기하 급수적으로 증가합니다.

당신이해야 할 일은 찾고있는 진원지 주변의 직사각형 안에있는 점의 양을 확인하는 것입니다. 여기서 (MySQL은)의 예이다 :

SELECT * FROM `points` 
    WHERE `latitude` >= X1 AND `latitude` <= X2 
    AND `longitude` >= Y1 AND `longitude` <= Y2 

이 제공 한 후, 상기 Haversine formula 사용 (지구의 곡률에 대해)을 orthodromic 거리를 계산함으로써 감소되어야 포인트 감소 superset.

latitudelongitudecomposite index을 설정을 잊지 마십시오.

<?php 
function haversine($latitude1, $longitude1, 
        $latitude2, $longitude2, $unit = 'Mi') { 
    $theta = $longitude1 - $longitude2; 
    $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))) + 
    (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta))); 
    $distance = acos($distance); 
    $distance = rad2deg($distance); 
    $distance = $distance * 60 * 1.1515; 
    switch ($unit) { 
    case 'Mi': 
     break; 
    case 'Km': 
     $distance = $distance * 1.609344; 
    } 
    return (round($distance, 2)); 
} 
?> 

을 요약하자면 :

Example with CN Tower

,536,913,632 : 여기

이 무엇을 보여주는 예제 이미지와 여기

Orthodromic distance

그것은 PHP에 10

첫 번째 검색에는 빨간색 점을 제외하고 superset을 결정하는 경계 상자 충돌 검색 (MySQL 예제)이 필요합니다. 두 번째 검증 과정은 포인트가 Haversine 수식 (PHP 예제)과 적절한 orthodromic 거리에 있고 subset (검은 점으로 구성)을 취하는 지 계산하는 과정입니다.

+0

답변 해 주셔서 감사합니다.이 아이디어를 구현하는 솔루션에 대해 생각해 보겠습니다.이 솔루션에 대한 우려가 있습니다. 매우 가까운 지점에 대해서는 잘 작동한다고 생각합니다. 더 큰 거리에 대해 이야기 할 때 포인트가 더 넓은 지역으로 퍼져 나올 때 복잡해집니다. 매우 큰 직사각형의 경우 경로 사이의 일치 기준이 더욱 정확해야합니다. 고맙습니다! –

+0

문제 없습니다, 알고리즘에 행운이 있기를. –

관련 문제