webGIS 之 智慧校园案例

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.mfbz.cn/a/503631.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

表单元素使用

表单元素使用 要完成的效果:代码实现: 要完成的效果: 代码实现: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

nginx与tomcat的区别?

关于nginx和tomcat的概念 网上有很多关于nginx和tomcat是什么东西的定义&#xff0c;我总结了一下: tomcat是Web服务器、HTTP服务器、应用服务器、Servlet容器、web容器。 Nginx是Web服务器、HTTP服务器、正向/反向代理服务器&#xff0c;。 这里有两个概念是交叉的&#xff…

DolphinScheduler on k8s 云原生部署实践

文章目录 前言利用Kubernetes技术云原生平台初始化迁移基于Argo CD添加GitOpsDolphinScheduler 在 k8s 上的服务自愈可观测性集成服务网格云原生工作流调度从HDFS升级到S3文件技术总结 前言 DolphinScheduler 的高效云原生部署模式&#xff0c;比原始部署模式节省了95%以上的人…

微信小程序备案流程详细操作指南

自2023年9月1日起&#xff0c;所有新上架的微信小程序均需事先完成备案手续&#xff0c;方能成功上线。而对于已经上架的存量小程序&#xff0c;也需要在2024年3月31日前完成备案工作。若在规定时间内未完成备案&#xff0c;平台将依据备案相关规定&#xff0c;自2024年4月1日起…

love 2d win 下超简单安装方式,学习Lua 中文编程 刚需!!

一、下载love 2d 参考&#xff1a;【Love2d从青铜到王者】第一篇:Love2d入门以及安装教程 或直接下载&#xff1a; 64位&#xff0c;现在一般电脑都可以用。 64-bit zipped 32位&#xff0c;很复古的电脑都可以用。 32-bit zipped 二、解压 下载好了之后&#xff0c;解压到…

HarmonyOS 应用开发之FA模型绑定Stage模型ServiceExtensionAbility

本文介绍FA模型的三种应用组件如何绑定Stage模型的ServiceExtensionAbility组件。 PageAbility关联访问ServiceExtensionAbility PageAbility关联访问ServiceExtensionAbility和PageAbility关联访问ServiceAbility的方式完全相同。 import featureAbility from ohos.ability…

python opencv 直线检测

直线检测 前期准备 import cv2 import numpy as np# 读取图片 img cv2.imread(r"C:\Users\HONOR\Desktop\12.png") # 灰度转换 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化 # reg, img cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 显示二值化…

代码+视频,手动绘制logistic回归预测模型校准曲线(Calibration curve)(1)

校准曲线图表示的是预测值和实际值的差距&#xff0c;作为预测模型的重要部分&#xff0c;目前很多函数能绘制校准曲线。 一般分为两种&#xff0c;一种是通过Hosmer-Lemeshow检验&#xff0c;把P值分为10等分&#xff0c;求出每等分的预测值和实际值的差距. 另外一种是calibra…

Adaboost集成学习 | Matlab实现基于SVM-Adaboost支持向量机结合Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Adaboost集成学习 | 基于SVM-Adaboost支持向量机结合Adaboost集成学习时间序列预测(股票价格预测)基于SVM(支持向量机)和AdaBoost集成学习的时间序列预测(如股票价格预测)是一种结合了两种强大机器学习算…

【Frida】【Android】工具篇:ZenTracer

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

如何使用 ChatGPT 进行编码和编程

文章目录 一、初学者1.1 生成代码片段1.2 解释功能 二、自信的初学者2.1 修复错误2.2 完成部分代码 三、中级水平3.1 研究库3.2 改进旧代码 四、进阶水平4.1 比较示例代码4.2 编程语言之间的翻译 五、专业人士5.1 模拟 Linux 终端 总结 大多数程序员都知道&#xff0c;ChatGPT …

mac+win10虚拟机+phpstudy便捷运行php+pgsql的方法

痛点&#xff1a;mac下要搭建nginxphp&#xff08;含pdo_pgsql&#xff09;pgsql比较麻烦 另类解决方法&#xff1a; 前提&#xff1a;mac下需要已安装win10虚拟机 方法&#xff1a; 1. win10虚拟机下安装phpstudy8.1 -> 开启php扩展&#xff08;pdo_pgsql&#xff09;&a…

竞赛 python+深度学习+opencv实现植物识别算法系统

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的植物识别算法研究与实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;4分 &#x1f9ff; 更多…

荣誉 | 人大金仓连续三年入选“金融信创优秀解决方案”

3月28日&#xff0c;由中国人民银行领导&#xff0c;中国金融电子化集团有限公司牵头组建的金融信创生态实验室发布“第三期金融信创优秀解决方案”&#xff0c;人大金仓新一代手机银行系统解决方案成功入选&#xff0c;这也是人大金仓金融行业解决方案连续第三年获得用户认可。…

OSI七层参考模型

osi即开放系统互联参考模型。 osi的目的是为了解决主机间的通信 从下到上&#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示出、应用层 上三层&#xff08;应用层、表示出、会话层&#xff09;负责产生数据&#xff0c;下四层&#xff08;传输层、网络层、数据…

类加载 双亲委派 内存模型 对象内存分配 逃逸分析学习记录

类加载双亲委派 main方法运行过程 C语言实现的java.exe来创建jvm,和引导类加载器&#xff0c;并由引导类加载器来创建类加载器的启动器launcher&#xff0c;在类加载器启动器空参构造中就对剩下的拓展类加载器&#xff0c;应用程序加载器&#xff0c;和自定义加载器来进行了加…

前端第一天练习

一、安装Node.js和搭建前端环境 安装 Node.js&#xff1a;访问 Node.js 官网 下载并安装最新版本的 Node.js。 LTS 为长期稳定的版本, Current 为新特性尝鲜版本, 可能存在隐藏的 bug 或者安全漏洞打开终端, 在终端输入命令 node -v后, 即可查看已安装的 Node.js 版本号 使用 …

JWFD流程图转换为矩阵数据库的过程说明

在最开始设计流程图的时候&#xff0c;请务必先把开始节点和结束节点画到流程图上面&#xff0c;就是设计器面板的最开始两个按钮&#xff0c;先画开始点和结束点&#xff0c;再画中间的流程&#xff0c;然后保存&#xff0c;这样提交到矩阵数据库就不会出任何问题&#xff0c;…

linux命令之tput

1.tput介绍 linux命令tput是可以在终端中进行文本和颜色的控制和格式化&#xff0c;其是一个非常有用的命令 2.tput用法 命令&#xff1a; man tput 3.样例 3.1.清除屏幕 命令&#xff1a; tput clear [rootelasticsearch ~]# tput clear [rootelasticsearch ~]# 3.2.…

32-2 APP渗透 - 移动APP架构

前言 app渗透和web渗透最大的区别就是抓包不一样 一、客户端: 反编译: 静态分析的基础手段,将可执行文件转换回高级编程语言源代码的过程。可用于了解应用的内部实现细节,进行漏洞挖掘和算法分析等。调试: 排查软件错误的一种手段,用于分析应用内部原理和行为。篡改/重打…