2013-03-22 35 views
9

Tôi có một cơ sở dữ liệu toàn cục về các đối tượng (điểm trên bản đồ) mà tôi muốn hiển thị trên bản đồ Leaflet. Thay vì tải tất cả các cơ sở dữ liệu (đơn giản là quá lớn) cùng một lúc và tạo các đối tượng trên một Leaflet LayerGroup, có cách nào hiệu quả hơn để truy vấn dữ liệu, có lẽ vì mỗi lần tải bản đồ, hoặc tôi đang tạo ra một giải pháp tùy chỉnh cho điều này?Cách hiệu quả để truy cập các tập dữ liệu lớn để hiển thị trên Leaflet

+0

Làm thế nào để bạn phục vụ bản đồ? Tôi hy vọng máy chủ có một phương thức có thể được truy vấn bằng cách sử dụng một hộp giới hạn. Hoặc tùy thuộc vào số lượng các đối tượng, bạn có lẽ có thể sử dụng markerclusters. Ví dụ của họ có [một bản đồ hiển thị 50000 mục] (http://leaflet.github.com/Leaflet.markercluster/example/marker-clustering-realworld.50000.html). – flup

+0

Tôi không muốn sử dụng các điểm đánh dấu, vì tôi muốn hiển thị mọi điểm đánh dấu hiển thị thay vì tổng hợp. Những gì tôi đang cố gắng để quyết định là chính xác như thế nào tôi nên phục vụ bản đồ của tôi. Vì điều này được di chuyển hoặc phóng to, có thể sẽ không có ý nghĩa nhiều khi truy vấn máy chủ mỗi lần theo hộp giới hạn mới (có thể chồng lên nhau một phần cũ). Tôi có thể hình dung một vài cách để làm điều này, nhưng trước khi tôi phát minh lại bánh xe, tôi muốn đảm bảo rằng không có giải pháp tốt cho điều này đã được – CuNimb

+0

Vâng, tại một số thời điểm, khi bạn thu nhỏ toàn bộ thế giới, ' d có nghĩa là hiển thị từng điểm đánh dấu. Vì vậy, sau đó phân cụm có ý nghĩa. Hoặc bạn sẽ không hiển thị điểm đánh dấu nào dưới một số mức thu phóng tối thiểu? Bạn có bao nhiêu điểm đánh dấu? – flup

Trả lời

13

Bạn có thể xem sự kiện 'moveend' trên bản đồ với map.on('moveend',loadstuff), thực hiện cuộc gọi ajax bên loadstuff() để lấy dấu bên trong hiện tại map.getBounds(), và sau đó thêm/gỡ bỏ các cột mốc (Tôi sẽ giả sử bạn có một số loại định danh toàn cầu đối với từng của họ) cho dù họ ở trong hay ngoài tầm nhìn hiện tại.

+0

Điều này cần được đánh dấu là câu trả lời, đó là cách thích hợp để thực hiện. – Rudi

+0

Cảm ơn bạn đã chỉ ra điều này. Tôi không phải là một người dùng SO rất tinh vi, chưa – CuNimb

+0

@snkashis - bạn có thể cung cấp thêm một chút chi tiết về cách thực hiện việc này không? Đó là chính xác những gì tôi đang cố gắng làm, nhưng kỹ năng của tôi không quá tuyệt vời! –

3

Có một cách tiêu chuẩn và hiệu quả xung quanh làm những gì snkashis nói. Tạo dịch vụ geoJSON được lát gạch và sử dụng plugin leaflet-tilelayer-geojson.

Sau đó, tất cả các mã bạn sẽ cần trình duyệt bên là (từ trang 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); 
Các vấn đề liên quan