在项目中须要使用相似GIS效果的地图,考虑到高德开放平台关于云图的便利性,便利用官网和网上的例子,进行了初步实现。javascript
1.带3D效果:
2.代码:
<!doctype html> <html> <head> <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"> <title>编辑多边形</title> <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.14&key=760d16c25fa8ee3c547b693a6c414821&plugin=Map3D,AMap.DistrictSearch"></script> <style> html, body, #container { margin: 0; height: 100%; } </style> </head> <body> <div id="container"></div> <script> var mask = []; var map = new AMap.Map('container', { mask: mask, resizeEnable: true, zoom: 12, viewMode: '3D', center: [121.124178, 31.150681], mapStyle: 'amap://styles/5a2dbb143362de08809a8aebe25ca455', //layers: [ // new AMap.TileLayer.RoadNet({ // zIndex: 20 // })]//, // new AMap.TileLayer({ // zIndex: 6, // opacity: 1, //getTileUrl: 'https://t{1,2,3,4}.tianditu.gov.cn/DataServer?T=ter_w&x=[x]&y=[y]&l=[z]' //getTileUrl: 'https://t{s}.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=5ecfe4e0cecdafec9a858e37c261084c' //})] }); map.plugin('AMap.CloudDataLayer', function () { var layerOptions = { query: { keywords: '' }, clickable: true }; var cloudDataLayer = new AMap.CloudDataLayer('5cbec0902376c10e3dec70d6', layerOptions); //实例化云图层类 cloudDataLayer.setMap(map); //叠加云图层到地图 }); new AMap.DistrictSearch({ extensions: 'all', subdistrict: 0 }).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 ]; for (var i = 0; i < holes.length; i += 1) { mask.push([holes[i]]) } pathArray.push.apply(pathArray, holes) var polygon = new AMap.Polygon({ pathL: pathArray, strokeColor: '#00eeff', strokeWeight: 1, fillColor: '#71B3ff', fillOpacity: 0.5 }); polygon.setPath(pathArray); map.add(polygon); var bounds = map.getBounds(); // 获取显示范围 map.setLimitBounds(bounds); // 限制地图显示范围 var object3Dlayer = new AMap.Object3DLayer({ zIndex: 1 }); map.add(object3Dlayer) var height = -8000; var color = '#0088ffcc';//rgba var wall = new AMap.Object3D.Wall({ path: holes, height: height, color: color }); wall.transparent = true object3Dlayer.add(wall) }); </script> </body> </html>
3.不带3D效果。带弹窗
4.代码:
<!doctype html> <html> <head> <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"> <title>编辑多边形</title> <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.14&key=760d16c25fa8ee3c547b693a6c414821&plugin=AMap.DistrictSearch,Map3D"></script> <script type="text/javascript" src="https://cache.amap.com/lbs/static/addToolbar.js"></script> <style> html, body, #container { margin: 0; height: 100%; } </style> </head> <body> <div id="container"></div> <script> var map = new AMap.Map('container', { resizeEnable: true, zoom: 12, viewMode: '3D', center: [121.124178, 31.150681], mapStyle: 'amap://styles/5a2dbb143362de08809a8aebe25ca455', //layers: [ // new AMap.TileLayer.RoadNet({ // zIndex: 20 // })]//, // new AMap.TileLayer({ // zIndex: 6, // opacity: 1, //getTileUrl: 'https://t{1,2,3,4}.tianditu.gov.cn/DataServer?T=ter_w&x=[x]&y=[y]&l=[z]' //getTileUrl: 'https://t{s}.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=5ecfe4e0cecdafec9a858e37c261084c' //})] }); new AMap.DistrictSearch({ extensions: 'all', subdistrict: 0 }).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({ pathL: pathArray, strokeColor: '#00eeff', strokeWeight: 1, fillColor: '#71B3ff', fillOpacity: 0.5 }); polygon.setPath(pathArray); map.add(polygon); var bounds = map.getBounds(); // 获取显示范围 map.setLimitBounds(bounds); // 限制地图显示范围 }); map.plugin('AMap.CloudDataLayer', function () { var layerOptions = { query: { keywords: '' }, clickable: true }; var cloudDataLayer = new AMap.CloudDataLayer('5cbec0902376c10e3dec70d6', layerOptions); //实例化云图层类 cloudDataLayer.setMap(map); //叠加云图层到地图 AMap.event.addListener(cloudDataLayer, 'click', function (result) { var clouddata = result.data; var photo = []; if (clouddata._image[0]) {//若是有上传的图片 photo = ['<img width=240 height=100 src="' + clouddata._image[0]._preurl + '"><br>']; } var infoWindow = new AMap.InfoWindow({ content: "<font class='title'>" + clouddata._name + "</font><hr/>" + photo.join("") + "地址:" + clouddata._address + "<br />" + "联系电话:" + clouddata.telephone + "<br />" + "经纬度:" + clouddata._location, size: new AMap.Size(0, 0), autoMove: true, offset: new AMap.Pixel(0, -25) }); infoWindow.open(map, clouddata._location); console.log(clouddata._name); }); }); </script> </body> </html>
不足:没法实如今云图中添加文本标签,没法标记这些点的名称,而是须要设置弹窗点击事件。要是有完成这部分的烦请留言,不胜感激。html