高德地图API实现区域立体效果
初衷
在利用高德地图API做项目的过程中遇到需只显示一个区域的地图,并且具有立体效果,经过 百度,谷歌等等搜索加实践了一番之后,虽然能实现,但是有一个弊端,就是只能在2D模式下进行显示,3D模式下就不能产生掩膜的效果,遂去高德地图API官网寻觅了一波,故产生了这篇博客。
区域掩膜
高德地图 JS API中提供了区域掩膜的示例,通过mask属性为地图对象设定区域掩膜,只显示区域内的图层和覆盖物,可实现在地图中只展示某个区域的地图的效果。官网示例效果如下图所示:
垂面Wall
在高德地图API中,有个立体Mesh中有一个垂面Wall的示例,利用AMap.Object3D.Wall可以用经纬度来创建一组垂直于地面的墙面,官网示例效果如下图所示:
区域掩膜与垂面Wall相结合,构建区域立体效果
通过融合上述的区域掩膜和垂面Wall两个示例,并调节地图样式,最终得到区域立体展示效果图如下:
上述效果的代码如下:
<!-- created by qiaozi 20201112 -->
<!DOCTYPE HTML>
<html>
<head>
<meta name="viewport" content="width=device-width initial-scale=1.0 maximum-scale=1.0 user-scalable=0">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>区域掩模</title>
<style>
body,html,#container{ margin:0;width: 100%;height: 100%}
</style>
</head>
<body>
<div id="container"></div>
<script language="javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=您申请的key值&plugin=Map3D,AMap.DistrictSearch"></script>
<script language="javascript">
var opts = {
subdistrict: 0,
extensions: 'all',
level: 'city'
};
//利用行政区查询获取边界构建mask路径
//也可以直接通过经纬度构建mask路径
var district = new AMap.DistrictSearch(opts);
district.search('北京市', function(status, result) {
var bounds = result.districtList[0].boundaries;
var mask = []
for(var i =0;i<bounds.length;i+=1){
mask.push([bounds[i]])
}
var map = new AMap.Map('container', {
mask:mask,
center:[116.472804,39.995725],
disableSocket:true,
viewMode:'3D',
showLabel:true,
labelzIndex:130,
pitch:40,
zoom:9,
mapStyle: 'amap://styles/grey',
});
var maskerIn = new AMap.Marker({
position:[116.501415,39.926055],
map:map
})
var maskerOut = new AMap.Marker({//区域外的不会显示
position:[117.001415,39.926055],
map:map
})
//添加高度面
var object3Dlayer = new AMap.Object3DLayer({zIndex:1});
map.add(object3Dlayer)
var height = 30000;
var color = '#0088ffcc';//rgba
var wall = new AMap.Object3D.Wall({
path:bounds,
height:height,
color:color
});
wall.transparent = true
wall.backOrFront = 'both';
object3Dlayer.add(wall)
//添加描边
for(var i =0;i<bounds.length;i+=1){
new AMap.Polyline({
path:bounds[i],
strokeColor:'#99ffff',
strokeWeight:4,
map:map
})
}
});
</script>
</body>
</html>
最后
自己写博客比较随意,就是记录自己平时遇到的问题,希望可以帮到有需要的小伙伴。