2016-03-03 99 views
0

我有一個三層的地理層:村>縣>地區。Leaflet,Topojson和圖層組

我的topojson由村莊的多邊形組成,我有一個包含村莊>縣>區域數據的json。

我加載這樣說:

L.TopoJSON = L.GeoJSON.extend({ 
    addData: function(jsonData) {  
    if (jsonData.type === "Topology") { 
     for (key in jsonData.objects) { 
     geojson = topojson.feature(jsonData, jsonData.objects[key]); 
     L.GeoJSON.prototype.addData.call(this, geojson); 
     } 
    }  
    else { 
     L.GeoJSON.prototype.addData.call(this, jsonData); 
    } 
    } 
}); 
var topoLayer = new L.TopoJSON(); 

var village = {}; 

$.getJSON('data/villages_data.json', function(data) { 
    village = data; 
    $.getJSON('data/villages_geo.json').done(addTopoData); 
}); 
function addTopoData(topoData){ 
    topoLayer.addData(topoData); 
    topoLayer.addTo(map); 
    topoLayer.eachLayer(handleLayer); 
} 

我想在地圖上顯示的三個層次:村,縣,區。我之前設法使用了layergroup,並且我正在考慮使用它來添加一個控件來切換每個管理級別。 我也想對每個管理級別進行不同的樣式設計。

我本來希望直接在地圖上做。否則我看到的唯一解決方案是製作三個shapefile,每個管理級別一個,然後爲這三個層創建一個topojson。那麼我猜想訪問每個管理員級別會更容易;雖然我甚至不確定我會處理它。

有什麼建議嗎?

回答

1

有點困惑,因爲我不清楚你的設置/解釋,但從我收集的東西,這是我會做的。您可以將您的shape文件導出爲三種不同的GeoJSON的文件,並將其轉換爲一個TopoJSON文件:

topojson -o topo.json -- villages.json counties.json regions.json 

然後你可以做到這一點,客戶方:

var overlays = { 
    'villages': new L.GeoJSON(null, { 
     'style': function() { 
      return { 
       'color': 'red' 
      } 
     } 
    }), 
    'counties': new L.GeoJSON(null, { 
     'style': function() { 
      return { 
       'color': 'green' 
      } 
     } 
    }), 
    'regions': new L.GeoJSON(null, { 
     'style': function() { 
      return { 
       'color': 'blue' 
      } 
     } 
    }) 
}; 

var control = new L.Control.Layers(null, overlays).addTo(map); 

$.getJSON('topo.json', function (topo) { 
    for (key in topo.objects) { 
     var geo = topojson.feature(topo, topo.objects[key]); 
     overlays[key].addData(geo); 
    } 
}); 

沿着這些線路的一些東西,但是你要知道:將其作爲僞/未經測試的代碼,因爲我徒手編寫它,並且沒有手動獲取適當的TopoJSON文件來實際測試它。

+0

只是爲了記錄:'style'選項可以直接作爲一個對象。 'L.geoJson'會將它轉換成一個總是返回該對象的函數。 – ghybs

+0

感謝您澄清並發現突出顯示錯誤,未正確自動檢測並監督它。至於工廠方法,我總是在我的所有代碼/示例中使用'new'關鍵字的正常方式,所以我改回了它。這不是我第一次幫助那些在instanciating有問題的人,當他們認爲工廠存在的時候不存在的時候(比如一些插件等) – iH8

+0

當然,Leaflet足夠好,構造函數和工廠是等同的。但不是一些插件,如你所說... – ghybs

相關問題