在網(wǎng)頁上繪制地圖

環(huán)境
angular , d3

  1. 下載所繪地圖的json文件
    一張地圖中担孔,省市的邊界煎谍,城市的坐標(biāo)位置执泰,名稱等信息咙好,均以json文件格式保存。這樣的GeoJson文件碱璃,可以在諸多網(wǎng)站中獲得弄痹。一個(gè)比較推薦的,提供中國省市地圖的網(wǎng)站是 DATAV.GeoAtlas嵌器。這里我們點(diǎn)擊下載geojson文件肛真,用于后面的繪制。
    http://datav.aliyun.com/tools/atlas

    DATAV.GeoAtlas網(wǎng)站.png

  2. 將json數(shù)據(jù)讀入程序
    如何使用java或js讀json文件爽航,方法有很多蚓让,這里就不展開討論了。需要注意的是讥珍,程序設(shè)計(jì)人員需要決策的一件事情是历极,應(yīng)該在前端讀文件還是在后端讀文件。下面以我的例子展示衷佃,使用的是在后端讀文件趟卸,傳給前端的方式。

   //后端讀取json文件
   @GetMapping("/map/province")
    public ResponseEntity<JSONObject> getProvinceMap() throws IOException {
        log.debug("load province map json");
        //這里為了方便,直接指定文件名锄列,工程中通常根據(jù)需要從別處獲得文件名图云。
        String mapFileName = "廣東省.json"
        String docPath = System.getProperty("user.dir") + "/src/main/resources/config/map/";
        File file = new File(docPath, mapFileName);
        String content = FileUtils.readFileToString(file, "UTF-8");
        JSONObject jsonObject = JSONObject.parseObject(content);
        return ResponseEntity.ok().body(jsonObject);
    }
  1. 在前端網(wǎng)頁上繪制地圖
<!-- 在html中添加一個(gè)svg元素,此后的繪制操作均在這個(gè)svg里實(shí)現(xiàn)-->
 <div>
        <svg id="map" class="map-svg" #map></svg>
 </div>
//ts里邻邮,引入d3
import * as d3 from 'd3';
import { ContainerElement } from 'd3';
//引入拓?fù)浞?wù)竣况,調(diào)用其getProvinceMap的GET請求,從后端拿到數(shù)據(jù)
import { TopologyService } from 'app/cpe/service/topology.service';

export class CpeProvinceMapComponent implements OnInit {
  //獲DOM中svg元素
  @ViewChild('map') mapSvg: ElementRef;

 ngOnInit() {
        this.topologyService.getProvinceMap().subscribe(mapJson => {
            this.mapJson = mapJson;
            this.generateProvinceMap();
        });
    }

   generateProvinceMap() {
        const svg = d3.select('#map');

        // 1.定義投影和生成器
        const projection = d3
            .geoMercator()
            .center([113, 23])       // 地圖中心位置,113是經(jīng)度饶囚,23是緯度
            .scale(5000)             // 設(shè)置縮放量
            .translate([0, 0]);      // 設(shè)置平移量

        // 定義地理路徑生成器,使每一個(gè)坐標(biāo)都會(huì)先調(diào)用此投影,才產(chǎn)生路徑值
        const path = d3.geoPath().projection(projection); // 設(shè)定投影

        const groups = svg.append('g');           //省市邊界
        const cityPoint = svg.append('g');        //城市圓點(diǎn)
        const cityLabel = svg.append('g');       //城市名稱標(biāo)簽

        // 添加城市標(biāo)簽
        cityLabel
            .selectAll('label')
            .data(this.mapJson.features) // 綁定數(shù)據(jù)
            .enter()
            .append('text')
            .text(function(d, i) {
                return d.properties.name;
            })
            .attr('x', function(d, i) {
                return projection(d.properties.center)[0];
            })
            .attr('y', function(d, i) {
                return projection(d.properties.center)[1] - 5;
            })
            .attr('font-size', 10);

        // 添加城市圓點(diǎn)
        cityPoint
            .selectAll('circle')
            .data(this.mapJson.features) // 綁定數(shù)據(jù)
            .enter()
            .append('circle')
            .attr('class', 'point')
            .attr('cx', function(d, i) {
                return projection(d.properties.center)[0];
            })
            .attr('cy', function(d, i) {
                return projection(d.properties.center)[1];
            })
            .attr('stroke', 'red')
            .attr('stroke-width', 1)
            .attr('fill', 'white')
            .attr('r', 2);

        const enableCities = this.enableCities;
        // 添加城市邊界
        groups
            .selectAll('path')
            .data(this.mapJson.features)                        // 綁定數(shù)據(jù)
            .enter()
            .append('path')
            .on('mouseover', function(d, i) {                  //鼠標(biāo)移入移出的變色處理
                    d3.select(this).style('fill', '#2CD8FF');
                }
            })
            .on('mouseout', function(d, i) {
                   d3.select(this).style('fill', '#1890ff');
            })
            .style('fill',  '#1890ff' )
            .style('stroke', 'black')
            .attr('d', path);
    }
}

