Vue實(shí)現(xiàn)大屏獲取當(dāng)前所處城市及當(dāng)?shù)靥鞖獾木唧w方案
之前做過(guò)的大屏項(xiàng)目一般是在內(nèi)網(wǎng)環(huán)境中使用,所以一般頂部不牽扯展示城市和天氣。但是這次做的是放在外網(wǎng)的,所以簡(jiǎn)單實(shí)現(xiàn)一下展示城市名稱和當(dāng)前實(shí)時(shí)天氣信息。
獲取當(dāng)前所處位置
獲取當(dāng)前定位可以通過(guò)瀏覽器原生的Geolocation API獲取經(jīng)緯度信息。
function getLocation() {
return new Promise((resolve, reject) => {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
(position) => {
const lat = position.coords.latitude;
const lon = position.coords.longitude;
resolve({lat, lon});
console.log('當(dāng)前位置:', lat, lon);
},
(error) => {
console.error('無(wú)法獲取位置:', error.message);
reject(error);
}
);
}
})
}
需要注意,Geolocation API是異步的,所以這里用 Promise 進(jìn)行了簡(jiǎn)單的封裝。另外這里只能獲取到經(jīng)緯度,無(wú)法獲取到所在城市名稱,需要通過(guò)逆地理編碼的方式實(shí)現(xiàn)。
逆地理編碼
目前國(guó)內(nèi)主要是御三家提供逆地理編碼的服務(wù),但是都需要進(jìn)行付費(fèi),不過(guò)唯一可以慶幸的是各家都有免費(fèi)額度。
如果你的大屏部署在外網(wǎng),國(guó)外的Nominatim是完全免費(fèi)的,咱們這邊目前是無(wú)法訪問(wèn)的。官網(wǎng)地址也放一個(gè)nominatim.openstreetmap.org。
這里我以騰訊的逆地理編碼服務(wù)為例子簡(jiǎn)單寫(xiě)一下:
async function getCityName(lat, lon) {
const sig = CryptoJs.MD5(`/ws/geocoder/v1/?key=${你的key}&location=${lat},${lon}${你的簽名}`).toString();
const {result} = await request.get(`/tencent/ws/geocoder/v1/?key=${你的key}&location=${lat},${lon}&sig=${sig}`);
return `${result.address_component.city}-${result.address_component.district}`
}
這里需要代理一下,我這里的代理如下:
'/tencent': {
target: 'https://apis.map.qq.com',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/tencent/, '')
},
獲取天氣
天氣信息目前咱們這邊有和風(fēng)天氣,提供了一定的免費(fèi)額度。
但是我在網(wǎng)上找到一個(gè)外面的,但是咱們這邊能訪問(wèn)到的Open-Meteo,官方地址也放一下open-meteo.com。
特點(diǎn)如下:
- 無(wú)需注冊(cè)、無(wú) API Key、無(wú)調(diào)用限制
- 支持全球經(jīng)緯度實(shí)時(shí)天氣 + 未來(lái)7天預(yù)報(bào)
- 數(shù)據(jù)來(lái)源:歐洲中期天氣預(yù)報(bào)中心(ECMWF)等權(quán)威機(jī)構(gòu)
唯一不好的一點(diǎn)在于返回的都是英文數(shù)據(jù),需要認(rèn)為的轉(zhuǎn)成中文。
// 部分天氣中英文映射
const WEATHER_CODE_MAP = {
0: { en: 'Clear sky', zh: '晴' },
1: { en: 'Mainly clear', zh: '晴轉(zhuǎn)多云' },
2: { en: 'Partly cloudy', zh: '多云' },
3: { en: 'Overcast', zh: '陰' },
45: { en: 'Fog', zh: '霧' },
48: { en: 'Depositing rime fog', zh: '凍霧' },
51: { en: 'Drizzle: Light', zh: '小雨' },
53: { en: 'Drizzle: Moderate', zh: '中雨' },
55: { en: 'Drizzle: Dense', zh: '大雨' },
61: { en: 'Rain: Slight', zh: '小雨' },
63: { en: 'Rain: Moderate', zh: '中雨' },
65: { en: 'Rain: Heavy', zh: '大雨' },
71: { en: 'Snow fall: Slight', zh: '小雪' },
73: { en: 'Snow fall: Moderate', zh: '中雪' },
75: { en: 'Snow fall: Heavy', zh: '大雪' },
95: { en: 'Thunderstorm', zh: '雷陣雨' },
96: { en: 'Thunderstorm with slight hail', zh: '雷陣雨伴小冰雹' },
99: { en: 'Thunderstorm with heavy hail', zh: '雷陣雨伴大冰雹' }
};
// 獲取天氣
async function getWeather(lat, lon) {
const result = await request.get(`https://api.open-meteo.com/v1/forecast?latitude=${lat}&longitude=${lon}¤t_weather=true`);
const code = result.current_weather.weathercode;
return WEATHER_CODE_MAP[code] || {en: 'Unknown', zh: '未知'};
}
這個(gè)是不需要代理的,因?yàn)?strong>Open-Meteo本身支持CORS。
總結(jié)
獲取經(jīng)緯度和城市信息,以及天氣信息在技術(shù)上沒(méi)什么難度。
主要的問(wèn)題點(diǎn)在于很多東西都是付費(fèi)的,自己玩玩還好,但要是真的上線正式環(huán)境一定要防備被別人惡意刷爆。
以上就是Vue實(shí)現(xiàn)大屏獲取當(dāng)前所處城市及當(dāng)?shù)靥鞖獾木唧w方案的詳細(xì)內(nèi)容,更多關(guān)于Vue大屏獲取當(dāng)前所處城市及天氣的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
前端Vue3+vant實(shí)現(xiàn)OSS上傳圖片全過(guò)程
這篇文章主要介紹了前端Vue3+vant實(shí)現(xiàn)OSS上傳圖片的相關(guān)資料,文中通過(guò)示例代碼詳細(xì)說(shuō)明了上傳文件的總流程,包括可能出現(xiàn)的跨域問(wèn)題以及如何配置服務(wù)器以解決跨域問(wèn)題,需要的朋友可以參考下2025-05-05
vue實(shí)現(xiàn)前端拖拽div位置交換的方法詳解
這篇文章主要介紹了如何使用Vue技術(shù)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的備忘錄應(yīng)用,包括添加條目和拖拽條目?jī)蓚€(gè)功能,文章還詳細(xì)解釋了如何使用Vue的draggable屬性和JavaScript獲取同級(jí)元素節(jié)點(diǎn)的方法,需要的朋友可以參考下2025-01-01
vue生成token保存在客戶端localStorage中的方法
本篇文章主要介紹了vue生成token保存在客戶端localStorage中的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
VUE中v-on:click事件中獲取當(dāng)前dom元素的代碼
這篇文章主要介紹了VUE中v-on:click事件中獲取當(dāng)前dom元素的代碼,文中同時(shí)給大家提到了v-on:click獲取當(dāng)前事件對(duì)象元素的方法,需要的朋友可以參考下2018-08-08
vue?+?electron應(yīng)用文件讀寫(xiě)操作
這篇文章主要介紹了vue?+?electron應(yīng)用文件讀寫(xiě)操作,如果要制作的應(yīng)用并不復(fù)雜,完全可以將數(shù)據(jù)存儲(chǔ)在本地文件當(dāng)中,然后應(yīng)用就可以通過(guò)這些文件進(jìn)行數(shù)據(jù)的讀寫(xiě),需要的朋友參考下吧2022-06-06

