利用d3、geojson繪制canvas地圖

“第一次用簡書悯嗓,嘗試著簡單記錄一下課程大作業(yè)的實現(xiàn)過程” ——許三多兒

關(guān)鍵詞:d3.js / canvas/ geojson

實現(xiàn)過程

加載數(shù)據(jù)

d3.queue().defer().await(){}可以理解成為d3異步加載多個csv文件县钥,而d3.csv則是一次只能加載一個伺绽。

d3.queue()
    .defer(d3.json, 'geo_shanghai_full.json')
    .defer(d3.csv, 'site.csv')
    .defer(d3.csv, 'spot.csv')
    .defer(d3.csv, 'shop.csv')
    .defer(d3.csv, 'schedulePenalty.csv')
    .await(function(error, shanghaiMapData, siteData, spotData, shopData, scheduleData) {}

定義投影坐標系

var projection = d3.geoMercator()
    .center([121.5, 31.1]) //最終要換成上海的中心坐標
    .scale(40000)
    .translate([canvasWidth / 2, canvasHeight / 2]) //渲染容器的中心點

初始化路徑

使用d3.geoPath(),將之前定義好的projection賦給path
d3.geoPath:給定GeoJSON幾何或要素對象甲馋,它會生成SVG路徑數(shù)據(jù)字符串或?qū)⒙窂匠尸F(xiàn)到Canvas埂奈。 建議使用Canvas進行動態(tài)或交互式投影以提高性能。 路徑可以與投影或變換一起使用定躏,也可以用于將平面幾何直接渲染到畫布或SVG账磺。

 var path = d3.geoPath()
       .projection(projection)
       .context(context)

繪圖

mapData.features.forEach(d => {
         context.beginPath()
         path(d)
         context.strokeStyle = 'rgba(255, 255, 255, 0.2)'
         context.lineWidth = 1
         context.stroke()
 })

完整代碼如下:

<html>
    <head>
        <meta charset=utf-8 />
        <title>drawcanvasmap</title>
        <meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />

    </head>
    <style>
        body,
        html {
            margin: 0;
            padding: 0;
            width: 100%;
        }
        
        body {
            background-color: black;
        }
    </style>

    <body>
        <canvas id="shanghaiMap"></canvas>
        <!-- Example data. -->
        <script src="d3.js"></script>
        <script src="http://d3js.org/d3.v4.0.0-alpha.44.min.js"></script>
        <script>
            var canvasWidth = window.innerWidth
            var canvasHeight = window.innerHeight

            var projection = d3.geoMercator()
                .center([121.5, 31.1]) //最終要換成上海的中心坐標
                .scale(40000)
                .translate([canvasWidth / 2, canvasHeight / 2]) //渲染容器的中心點

            d3.queue()

                .defer(d3.json, 'geo_shanghai_full.json')
                .defer(d3.csv, 'site.csv')
                .defer(d3.csv, 'spot.csv')
                .defer(d3.csv, 'shop.csv')
                .defer(d3.csv, 'schedulePenalty.csv')
                .await(function(error, shanghaiMapData, siteData, spotData, shopData, scheduleData) {
                    console.log(shanghaiMapData, siteData);
                    drawCanvasMap(shanghaiMapData, projection)

                })

            function drawCanvasMap(mapData, projection) {
                var canvas = document.getElementById('shanghaiMap')
                var context = canvas.getContext('2d')
                context.globalCompositeOperation = 'lighter'

                canvas.width = window.innerWidth
                canvas.height = window.innerHeight

                var path = d3.geoPath()
                    .projection(projection)
                    .context(context)

                // console.log(mapData.features)

                mapData.features.forEach(d => {
                    context.beginPath()
                    path(d)
                    context.strokeStyle = 'rgba(255, 255, 255, 0.2)'
                    context.lineWidth = 1
                    context.stroke()
                })


            }
        </script>
    </body>
</html>
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市痊远,隨后出現(xiàn)的幾起案子垮抗,更是在濱河造成了極大的恐慌,老刑警劉巖碧聪,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冒版,死亡現(xiàn)場離奇詭異,居然都是意外死亡矾削,警方通過查閱死者的電腦和手機壤玫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門豁护,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哼凯,“玉大人欲间,你說我怎么就攤上這事《喜浚” “怎么了猎贴?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蝴光。 經(jīng)常有香客問我她渴,道長,這世上最難降的妖魔是什么蔑祟? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任趁耗,我火速辦了婚禮,結(jié)果婚禮上疆虚,老公的妹妹穿的比我還像新娘苛败。我一直安慰自己,他們只是感情好径簿,可當(dāng)我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布罢屈。 她就那樣靜靜地躺著,像睡著了一般篇亭。 火紅的嫁衣襯著肌膚如雪缠捌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天译蒂,我揣著相機與錄音曼月,去河邊找鬼。 笑死柔昼,一個胖子當(dāng)著我的面吹牛哑芹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播岳锁,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绩衷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了激率?” 一聲冷哼從身側(cè)響起咳燕,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乒躺,沒想到半個月后招盲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡嘉冒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年曹货,在試婚紗的時候發(fā)現(xiàn)自己被綠了咆繁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡顶籽,死狀恐怖玩般,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情礼饱,我是刑警寧澤坏为,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站镊绪,受9級特大地震影響匀伏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝴韭,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一够颠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧榄鉴,春花似錦履磨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至减余,卻和暖如春综苔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背位岔。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工如筛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抒抬。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓杨刨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親擦剑。 傳聞我的和親對象是個殘疾皇子妖胀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,647評論 2 354

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

  • 1 Canvas接口元素定義 1.1 getContext()方法 為了在canvas上繪制,你必須先得到一個畫布...
    Kevin_Junbaozi閱讀 1,304評論 1 2
  • 一:canvas簡介 1.1什么是canvas惠勒? ①:canvas是HTML5提供的一種新標簽 ②:HTML5 ...
    GreenHand1閱讀 4,679評論 2 32
  • 總原則: 在移動APP中赚抡,因為手機硬件性能有限,其實不宜做太多特效纠屋,應(yīng)該往簡潔突出重點的方向考慮涂臣。 1 性能建議 ...
    Kevin_Junbaozi閱讀 2,712評論 0 6
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,029評論 0 2
  • 2017年已經(jīng)過去67天。今天是婦女節(jié) 這句話你一定聽過“絕大多數(shù)人 25 歲以后就不再進步了”售担。畢業(yè)后的很多人就...
    夏歐閱讀 589評論 0 51