Vue使用高德地图定位到当前位置,并显示天气信息

首先得去高德控制台申请两个 key,一个天气key和一个定位key

 

获取天气信息的函数:

const getWeather = function (city) {
  // 使用 fetch 发送请求获取天气信息
  fetch(`https://restapi.amap.com/v3/weather/weatherInfo?city=${city}&key=eefd36557b0250d19d243aea0f62d499`)
    .then((response) => response.json())
    .then((data) => {
      const { lives } = data;
      // 更新响应式数据
      weather.city = lives[0].city;
      weather.weather = lives[0].weather;
      weather.temperature = lives[0].temperature;
      weather.winddirection = lives[0].winddirection;
      weather.windpower = lives[0].windpower;
      weather.reporttime = lives[0].reporttime;
    });
};

使用Geolocation API获取当前位置:

onMounted(() => {
  let latitude = 0;
  let longitude = 0;

  if ("geolocation" in navigator) {
    navigator.geolocation.getCurrentPosition(
      function (position) {
        latitude = position.coords.latitude;
        longitude = position.coords.longitude;
      },
      function (error) {
        console.error("获取位置失败:", error.message);
      }
    );
  } else {
    console.error("浏览器不支持Geolocation");
  }
});

加载高德地图API并在地图上显示标记和天气信息:

AMapLoader.load({
  // 加载高德地图API
}).then((AMap) => {
  // 在地图上显示当前位置的标记
  const marker = new AMap.Marker({
    position: new AMap.LngLat(longitude, latitude),
    title: "当前位置",
  });

  // 其他地图初始化和相关操作

  // 在地图上显示信息窗体
  watch(weather, (newVal, oldVal) => {
    // 创建信息窗体
    var content = [
      "<div><b>天气</b>",
      `城市:${weather.city}`,
      // 其他天气信息...
      "</div>",
    ];

    var infoWindow = new AMap.InfoWindow({
      content: content.join("<br>"),
      anchor: "top-left",
    });

    infoWindow.open(map, [longitude, latitude]);
  });

  // 添加标记到地图
  map.add(marker);

  // 标记点击事件
  marker.on('click', function (e) {
    // 打开信息窗体
    infoWindow.open(map, [longitude, latitude]);
  });
}).catch(e => {
  console.error(e);
});

全部代码

<template>
  <div id="container">
  </div>
  <!--  -->
</template>
<script setup lang="ts">
import {onMounted, reactive, ref, watch} from 'vue';
import AMapLoader from '@amap/amap-jsapi-loader';
import {computed} from "vue-demi";

// 如果是在 ts 的项目中,这一步会有类型错误,解决方案请移步 2.1.1
window._AMapSecurityConfig = {
  securityJsCode: 'd6a5157a0b06c55bcee22c7b69a42c5a'// 你的安全密钥
};
// 定义当前经纬度
/** 初始化地图函数 */
// IP定位获取当前城市信息
const weather = reactive({
  city: '',
  weather: '',
  temperature: '',
  winddirection: '',
  windpower: '',
  reporttime: ''
})
const weatheritem = computed(() => {
  // 回调函数必须return,结果就是计算的结果
  // 如果计算属性依赖的数据发生变化,那么会重新计算
  return weather
})


