programing

웨이포인트를 저장하고 비교를 수행하는 가장 효율적인 방법은 무엇입니까?

bestprogram 2023. 10. 29. 19:53

웨이포인트를 저장하고 비교를 수행하는 가장 효율적인 방법은 무엇입니까?

당신의 의견을 알고 싶습니다.저는 사용자가 경로를 만들고 이 경로를 추적하여 데이터베이스에 모든 경유지를 저장하는 응용프로그램을 만들었습니다.그런 다음, 응용 프로그램은 사용자 웨이포인트를 비교합니다.

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

다른 옵션들도 조사해 봤습니다.제가 구현한 것 중 하나는 객체를 이용한 오라클 11g입니다.모든 데이터를 하나의 Object Table에만 저장하고 Way Point는 Latitude(위도) 및 Longitude(경도) 특성을 가진 유형의 Varray(배레이)에 저장됩니다.이 방법은 데이터를 저장하고 검색하는 데 매우 효율적이지만 비교할 때는 복잡해집니다.

저는 당신을 찾고 있습니다.NoSQL해결책, 이것을 효율적으로 수행하기 위한 알고리즘 또는 방법.당신은 어떻게 생각하나요?

모든 n개의 레코드에 ST Distance와 같은 데이터베이스 기능을 사용하는 것은 차선입니다.CPU 오버헤드가 기하급수적으로 증가합니다.

현재 검색 중인 진원지 주변의 사각형 안에 있는 점의 양을 확인하는 것이 좋습니다.MySQL의 예는 다음과 같습니다.

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

이것은 감소된 기능을 확인할 수 있습니다.supersetHaversine 공식을 사용하여 (지구의 곡률에 대한) 정칙 거리를 계산함으로써 더 감소되어야 하는 점들에 대한.

복합 인덱스를 설정하는 것을 잊지 마십시오.latitude그리고.longitude.

Orthodromic distance

PHP로 되어 있습니다.

<?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

첫 번째 검색은 경계 상자 충돌 검색(MySQL 예제)을 포함하여 다음을 결정합니다.superset, 빨간 점은 빼고요.두 번째 검증 과정은 Haversine 공식(PHP 예제)으로 점들이 적절한 직교 거리 내에 있는지 계산하고 다음을 수행하는 것을 포함합니다.subset(검은색 점의 composed).

언급URL : https://stackoverflow.com/questions/12568726/most-efficient-way-to-save-way-points-and-do-comparisons