webGIS 之 智慧校园案例

news2024/11/24 3:34:08

1.引入资源创建地图

//index.html
<!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>智慧校园</title>
    <!-- 引⼊资源 -->
    <!-- css样式 -->
    <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
    <link rel="stylesheet" href="./css/index.css">
    <!-- 引⼊js资源 -->
    <script type="text/javascript">
        window._AMapSecurityConfig = {
            securityJsCode: 'code',
        }
    </script>
    <script type="text/javascript" src="https://webapi.amap.com/maps?v=2.0&key=key"></script>
</head>
<body>
    <!-- 创建地图容器 -->
    <div id="container"></div>
    <script>
        //创建地图对象
        var map = new AMap.Map('container', {
            center: [114.402672, 30.518987],
            zoom: 16,
            viewMode: '3D',
            pitch: 45,
        })
    </script>
</body>
</html>
//css/index.css
html,
body,
#container {
    width: 100%;
    height: 100%;
}

2.使用控件

在这里插入图片描述

 // 使⽤控件
        AMap.plugin(['AMap.ToolBar', 'AMap.Scale', 'AMap.ControlBar'], function () {
            map.addControl(new AMap.ToolBar())
            map.addControl(new AMap.Scale())
            map.addControl(new AMap.ControlBar())
        })

3.标记功能

右上⻆就有了交互控件,且可以⽤⿏标左键单击添加标记。
在这里插入图片描述

      //使⽤⾼德的css样式来创建⼀个div控件
      <div class="info">点击地图标注热⻔地点</div>
       // 添加监听地图点击事件
        map.on('click',function(e){
            // 创建标记
            var marker = new AMap.Marker({
                position:e.lnglat,
           })
            // 添加标记图层
            map.add(marker)
       })

4.使⽤GeoJSON数据持久化

在这里插入图片描述

使⽤GeoJSON在本地存储中记录数据
首页我们需要创建一个store.js文件用来写读取和存入的函数

// 从local storage中读取数据
function getData() {
    //判断本地local storage中不存在数据
    if (!localStorage.getItem('geojson')) {
        localStorage.setItem('geojson', '[]')
    }
    return JSON.parse(localStorage.getItem('geojson'))
}
// 从local storage中写数据
function saveData(data) {
    localStorage.setItem('geojson', JSON.stringify(data))
}

在index .html引入
<script src="./js/store.js"></script>

<!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>智慧校园</title>
    <!-- 引⼊资源 -->
    <!-- css样式 -->
    <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
    <link rel="stylesheet" href="./css/index.css">
    <!-- 引⼊js资源 -->
    <script type="text/javascript">
        window._AMapSecurityConfig = {
            securityJsCode: 'code',
        }
    </script>
    <script src="./js/store.js"></script>
    <script type="text/javascript"
        src="https://webapi.amap.com/maps?v=2.0&key=key"></script>
</head>

<body>
    <!-- 创建地图容器 -->
    <div id="container"></div>
    <div class="info">点击地图标注热⻔地点</div>
    <script>
        //创建地图对象
        var map = new AMap.Map('container', {
            center: [114.402672, 30.518987],
            zoom: 16,
            viewMode: '3D',
            pitch: 45,
        })
        // 使⽤控件
        AMap.plugin(['AMap.ToolBar', 'AMap.Scale', 'AMap.ControlBar','AMap.GeoJSON'], function () {
            map.addControl(new AMap.ToolBar())
            map.addControl(new AMap.Scale())
            map.addControl(new AMap.ControlBar())
        })
        //定义全局变量
        var geojson = new AMap.GeoJSON({
            geoJSON: null,
        })
        // 导⼊数据
        if (JSON.stringify(getData()) != '[]') {
            //有数据的时候才导⼊
            geojson.importData(getData())
        }

        map.add(geojson)
        // 监听地图点击事件
        map.on('click', function (e) {
            // 创建标记
            var marker = new AMap.Marker({
                position: e.lnglat,
            })
            // 通过geojson对象管理覆盖物
            geojson.addOverlay(marker)
            //console.log(geojson)
            saveData(geojson.toGeoJSON())
        })
        
    </script>
</body>
</html>

5.实现打卡

在这里插入图片描述

实现思路:使用marker覆盖物的点击事件,导入数据的地方恢复旧数据的点击事件

<!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>智慧校园</title>
    <!-- 引⼊资源 -->
    <!-- css样式 -->
    <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
    <link rel="stylesheet" href="./css/index.css">
    <!-- 引⼊js资源 -->
    <script type="text/javascript">
        window._AMapSecurityConfig = {
            securityJsCode: 'code',
        }
    </script>
    <script src="./js/store.js"></script>
    <script type="text/javascript"
        src="https://webapi.amap.com/maps?v=2.0&key=key"></script>