const getWeather = function (city) {
  fetch(
      `https://restapi.amap.com/v3/weather/weatherInfo?city=${city}&key=eefd36557b0250d19d243aea0f62d499` //天气key
  )
      .then((response) => {
        return response.json();
      })
      .then((data) => {
        const {lives} = data
        console.log(lives[0])
        weather.city = lives[0].city
        weather.weather = lives[0].weather
        weather.temperature = lives[0].temperature
        weather.winddirection = lives[0].winddirection
        weather.windpower = lives[0].windpower
        weather.reporttime = lives[0].reporttime
      });
}
onMounted(() => {
  let latitude = 0;
  let longitude = 0;
  // 获取当前位置的经纬度
// 检查浏览器是否支持Geolocation
  if ("geolocation" in navigator) {
    // 获取当前位置
    navigator.geolocation.getCurrentPosition(
        function (position) {
          // 获取经纬度
          latitude = position.coords.latitude;
          longitude = position.coords.longitude;
          // 在这里使用经纬度数据进行其他操作
          console.log("纬度:" + latitude + ", 经度:" + longitude);
        },
        function (error) {
          // 处理获取位置失败的情况
          console.error("获取位置失败:", error.message);
        }
    );
  } else {
    // 浏览器不支持Geolocation
    console.error("浏览器不支持Geolocation");
  }
  // AMapLoader => 加载器
  // 资源加载完成后就会触发 then
  AMapLoader.load({
    "key": "34b7b1e632fcf24d30be5c5825f8043d", // 申请好的Web端开发者定位Key,首次调用 load 时必填
    "version": "2.0",   // 指定要加载的 JS API 的版本,缺省时默认为 1.4.15
    "plugins": [],           // 需要使用的的插件列表,如比例尺'AMap.Scale'等
  }).then((AMap) => {
    AMap.plugin('AMap.CitySearch', function () {
      var citySearch = new AMap.CitySearch()
      citySearch.getLocalCity(function (status, result) {
        if (status === 'complete' && result.info === 'OK') {
          // 查询成功,result即为当前所在城市信息
          console.log(result.city)
          getWeather(result.city)
        }
      })
    })
    const marker = new AMap.Marker({
      position: new AMap.LngLat(longitude, latitude), //经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
      title: "当前位置",
    });


//打开信息窗体
    // 初始化地图
    const map = new AMap.Map('container', {
      center: [longitude, latitude], //地图中心点
      zoom: 10
      // 配置对象 - 配置地图的风格和缩放比例,请移步 2.2
    });
    //获取当前城市信息
    //信息窗体的内容
    watch(weather, (newVal, oldVal) => {
      console.log(newVal, oldVal)
      var content = [
        "<div><b>天气</b>",
        `城市:${weather.city}`,
        `时间:${weather.reporttime}`,
        `天气:${weather.weather}`,
        `温度:${weather.temperature}℃`,
        `风向:${weather.winddirection}`,
        `风速:${weather.windpower}`,
        "</div>",
      ];
//创建 infoWindow 实例
      var infoWindow = new AMap.InfoWindow({
        content: content.join("<br>"), //传入字符串拼接的 DOM 元素
        anchor: "top-left",
      });
      infoWindow.open(map, [longitude, latitude]); //map 为当前地图的实例,map.getCenter() 用于获取地图中心点坐标。
    })
    map.add(
        marker
    )
    marker.on('click', function (e) {
      // 打开信息窗体,显示信息
      console.log(e)
      infoWindow.open(map, [longitude, latitude]);
    });

  }).catch(e => {
    console.log(e);
  });
});

</script>

<style scoped>
#container {
  width: 100vw;
  height: 100vh;
}
</style>

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

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

相关文章

二,几何相交----2,区间相交检测IID--(1)算法

对于空间的线段是否相交&#xff0c;假设都是与x平行&#xff0c;则需要三步 1&#xff0c;对各线段左右端点设置为L,R标志 2&#xff0c;从小到大进行排序 3&#xff0c;线性扫描&#xff0c;从小到大&#xff0c;根据模式判断是否相交&#xff0c;假设不相交&#xff0c;则应…

【JavaScript】面试手撕浅拷贝

【JavaScript】面试手撕浅拷贝 引入 浅拷贝和深拷贝应该是面试时非常常见的问题了&#xff0c;为了能将这两者说清楚&#xff0c;于是打算用两篇文章分别解释下深浅拷贝。 PS: 我第一次听到拷贝这个词&#xff0c;有种莫名的熟悉感&#xff0c;感觉跟某个英文很相似&#xff…

sc-MAVE

Deep-joint-learning analysis model of single cell transcriptome and open chromatin accessibility data单细胞转录组和开放染色质可及性数据的深度联合学习分析模型 在同一个细胞中同时分析转录组和染色质可及性信息为了解细胞状态提供了前所未有的解决方案。然而&#x…

WPS/Office 好用的Word插件-查找替换

例如&#xff1a;一片文档&#xff1a;…………泰山…………泰&#xff08;少打了山字&#xff09;………… 要是把“泰”查找替换为“泰山”&#xff0c;就会把前面的“泰山”变成“泰山山”&#xff0c;这种问题除了再把“泰山山”查找替换为“泰山”&#xff0c;有没有更简单…

Flutter输入框换行后自适应高度

Flutter输入框换行后输入框高度随之增加 效果 设计思想 通过TextEditingController在build中监听输入框&#xff0c;输入内容后计算输入框高度然后自定义适合的值&#xff0c;并且改变外部容器高度达到自适应高度的目的 参考代码 //以下代码中的值只适用于案例&#xff0c;…

智能果园风吸杀虫灯的优势

TH-FD2随着农业科技的不断进步&#xff0c;果园管理也迎来了革命性的变革。智能果园风吸杀虫灯作为一种新型的果园管理工具&#xff0c;以其独特的优势&#xff0c;正逐渐受到广大果农的青睐。 一、智能果园风吸杀虫灯的工作原理 智能果园风吸杀虫灯利用害虫的趋光性&#xff0…

贪心 Leetcode 134 加油站

加油站 Leetcode 134 学习记录自代码随想录 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时油…

MonkeyRunner在自动化测试里的应用场景!

