波奇數(shù)據(jù)可視化實踐之利用d3畫一個中國地圖

這次我們準備利用D3畫一個中國地柒爵。
lib版本
https://d3js.org/d3.v4.min.js
https://d3js.org/topojson.v2.min.js
如下圖:

屏幕快照 2018-11-19 上午10.37.23.png

一. 目前中國地圖的地理文件格式有兩種芙粱,GeoJSON和TopoJSON。

GeoJSON

GeoJSON 是用于描述地理空間信息的數(shù)據(jù)格式己肮。GeoJSON 不是一種新的格式,其語法規(guī)范是符合 JSON 格式的,只不過對其名稱進行了規(guī)范洪鸭,專門用于表示地理信息挡毅。
GeoJSON 的最外層是一個單獨的對象(object)蒜撮。這個對象可表示:

  • 幾何體(Geometry)
  • 特征(Feature)
  • 特征集合(FeatureCollection)
    最外層的 GeoJSON 里可能包含有很多子對象,每一個 GeoJSON 對象都有一個 type 屬性跪呈,表示對象的類型段磨,type 的值必須是下面之一。
  • Point:點耗绿。
  • MultiPoint:多點薇溃。
  • LineString:線。
  • MultiLineString:多線缭乘。
  • Polygon:面沐序。
  • MultiPolygon:多面琉用。
  • GeometryCollection:幾何體集合。
  • Feature:特征策幼。
  • FeatureCollection:特征集合邑时。
    如下面代碼
點對象:
{
"type": "Point",
"coordinates": [ -135, 39 ]
}

線對象:
{
"type": "LineString",
"coordinates": [[-135, 39 ], [-137, 38 ]]
}
面對象:
{
"type": "Polygon",
"coordinates":[[ [30, 0], [31, 0], [31, 5], [30, 5], [30, 0] ]]
}

由以上格式可以發(fā)現(xiàn),每一個對象都有一個成員變量 coordinates特姐。如果 type 的值為 Point晶丘、MultiPoint、LineString唐含、MultiLineString浅浮、Polygon、MultiPolygon 之一捷枯,則該對象必須有變量 coordinates滚秩。
如果 type 的值為 GeometryCollection(幾何體集合),那么該對象必須有變量 geometries淮捆,其值是一個數(shù)組郁油,數(shù)組的每一項都是一個 GeoJSON 的幾何對象。例如:

{
    "type": "GeometryCollection",
    "geometries": [
        {
            "type": "Point",
            "coordinates": [100, 40]
        },
        {
            "type": "LineString",
            "coordinates": [ [100, 30], [100, 35] ]
        }
    ]
}

如果 type 的值為 Feature(特征)攀痊,那么此特征對象必須包含有變量 geometry桐腌,表示幾何體,geometry 的值必須是幾何體對象苟径。此特征對象還包含有一個 properties案站,表示特性,properties 的值可以是任意 JSON 對象或 null棘街。例如:

{
    "type": "Feature",
    "properties": {
        "name": "北京"
    },
    "geometry": {
        "type": "Point",
        "coordinates": [ 116.3671875, 39.977120098439634]
    }
}

如果 type 的值為 FeatureCollection(特征集合)嚼吞,則該對象必須有一個名稱為 features 的成員。features 的值是一個數(shù)組蹬碧,數(shù)組的每一項都是一個特征對象舱禽。

TopoJSON

TopoJSON 是 GeoJSON 按拓撲學編碼后的擴展形式,是由 D3 的作者 Mike Bostock 制定的恩沽。相比 GeoJSON 直接使用 Polygon誊稚、Point 之類的幾何體來表示圖形的方法,TopoJSON 中的每一個幾何體都是通過將共享邊(被稱為arcs)整合后組成的罗心。
TopoJSON 消除了冗余里伯,文件大小縮小了 80%,因為:

  • 邊界線只記錄一次(例如廣西和廣東的交界線只記錄一次)渤闷。
  • 地理坐標使用整數(shù)疾瓮,不使用浮點數(shù)。
    引用來自ourd3js.com

二. 準備D3JS飒箭, 構(gòu)建最簡單的中國地圖

上面已經(jīng)說過了狼电,地理的JSON文件分為TopoJSON 和GeoJSON, 現(xiàn)在我們使用TopoJSON來完成接下來的構(gòu)建蜒灰。

  1. 在項目中引入兩個lib
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://d3js.org/topojson.v2.min.js"></script>
  1. 生成投影 和投影相對于的路徑生成器
#生成路徑生成器
generatePath(scale) {
      let self = this;
      var projection = self.generateProjection(scale);
     return d3.geoPath().projection(projection);
},
#生成投影
generateProjection(scale) {
    var svg = d3.select("svg"),
    width = svg.attr("width"),
    height = svg.attr("height");
    return d3.geoMercator()
          .center([105, 31])
          .scale(scale)
          .translate([width / 2, height / 2 + height / 6])
},
  1. 獲取中國地圖數(shù)據(jù)
