高德地图 围栏 多边形 增删改查 绘制 返回围栏的坐标数据

layui、jquery、高德地图

1、支持绘制后,返回围栏坐标数据

2、支持点击切换不同围栏,进行编辑、删除

3、支持一个区域数据包含多个围栏

4、支持搜索定位(高德限制次数)

效果图:

 区域数据:

 新增区域时设置围栏(打开地图):

function openScopeMap() {
    layer.open({
        type: 2,
        title: '绘制围栏',
        maxmin: true,
        shadeClose: false, // 点击遮罩关闭层
        area: ['90%', '90%'],
        btn: ['确定', '取消'],
        yes: function (index, layero) {
            window["layui-layer-iframe" + index].endDraw();
            var res = window["layui-layer-iframe" + index].confirmDraw();
            console.log('设置后返回内容', res);
            if (res.length > 0 && res !== "[]") {
                $('#locationJson').val(res)
            } else {
                $('#locationJson').val("")
            }
            layer.close(index);
        },
        content: '/xxx/xxxxx/scopeMap',//替换为自己的请求路径
        success: function (layero, index) {
            // 获取子页面的iframe
            var iframe = window['layui-layer-iframe' + index];
            // 向子页面的全局函数child传参
            iframe.getParentParam($('#locationJson').val());
        }
    });
}

 编辑区域时设置围栏(打开地图):

function openScopeMap() {
    layer.open({
        type: 2,
        title: '绘制围栏',
        maxmin: true,
        shadeClose: false, // 点击遮罩关闭层
        area: ['90%', '90%'],
        btn: ['确定', '取消'],
        yes: function (index, layero) {
            // 点击确定触发围栏编辑器的关闭endDraw,否则获取不到正在编辑的围栏坐标
            window["layui-layer-iframe" + index].endDraw();
            var res = window["layui-layer-iframe" + index].confirmDraw();
            console.log('设置后返回内容', res);
            if (res.length > 0 && res !== "[]") {
                $('#locationJson').val(res)
            } else {
                $('#locationJson').val("")
            }
            layer.close(index);
        },
        content: '/xxx/xxxxx/scopeMap?scopeId=' + $('#id').val(),//替换为自己的请求路径
        success: function (layero, index) {
            // 获取子页面的iframe
            var iframe = window['layui-layer-iframe' + index];
            // 向子页面的全局函数child传参
            iframe.getParentParam($('#locationJson').val());
        }
    });
}

 打开地图请求(Java)

	/**
	 * 进入围栏地图界面
	 * @param model
	 * @param scopeId
	 * @return
	 */
	@GetMapping("/scopeMap")
	public String tree(Model model, String scopeId) {
		if (StringUtils.isNotEmpty(scopeId)) {
			model.addAttribute("scopeId", scopeId);
			model.addAttribute("szScope", szScopeService.get(Long.parseLong(scopeId)).getLocationJson());
		}
		return "xxx/xxxxx/scopeMap";
	}

【核心】地图: 

<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head>
    <title>绘制地图</title>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
    <script src="/js/layui.js"></script>
    <script src="/js/jquery.min.js?v=2.1.4"></script>
    <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
    <script src="https://webapi.amap.com/maps?v=2.0&key=替换成你的Key值&plugin=AMap.PolygonEditor"></script>
    <script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
    <link href="/layui-v2.6.8/layui/css/layui.css" rel="stylesheet">

    <style>
        .tipdiv{
            width: 100%;
            height: 29px;
            top: auto;
            bottom: 0rem;
            position: fixed;
            line-height: 30px;
            background-color: #2f4050;
            color: #ff9900;
            font-size: 13px;
            font-weight: 400;
            padding-left: 15px;
        }
        .searchdiv{
            width: 100%;
            top: 5px;
            bottom: auto;
            position: fixed;
            color: #ff9900;
            font-size: 13px;
            font-weight: 400;
            padding-left: 15px;
            display: flex;
        }
    </style>
</head>
<body class="gray-bg">
<div class="wrapper wrapper-content ">
    <div class="row">
        <div class="col-sm-12">
            <input id="locationjsonID" value="" type="hidden">
            <div id="map-container" style="width: 100%;height: 800px;"></div>
            <!-- 搜索 高德会限制每日次数,只能暂时屏蔽掉:USER_DAILY_QUERY_OVER_LIMIT -->
<!--            <div class="searchdiv">-->
<!--                <div class="columns pull-right col-md-2 nopadding">-->
<!--                    <input id="searchName" type="text" class="form-control" placeholder="搜索" style="height: 38px;width: 360px;">-->
<!--                </div>-->
<!--            </div>-->
            <div class="input-card" style="width: 120px;top: 1rem;bottom: auto">
                <button class="btn" onclick="createPolygon()" style="margin-bottom: 5px">新建</button>
                <button class="btn" onclick="deleteCur()" style="margin-bottom: 5px">删除</button>
            </div>
            <div class="tipdiv">操作提示:【左键】选点绘制,点击【右键】结束绘制</div>
        </div>
    </div>