MonkeyRunner是Android提供的一个自动化测试工具&#xff0c;主要用于对Android设备或模拟器进行功能和压力测试。以下是一些MonkeyRunner在自动化测试中的应用场景及实例代码&#xff1a; 基本操作测试 点击屏幕上的特定位置或元素。 模拟滑动和手势操作。 发送按键事件。 …

指针习题二

使用函数指针实现转移表 #include <stdio.h> int add(int a, int b) {return a b; } int sub(int a, int b) {return a - b; } int mul(int a, int b) {return a * b; } int div(int a, int b) {return a / b; } int main() {int x, y;int input 1;int ret 0;int(*p[…

Linux学习:初识Linux

目录 1. 引子&#xff1a;1.1 简述&#xff1a;操作系统1.2 学习工具 2. Linux操作系统中的一些基础概念与指令2.1 简单指令2.2 ls指令与文件2.3 cd指令与目录2.4 文件目录的新建与删除指令2.5 补充指令1&#xff1a;2.6 文件编辑与拷贝剪切2.7 文件的查看2.8 时间相关指令2.9 …

服务器硬件基础知识

1. 服务器分类 服务器分类 服务器的分类没有一个统一的标准。 从多个多个维度来看服务器的分类可以加深我们对各种服务器的认识。 N.B. CISC: complex instruction set computing 复杂指令集计算 RISC: reduced instruction set computer 精简指令集计算 EPIC: explicitly p…

ViTMatte:Boosting image matting with pretrained plain vision transformers

自sora之后&#xff0c;我也要多思考&#xff0c;transformer的scaling law在各个子领域中是不是真的会产生智能&#xff0c;conv的叠加从resnet之后就讨论过&#xff0c;宽或者深都没有办法做到极限&#xff0c;大概sam这种思路是最好的实证。 1.introduction 引入了ViT adap…

浅谈一个CTF中xss小案例

一、案例代码 二、解释 X-XSS-Protection: 0&#xff1a;关闭XSS防护 之后get传参&#xff0c;替换过滤为空&#xff0c;通过过滤保护输出到img src里面 三、正常去做无法通过 因为这道题出的不严谨所以反引号也是可以绕过的 正常考察我们的点不在这里&#xff0c;正常考察…

深入理解快速排序算法:从原理到实现

目录 1. 引言 2. 快速排序算法原理 3. 快速排序的时间复杂度分析 4. 快速排序的应用场景 5. 快速排序的优缺点分析 5.1 优点&#xff1a; 5.2 缺点&#xff1a; 6. Java、JavaScript 和 Python 实现快速排序算法 6.1 Java 实现&#xff1a; 6.2 JavaScript 实现&#…

ARM64汇编02 - 寄存器与指令基本格式

最近的文章可能会有较多修改&#xff0c;请关注博客哦 异常级别 ARMv8处理器支持4种异常等级&#xff08;Exception Level&#xff0c;EL&#xff09;。 EL0 为非特权模式&#xff0c;用于运行应用程序&#xff0c;其他资源访问受限&#xff0c;权限不够。 EL1 为特权模式&…

栈的OJ一小道-->Leetcode有效的括号

20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 这道题我们乍一看可能会选择暴力遍历法,但这题我们可以选择栈,这样可以大大降低我们的时间复杂度.这题要求非常简单 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型…

Qt 简约美观的动画 摆钟风格 第十季

&#x1f60a; 今天给大家分享一个摆钟风格的加载动画 &#x1f60a; 效果如下: 最近工作忙起来了 , 后续再分享其他有趣的加载动画吧. 一共三个文件 , 可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <Q…

山西电力市场日前价格预测【2024-02-24】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-24&#xff09;山西电力市场全天平均日前电价为562.29元/MWh。其中&#xff0c;最高日前电价为1026.21元/MWh&#xff0c;预计出现在18:30。最低日前电价为337.39元/MWh&#xff0c;预计…

[LeetBook]【学习日记】寻找和为指定数字的连续数字

题目 文件组合 待传输文件被切分成多个部分&#xff0c;按照原排列顺序&#xff0c;每部分文件编号均为一个 正整数&#xff08;至少含有两个文件&#xff09;。传输要求为&#xff1a;连续文件编号总和为接收方指定数字 target 的所有文件。请返回所有符合该要求的文件传输组…

【音视频开发】使用ffmpeg实现多个视频合成一个视频(按宫格视图)

先上结果 环境 硬件&#xff1a;通用PC 系统&#xff1a;Windows 测试有效 软件&#xff1a;ffmpeg 解决 0、命令 ffmpeg.exe -i input1.mp4 -i input2.mp4 -i input3.mp4 -i input4.mp4 -filter_complex "[0:v]scaleiw/2:ih/2,pad2*iw:2*ih[a]; [1:v]scaleiw/2:ih/2…