本人的個人部落格為:www.ourd3js.com
csdn部落格為:blog.csdn.net/lzhlzz
轉載請注明出處,謝謝。
地圖的制作在 D3 中可以說是最重要的一環。因為在進行資料可視化時,很多情況都會和地圖聯系在一起,如中國各省的人口多少,GDP多少等,都可以和地圖聯系在一起。
D3 中制作地圖所需要的檔案問 JSON 檔案。JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式。關于 JSON 的文法格式,可以在:
http://www.w3school.com.cn/json/
學習。将 JSON 的格式應用于地理上的檔案,叫做 GeoJSON 檔案。本節就是用這種檔案繪制地圖。
那麼如何獲得中國地圖的 GeoJSON 檔案呢,這其實真的有點麻煩,可以參照: https://github.com/clemsos/d3-china-map 進行制作,這不僅需要安裝一些東西,還要研究一下制作方法,對想直接下載下傳擷取中國地圖的 GeoJSON 檔案的朋友可能感覺很不舒服,呵呵,其實我也是這樣。
好吧,我辛苦一點,将制作好的中國地圖放上來與大家分享。
中國地圖的 GeoJSON 檔案: china.json
這個檔案是用 Natural Earth 上的資料,經過提取後制作而成,我還去掉了很多無用的資訊,隻保留的中國的各省份的名字和 id 号,在這裡先感謝 Natural Earth 提供的資料。接下來我還會提取其他各個國家的資料,放到個人部落格中供大家分享,希望能省去大家的時間,因為這個部分真的很麻煩。對于隻希望進行可視化的朋友來說,估計不想做這個工作。後續制作好的各種 GeoJSON 檔案,都會放到 OUR D3.JS 小站中,請關注。
好了,廢話不說了。開始用 D3 來繪制地圖吧。繪制分為三步:
1. 設定投影函數
var projection = d3.geo.mercator()
.center([107, 31])
.scale(850)
.translate([width/2, height/2]);
由于 GeoJSON 檔案中的地圖資料,都是經度和緯度的資訊,它們都是三維的。要在網頁上顯示的是二維的,是以要設定一個投影函數來轉換經度緯度。如上所示,我們用 d3.geo.mercator() 的投影方式。關于各種投影方式的函數,可以參考: https://github.com/mbostock/d3/wiki/Geo-Projections
center() 函數是用于設定地圖的中心位置,[107,31] 指的是經度和緯度。
scale() 函數用于設定放大的比例。
translate() 函數用于設定平移。
2. 設定 path 函數
var path = d3.geo.path()
.projection(projection);
将上面的投影函數,作為參數,放入 path 中。這個 path 函數後面在繪制的時候就會用于轉換經度緯度為平面資訊,用于繪制。
3. 讀取檔案并繪制
d3.json("china.json", function(error, root) {
if (error)
return console.error(error);
console.log(root.features);
svg.selectAll("path")
.data( root.features )
.enter()
.append("path")
.attr("stroke","#000")
.attr("stroke-width",1)
.attr("fill", function(d,i){
return color(i);
})
.attr("d", path )
.on("mouseover",function(d,i){
d3.select(this)
.attr("fill","yellow");
})
.on("mouseout",function(d,i){
d3.select(this)
.attr("fill",color(i));
});
});
和上幾節一樣,用 d3.json 讀取檔案。 請注意,再次聲明一下,這個函數的調用需要你搭建一個伺服器。接下來,就是給 svg 中添加 path。要注意 attr("d",path) 這一行代碼,前面也說過,這個其實相當于:
.attr("d",funtion(d){
return path(d);
})
請一定要注意這種省略用法。這裡是有點難了解的。
好了,看結果吧。
我們的國家就被繪制出來了。要看完整代碼和試試互操作的朋友,請點選下面連結檢視,把滑鼠放上去會有變色效果:
http://www.ourd3js.com/demo/chinamap.html