进行图形可视化,难免会遇到地理数据的可视化需求。通常情况下,直接使用echarts对配置项进行处理,就可以满足大部分需求。当然,更加复杂的定制化需求,可能就需要借助d3、Three.js等工具。如果对详细的地图背景有要求的话,又需要将图形库与leaflet、maptalks等地图引擎相结合。
不过也许你的需求和我一样,没有那么复杂的交互需求,但对显示效果却有一些想法。那么就可以尝试阅读本文,使用一种比较偷懒的方法,仅基于maptalks本身,来绘制可交互的伪3d地图。
下面,以贵州省的伪3d地图为例,进行代码的编写和相应数据的简单处理。

1.基本的地图绘制
maptalks(maptalks的git)的官方范例写得相当亲切,我们可以从中找到所有绘制伪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: '&copy; <a href="http://osm.org">OpenStreetMap</a> contributors, &copy; <a href="https://carto.com/">CARTO</a>'})});
}

需要注意的是,除了maptalks.js以外,maptalks.css也是必须引入的。

然后,我们需要借助maptalks.Polygon添加一些地图区块(Polygon示例)。虽然地图看起来和长方体不太一样,实际上这些区块也不过是稍微复杂一些的点线集合而已。作为一切绘制的基础,我们需要找一些GeoJson格式的数据(中国各省市级json,世界主要国家json)。观察GeoJson,其中,的coordinates属性,就是地图边界的集合。需要注意的是,区域type包含Polygon和MultiPolygon两类,和maptalks的多边形函数相对应,在数组的层级上稍有区别。为了减少数据选取的麻烦,这里选择使用MultiPolygon来进行绘制。

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.coordinatesself.drawPolygons(i, coordinates, properties)});const polygonsLayer = new maptalks.VectorLayer("vector-polygon",self.polygons,).addTo(self.mapDom);})
},

到现在为止,一切还只是2d的样子。不过,maptalks允许我们绘制3维的高度面(立体的线)。只需要引入一个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.coordinatesself.drawPolygons(i, coordinates, properties)const pathCoordinates = g.geometry.type == "MultiPolygon" ? coordinates.map(d => { return d[0] }) : coordinatesself.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.数据和样式处理
到这个时候,效果还是不太令人满意。县市间的边界太丑,有没有什么办法把他去掉呢?很简单,直接绘制地图的外沿就好。不过,网上下载的贵州省边界好像和现在带有区县划分的精度不太一样?那么,就来自己处理一下吧。根据问答如何合并区域边界,访问在线的地图数据处理网站http://mapshaper.org/,给每个县市取一个相同的别名,一番输入输出,我们就得到了贵州省的外边界。

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);})
}

当然,mapshaper的功效不止于此,简直是区域数据处理的一大利器,非常值得探索。
另一个令人不太满意的是地图的底图。打开mapbox,找到Studio然后Start With Basic,一个全新的自配地图的世界等待着你。这里,就随便先把英文的区县名换成中文好了。

完成配置之后,点击share,你会得到一个链接。不过,在用他替换掉Map的urlTemplate之前,还要按照格式进行一下修整。

最后,就得到了本文开头所示的地图。相关源码

