智慧校园--webGIS--高德地图

实现地图点击打卡,驾车路线。

需要自己去高德开发平台注册新建自己的项目保存key和秘钥

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <!-- 引入资源 -->
    <!-- 1.高德地图基础css样式 -->
    <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
    <!-- 2.基础样式 -->
    <link rel="stylesheet" href="./css//a.css">
    <!-- 3.引入地图资源 -->
    <script type="text/javascript">
        window._AMapSecurityConfig = {
            securityJsCode: "自己的秘钥",
        }
    </script>
    <script src="https://webapi.amap.com/maps?v=2.0&key=自己的key"></script>
    <!-- <script src="./js/store.js"></script> -->
</head>

<body>
    <div id="container"></div>
    <!-- 添加类名info、input-item...,使用高德里面的样式 -->
    <div class="info">点击地图标注热门地点</div>
    <div class="input-card" style="width:13rem">
        <h4>推荐;浏览路线</h4>
        <div class="input-item">
            <button class="btn" onclick="startAnimation()">开始动画</button>
        </div>
    </div>
</body>
<script>
    function getData(){
    if(!localStorage.getItem('geojson')){
        localStorage.setItem('geojson','[]')
    }
    return JSON.parse(localStorage.getItem('geojson'))
}
function saveData(data){
    localStorage.setItem('geojson',JSON.stringify(data))
}
    var map = new AMap.Map('container', {
        center: [114.402672, 30.518987],
        zoom: 16,
        viewMode: '3D',
        pitch: 45
    })

    AMap.plugin(['AMap.ToolBar',
        'AMap.Scale',
        'AMap.HawkEye',
        'AMap.MapType',
        'AMap.Geolocation',
        'AMap.ControlBar',
        'AMap.GeoJSON',
        'AMap.MoveAnimation'
    ], function () {
        // 在图面添加工具条控件,工具条控件集成了缩放、平移、定位等功能按钮在内的组合控件
        map.addControl(new AMap.ToolBar({
            position: {
                top: '80px',
                right: '25px'
            }
        }));
        map.addControl(new AMap.Scale());
        map.addControl(new AMap.ControlBar());
    })
    // JSON数据

    var geojson = new AMap.GeoJSON({
        geoJSON: null
    })
    if (JSON.stringify(getData()) != '[]') {
        // 导入数据
        geojson.importData(getData())
        // 恢复旧数据点击事件
        geojson.eachOverlay(function (mak) {
            mak.on('click', function (e) {
                // console.log(e.lnglat, '点击了旧数据');
                var ext = mak.getExtData()
                var click = ++ext._geoJsonProperties.click
                console.log('旧数据点击了' + click + '次');
                // 1.使用信息提示框显示
                var infowin = new AMap.InfoWindow({
                    anchor: 'top-center',
                    content: `<div>打卡了${click}次</div>`
                })
                //2. 显示提示框的位置
                infowin.open(map, mak.getPosition())
                saveData(geojson.toGeoJSON())

            })

        })
    }
    map.add(geojson)

    // 地图点击事件添加标注
    function handler(e) {
        var marker = new AMap.Marker({
            position: e.lnglat,
            extData: {
                _geoJsonProperties: {
                    gid: geojson.getOverlays().length + 1,
                    click: 0
                }
            }
        })
        // map.add(marker)
        // 覆盖物的点击事件
        marker.on('click', function (e) {
            // console.log(e.lnglat, '点击了');
            var ext = marker.getExtData()
            var click = ++ext._geoJsonProperties.click
            console.log('点击了' + click + '次');
            saveData(geojson.toGeoJSON())
            // 1.使用信息提示框显示
            var infowin = new AMap.InfoWindow({
                anchor: 'top-center',
                content: `<div>打卡了${click}次</div>`
            })
            //2. 显示提示框的位置
            infowin.open(map, marker.getPosition())
        })
        // 通过geojson对象来管理覆盖物、显示点
        geojson.addOverlay(marker)
        // 保存数据(将geojson对象转换成标准的GeoJSON格式对象)
        saveData(geojson.toGeoJSON())
    }
    map.on('click', handler) //地图点击事件调用
    //开始动画
    function startAnimation() {
        AMap.plugin(["AMap.Driving"], function () {

            var driving = new AMap.Driving({
                map: map,
                //驾车策略,
                policy: AMap.DrivingPolicy.LEAST_TIME
            })
            // 设计始点终点
            var start = new AMap.LngLat(114.399282, 30.517028)
            var end = new AMap.LngLat(114.408448, 30.522259)
            // 通过eachOverlay获取途经点定位
            var opts = {
                waypoints: []
            }
            geojson.eachOverlay(function (item) {
                opts.waypoints.push(item.getPosition())
            })
            driving.search(start, end, opts, function (status, result) {
                if (status == 'complete') {
                    console.log('规划路线完成', result);
                    // 获取路径点数组
                    var lineArr = []
                    result.routes[0].steps.forEach((item) => {
                        lineArr.push(...item.path)
                    })

                    // 实现模拟轨迹
                    var marker = new AMap.Marker({
                        map,
                        position: start, //定位
                        icon: 'https://a.amap.com/jsapi_demos/static/demo-center-v2/car.png', //icon标注
                        offset: new AMap.Pixel(-25, -13), //偏移量
                        autoRotation: true, //自动转换角度,
                        angle: -160, //开始的车头方向

                    })

                    // 绘制线的设置
                    var passedPolyline = new AMap.Polyline({
                        map: map,
                        strokeColor: "#AF5", //线的颜色
                        strokrWeight: 6, //线宽
                    })
                    marker.on('moving', function (e) {
                        passedPolyline.setPath(e.passedPath)
                    })
                    map.setFitView();
                    marker.moveAlong(lineArr, {
                        duration: 500,
                        autoRotation: true
                    })

                } else {
                    console.log('错误');
                }
            })
        })
    }
</script>

</html>

css:

html,
body,
#container {
    width: 100%;
    height: 100%;
}

实现效果

猜你喜欢

转载自blog.csdn.net/CSSAJBQ_/article/details/131458629