</head>

<body>
    <!-- 创建地图容器 -->
    <div id="container"></div>
    <div class="info">点击地图标注热⻔地点,点击地点可以打卡</div>
    <script>
        //创建地图对象
        var map = new AMap.Map('container', {
            center: [114.402672, 30.518987],
            zoom: 16,
            viewMode: '3D',
            pitch: 45,
        })
        // 使⽤控件
        AMap.plugin(['AMap.ToolBar', 'AMap.Scale', 'AMap.ControlBar', 'AMap.GeoJSON'], function () {
            map.addControl(new AMap.ToolBar())
            map.addControl(new AMap.Scale())
            map.addControl(new AMap.ControlBar())
        })
        // 创建一个 Icon
        var startIcon = new AMap.Icon({
            // 图标的取图地址
            image: 'https://a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png',
        });
        //定义全局变量
        var geojson = new AMap.GeoJSON({
            geoJSON: null,
        })
        // 导⼊数据
        if (JSON.stringify(getData()) != '[]') {
            //有数据的时候才导⼊
            geojson.importData(getData())
            geojson.eachOverlay(function (item) {
                item.on('click', function (e) {
                    var ext = item.getExtData()
                    var click = ++ext._geoJsonProperties.click
                })
            })
            saveData(geojson.toGeoJSON())
        }
        map.add(geojson)
        // 监听地图点击事件
        map.on('click', function (e) {
            // 创建标记
            var marker = new AMap.Marker({
                position: e.lnglat,
                icon: startIcon,
                //固定写法
                extData: {
                    _geoJsonProperties: {
                        gid: geojson.getOverlays().length + 1,
                        click: 0,
                    },
                }
            })
            marker.on('click', function (e) {
                //固定写法
                var ext = marker.getExtData()
                var click = ++ext._geoJsonProperties.click
                saveData(geojson.toGeoJSON())
                // 使⽤消息提示框
                var infowindow = new AMap.InfoWindow({
                    anchor: 'top-center',//模板字符串
                    content: `<div>打卡了${click}次</div>`,
                })
                //打开信息框在标记的位置
                infowindow.open(map, marker.getPosition())
            })
            // 通过geojson对象管理覆盖物
            geojson.addOverlay(marker)
            //console.log(geojson)
            saveData(geojson.toGeoJSON())
            // 添加标记图层
            // map.add(marker)
        })

    </script>
</body>

</html>

6.推荐浏览路线

在这里插入图片描述

<!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>智慧校园</title>
    <!-- 引⼊资源 -->
    <!-- css样式 -->
    <link rel="stylesheet" href="https://a.amap.com/jsapi_demos/static/demo-center/css/demo-center.css" />
    <link rel="stylesheet" href="./css/index.css">
    <!-- 引⼊js资源 -->
    <script type="text/javascript">
        window._AMapSecurityConfig = {
            securityJsCode: 'code',
        }
    </script>
    <script src="./js/store.js"></script>
    <script type="text/javascript"
        src="https://webapi.amap.com/maps?v=2.0&key=key"></script>
</head>

