WebGIS之实现查询地区天气并让地区高亮

一.预览>>


 

二.思路>>


        根据搜索框的内容来进行页面视角的切换,对应的地区高亮,右边有关天气的地方实时更新,并且因为代码体量非常小,并没有选择在框架下完成。直接一个html文件搞定了,但实际上还是有一些坑的,比如不太了解的人会把key引入错,关于请求高德接口方面,注意阅读看是否需要其它参数,地理/逆地理编码-基础 API 文档-开发指南-Web服务 API|高德地图API (amap.com)icon-default.png?t=N7T8https://lbs.amap.com/api/webservice/guide/api/georegeo可能之后时间过得久了,对应API发生了变化,及时查阅文档。

三.代码>> 


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

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Weather</title>
    <link href="https://api.mapbox.com/mapbox-gl-js/v3.2.0/mapbox-gl.css" rel="stylesheet">
    <script src="https://api.mapbox.com/mapbox-gl-js/v3.2.0/mapbox-gl.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
    <style>
        body {
            margin: 0;
            padding: 0;
        }

        #header {
            width: 100%;
            height: 100px;
            background-color: #212121;
            overflow: hidden;
            /* 解决margin塌陷,因为group设置了margin-top*/
        }

        #map {
            width: 100%;
            position: absolute;
            top: 100px;
            bottom: 0;
        }

        #map .information {
            padding: 0;
            margin: 0;
            list-style: none;
            width: 200px;
            height: 300px;
            position: absolute;
            z-index: 1;
            top: 10px;
            right: 10px;
            color: #fff;

            background-color: rgba(0, 0, 0, 0.4);
            border-radius: 5px;
            padding: 10px;
            display: flex;
            align-items: stretch;
            justify-content: space-around;
            flex-direction: column;
        }

        #map .information li {
            border-bottom: 1px solid aqua;
            font-style: 20px;
        }


        .group {
            display: flex;
            line-height: 28px;
            align-items: center;
            position: relative;
            max-width: 190px;
            margin: 0 auto;
            margin-top: 20px;
        }

        .input {
            width: 100%;
            height: 40px;
            line-height: 28px;
            padding: 0 1rem;
            padding-left: 2.5rem;
            border: 2px solid transparent;
            border-radius: 8px;
            outline: none;
            background-color: #f3f3f4;
            color: #0d0c22;
            transition: .3s ease;
        }

        .input::placeholder {
            color: #9e9ea7;
        }

        .input:focus,
        input:hover {
            outline: none;
            border-color: rgba(234, 76, 137, 0.4);
            background-color: #fff;
            box-shadow: 0 0 0 4px rgb(234 76 137 / 10%);
        }

        .icon {
            position: absolute;
            left: 1rem;
            fill: #9e9ea7;
            width: 1rem;
            height: 1rem;
        }
    </style>
</head>

