当前位置: 首页 > Web前端 > JavaScript

mapboxgl绘制3D线条

时间:2023-03-26 22:15:37 JavaScript

最近遇到需要用mapboxgl绘制行政区划图层,需要将行政区划抬高做立体效果进行高亮显示。拿到这个需求后,感觉很简单。你只需要使用填充挤压的方法来绘制。这样的效果有点难看,这里有个问题,我的数据是区县数据,绘制出来的效果却没有区分各个区县的边界,所以优化过程是从下面两个方向:每个区县用不同的颜色区分,加上区县的边框。一是不同区县以颜色区分。这个简单,只需要设置fill-extrusion-color设置效果如下,效果就好多了。接下来,继续尝试添加区县边界。之前看到过类似的效果,感觉应该很容易实现。..经过一番查找,发现mapboxgl可以升面,但是没有办法升线,也就是说不支持画3D线。这怎么能好呢?由于无法提升线数据,因此始终可以将线处理成面。所以从这个思路出发,按照以下两步来缓冲行政区划的边界。这里需要使用turf.js的buffer方法获取缓冲的边界面数据,然后使用fill-extrusion的方法进行绘制。嗯,效果还不错。绘制边缘缓冲曲面时,需要注意以下两点:fill-extrusion-height设置的值需要略高于曲面数据。有的,不然显示的时候会出现遮挡的问题。fill-extrusion-base(底部高度)参数可以设置为与之前绘图面的fill-extrusion-height参数一致。感觉很难看。其实这里还有一个问题。由于这里的border是作为缓冲面绘制的,当地图缩放时,border的宽度不会像线一样显示为固定的像素宽度,地图放大时会出现border。越来越宽,地图缩小时边界线越来越窄:根据各级分辨率对行政区划边界进行缓冲计算,然后对应各层级和各层级显示的分辨率显示的,也就是每一级比例尺下地图的分辨率,也就是一个像素代表的地图单位,这里缓存的单位是米,使用EPSG:900913的分辨率,也就是米数由每个尺度下的每个像素表示。核心代码如下。数据只是行政区划的geojson格式的area数据,需要line数据缓冲,所以需要从area转换成line。最终效果总结如下。在做行政区划面数据的三维展示时,只用填充-拉伸的方式绘制,效果不好,无法展示边线。它不支持绘制3D线。通过缓冲边数据,获取buffer后面的数据作为边。由于单个buffer的半径是固定的,得到的buffersurface的大小也是固定的,会出现地图边缘的宽度也会随着缩放比例缩放的问题。通过resolutions,逐级处理边缘线,按照level显示,可以获得更好的显示效果在线示例在线示例:http://gisarmory.xyz/blog/index.html?demo=MapboxGL3DLine代码地址:http://gisarmory.xyz/blog/index.html?source=MapboxGL3DLine原文地址:http://gisarmory.xyz/blog/index.html?blog=MapboxGL3DLine专注《GIS兵器库》,只给你GIS知识和技能你不能在网上找到。本文使用的知识共享已获得Attribution-NonCommercial-ShareAlike4.0InternationalLicense许可。欢迎转载、使用、转载,但务必保留文章署名《GIS兵器库》(含链接:http://gisarmory.xyz/blog/),不得用于商业用途。基于本文修改的作品必须使用相同的许可发布。