摘要:下面,以貴州省的偽地圖為例,進(jìn)行代碼的編寫和相應(yīng)數(shù)據(jù)的簡單處理。根據(jù)問答如何合并區(qū)域邊界,訪問在線的地圖數(shù)據(jù)處理網(wǎng)站,給每個(gè)縣市取一個(gè)相同的別名,一番輸入輸出,我們就得到了貴州省的外邊界。
進(jìn)行圖形可視化,難免會(huì)遇到地理數(shù)據(jù)的可視化需求。通常情況下,直接使用echarts對(duì)配置項(xiàng)進(jìn)行處理,就可以滿足大部分需求。當(dāng)然,更加復(fù)雜的定制化需求,可能就需要借助d3、Three.js等工具。如果對(duì)詳細(xì)的地圖背景有要求的話,又需要將圖形庫與leaflet、maptalks等地圖引擎相結(jié)合。
不過也許你的需求和我一樣,沒有那么復(fù)雜的交互需求,但對(duì)顯示效果卻有一些想法。那么就可以嘗試閱讀本文,使用一種比較偷懶的方法,僅基于maptalks本身,來繪制可交互的偽3d地圖。
下面,以貴州省的偽3d地圖為例,進(jìn)行代碼的編寫和相應(yīng)數(shù)據(jù)的簡單處理。
1.基本的地圖繪制
maptalks(maptalks的git)的官方范例寫得相當(dāng)親切,我們可以從中找到所有繪制偽3d地圖需要的元素。
首先,從地圖底圖開始。(官方入門示例)
initMapTalk() { let map = new maptalks.Map("mapDom", { center: [121.345, 31.2088], zoom: 9, baseLayer: new maptalks.TileLayer("base", { urlTemplate: "http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png", subdomains: ["a","b","c","d"], attribution: "© OpenStreetMap contributors, ©需要注意的是,除了maptalks.js以外,maptalks.css也是必須引入的。
然后,我們需要借助maptalks.Polygon添加一些地圖區(qū)塊(Polygon示例)。雖然地圖看起來和長方體不太一樣,實(shí)際上這些區(qū)塊也不過是稍微復(fù)雜一些的點(diǎn)線集合而已。作為一切繪制的基礎(chǔ),我們需要找一些GeoJson格式的數(shù)據(jù)(中國各省市級(jí)json,世界主要國家json)。觀察GeoJson,其中,的coordinates屬性,就是地圖邊界的集合。需要注意的是,區(qū)域type包含Polygon和MultiPolygon兩類,和maptalks的多邊形函數(shù)相對(duì)應(yīng),在數(shù)組的層級(jí)上稍有區(qū)別。為了減少數(shù)據(jù)選取的麻煩,這里選擇使用MultiPolygon來進(jìn)行繪制。
drawPolygons(idx, coordinates, properties) { const polygon = new maptalks.MultiPolygon(coordinates, { symbol: { lineWidth: 1, lineColor: edgeColor, polygonFill: polygonColors[0], polygonOpacity: 0.5 }, properties: { id: properties.id, index: idx, properties: properties } }) .on("mouseenter", function(e) { e.target.updateSymbol({ polygonFill: polygonColors[1] }); }) .on("mouseout", function(e) { e.target.updateSymbol({ polygonFill: polygonColors[0] }); }) this.polygons.push(polygon); }, drawRegion() { const self = this $.getJSON("guizhou.json", "", function(mapData) { const features = mapData.features; features.forEach((g, i) => { const properties = g.properties; const coordinates = g.geometry.coordinates self.drawPolygons(i, coordinates, properties) }); const polygonsLayer = new maptalks.VectorLayer( "vector-polygon", self.polygons, ).addTo(self.mapDom); }) },到現(xiàn)在為止,一切還只是2d的樣子。不過,maptalks允許我們繪制3維的高度面(立體的線)。只需要引入一個(gè)altitude屬性,并在底圖上引入pitch屬性使視角稍稍偏移, 我們的2.5d地圖就畫出來了。
drawLimitLines(idx, coordinates, properties) { const outLine = new maptalks.MultiLineString(coordinates, { symbol: { lineColor: edgeColor, lineWidth: 1, textPlacement: "vertex" }, properties: { altitude: altitude, index: idx, id: properties.id, properties: properties } }); this.limitLines.push(outLine); }, drawPolygons(idx, coordinates, properties) { const polygon = new maptalks.MultiPolygon(coordinates, { symbol: { lineWidth: 1, lineColor: edgeColor, polygonFill: polygonColors[0], polygonOpacity: 0.5 }, properties: { altitude: altitude, id: properties.id, index: idx, properties: properties } }) .on("mouseenter", function(e) { e.target.updateSymbol({ polygonFill: polygonColors[1] }); }) .on("mouseout", function(e) { e.target.updateSymbol({ polygonFill: polygonColors[0] }); }) this.polygons.push(polygon); }, drawRegion() { const self = this $.getJSON("guizhou.json", "", function(mapData) { const features = mapData.features; features.forEach((g, i) => { const properties = g.properties; const coordinates = g.geometry.coordinates self.drawPolygons(i, coordinates, properties) const pathCoordinates = g.geometry.type == "MultiPolygon" ? coordinates.map(d => { return d[0] }) : coordinates self.drawLimitLines(i, pathCoordinates, properties) }); const polygonsLayer = new maptalks.VectorLayer( "vector-polygon", self.polygons, { enableAltitude: true } ).addTo(self.mapDom); const limitLinesLayer = new maptalks.VectorLayer( "vector-line", self.limitLines, { enableAltitude: true, drawAltitude: { polygonFill: edgeColor, polygonOpacity: 0.3, lineWidth: 0 } } ).addTo(self.mapDom); }) },2.數(shù)據(jù)和樣式處理
到這個(gè)時(shí)候,效果還是不太令人滿意??h市間的邊界太丑,有沒有什么辦法把他去掉呢?很簡單,直接繪制地圖的外沿就好。不過,網(wǎng)上下載的貴州省邊界好像和現(xiàn)在帶有區(qū)縣劃分的精度不太一樣?那么,就來自己處理一下吧。根據(jù)問答如何合并區(qū)域邊界,訪問在線的地圖數(shù)據(jù)處理網(wǎng)站http://mapshaper.org/,給每個(gè)縣市取一個(gè)相同的別名,一番輸入輸出,我們就得到了貴州省的外邊界。drawBorderLines(coordinates, properties) { const outLine = new maptalks.MultiLineString(coordinates, { symbol: { lineColor: edgeColor, lineWidth: 1, textPlacement: "vertex" }, properties: { altitude: altitude, id: properties.id, properties: properties } }); this.limitLines.push(outLine); }, drawWall() { const self = this $.getJSON("guizhou-border.json", "", function(borderMapData) { const borderFeatures = borderMapData.features[0] const properties = borderFeatures.properties; const pathCoordinates = borderFeatures.geometry.coordinates.map(d => { return d[0] }) self.drawBorderLines(pathCoordinates, properties) const limitLinesLayer = new maptalks.VectorLayer( "vector-line", self.limitLines, { enableAltitude: true, drawAltitude: { polygonFill: edgeColor, polygonOpacity: 0.3, lineWidth: 0 } } ).addTo(self.mapDom); }) }當(dāng)然,mapshaper的功效不止于此,簡直是區(qū)域數(shù)據(jù)處理的一大利器,非常值得探索。
另一個(gè)令人不太滿意的是地圖的底圖。打開mapbox,找到Studio然后Start With Basic,一個(gè)全新的自配地圖的世界等待著你。這里,就隨便先把英文的區(qū)縣名換成中文好了。
完成配置之后,點(diǎn)擊share,你會(huì)得到一個(gè)鏈接。不過,在用他替換掉Map的urlTemplate之前,還要按照格式進(jìn)行一下修整。
最后,就得到了本文開頭所示的地圖。相關(guān)源碼
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100333.html
摘要:首先利用搭建一個(gè)項(xiàng)目,然后寫一段的。如果對(duì)項(xiàng)目的創(chuàng)建比較熟悉,可以跳過步驟一,直接看步驟二。輸入保存的模板名字,進(jìn)入項(xiàng)目初始化構(gòu)建,等待構(gòu)建完成。二安裝刪除,新建,輸入如下代碼地圖初始化,應(yīng)寫在函數(shù)中,以保證掛載點(diǎn)先于地圖渲染。 Maptalks 項(xiàng)目是一個(gè) HTML5 的地圖引擎, 基于原生 ES6 Javascript 開發(fā): 二三維一體化地圖, 通過二維地圖的旋轉(zhuǎn) /傾斜增加三維視...
摘要:導(dǎo)語大數(shù)據(jù)呈現(xiàn)應(yīng)用越來越廣泛支持大數(shù)據(jù)呈現(xiàn)的,水平較高的有然而在地圖呈現(xiàn)的功能上,大都只能繪制矢量地圖,而不能呈現(xiàn)具有真實(shí)效果的地圖鑒于此,本文重點(diǎn)在于如何制作一張,即可以看到真實(shí)效果,又能進(jìn)行交互的矢量地圖先睹為快若有所思技術(shù)選擇想實(shí)現(xiàn)上 導(dǎo)語 大數(shù)據(jù)呈現(xiàn)應(yīng)用越來越廣泛,支持大數(shù)據(jù)呈現(xiàn)的SDK,水平較高的有echarts、highchart、D3;然而在地圖呈現(xiàn)的功能上,大都只能繪制...
摘要:和代表普通道路和墻,和代表星星和巖漿。用作裁剪接收?qǐng)D片對(duì)象起始坐標(biāo)和裁剪區(qū)域五個(gè)參數(shù)起始坐標(biāo)和裁剪區(qū)域可選用于創(chuàng)建圖像,可以添加到游戲圖層將指定尺寸按照指定行列進(jìn)行裁剪,返回一個(gè)二維數(shù)組生成動(dòng)畫,每一行為一組動(dòng)畫。 繪制地圖前準(zhǔn)備 在繪制之前,我們先看一下地圖的數(shù)據(jù)實(shí)現(xiàn) globalData = { mapCol: 11, mapRow: 11, size: 32, f...
入門 Leaflet 之小 Demo 寫在前面 ---- WebGIS 開發(fā)基礎(chǔ)之 Leaflet GIS 基本概念:GIS、Map、Layer、Feature、Geometry、Symbol、Data(Point、Polyline、Polygon)、Renderer、Scale、Project、Coordinates; GIS 開發(fā)概述:架構(gòu)模式、常用平臺(tái)和 SDK、二維三維 使用 Lea...
閱讀 3100·2021-11-22 13:54
閱讀 848·2021-11-04 16:08
閱讀 4577·2021-10-11 11:09
閱讀 3614·2021-09-22 16:05
閱讀 958·2019-08-30 15:54
閱讀 405·2019-08-30 15:44
閱讀 611·2019-08-30 14:05
閱讀 1030·2019-08-30 12:46