<body>
    <div id="header">
        <!-- <input type="text" placeholder="请输入城市名称"> -->
        <div class="group">
            <svg class="icon" aria-hidden="true" viewBox="0 0 24 24">
                <g>
                    <path
                        d="M21.53 20.47l-3.66-3.66C19.195 15.24 20 13.214 20 11c0-4.97-4.03-9-9-9s-9 4.03-9 9 4.03 9 9 9c2.215 0 4.24-.804 5.808-2.13l3.66 3.66c.147.146.34.22.53.22s.385-.073.53-.22c.295-.293.295-.767.002-1.06zM3.5 11c0-4.135 3.365-7.5 7.5-7.5s7.5 3.365 7.5 7.5-3.365 7.5-7.5 7.5-7.5-3.365-7.5-7.5z">
                    </path>
                </g>
            </svg>
            <input placeholder="输入城市名称" type="search" class="input">
        </div>
    </div>
    <div id="map">
        <ul class="information">
            <li>当前时间</li>
            <li>城市</li>
            <li>天气</li>
            <li>温度</li>
            <li>风向</li>
            <li>风力</li>
        </ul>
    </div>

    <script type="text/javascript">
        window._AMapSecurityConfig = {
            securityJsCode: "写你自己的",
        };
    </script>
    <script type="text/javascript"
        src="https://webapi.amap.com/maps?v=2.0&key=你自己的web端key">        </script>
    <script>
        const input = document.querySelector('.input');
        mapboxgl.accessToken = 'pk.eyJ1IjoiY3VkODUiLCJhIjoiY2xrYnFncXZhMGc1cTNlbmFrNHN1N2cxeCJ9.69E3f8nMJkvqQDRhLSojVw';
        const map = new mapboxgl.Map({
            container: 'map',
            style: 'mapbox://styles/mapbox/streets-v12',
            zoom: 10,
            center: [116.41667, 39.91667]
        });


        document.addEventListener('keypress', function (e) {
            if (e.key === 'Enter') {
                const cityName = input.value;
                //使用完清空,便于下次使用
                input.value = ''
                queryWeather(cityName)
            }
        })

        function queryWeather(cityName) {
            //加载天气查询插件,因为只展示当前天气,没必要调用接口
            AMap.plugin("AMap.Weather", function () {
                //创建天气查询实例
                var weather = new AMap.Weather();
                //执行实时天气信息查询
                weather.getLive(cityName, function (err, data) {
                    console.log(data);
                    if (!err) {
                        updateWeatherInfo(data)
                        updateMap(data.city, data.adcode)
                    } else {
                        alert(err)
                    }
                });
            });
        }

        function updateWeatherInfo(data) {
            const timeElement = document.querySelector('.information li:nth-child(1)')
            const cityElement = document.querySelector('.information li:nth-child(2)');
            const weatherElement = document.querySelector('.information li:nth-child(3)');
            const tempElement = document.querySelector('.information li:nth-child(4)');
            const windDirectionElement = document.querySelector('.information li:nth-child(5)');
            const windPowerElement = document.querySelector('.information li:nth-child(6)');

            timeElement.textContent = '当前时间:' + data.reportTime;
            cityElement.textContent = '城市:' + data.city;
            weatherElement.textContent = '天气:' + data.weather;
            tempElement.textContent = '温度:' + data.temperature + '°C';
            windDirectionElement.textContent = '风向:' + data.windDirection;
            windPowerElement.textContent = '风力:' + data.windPower + '级';
        }

        function updateMap(city, adcode) {
            //调用高德的地理编码API
            //记住是这个key绑定的是Web服务,跟前面的key不是一种
            axios({
                url: `https://restapi.amap.com/v3/geocode/geo?address=${city}&adcode=${adcode}&key=填自己的key`
            }).then(result => {
                // console.log(typeof (result.data.geocodes[0].location))  //String类型
                var locationString = result.data.geocodes[0].location;
                var coordinates = locationString.split(","); // 经度和纬度之间用逗号分隔,可以根据实际情况调整分隔符

                // 创建一个新的 LngLat 对象
                var newCenter = new mapboxgl.LngLat(parseFloat(coordinates[0]), parseFloat(coordinates[1]));

                //实现视角跳转
                map.flyTo({
                    center: newCenter,
                    //使动画平滑
                    essential: true
                })
            }).catch(error => {
                console.log(error.message);
            })

            // 先检查是否已存在同名的数据源和图层,如果存在,则移除
            if (map.getSource('json')) {
                map.removeLayer('place'); // 移除图层
                map.removeSource('json'); // 移除数据源
            }

            //省市的url带有_full,观察adcode的区别来确定模板字符串
            let url = ''
            if (adcode[adcode.length - 1] == 0) {
                url = `https://geo.datav.aliyun.com/areas_v3/bound/${adcode}_full.json`
            } else {
                url = `https://geo.datav.aliyun.com/areas_v3/bound/${adcode}.json`
            }

            // console.log(url);
            map.addSource('json', {
                type: 'geojson',
                data: url
            })
            map.addLayer({
                id: 'place',
                type: 'fill',
                source: 'json',
                paint: {
                    'fill-color': '#ff5733', // 设置填充颜色为橙红色
                    'fill-opacity': 0.5, // 设置填充不透明度
                    'fill-outline-color': '#ffffff', // 设置边界线的颜色为白色
                    'fill-outline-width': 2 // 设置边界线的宽度
                }
            })
        }

    </script>
