在layui弹窗中内嵌高德地图、实现自在选点坐标、以及设置地图边界(边界外的内容不展现)
效果图:
引入jq、layui,次要应用了layui弹窗组件于左上角开关抉择的组件,当然也能够应用原生或者其余组件,当单选扭转的时候去更新地图参数也是一样的,从新渲染地图,默认以银川区域为例,当右上角开关扭转后就会切换到全国地图。
<link rel="stylesheet" href="../../layui/css/layui.css" media="all" /> <script src="../../layui/layui.js"></script> <script src="../../js/jquery.min.js"></script>
css款式和html局部
html, body, #container { width: 100%; height: 100%; } .amap-icon > img { width: 19px; height: 31px; } .switch { z-index: 999; position: absolute; right: 10px; top: 0; }
<div id="container"></div> <div id="myPageTop"> <input type="text" id="autoText" name="title" required lay-verify="required" placeholder="请输出关键字进行搜寻" autocomplete="off" class="layui-input" /> <input type="text" id="autoText_all" style="display: none" name="title" required lay-verify="required" placeholder="请输出关键字进行搜寻" autocomplete="off" class="layui-input" /> <div class="layui-form switch"> <input type="checkbox" name="open" checked="" lay-skin="switch" lay-filter="switchTest" lay-text="银川市区|全国" /> </div> </div> <div class="testAddre"> <font id="testAddreInfo"> </font> </div> <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=你的高德key&plugin=AMap.Autocomplete,AMap.DistrictSearch" ></script> <script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
找了很久高德地图没有自带点击选点API,选点只能AMap.Marker的形式实现点击自在选点的性能,能够自定义坐标点的图片,而后能够通过调用affrimFormat办法获取到对应坐标
选项切换时都会创立两个不同的地图实例,当为银川选项时会从新创立某区域下的地图实例(通过districtMap办法中进行配置:区域地位、区域边框款式...)。
<script type="text/javascript"> layui.use("form", function () { var form = layui.form; form.on("switch(switchTest)", function (data) { if (this.checked) { $("#autoText").show(); $("#autoText_all").hide(); map = districtMap(); } else { //全国 $("#autoText_all").show(); $("#autoText").hide(); map = new AMap.Map("container", { resizeEnable: true, }); map.on("click", showInfoClick); } }); }); // 选中的地位的坐标 var coordinate = []; // 点标记容器 var marker = ""; //搜寻服务 var placeSearch; var detailAddressList = {}; //初始化地图对象,加载地图 function districtMap() { var opts = { subdistrict: 1, extensions: "all", level: "city", }; var map = new AMap.Map("container", { resizeEnable: true, center: [106.227885, 38.486581], //默认定位到银川坐标 zoom: 11, }); var district = new AMap.DistrictSearch(opts); district.search("银川市", function (status, result) { var outer = [ new AMap.LngLat(-360, 90, true), new AMap.LngLat(-360, -90, true), new AMap.LngLat(360, -90, true), new AMap.LngLat(360, 90, true), ]; var holes = result.districtList[0].boundaries; var pathArray = [outer]; pathArray.push.apply(pathArray, holes); var polygon = new AMap.Polygon({ //多边形填充色彩,应用16进制颜色代码赋值,如:#FFAA00 fillColor: "#fcf9f2", //多边形填充透明度,取值范畴[0,1],0示意齐全通明,1示意不通明。默认为0.9 fillOpacity: 1, //轮廓线款式,实线:solid,虚线:dashed strokeStyle: "solid", }); polygon.setPath(pathArray); map.add(polygon); }); map.on("click", showInfoClick); return map; } // 搜寻框 --输出提醒插件 var auto = new AMap.Autocomplete({ input: "autoText", city: "银川市", citylimit: true, }); AMap.event.addListener(auto, "select", select); var auto_all = new AMap.Autocomplete({ input: "autoText_all", }); AMap.event.addListener(auto_all, "select", select); map = districtMap(); function select(e) { if (e.poi && e.poi.location) { // 获取具体地址并实例化以后标注点 getPositionByLonLats(e.poi.location.lng, e.poi.location.lat); addMarker(e.poi.location.lng, e.poi.location.lat); map.setZoom(13); map.setCenter(e.poi.location); } } // 实例化点标记 function addMarker(lng, lat) { map.remove(marker); marker = new AMap.Marker({ icon: "mark_r.png", position: new AMap.LngLat(lng, lat), title: "", }); marker.setMap(map); } function showInfoClick(e) { console.log(e); document.getElementById("autoText").value = ""; clearMarker(); getPositionByLonLats(e.lnglat.getLng(), e.lnglat.getLat()); addMarker(e.lnglat.getLng(), e.lnglat.getLat()); coordinate = [e.lnglat.getLng(), e.lnglat.getLat()]; console.log(coordinate); } // 革除 marker function clearMarker() { if (!placeSearch) { return; } if (placeSearch) { placeSearch.render && placeSearch.render.markerList.clear(); } else { placeSearch.clear(); } map.remove(marker); } // 依据经纬度取得具体地址 function getPositionByLonLats(lng, lat) { var lnglatXY = [lng, lat]; // 地图上所标点的坐标 AMap.service("AMap.Geocoder", function () { // 回调函数 geocoder = new AMap.Geocoder({}); geocoder.getAddress(lnglatXY, function (status, result) { if (status === "complete" && result.info === "OK") { var address = result.regeocode.formattedAddress;Label({ marker.set content: "<div class='info'>地址:" + address + "</div>", //设置文本标注内容 direction: "top", //设置文本标注方位 }); clickAddr = address; marker.setIcon("../../images/mark_r.png"); searchNearBy("", lnglatXY, 10000); } else { } }); }); } // 依据经纬度取得肯定范畴内具体地址 function searchNearBy(keyword, LngLat, radius) { AMap.service(["AMap.PlaceSearch"], function () { //结构地点查问类 placeSearch = new AMap.PlaceSearch({ pageSize: 5, // 单页显示后果条数 pageIndex: 1, // 页码 type: "", // 趣味点类别 extensions: "all", fillColor: "0", map: map, // 展示后果的地图实例 panel: "testAddreInfo", // 后果列表将在此容器中进行展现。 autoFitView: true, // 是否主动调整地图视线使绘制的 Marker点都处于视口的可见范畴 }); //关键字查问 }); placeSearch.searchNearBy( keyword, LngLat, radius, function (status, result) { console.log(status, result); detailAddressList = {}; if (result.info == "OK") { result.poiList.pois.forEach(function (val) { detailAddressList[val.address] = val.pname + val.cityname + val.adname + val.name; coordinate = [val.location.lng, val.location.lat]; }); } } ); placeSearch.on("selectChanged", function (e) { clickAddr = ""; map.remove(marker); }); } function affrimFormat() { var val = ""; if (document.querySelector("#testAddreInfo .amap_lib_placeSearch_ul")) { if ( document.querySelector( "#testAddreInfo .amap_lib_placeSearch_ul .poibox.selected .poi-info .poi-addr" ) == null && clickAddr != "" ) { return clickAddr; } val = document .querySelector( "#testAddreInfo .amap_lib_placeSearch_ul .poibox.selected .poi-info .poi-addr" ) .innerText.replace("地址:", ""); var name = document.querySelector( "#testAddreInfo .amap_lib_placeSearch_ul .poibox.selected .poi-title .poi-name" ).innerText; val = detailAddressList[val] + val + name; } else { val = document.querySelector("#testAddreInfo").innerText; } return val; } // 点击事件事件绑定 function search(val) { AMap.service(["AMap.PlaceSearch"], function () { //结构地点查问类 placeSearch = new AMap.PlaceSearch({ pageSize: 5, // 单页显示后果条数 pageIndex: 1, // 页码 extensions: "all", map: map, // 展示后果的地图实例 panel: "testAddreInfo", // 后果列表将在此容器中进行展现。 autoFitView: true, // 是否主动调整地图视线使绘制的 Marker点都处于视口的可见范畴 }); //关键字查问 placeSearch.search(val, function (status, result) { console.log(status, result); detailAddressList = {}; if (result.info == "OK") { result.poiList.pois.forEach(function (val) { detailAddressList[val.address] = val.pname + val.cityname + val.adname; coordinate = [val.location.lng, val.location.lat]; }); } }); }); } </script>