</div>

<script type="text/javascript">
    var map = new AMap.Map('map-container', {
        zoom: 13,
        center: [113.55005, 22.356141]
    });
    map.setFitView();

    // 搜索
    AMap.plugin(['AMap.PlaceSearch','AMap.AutoComplete'], function(){
        var placeSearch = new AMap.PlaceSearch({
            map: map
        });
        var auto = new AMap.AutoComplete({
            input: "searchName"
        });
        auto.on("select", select);
        function select(e) {
            // placeSearch.setCity("北京");
            placeSearch.setCity(e.poi.adcode);
            placeSearch.search(e.poi.name);
        }
    });
    
    var polyEditor = new AMap.PolygonEditor(map);
    var newLocationJsonObj = {};
    var doDel = false;
    
    // 返回绘制数据
    function confirmDraw() {
        let newLocationJson = [];
        for (let key in newLocationJsonObj) {
            if (newLocationJsonObj.hasOwnProperty(key)) {
                newLocationJson.push(newLocationJsonObj[key])
            }
        }
        return JSON.stringify(newLocationJson);
    }

    function getParentParam(dataJson){
        console.log('tanlydefined', dataJson);
        document.getElementById('locationjsonID').setAttribute("value", dataJson)

        var jsonStr = document.getElementById('locationjsonID').value;
        const edit = jsonStr.length > 0;
        if(jsonStr.length>0){
            let jsonObj = JSON.parse(jsonStr);
            console.log('jsonObj',jsonObj);
            for (let i = 0; i < jsonObj.length; i++) {
                let scope = jsonObj[i];
                let tempArys = [];
                let tempPaths = []
                for (let j = 0; j < scope.length; j++) {
                    tempArys.push([scope[j].lng, scope[j].lat])
                    tempPaths.push({
                        lng: scope[j].lng,
                        lat: scope[j].lat
                    });
                }
                
                // 收集原数据
                // 创建围栏
                let tempPolygon = new AMap.Polygon({
                    map: map,
                    strokeWeight: 2,
                    strokeColor: '#FF33FF',
                    fillColor: '#FF99FF',
                    fillOpacity: 0.5,
                    path: tempArys
                });
                polyEditor.addAdsorbPolygons(tempPolygon);
                newLocationJsonObj[tempPolygon._amap_id] = tempPaths;

                tempPolygon.on('click', () => {
                    console.log('tanlydefinedtempPolygon', tempPolygon);
                    if (polyEditor.getTarget()==null || tempPolygon._amap_id !== polyEditor.getTarget()._amap_id) {
                        polyEditor.setTarget(tempPolygon);
                        polyEditor.open();
                    }
                })

                tempPolygon.on('dblclick', () => {
                    polyEditor.setTarget();
                    polyEditor.close();
                })
            }
        }

        polyEditor.on('add', function (data) {
            var polygon = data.target;
            polyEditor.addAdsorbPolygons(polygon);
            polygon.on('click', () => {
                if (polyEditor.getTarget()==null || polygon._amap_id !== polyEditor.getTarget()._amap_id) {
                    polyEditor.setTarget(polygon);
                    polyEditor.open();
                }
            })
            polygon.on('dblclick', () => {
                polyEditor.setTarget();
                polyEditor.close();
            })

            var path = polygon.getPath();
            var tempPaths = []
            var temparys = []
            for (let i = 0; i < path.length; i++) {
                tempPaths.push({
                    lng: path[i].lng,
                    lat: path[i].lat
                });

                let tempary = [];
                tempary = [path[i].R, path[i].Q];
                temparys.push(tempary)
            }
            newLocationJsonObj[polygon._amap_id] = tempPaths;
        })

        // 监听绘制完成事件 close后
        polyEditor.on('end', function (data) {
            if(!doDel){
                let polygon = data.target;
                let path = polygon.getPath();
                let tempPaths = []
                for (let i = 0; i < path.length; i++) {
                    tempPaths.push({
                        lng: path[i].lng,
                        lat: path[i].lat
                    });
                }
                newLocationJsonObj[polygon._amap_id] = tempPaths;
            }
            doDel = false;
        });
        
        if(!edit){
            // 新增自动开启绘制工具
            createPolygon();
            polyEditor.open();
        }
    }
    function createPolygon() {
        polyEditor.close();
        polyEditor.setTarget();
        polyEditor.open();
    }

    function deleteCur() {
        let polygon = polyEditor.getTarget();
        if(polygon){
            delete newLocationJsonObj[polygon._amap_id];
            polyEditor.getTarget().setMap(null);
            polyEditor.removeAdsorbPolygons(polygon);
            doDel = true;
            polyEditor.setTarget();
            polyEditor.close();
        }
    }
    
    function endDraw(){
        polyEditor.setTarget();
        polyEditor.close();
    }

</script>
</body>
</html>

如果文章帮助到了你,点赞,评论,关注下吧

谢谢,欢迎多多交流!

——tanly

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值