對所有n個記錄使用數據庫函數STDistance並不理想。您的CPU開銷將會呈指數增長。
你應該做的是檢查你正在搜索的當前震中周圍矩形內的點數。下面是一個例子(在MySQL):
SELECT * FROM `points`
WHERE `latitude` >= X1 AND `latitude` <= X2
AND `longitude` >= Y1 AND `longitude` <= Y2
這提供點的減小的superset
應該然後可以進一步通過計算順距離(相對於地球的曲率),使用Haversine formula降低。
別忘了在latitude
和longitude
上設置composite index。
這是在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));
}
?>
回顧一下:
這裏的說明做什麼的示例圖像:
第一次搜索將涉及一個包圍盒碰撞搜索(MySQL示例)以確定superset
,排除紅點。第二個驗證過程將涉及計算點與Haversine公式(PHP示例)是否在適當的正向距離內並採取subset
(由黑點組成)。
我的回答對你有幫助嗎? –
是的,它幫助,謝謝!我認爲解決方案不是以我存儲信息的方式,而是以比較航點的算法。爲此,我首先必須將航點的數量減少到與其他航線相匹配的最相關和統一航點,然後進行比較(如您的答案所述)。我沒有真正測試過,如果結果更好,我會發布我的解決方案。 –