2015-09-26 30 views
0

我有一個基於地圖邊界框相對於要素運行操作所需的特徵/多邊形列表,而無需移動地圖。根據縮放級別和中心點創建latLngBounds

爲了進一步說明我的問題,我可以給我怎麼能這樣一個例子,如果中移動地圖是不是一個問題:

features.forEach(function (feature) { 
    var bbox, 
     ne, 
     sw, 
     fBounds, 
     zoom, 
     mBounds; 

    bbox = feature.geometry.bbox; 
    sw = L.latLng(bbox[1], bbox[0]); 
    ne = L.latLng(bbox[3], bbox[2]); 
    fBounds = L.latLngBounds(sw, ne); 
    map.fitBounds(bounds); 
    mBounds = map.getBounds(); 
    zoom = map.getZoom(); 
    //Execute operation based on mBounds and zoom 
}  

我已經測試了很多,這是最接近我有一個工作代碼片段:

 var self = this, 
      bbox, 
      sw, 
      ne, 
      bounds, 
      zoom, 
      swPoint, 
      nePoint, 
      center, 
      factor, 
      dw, 
      dh, 
      cpx; 

     bbox = feature.geometry.bbox; 
     sw = L.latLng(bbox[1], bbox[0]); 
     ne = L.latLng(bbox[3], bbox[2]); 
     bounds = L.latLngBounds(sw, ne); 
     zoom = self.map.getBoundsZoom(bounds, false); //maxZoom? 
     swPoint = self.map.project(bounds.getSouthWest(), zoom), 
     nePoint = self.map.project(bounds.getNorthEast(), zoom), 
     center = self.map.unproject(swPoint.add(nePoint).divideBy(2), zoom); 

     factor = self.map.options.crs.scale(zoom)/8388608; 
     dw = self.map.getSize().x/2*factor; 
     dh = self.map.getSize().y/2*factor; 
     cpx = self.map.options.crs.latLngToPoint(center, zoom);    

     return { 
      ne: self.map.options.crs.pointToLatLng(L.point(cpx.x + dw, cpx.y - dh, false), zoom), 
      sw: self.map.options.crs.pointToLatLng(L.point(cpx.x - dw, cpx.y + dh, false), zoom), 
      center: center, 
      zoom: zoom 
     } 

     //Execute operation based on returned object, repeat for every feature 

這個「作品」,但它沒有給出相同的結果,第一代碼片段(即結果是錯誤的)。

回答

0

下面的代碼段爲我工作,如果任何人應該有同樣的疑問:

var self = this, 
    bbox, 
    sw, 
    ne, 
    bounds, 
    zoom, 
    center; 

bbox = feature.geometry.bbox; 
sw = L.latLng(bbox[1], bbox[0]); 
ne = L.latLng(bbox[3], bbox[2]); 
bounds = L.latLngBounds(sw, ne); 
zoom = self.map.getBoundsZoom(bounds, false); //maxZoom? 
sw = self.map.project(bounds.getSouthWest(), zoom), 
ne = self.map.project(bounds.getNorthEast(), zoom), 
center = self.map.unproject(sw.add(ne).divideBy(2), zoom); 

bounds = self.map.getPixelBounds(center, zoom), 
sw = self.map.unproject(b2.getBottomLeft()), 
ne = self.map.unproject(b2.getTopRight()); 

return new L.LatLngBounds(sw, ne);