高德地图API实现区域立体效果

本文介绍如何使用高德地图API实现特定区域的地图立体展示效果。通过区域掩膜与垂面Wall结合,仅显示选定区域并呈现立体视觉,适用于2D模式。提供具体实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初衷

在利用高德地图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>

最后

自己写博客比较随意,就是记录自己平时遇到的问题,希望可以帮到有需要的小伙伴。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值