2013-03-22 11 views
9

У меня есть глобальная база данных объектов (точек на карте), которые я хотел бы показать на карте лифтов. Вместо того, чтобы загружать всю базу данных (просто слишком большую) сразу и создавать объекты в Leaflet LayerGroup, есть ли более эффективный способ обращения к данным, возможно, по мере того, как загружается каждая карта, или я смотрю на создание настраиваемого решения для этого?Эффективный способ доступа к большим наборам данных для отображения на листе

+0

Как вы служите карту? Я ожидаю, что у сервера будет метод, который можно запросить с помощью ограничивающей рамки. Или, в зависимости от количества объектов, вы можете использовать markerclusters. В их примере есть [карта, отображающая 50000 элементов] (http://leaflet.github.com/Leaflet.markercluster/example/marker-clustering-realworld.50000.html). – flup

+0

Я не хочу использовать markerclusters, так как я хочу отображать каждый маркер, который виден вместо агрегации. Я пытаюсь решить, как именно я должен служить своей карте. Поскольку это перемещается или масштабируется, вероятно, не имеет смысла каждый раз запрашивать сервер в соответствии с новой ограничивающей рамкой (которая может частично перекрывать старую). Я могу представить несколько способов сделать это, но прежде чем изобретать колесо, я хотел бы убедиться, что уже нет хорошего решения. – CuNimb

+0

Ну, в какой-то момент, когда вы уменьшаете масштаб до всего мира, d означает отображение каждого маркера. Итак, кластеризация имеет смысл. Или вы не увидите никаких маркеров на уровне ниже минимального уровня масштабирования? Сколько у вас маркеров? – flup

ответ

13

Вы могли наблюдать за «moveend» событие на карте с map.on('moveend',loadstuff), сделать вызов Ajax внутри loadstuff(), чтобы захватить маркеры внутри текущего map.getBounds(), а затем добавить/удалить маркеры (я предполагаю, у вас есть какой-то глобальный идентификатор для каждого из них) находятся ли они внутри или снаружи текущего представления.

+0

Это должно быть отмечено как ответ, это правильный способ сделать это. – Rudi

+0

Спасибо за это. Я еще не очень сложный пользователь SO – CuNimb

+0

@snkashis - не могли бы вы предоставить немного больше подробностей о том, как это сделать? Это именно то, что я пытаюсь сделать, но мои навыки не так велики! –

3

Существует стандартный и эффективный способ делать то, что говорят snkashis. Создайте услугу geoJSON с черепицей и используйте плагин leaflet-tilelayer-geojson.

Тогда весь код, вам нужно будет на стороне браузера есть (со страницы Github):

var geojsonURL = 'http://polymaps.appspot.com/state/{z}/{x}/{y}.json'; 
var geojsonTileLayer = new L.TileLayer.GeoJSON(geojsonURL, { 
     clipTiles: true, 
     unique: function (feature) { 
      return feature.id; 
     } 
    }, { 
     style: style, 
     onEachFeature: function (feature, layer) { 
      if (feature.properties) { 
       var popupString = '<div class="popup">'; 
       for (var k in feature.properties) { 
        var v = feature.properties[k]; 
        popupString += k + ': ' + v + '<br />'; 
       } 
       popupString += '</div>'; 
       layer.bindPopup(popupString); 
      } 
      if (!(layer instanceof L.Point)) { 
       layer.on('mouseover', function() { 
        layer.setStyle(hoverStyle); 
       }); 
       layer.on('mouseout', function() { 
        layer.setStyle(style); 
       }); 
      } 
     } 
    } 
); 
map.addLayer(geojsonTileLayer);