</body>

</html>

         

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

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

相关文章

如何批量获取公众号所有文章的阅读数点赞数和留言数导出excel?

如何批量获取公众号所有文章的阅读数点赞数和留言数导出excel&#xff1f;我写了个脚本批量抓取&#xff0c;导出的excel文章数据包含文章日期&#xff0c;文章标题&#xff0c;文章链接&#xff0c;文章简介&#xff0c;文章作者&#xff0c;文章封面图&#xff0c;是否原创&a…

印度交易所股票行情数据API接口

1. 历史日线 # Restful API https://tsanghi.com/api/fin/stock/XNSE/daily?token{token}&ticker{ticker}默认返回全部历史数据&#xff0c;也可以使用参数start_date和end_date选择特定时间段。 更新时间&#xff1a;收盘后3~4小时。 更新周期&#xff1a;每天。 请求方式…

【模拟string函数的实现】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 模拟string函数的实现 浅拷贝 深拷贝 vs和g下string结构的说明 总结 前言 模拟string函数的实现 浅拷贝 深拷贝 总结 前言 世上有两种耀眼的光芒&#…

【Poi-tl Documentation】自定义占位符来设置图片大小

前置说明&#xff1a; <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version> </dependency>模板文件&#xff1a; image_test.docx package run.siyuan.poi.tl.policy;imp…

PyQt5---初识PyQt5相关及开发实战介绍

什么是GUI GUI是Graphical User Interface&#xff08;图形用户界面&#xff09;的缩写&#xff0c;是一种用户与计算机交互的方式&#xff0c;通过使用图形化的元素&#xff08;如按钮、窗口、菜单等&#xff09;来帮助用户完成任务。GUI使得用户可以通过鼠标、键盘等输入设备…

2024.3.17 机器学习周报

引言 Abstract 文献阅读 1、题目 R-TRANSFORMER: RECURRENT NEURAL NETWORK ENHANCED TRANSFORMER 2、引言 递归神经网络长期以来一直是序列建模的主要选择。然而&#xff0c;它严重遭受两个问题&#xff1a;在捕获非常长期的依赖性和无法并行化的顺序计算过程中无能为力…

【Javascript编程实操06】1、反转数组和字符串 2、将二维数组转一维数组

前言 1、反转数组和字符串 代码&#xff1a; 实现效果&#xff1a; 2、将二维数组转一维数组 代码&#xff1a; 实现效果&#xff1a; 总结 前言 本次主要是针对Javascript阶段的字符串与数组的实操练习&#xff0c;共有2个实操&#xff0c;大家可以在实操的过程中更加深…

程序人生——Java泛型和反射的使用建议

目录 引出泛型和反射建议93&#xff1a;Java的泛型是类型擦除的建议94&#xff1a;不能初始化泛型参数和数组建议95&#xff1a;强制声明泛型的实际类型 建议96&#xff1a;不同的场景使用不同的泛型通配符建议97&#xff1a;警惕泛型是不能协变和逆变的 建议98&#xff1a;建议…

基于springboot实现小区物业管理系统项目【项目源码+论文说明】

基于springboot实现小区物业管理系统演示 摘要 随着城镇人口居住的集中化加剧 &#xff0c;传统人工小区管理模式逐渐跟不上时代的潮流。这就要求我们提供一个专门的管理系统。来提高物管的工作效率、为住户提供更好的服务。 物业管理系统运用现代化的计算机管理手段,使物业的…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的安全帽检测系统(深度学习模型+UI界面代码+训练数据集)

摘要&#xff1a;开发先进的安全帽识别系统对提升工作场所的安全性至关重要。本文详细介绍了使用深度学习技术创建此类系统的方法&#xff0c;并分享了完整的实现代码。系统采用了强大的YOLOv8算法&#xff0c;并对其与YOLOv7、YOLOv6、YOLOv5的性能进行了详细比较&#xff0c;…