地图绘制初探——基于maptalks的2.5D地图绘制相关推荐

  1. 【26】地图可视化:基于 Echarts + Flask 的动态实时地图组件 - 点气泡流向组合区域三级下钻地图

    目录 一.大屏整体架构 Echarts + Flask + Bootstrap 1. 效果展示 动态效果 鼠标右键切换主题 2. 前端布局 Bootstrap 3. HTTP 服务端使用 Flask  ...

  2. android绘制论文,基于Android平台的三维地形绘制研究与实现

    摘要: 地形是一种常见的三维场景,也是三维场景的重要组成部分,地形数据的实时绘制在PC端已经有大量研究,但如何实现移动端大规模地形的实时绘制是一个新问题.目前,移动端设备硬件性能发展迅速,但在移动端地 ...

  3. 【26】地图可视化:基于 Echarts + Java SpringBoot 的动态实时地图组件 - 点气泡流向组合区域三级下钻地图

    在数据可视化大屏中,地图可视化是常用的高级图表之一. 很多小伙伴们以为地图太高大上了,那么实现起来估计也不容易,说实话,确实不那么容易,直接用echarts是要花些时间研究的,但是我们可以将其二次封装 ...

  4. echarts geo地图示例_用Python,炫酷地图轻松绘制,一起来学习吧

    转自:数据分析1480 地图可视化是一种非常直观的数据分析结果展现形式,python 有很多可视化库可以实现,pyecharts 就是很多 python 爱好者喜爱的实现地图可视化方法之一.不可否认, ...

  5. Unity使用Isometric Z As Y Tilemap创建2.5D地图(一)如何创建Tilemap

    Unity2019使用Isometric Z as Y Tilemap创建2.5D地图 (一)创建Tilemap 1.Tilemap的类型 2.新建Isometric Z As Y Tilemap 2 ...

  6. Unity使用Isometric Z As Y Tilemap创建2.5D地图(二)如何按照正确遮挡顺序渲染图片

    Unity使用Isometric Z As Y Tilemap创建2.5D地图(二)如何按照正确遮挡顺序渲染图片 如何按照正确遮挡顺序渲染图片 1.创建多层Tilemap 2.使用Sorting La ...

  7. Unity使用Isometric Z As Y Tilemap创建2.5D地图(三)如何用代码创建Tilemap

    Unity使用Isometric Z As Y Tilemap创建2.5D地图(三)如何用代码创建Tilemap 创建Tilemap Palette 1.一些需要了解的事情 1.1 UnityEdit ...

  8. 什么地图制作软件好用,简单的地图绘制软件

    随着信息社会的到来,智能手机的快速崛起正在改变着人们的生活方式.伴随着大型.巨型建筑物的拔地而起,在这些复杂的建筑物内,人们发现在这里也会迷路.导航,不再是室外的专有功能,室内也需要.有了室内地图,足 ...

  9. 基于Autoware制作高精地图(六)

    基于Autoware制作高精地图(六) 这期还是带来高精地图的制作,采用的软件还是Unity,插件仍然是VectorMap: 这期主要是进行几种测试,因为有的时候可能按照我前面写的文章进行地图绘制不一 ...

最新文章

  1. asp.net 连接 Access 的几种方法
  2. appium---【Mac】Appium-Doctor提示WARN:“ opencv4nodejs cannot be found”解决方案
  3. Linux 权限管理: 权限的概念、权限管理、文件访问权限的设置、 粘滞位
  4. Valgrind 安装与使用
  5. java io流文件损坏_java使用io流下载.docx. xlsx文件,出现文件损坏提示
  6. 【毕业答辩】如何做出90分的毕业答辩PPT?
  7. [学习官方例子]TCustomComparer
  8. 【意见征集补充】09'博客园T恤设计
  9. 计算机主机结构图片,电脑的组成的图文详解
  10. java 批量下载小说天堂的小说
  11. 人工智能:《时代周刊》2019年度100大最佳发明榜单发布!
  12. 基于区块链技术实现“资产通证化”
  13. 为什么有了路由器还要光猫
  14. 「Python开发者」公号招内容编辑
  15. MultipartFile.transferTo(dest) 报找不到文件错误以及解决方法
  16. while(1)语句
  17. 仿百度,谷歌输入框自动提示功能
  18. Unity C# 批量处理 命名空间 修改
  19. html5实现窗帘,纯 CSS3 实现的窗帘菜单 Accordion
  20. 基础篇:3.1.4)注塑件-热熔

热门文章

  1. Python爬虫学习第九天---反爬与反反爬
  2. 基于PHP的UUID/GUID/uniqid替换方法及其可靠性论述
  3. HDL4SE:软件工程师学习Verilog语言(二)
  4. php x30表示什么,深度剖析揭秘vivox30 pro和vivos7区别是什么?哪个好?专家们分析真相如何...
  5. Turtle 模块基础详解-画曲线
  6. RHCE(一)--- at、crontab、网卡绑定
  7. Tomcat部署与JSPXCMS搭建
  8. 秒速区分商家和个人,网商银行为小微商价定制合理贷款
  9. 用JAVA将多个PDF文件合并成一个PDF文件
  10. Unity3d官方打飞机demo污化版