總結(jié)帕翻,繪制地圖還是比較容易的一件事,上述的代碼僅為示意萝风,不一定能正確運(yùn)行,且由于展示了整個(gè)繪制過程紫岩,導(dǎo)致重點(diǎn)不是很清晰规惰,這里指出,繪制地圖的關(guān)鍵是下面這段代碼泉蝌,同時(shí)先學(xué)習(xí)svg的path歇万,circle, text的繪制,會(huì)對讀懂示意代碼有很大的幫助勋陪。

        // 1.定義投影和生成器
        const projection = d3
            .geoMercator()
            .center([113, 23])       // 地圖中心位置,113是經(jīng)度贪磺,23是緯度
            .scale(5000)             // 設(shè)置縮放量
            .translate([0, 0]);      // 設(shè)置平移量

        // 定義地理路徑生成器,使每一個(gè)坐標(biāo)都會(huì)先調(diào)用此投影,才產(chǎn)生路徑值
        const path = d3.geoPath().projection(projection); // 設(shè)定投影

        const groups = svg.append('g');           //省市邊界

        // 添加城市邊界
        groups
            .selectAll('path')
            .data(this.mapJson.features)            // 綁定數(shù)據(jù)
            .enter()
            .append('path')
            .style('fill',  '#1890ff' )
            .attr('d', path);
  1. 效果展示


    d3繪制廣東省地圖.png

結(jié)束!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诅愚,一起剝皮案震驚了整個(gè)濱河市寒锚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌违孝,老刑警劉巖刹前,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雌桑,居然都是意外死亡喇喉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門校坑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拣技,“玉大人,你說我怎么就攤上這事耍目「嘟铮” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵制妄,是天一觀的道長掸绞。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么衔掸? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任烫幕,我火速辦了婚禮,結(jié)果婚禮上敞映,老公的妹妹穿的比我還像新娘较曼。我一直安慰自己,他們只是感情好振愿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布捷犹。 她就那樣靜靜地躺著,像睡著了一般冕末。 火紅的嫁衣襯著肌膚如雪萍歉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天档桃,我揣著相機(jī)與錄音枪孩,去河邊找鬼。 笑死藻肄,一個(gè)胖子當(dāng)著我的面吹牛蔑舞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘹屯,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼攻询,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了州弟?” 一聲冷哼從身側(cè)響起钧栖,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呆馁,沒想到半個(gè)月后桐经,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浙滤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年阴挣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纺腊。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡畔咧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出揖膜,到底是詐尸還是另有隱情誓沸,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布壹粟,位于F島的核電站拜隧,受9級特大地震影響宿百,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洪添,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一垦页、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧干奢,春花似錦痊焊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逛尚,卻和暖如春垄惧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背黑低。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工赘艳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人克握。 一個(gè)月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像枷踏,于是被迫代替她去往敵國和親菩暗。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

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