n 개의 레코드 모두에 대해 STDistance과 같은 데이터베이스 기능을 사용하면 차선책입니다. CPU 오버 헤드가 기하 급수적으로 증가합니다.
당신이해야 할 일은 찾고있는 진원지 주변의 직사각형 안에있는 점의 양을 확인하는 것입니다. 여기서 (MySQL은)의 예이다 :
SELECT * FROM `points`
WHERE `latitude` >= X1 AND `latitude` <= X2
AND `longitude` >= Y1 AND `longitude` <= Y2
이 제공 한 후, 상기 Haversine formula 사용 (지구의 곡률에 대해)을 orthodromic 거리를 계산함으로써 감소되어야 포인트 감소 superset
.
는 latitude
와 longitude
에 composite 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));
}
?>
이을 요약하자면 :
,536,913,632 : 여기
이 무엇을 보여주는 예제 이미지와 여기
그것은 PHP에 10
첫 번째 검색에는 빨간색 점을 제외하고 superset
을 결정하는 경계 상자 충돌 검색 (MySQL 예제)이 필요합니다. 두 번째 검증 과정은 포인트가 Haversine 수식 (PHP 예제)과 적절한 orthodromic 거리에 있고 subset
(검은 점으로 구성)을 취하는 지 계산하는 과정입니다.
내 대답이 도움이 되었습니까? –
예, 도움이되었습니다, 감사합니다! 나는 솔루션이 정보를 저장하는 방식이 아니라 웨이 포인트를 비교하는 알고리즘에 있다고 생각한다. 이렇게하려면 먼저 다른 경로와 일치 할 수있는 가장 관련성이 높고 균일 한 웨이 포인트 수를 줄이면서 비교를 수행해야합니다 (응답 상태와 동일). 나는 실제로 그것을 테스트하지 않았고, 더 나은 성능으로 결과를 얻는다면 내 솔루션을 게시 할 것입니다. –