Вам действительно нужно вычислить евклидово расстояние ? Если вы просто сравниваете относительные величины расстояний, вы, вероятно, можете избежать использования Манхэттенского расстояния , которое сэкономит вам два звонка на pow()
и один на sqrt()
:
function pixelDistance($lat1, $lon1, $lat2, $lon2, $zoom) {
$x1 = $lon1*10000000; //This is what I did to compensate for using lat/lon values instead of pixels.
$y1 = $lat1*10000000;
$x2 = $lon2*10000000;
$y2 = $lat2*10000000;
return ($x1-$x2) + ($y1-$y2) >> (21 - $zoom);
}
Не уверен, что вам нужен бит >> (21 - $zoom)
для ваших вычислений, поэтому я оставил его. Но если вам не нужно фактически использовать рассчитанные значения расстояния в другом месте, вы, вероятно, можете избежать использования только широты / долготы напрямую ( не нужно умножать на что-либо) и брать манхэттенское расстояние, предполагая, что вы предварительно рассчитали $distance
, чтобы соответствовать этой мере, что будет намного дешевле в вычислительном выражении, чем приведение всех расстояний к единицам и величине $distance
.
РЕДАКТИРОВАТЬ: Когда я исследовал эту проблему в прошлом году, я нашел некоторые полезные вещи в Википедии - да, это может случиться; -)
Я также настоятельно рекомендую книгу Программирование Коллективного разума: создание приложений Smart Web 2.0 , которая глубоко углубляется в кластеризацию, применительно не только к географическим данным, но и к другим Области анализа данных.