<body>
    <!-- 创建地图容器 -->
    <div id="container"></div>
    <div class="info">点击地图标注热⻔地点,点击地点可以打卡</div>
    <div class="input-card" style="width:10rem;">
        <h4>推荐游览路线</h4>
        <div class="input-item">
            <button class="btn" onclick="startAnimation()">开始动画
            </button>
        </div>
    </div>
    <script>
        //创建地图对象
        var map = new AMap.Map('container', {
            center: [114.402672, 30.518987],
            zoom: 16,
            viewMode: '3D',
            pitch: 45,
        })
        // 使⽤控件
        AMap.plugin(['AMap.ToolBar', 'AMap.Scale', 'AMap.ControlBar', 'AMap.GeoJSON','AMap.MoveAnimation'], function () {
            map.addControl(new AMap.ToolBar())
            map.addControl(new AMap.Scale())
            map.addControl(new AMap.ControlBar())
            // map.addControl(new AMap.MoveAnimation())
        })
        //定义全局变量
        var geojson = new AMap.GeoJSON({
            geoJSON: null,
        })
        // 导⼊数据
        if (JSON.stringify(getData()) != '[]') {
            //有数据的时候才导⼊
            geojson.importData(getData())
            geojson.eachOverlay(function (item) {
                item.on('click', function (e) {
                    var ext = item.getExtData()
                    var click = ++ext._geoJsonProperties.click
                })
            })
            saveData(geojson.toGeoJSON())
        }
        map.add(geojson)
        // 监听地图点击事件
        map.on('click', function (e) {
            // 创建标记
            var marker = new AMap.Marker({
                position: e.lnglat,
                extData: {
                    _geoJsonProperties: {
                        gid: geojson.getOverlays().length + 1,
                        click: 0,
                    },
                }
            })
            marker.on('click', function (e) {
                var ext = marker.getExtData()
                var click = ++ext._geoJsonProperties.click
                saveData(geojson.toGeoJSON())
                // 使⽤消息提示框
                var infowindow = new AMap.InfoWindow({
                    anchor: 'top-center',//模板字符串
                    content: `<div>打卡了${click}次</div>`,
                })
                //打开信息框在标记的位置
                infowindow.open(map, marker.getPosition())
            })
            // 通过geojson对象管理覆盖物
            geojson.addOverlay(marker)
            //console.log(geojson)
            saveData(geojson.toGeoJSON())
            // 添加标记图层
            // map.add(marker)
        })
        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.400984, 30.518653)
                var end = new AMap.LngLat(114.404755, 30.523851)
                // 创建途经点
                var opts = {
                    waypoints: [],
                }
                geojson.eachOverlay(function (item) {//拿到每⼀个点
                    opts.waypoints.push(item.getPosition())
                })
                driving.search(start, end, opts, function (status, result) {
                //result结果就会返回当前轨迹对象,其中包含了导航信息
                    var lineArr = []
                    result.routes[0].steps.forEach(function (item) {
                        lineArr.push(...item.path)
                    });
                    if (status == 'complete') {
                        var marker = new AMap.Marker({
                            map: map,
                            position: start,
                            icon: 'https://webapi.amap.com/images/car.png',
                            offset: new AMap.Pixel(-26 ,- 13),
                            autoRotation: true,
                            angle: -180,
                        })
                        var passedPolyline = new AMap.Polyline({
                            map: map,
                            strokeColor: '#AF5',//描边的绿⾊
                            strokeWeight: 6,//线宽
                        })
                        marker.on('moving', function (e) {
                            passedPolyline.setPath(e.passedPath)
                        })
                        map.setFitView()
                        marker.moveAlong(lineArr, {
                            duration: 500,
                            autoRotation: true,
                        })
                    } else {
                    }
                })
            })
        }

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1559663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PyQt学习篇 · ⑮】:qrc/rcc资源系统

文章目录 qrc使用介绍rcc编译资源rcc 的安装与基本使用 编译成Python文件使用资源系统文件方式一&#xff1a;导入资源系统文件方式二&#xff1a;整合资源系统文件 qrc使用介绍 在PyQt中&#xff0c;qrc文件是一种资源文件&#xff0c;用于将应用程序所需的资源&#xff08;如…

中文Mistral模型介绍(Chinese-Mistral)——中文大语言模型

中文Mistral简介 Chinese-Mistral由清华大学地学系地球空间信息科学实验室开发。 该模型基于Mistral发布的Mistral-7B-v0.1训练得到。首先进行中文词表扩充&#xff0c;然后采用实验室提出的PREPARED训练框架&#xff08;under review&#xff09;在中英双语语料上进行增量预训…

日历插件fullcalendar【笔记】

日历插件fullcalendar【笔记】 前言版权开源推荐日历插件fullcalendar一、下载二、初次使用日历界面示例-添加事件&#xff0c;删除事件 三、汉化四、动态数据五、前后端交互1.环境搭建-前端搭建2.环境搭建-后端搭建3.代码编写-前端代码fullcalendar.htmlfullcalendar.js 4.代码…

事务传播行为Propagation

目录 背景Propagation测试程序1测试程序2分析 背景 前段时间&#xff0c;某个项目在部署时&#xff0c;被公司的一个检测拦截了&#xff0c;提示报错如下&#xff1a; Your code exists Method or Class with Transactional annotation that not use Propagation.REQUIRED.有…

算法学习——LeetCode力扣图论篇3(127. 单词接龙、463. 岛屿的周长、684. 冗余连接、685. 冗余连接 II)

算法学习——LeetCode力扣图论篇3 127. 单词接龙 127. 单词接龙 - 力扣&#xff08;LeetCode&#xff09; 描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk&#xff1a; 每一对相…

macOS Catalina for mac (macos 10.15系统)v10.15.7正式版