initChinaMap() {
        let self = this;
        var path = self.generatePath(950);
        var pathCubier = self.generatePath(958);
        var color = function(i) {
          return d3.color('#02005A');
        };
        var svg = d3.select("svg");
        d3.json("/static/js/china-topo.json", function(error, root) {
          if (error)
            return console.error(error);
          //畫陰影背景
          svg.append("g")
            .attr("filter", "url(#f1)")
            .attr("fill", "rgba(45,107,253,1)")
            .attr('style', 'border: 1px solid #fff;')
            .selectAll("path")
            .data(topojson.feature(root, root.objects.china).features)
            .enter()
            .append("path")
            .attr("stroke", "rgba(45,107,253,1)")
            .attr("stroke-width", 1)
            .attr("fill", "rgba(45,107,253,1)")
            .attr("d", pathCubier)
            .select('circle')
            .data(topojson.feature(root, root.objects.china).features)
            .enter()
            .append("circle")
            .attr('cx', '0')
            .attr('cy', '0')
            .attr('r', 500)
            .attr('fill', 'transparent')
          //畫立體層級感
          svg.append("g")
            .attr("fill", "#59acc8")
            .selectAll("path")
            .data(topojson.feature(root, root.objects.china).features)
            .enter()
            .append("path")
            .attr("stroke", "#59acc8")
            .attr("stroke-width", 1)
            .attr("fill", "#59acc8")
            .attr("d", pathCubier)
          //畫中國地圖
          svg.append("g")
            .attr("fill", "#02005A")
            .selectAll("path")
            .data(topojson.feature(root, root.objects.china).features)
            .enter()
            .append("path")
            .attr("stroke", "#1C98C8")
            .attr("stroke-width", 1)
            .attr("fill", function(d, i) {
              return color(i);
            })
            .attr("d", path)
            .append("title")
            .text(function(d) {
              // console.log("d", d)
              return d.properties.name;
            })  
        });
      },

這里為了畫出地圖的立體效果和陰影效果, 將整個地圖分成了 三部分肩碟,强窖,先畫陰影部分


屏幕快照 2018-11-19 上午10.42.33.png

再畫立體部分


屏幕快照 2018-11-19 上午10.43.10.png

最后畫地圖具體的輪廓
屏幕快照 2018-11-19 上午10.43.26.png

最后,按照順序合再一起就可以畫出削祈,有陰影翅溺,有立體的中國地圖。
有任何問題髓抑,可以聯(lián)系我
email: cheng_cong123@163.com
當然咙崎,這個立體感是有問題的,有誰知道是什么問題嗎吨拍?可以留言褪猛!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市密末,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌跛璧,老刑警劉巖严里,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異追城,居然都是意外死亡刹碾,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門座柱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迷帜,“玉大人,你說我怎么就攤上這事色洞∠非拢” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵火诸,是天一觀的道長锦针。 經(jīng)常有香客問我,道長置蜀,這世上最難降的妖魔是什么奈搜? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮盯荤,結(jié)果婚禮上馋吗,老公的妹妹穿的比我還像新娘。我一直安慰自己秋秤,他們只是感情好宏粤,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布脚翘。 她就那樣靜靜地躺著,像睡著了一般商架。 火紅的嫁衣襯著肌膚如雪堰怨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天蛇摸,我揣著相機與錄音备图,去河邊找鬼。 笑死赶袄,一個胖子當著我的面吹牛揽涮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饿肺,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蒋困,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了敬辣?” 一聲冷哼從身側(cè)響起雪标,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溉跃,沒想到半個月后村刨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡撰茎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年嵌牺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片龄糊。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡逆粹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炫惩,到底是詐尸還是另有隱情僻弹,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布他嚷,位于F島的核電站奢方,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏爸舒。R本人自食惡果不足惜蟋字,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扭勉。 院中可真熱鬧鹊奖,春花似錦、人聲如沸涂炎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至两蟀,卻和暖如春网梢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赂毯。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工战虏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人党涕。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓烦感,卻偏偏與公主長得像,于是被迫代替她去往敵國和親膛堤。 傳聞我的和親對象是個殘疾皇子手趣,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 文/李秀峰 南方雪嶺北方春, 北雪南飄為何因肥荔。 難道天公多醉酒绿渣, 偏將北雪向南臨。 ——2018.1....
    盤錦西山閱讀 203評論 4 11
  • class 和 id 的使用場景 id定位到頁面上唯一元素燕耿,而class定位到某一類元素中符。 CSS選擇器種類 (1...
    饑人谷_張樂閱讀 184評論 0 0
  • 我的小房間 零亂又溫暖 她就緊靠在 廳房的右邊 深褐色的立柜里面 舊衣物掛得滿滿 暗紅色書桌的抽屜中 鎖滿了浪漫的...
    畫府王爺閱讀 1,258評論 4 6
  • 原曲:《小小》 填詞:歸海臨秋 同以往親昵的模樣 言笑也依舊如平常 卻能感覺意味深長 冷不防雙耳燙 似有似無投遞眼...
    歸海臨秋閱讀 315評論 0 2
  • 詳細一 詳細二 UIImageView+WebCache.hNSURL*url = [NSURL URLWithS...
    nothing_c閱讀 163評論 0 0