@mapleart

Как сделать выборку на карте с QuadKey?

Здравствуйте! Нужно по быстрому сделать кластеризацию на сервере меток с карты. Подходит вариант https://habr.com/ru/post/268621/.
Собственно в базу я уже добавил метки с уровнем детализации 23, сам QuadKey хранится в десятичной системе.

5ca74bee47ca5849374995.png

Сейчас пытаюсь сделать выборку маркеров как в примере на карте. Не могу сообразить.

public function getClusters( $quad_key, $zoom)
  {
    $q1 = $quad_key . str_repeat("0", TileSystem::MaxZoom - $zoom);
    $q2 = $quad_key . str_repeat("3", TileSystem::MaxZoom - $zoom);
    $mask = $q1;
    $mask_plus = 1;
    $mask = $quad_key . str_repeat("3", $mask_plus);
    $mask = $mask . str_repeat("0", TileSystem::MaxZoom - $zoom - $mask_plus);

    $q1 = TileSystem::quadKey4ToDec( $q1);
    $q2 = TileSystem::quadKey4ToDec( $q2);
    $mask = TileSystem::quadKey4ToDec( $mask);

     return $this-> findBetweenQuadKeys( $q1, $q2, $mask);
  }

 public function findBetweenQuadKeys( $quad_key_l, $quad_key_r, $mask)
  {
    $entities = [];

    $sql = "SELECT `quadkey`, MIN(id) AS id, COUNT(id) AS count, AVG(longitude) AS longitude, AVG(latitude) AS latitude ";
    $sql .= "FROM `marker ` ";
    $sql .= "WHERE `quadkey` BETWEEN $quad_key_l AND $quad_key_r ";
    $sql .= "AND `is_deleted`= '0' ";
    $sql .= "GROUP BY (`quadkey` & $mask) ";

    if( $stmt =  $this->_connection->query( $sql))
    {
      foreach( $stmt as $row)
        $entities[] = $this->_createEntityFromRow( $row);
    }

    return $entities;
  }


что передавать в getClusters ? $quad_key и $zoom . Подскажите пожалуйста, информации так мало в интернете
  • Вопрос задан
  • 171 просмотр
Пригласить эксперта
Ваш ответ на вопрос

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

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