macOS Catalina是苹果公司专为麦金塔电脑推出的桌面操作系统&#xff0c;是macOS的第16个主要版本。它继承了苹果一贯的优雅与高效&#xff0c;不仅引入了分割视图和侧边栏&#xff0c;还带来了全新的音乐和播客应用&#xff0c;极大地提升了用户体验。在隐私保护和安全性方面&…

Oracle 数据库、实例、用户、表空间、表之间的关系(新手入门)

Oracle 数据库、实例、用户、表空间、表之间的关系 数据库&#xff1a; Oracle数据库是数据的物理存储。这就包括&#xff08;数据文件ORA或者DBF、控制文件、联机日志、参数文件&#xff09;。其实Oracle数据库的概念和其它数据库不一样&#xff0c;这里的数据库是一个操作系…

python中dropna()函数的作用举例说明

在Python中&#xff0c;dropna()是一个Pandas库中的函数&#xff0c;用于从数据框&#xff08;DataFrame&#xff09;中删除包含缺失值&#xff08;NaN&#xff09;的行或列。它用于数据清洗和预处理阶段&#xff0c;以便去除缺失值&#xff0c;使数据更加规整。 dropna()函数…

软件杯 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

nginx的缓存和gzip

nginx的缓存 缓存的基本思想是利用客户端访问的时间局限性&#xff0c;将客户端访问过的内容做一个副本&#xff0c;在一定时间内存放到本地&#xff0c;当改数据下次被访问时&#xff0c;不必连接到后端服务器反复去查询数据&#xff0c;而是由本地保存的副本响应数据。 保存…

服务器固定IP(固定出口IP)去访问外部服务

背景 服务器上有多个IP&#xff0c;那么在服务器请求外部服务的时候&#xff0c;到底是使用哪个IP呢&#xff1f;如果要使用特定的IP去请求外部服务&#xff0c;该如何设置呢&#xff1f; 分析 遇到一个实际的场景&#xff1a; 我们产品和其他产品联调&#xff0c;我们的服务…

【A-010】基于SSH的宠物狗商城系统(含论文)

【A-010】基于SSH的宠物狗商城系统&#xff08;含论文&#xff09; 开发环境&#xff1a; Eclipse/MyEclipse、Tomcat8、Jdk1.8 数据库&#xff1a; MySQL 项目介绍&#xff1a; 在科学技术飞速发展的今天&#xff0c;互联网成为人们快速获取、发布和传递信息的重要渠道&am…

【Docker笔记01】【基础内容】

一、前言 本系列是根据 B 站 尚硅谷 Docker 视频 学习记录笔记。因为没有视频课件&#xff0c;部分内容摘自 https://www.yuque.com/tmfl/cloud/dketq0。 本系列仅为自身学习笔记记录使用&#xff0c;记录存在偏差&#xff0c;推荐阅读原视频内容或本文参考笔记。 二、Docker…

基于springboot实现房屋租赁系统项目【项目源码+论文说明】

基于springboot实现房屋租赁系统演示 摘要 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本…

QT-左框选项卡软件界面框架

QT-左框选项卡软件界面框架 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include <QTextBrowser> #include <QLabel> #include <QPushButton> #include <QSpacerItem> #include <QToolButton> #include <QDebug> #i…

浮点数(小数)在计算机中如何用二进制存储?

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/137182814 出自【进步*于辰的博客】 注&#xff1a;为了阐述更加严谨&#xff0c;本篇文章中将使…

【练习】滑动窗口思想

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Java算法&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1.长度最小的子数组 题目解析 讲解 代码实现 2.无…

微信小程序(黑马优购:登录)

1.点击结算进行条件判断 user.js //数据 state: () >({ // address: {} address: JSON.parse(uni.getStorageSync(address) || {}), token: }), my-settle.vue computed: { ...mapGetters(m_cart,[checkedCount,total,checkedGoodsAmount]), …

MySQL经验分享:Shell开发问题

背景 之前整理过Python连接使用MySQL的经验&#xff0c;链接如下&#xff1a; pymysql封装总结_pymysql封装类-CSDN博客 相比高级语言&#xff0c;Shell与MySQL开发使用相对会更麻烦一些&#xff1b;由于 shell是linux命令集的概称&#xff0c;是属于命令行的人机界面。Shel…

机器视觉学习(八)—— 阈值化

目录 一、阈值化 二、二值化和示例 2.1 二值化 2.2 示例代码 一、阈值化 OpenCV是一个开源的计算机视觉库&#xff0c;可以用于图像处理和计算机视觉任务。阈值化是图像处理中的一种常见操作&#xff0c;可以将图像的像素值分成两个或多个不同的类别&#xff0c;通常是黑色…