MySQL:视图

1. 概述 在MySQL中&#xff0c;视图&#xff08;View&#xff09;是一个虚拟存在的表&#xff0c;其内容是由查询定义的。视图本身并不包含数据&#xff0c;它只包含一条SQL查询语句&#xff08;即定义视图的SELECT语句&#xff09;。当通过视图访问数据时&#xff0c;MySQL会执…

【SpringBoot3】整合Druid数据源和Mybatis 项目打包和运行

文章目录 一、整合Druid数据源二、整合Mybatis2.1 MyBatis整合步骤2.1 Mybatis整合实践2.1 声明式事务整合配置2.1 AOP整合配置 三、项目打包和运行命令启动和参数说明 总结web 与 springboot 打包区别JDK8的编译环境 执行17高版本jar 一、整合Druid数据源 创建模块 &#xff1…

Fork - 将 GitHub 的某个特定仓库复制到自己的账户下

Fork - 将 GitHub 的某个特定仓库复制到自己的账户下 1. ForeverStrongCheng/OpenCV-tutorials2. Fork -> ForeverStrongCheng/R2CNN_Faster-RCNN_TensorflowReferences 访问仓库页面&#xff0c;点击 Fork 按钮创建自己的仓库。 Fork 是将 GitHub 的某个特定仓库复制到自己…

【Python编程基础】第一节.Python基本语法(上)

文章目录 前言⼀、Python介绍二、Python环境配置三、Pycharm 书写代码四、Python基本语法 4.1 print 函数的简单使用 4.2 注释 4.3 Python 代码中三种波浪线和 PEP8 4.4 在 cmd 终端中运⾏ Python 代码 4.5 变量 4.6 数据类型 4.7 类型转换…

【docker】docker的常用命令

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;中间件 ⛺️稳中求进&#xff0c;晒太阳 常规命令 docker version #查看docker 版本信息docker info #显示docker 的系统信息&#xff0c;包括镜像和容器数量docker --help #查看所有的命…

花钱买不到系列-linux信号[1]卷

我们下面要学的这个&#xff0c;信号&#xff0c;它呢就挺好玩的&#xff0c;虽然它也有一点点难&#xff0c;那么尤其是这里要进入第二阶段的进程地质空间的分享。 第一阶段&#xff0c;是当时在讲进程概念时&#xff0c;学了个进程地址空间&#xff0c;当时知道了地址空间页表…

基于大模型和向量数据库的 RAG 示例

1 RAG 介绍 RAG 是一种先进的自然语言处理方法&#xff0c;它结合了信息检索和文本生成技术&#xff0c;用于提高问答系统、聊天机器人等应用的性能。 2 RAG 的工作流程 文档加载&#xff08;Document Loading&#xff09; 从各种来源加载大量文档数据。这些文档…

操作系统——cpu、内存、缓存介绍

一、内存是什么 内存就是系统资源的代名词&#xff0c;它是其他硬件设备与 CPU 沟通的桥梁&#xff0c; 计算机中的所有程序都在内存中运行。其作用是暂时存放CPU的运算数据&#xff0c;以及与硬盘交换的数据。也是相当于CPU与硬盘沟通的桥梁。只要计算机在运行&#xff0c;CP…

应对恶意IP攻击的有效方法

在当今数字化时代&#xff0c;网络攻击已经成为了互联网安全的重大挑战之一。恶意IP攻击是网络安全领域中的一种常见威胁&#xff0c;它可能导致数据泄露、服务中断、系统瘫痪等严重后果。因此&#xff0c;有效地应对恶意IP攻击至关重要。IP数据云将深入探讨如何应对恶意IP攻击…

android中单例模式为什么会引起内存泄漏?

单例模式使用不恰当会造成内存泄漏。因为单例的静态特性使得单例的生命周期和应用的生命周期一样长, 如果一个对象已经不需要使用了,但是单例对象还持有该对象的引用,那么这个对象就不能被正常回收,因此会导致内存泄漏。 举个例子: ①新建一个工程。 ②配置好LeakCanary检…