Есть ли библиотеки для реализации кластеризации на PHP?

Есть задача по кластеризации данных. Вкратце:

Во входящем массиве есть некие координаты, выраженные константами x и y (широта и долгота). Необходимо произвести кластеризацию, метод не важен, особая точность тоже не важна.

Обязательное условие только одно: PHP+Apache.

Собственно, суть вопроса, каким образом это можно сделать, чтобы не лезть в глубокие дебри алгоритмов? Есть ли библиотеки реализации алгоритма?
  • Вопрос задан
  • 3629 просмотров
Решения вопроса 1
morozovdenis
@morozovdenis
если вам не обязательно честную кластеризацию то можно и самому не долго написать:
предисловие: мною было посчитано что смещение на 0.01 градуса по прямой на нашей планете земля можно считать 1111 метров
$objects = array(array('lon' => 1, 'lat' => 2), ..., ...);
$cluster = array();
$levels = 10;
$firstRectWidth = 0.01; //самый маленький "квадрат" будет 1111 на 1111
for ($i = 0; $i < count($objects); $i++)
{
$obj = $objects[$i];
for ($level = 1; $level <= $levels; $level++)
{
         $lon_index = ($obj->lon) / ($firstRectWidth * (2 ^ $level)); // не помню как степень в php
         $lat_index = ($obj->lat) / ($firstRectWidth * (2 ^ $level)); // не помню как степень в php
         $cluster[$level][$lon_index . "-" . $lat_index][] = $i;
}
}

// использование

$zoom = 1..10;
echo "кластеров ".(count($cluster[$zoom]))."<br >";
foreach ($cluster[$zoom] as $key => $value)
{
          echo "область ".$key."<br >";
          echo "кол-во элеметнов ". (count($value));
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
inside22
@inside22
Вот к примеру как я на SQL расчитываю растояние между двумя координатами.

Высчитам расстоение, можно в принципе и кластеризацию написать на PHP, если надо :-)

"google maps cluster" - поищите в поисковике, думаю найдете много интересного, как PHP, так и MySQL и JS решения.

$query = $this->db->query('SELECT
  pan.id,
  ROUND(ATAN(SQRT(POW(COS(RADIANS(pan.latitude)) * SIN(ABS(RADIANS('.$pano->longitude.')-RADIANS(pan.longitude))),2) + POW( COS(RADIANS('.$pano->latitude.')) * SIN(RADIANS(pan.latitude)) - SIN(RADIANS('.$pano->latitude.')) * COS(RADIANS(pan.latitude))*COS(ABS(RADIANS('.$pano->longitude.')-RADIANS(pan.longitude))),2))/(SIN(RADIANS(pan.latitude)) * SIN(RADIANS('.$pano->latitude.')) + COS(RADIANS(pan.latitude)) * COS(RADIANS('.$pano->latitude.'))* COS(ABS(RADIANS('.$pano->longitude.')-RADIANS(pan.longitude))))) * 6373000, 0) AS distance
FROM pano pan
WHERE pan.latitude IS NOT NULL
    AND pan.longitude IS NOT NULL
    AND pan.id != '.$pano->id);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы