2013-04-02 2 views
0

У меня есть приложение, которое отображает последние задания на карте в качестве точек с помощью Leafletjs.Найти слои в текущем виде карты с помощью Leafletjs

С Leafletjs, когда вы хотите, чтобы увеличить до обнаруженного местоположения пользователя, вы называете что-то вроде:

map.locate({'setView' : true, 'timeout' : 10000, maxZoom: 10}); 

Однако для некоторых местах уровень масштабирования 10 не содержит каких-либо точек задания, так что я d хотел бы динамически установить масштаб так, чтобы по крайней мере на рабочем месте было видно пользователям.

Я знаю, что я могу слушать успеха функция Locate и затем проверить что-то вроде:

map.on('locationfound', function() { 
    //for marker in markers{ 
    //is point within currently visible bounds 
    //break on first positive 
    //else, 
    //zoom up a level, repeat previous checks 
    } 
} 

но это очень неэффективно, особенно, если у меня есть большое количество очков.

Есть ли в Лифлете какие-либо встроенные функции/методы для предоставления информации о слоях в текущем виде карты?

ответ

0

Если вы делаете что-то на стороне сервера, вы, вероятно, можете сделать вычисления достаточно быстро.

  1. Храните местоположения в пиксельных координатах в базе данных на некотором увеличенном уровне масштабирования (я использую уровень масштабирования 23). Я называю эту систему координат «Vast Coordinate System». Затем, чтобы получить координаты плитки для точки в определенном месте, это IIRC один побитовый сдвиг - очень быстрый, и что-то, что вы можете сделать в SQL.
  2. Преобразуйте местоположение своих пользователей в пиксельные координаты таким образом, чтобы увеличить масштаб.
  3. Итерация на уровне увеличения. Получить координаты фрагмента для местоположения пользователя на этом уровне масштабирования, а затем выполнить SQL-запрос, который подсчитывает количество точек на этом фрагменте. Если> 0, остановитесь.

Ваш SQL будет что-то вроде (извините, я лениться и делать это из памяти/мышления, а не на самом деле пытается его)

SELECT count(*) WHERE (vcsX>>(zoom+8)==userX>>(zoom+8)) AND (vcsY>>(zoom+8)==userY>>(zoom+8)); 

где vcsX и vcsY являются координаты пикселей в Обширная система координат.

+0

Спасибо Kaitlin, но я действительно надеюсь сохранить его на стороне клиента в этом проекте. – bibliotechy

Смежные вопросы