uniapp 開發微信小程序,獲取經緯度并且轉化詳細地址(單獨封裝版本)

目錄

      • 1、單獨抽離封裝
      • 2、使用示例
      • 3、前置條件和配置
      • 4、效果彈框

1、單獨抽離封裝

// 騰訊地圖SDK引入(需提前下載qqmap-wx-jssdk.min.js文件)
// 注意:使用前需在微信公眾平臺配置request合法域名https://apis.map.qq.com
var QQMapWX = require('@/libs/qqmap-wx-jssdk.min.js')// 高德地圖SDK引入(需提前下載amap-wx.130.js文件)
// 注意:使用前需配置高德域名白名單https://restapi.amap.com
import amap from '@/libs/amap-wx.130.js';/*** 地圖服務配置常量* 建議通過構建工具注入環境變量,避免硬編碼* AMAP_KEY:高德開發者密鑰(需到lbs.amap.com申請)* QQMAP_KEY:騰訊地圖開發者密鑰(需到lbs.qq.com申請)*/
const MAP_CONFIG = {AMAP_KEY: '', // 您的高德地圖Key QQMAP_KEY: '' // 您的騰訊地圖Key
}/*** 定位服務核心類* 功能:封裝高德/騰訊地圖的定位和逆地理編碼能力* 特點:* 1. 雙地圖服務支持(自動根據配置初始化)* 2. 完整的權限控制流程* 3. 統一的數據格式返回*/
export default class LocationService {constructor() {this.amapPlugin = null // 高德地圖實例this.qqmapsdk = null // 騰訊地圖實例this._initSDK() // 自動初始化SDK}/*** 初始化地圖SDK(私有方法)* 注意:會根據MAP_CONFIG配置自動初始化可用SDK* 高德地圖需額外配置Geocoder插件用于逆地理編碼*/_initSDK() {// 高德地圖初始化(需同時滿足SDK存在且配置了有效KEY)if (typeof amap !== 'undefined' && MAP_CONFIG.AMAP_KEY) {this.amapPlugin = new amap.AMapWX({key: MAP_CONFIG.AMAP_KEY,// plugin: ['AMap.Geocoder'] // 必須添加地理編碼插件})}// 騰訊地圖初始化(需同時滿足SDK存在且配置了有效KEY)if (typeof QQMapWX !== 'undefined' && MAP_CONFIG.QQMAP_KEY) {this.qqmapsdk = new QQMapWX({key: MAP_CONFIG.QQMAP_KEY})}}/*** 統一權限檢查流程(私有方法)* 三階段處理:* 1. 檢查已有權限* 2. 無權限時請求授權(每次拒絕后下次仍會觸發系統彈窗)* 3. 授權被拒時引導用戶去設置頁*/async _checkPermission() {return new Promise((resolve, reject) => {uni.getSetting({success: (res) => {// 已有權限直接通過if (res.authSetting['scope.userLocation'] === true) {resolve(true)} else {// 1. 先請求授權// uni.authorize:用于?首次請求權限?,彈窗詢問用戶是否允許獲取位置uni.authorize({scope: 'scope.userLocation',success: () => resolve(true),fail: (err) => {// 引導去設置頁(不阻止后續再次觸發系統彈窗)this._showPermissionModal().finally(() => {reject(new Error('PERMISSION_DENIED'))})}})}},fail: reject})})}/*** 顯示權限引導彈窗(私有方法)* 增強功能:用戶從設置頁返回后自動嘗試獲取定位*/_showPermissionModal() {return new Promise((resolve) => {uni.showModal({title: '權限提示',content: '需要位置權限才能獲取定位信息',confirmText: '去設置',success: (res) => {if (res.confirm) {uni.openSetting({success: (settingRes) => {// 設置頁返回后檢查權限狀態if (settingRes.authSetting['scope.userLocation']) {resolve(true) // 權限已開啟} else {resolve(false) // 用戶未開啟權限}},fail: () => resolve(false)})} else {resolve(false)}}})})}/*** 獲取基礎坐標(核心方法)* 增強功能:支持從設置頁返回后自動獲取坐標* @param {Object} options 配置項*        - altitude: 是否獲取海拔高度(默認false)*        - highAccuracy: 是否啟用高精度模式(耗電增加)* @returns {Promise} 包含經緯度等信息的Promise*/async getCoordinates(options = {}) {try {// 檢查權限(包含引導設置流程)const hasPermission = await this._checkPermission()if (!hasPermission) throw new Error('PERMISSION_DENIED')return new Promise((resolve, reject) => {// 2. 授權成功后獲取高精度坐標// uni.getLocation:?實際獲取坐標?,需在權限通過后調用uni.getLocation({// wgs84:國際標準GPS坐標系(原始經緯度數據)// gcj02:中國國測局坐標系(高德/騰訊地圖專用)type: 'gcj02',altitude: !!options.altitude,isHighAccuracy: !!options.highAccuracy, //高精度模式(isHighAccuracy:true)會增加功耗,建議按需使用success: (res) => {resolve({longitude: res.longitude,latitude: res.latitude,altitude: res.altitude || null,accuracy: res.accuracy,verticalAccuracy: res.verticalAccuracy || null})},fail: (err) => {console.log('err-----授權', err)// 特殊處理用戶從設置頁返回的情況if (err.errMsg.includes('auth deny')) {this.getCoordinates(options).then(resolve).catch(reject)} else {reject((err))}}})})} catch (err) {throw (err)}}/*** 獲取高德地圖地址信息(核心方法)* 流程:獲取坐標 -> 調用高德逆地理編碼接口* 注意:需提前配置高德域名白名單*/async getAMapAddress(options = {}) {if (!this.amapPlugin) {throw new Error('AMAP_SDK_NOT_INIT')}try {// 先獲取基礎坐標const coords = await this.getCoordinates(options)return new Promise((resolve, reject) => {// 調用高德逆地理編碼接口this.amapPlugin.getRegeo({location: `${coords.longitude},${coords.latitude}`,success: (data) => {resolve(this._formatAMapData(data, coords))},fail: (err) => reject(err)})})} catch (err) {throw (err)}}/*** 獲取騰訊地圖地址信息(核心方法)* 流程:獲取坐標 -> 調用騰訊逆地理編碼接口* 注意:需提前配置騰訊地圖域名白名單*/async getQQMapAddress(options = {}) {if (!this.qqmapsdk) {throw new Error('QQMAP_SDK_NOT_INIT')}try {// 先獲取基礎坐標const coords = await this.getCoordinates(options)return new Promise((resolve, reject) => {// 調用騰訊逆地理編碼接口this.qqmapsdk.reverseGeocoder({location: {latitude: coords.latitude,longitude: coords.longitude},get_poi: options.includePOI || false, // 是否返回周邊POI信息success: (res) => {resolve(this._formatQQMapData(res, coords))},fail: (err) => reject(err)})})} catch (err) {throw (err)}}// 新增:通過坐標獲取高德地址信息async getAMapByCoordinates(lng, lat, options = {}) {if (!this.amapPlugin) throw new Error('AMAP_SDK_NOT_INIT')return new Promise((resolve, reject) => {this.amapPlugin.getRegeo({location: `${lng},${lat}`,success: (data) => resolve(this._formatAMapData(data, {longitude: lng,latitude: lat})),fail: reject})})}// 新增:通過坐標獲取騰訊地址信息async getQQMapByCoordinates(lng, lat, options = {}) {if (!this.qqmapsdk) throw new Error('QQMAP_SDK_NOT_INIT')return new Promise((resolve, reject) => {this.qqmapsdk.reverseGeocoder({location: {latitude: lat,longitude: lng},get_poi: options.includePOI || false,success: (res) => resolve(this._formatQQMapData(res, {longitude: lng,latitude: lat})),fail: reject})})}/*** 格式化高德地圖返回數據(私有方法)* 統一數據格式,方便業務層使用*/_formatAMapData(data, coords) {console.log('高德地圖返回數據', data)const firstResult = data[0] || {}return firstResult//也可以根據具體數據自定義返回// return {// 	coordinates: coords, // 原始坐標信息// 	formattedAddress: firstResult.address || '', // 完整地址// 	country: firstResult.country || '',// 	province: firstResult.province || '',// 	city: firstResult.city || '',// 	district: firstResult.district || '',// 	street: firstResult.street || '',// 	streetNumber: firstResult.streetNumber || '',// 	cityCode: firstResult.citycode || '', // 城市編碼// 	adCode: firstResult.adcode || '', // 區域編碼// 	poiList: firstResult.poiList || [] // 周邊POI列表// }}/*** 格式化騰訊地圖返回數據(私有方法)* 統一數據格式,方便業務層使用*/_formatQQMapData(data, coords) {console.log('騰訊地圖返回數據-', data)const address = data.result || {}return address//也可以根據具體數據自定義返回// return {// 	coordinates: coords, // 原始坐標信息// 	formattedAddress: address.address || '', // 完整地址// 	country: address.address_component?.nation || '',// 	province: address.address_component?.province || '',// 	city: address.address_component?.city || '',// 	district: address.address_component?.district || '',// 	street: address.address_component?.street || '',// 	streetNumber: address.add// }}
}

2、使用示例

import LocationService from '@/utils/location.js'
async getAMapAddress() {try {// 僅僅獲取經緯度const result = await new LocationService().getCoordinates()// 根據高德逆地理編碼接口,獲取當前經緯度對應的具體地址const result = await new LocationService().getAMapAddress()// 根據騰訊逆地理編碼接口,獲取當前經緯度對應的具體地址const result = await new LocationService().getQQMapAddress()// 根據高德逆地理編碼接口,獲取傳入的經緯度對應的具體地址const result = await new LocationService().getAMapByCoordinates('', '')// 根據騰訊逆地理編碼接口,獲取傳入的經緯度對應的具體地址const result = await new LocationService().getQQMapByCoordinates('', '')console.log(result, '經緯度||地址')} catch (err) {console.log(err)}
}

3、前置條件和配置

具體可以查看另一篇文章:
https://blog.csdn.net/weixin_41549971/article/details/149837996?spm=1011.2415.3001.5331

4、效果彈框

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93515.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93515.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93515.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解 Python 元類中的 __prepare__ 方法:掌控類屬性定義順序的藝術

關鍵詞:元類、type、prepare、OrderedDict、屬性順序、數據建模在 Python 的高級編程中,元類(metaclass) 是一種強大而神秘的機制。它允許我們在類創建之前進行干預,從而實現諸如自動屬性驗證、字段序列化、ORM 映射等…

MATLAB基礎訓練實驗

MATLAB基礎訓練實驗 1. 標題 MATLAB 基礎訓練 2. 內容概括 本實驗旨在通過MATLAB基礎操作訓練,掌握數組創建與運算、矩陣操作、M文件編寫、流程控制、二維/三維繪圖等核心技能。實驗內容包括復數運算、矩陣變換、函數繪圖、結構體創建、電路方程求解、電流波形繪制、三維曲…

implement libwhich for Windows

因為windows沒有類似unix的which命令 現在實現盡量跨平臺,且stb 風格的libwhich // which.h #ifndef LIBWHICH_H #define LIBWHICH_H#ifdef __cplusplus extern "C" { #endif/** 查找可執行文件在系統中的路徑* 參數:* filename - 要查找的可執行文件名…

記與客戶端的一次“無謂之爭”

一、沖突今天,流程收尾時,客戶端為了統計時延,連發兩個接口:一個報開始時間,一個報結束時間。我因性能考慮,說:“明明一個接口能搞定!”客戶端負責人說:“發送兩次更合理…

Java Condition 對象 wait 方法使用與修復方案

在 Java 中,java.util.concurrent.locks.Condition 接口提供了類似監視器的方法(await(), signal(), signalAll())來實現線程間的協調。正確使用 Condition 對象需要遵循特定模式以避免常見問題。常見問題及修復方案1. 虛假喚醒問題問題&…

??金倉數據庫KingbaseES V9R1C10安裝教程 - Windows版詳細指南?

文章目錄一、前言二、軟件下載2.1 下載安裝包2.2 下載授權文件三. 安裝KingbaseES數據庫3.1 解壓安裝包3.2 運行安裝程序3.3 安裝步驟詳解步驟1:歡迎界面步驟2:許可協議步驟3:添加授權文件步驟4:選擇安裝路徑步驟5:選擇…

論文推薦|遷移學習+多模態特征融合

來gongzhonghao【圖靈學術計算機論文輔導】,快速拿捏更多計算機SCI/CCF發文資訊~在Cvpr、NeurIPS、AAAI等頂會中,遷移學習多模態特征融合正以“降成本、提性能、省標注”的絕對優勢成為最熱賽道。面對超大模型全量微調天價算力、異構模態對齊…

接口芯片斷電高阻態特性研究與應用分析

摘要: 本文以國科安芯推出的ASM1042 系列通訊接口芯片為例,深入探討接口芯片斷電高阻態特性,涵蓋其定義、原理、應用及設計注意事項。通過對相關技術資料的梳理與分析,結合具體芯片實例,闡述高阻態在電路穩定性、設備兼…

數據結構初階(17)排序算法——非比較排序(計數排序·動圖演示)、排序算法總結

2.0 十大排序算法2.5 非比較排序 之前學習的排序算法都是比較排序——借助比較大小,來實現排序。非比較就是不借助比較大小,來實現排序。——小眾的、局限的非比較排序大致有這些:計數排序、桶排序、基數排序。桶排序、基數排序在實踐中意義不…

VisualStudio2022調試Unity C#代碼步驟

一.VS安裝Unity開發組件按下圖所示安裝Unity開發組件二.附加Unity調試程序2.1 先將Unity進入Play模式2.2 VS選擇附加Unity調試程序菜單2.3 選擇附加的實例三.加入斷點測試Update方法中成功進入斷點

Zabbix【部署 01】Zabbix企業級分布式監控系統部署配置使用實例(在線安裝及問題處理)程序安裝+數據庫初始+前端配置+服務啟動+Web登錄

Zabbix使用 1.下載 2.安裝 2.1 程序安裝 2.2 數據庫初始化 2.3 前端配置 2.4 服務啟動 3.Web登錄 4.總結 安裝說明: 本次安裝為在線安裝,使用數據庫為PostgreSQL。 1.下載 由于是在線安裝,這次不涉及離線安裝包的下載,僅做參考用,點擊跳轉【下載頁面】,下載說明: 版本…

爬機 驗證服務器是否拒絕請求

當訪問XX網站時返回 418 狀態碼時,說明服務器識別到了爬蟲行為并拒絕了請求。這是網站的反爬機制在起作用,我們可以通過模擬瀏覽器行為來繞過基礎反爬。import requestsurl https://cn.bing.com/# 模擬瀏覽器的完整請求頭,包含更多瀏覽器標識…

GaussDB 數據庫架構師修煉(十三)安全管理(3)-數據庫審計

1 數據庫審計作用數據庫審計機制主要通過對SQL操作或其他操作記錄審計日志的方式 ,增強數據庫系統對非法操作的追溯及舉證能力 。高斯數據庫提供兩種審計特性 :傳統審計 ,統一審計。2 傳統審計傳統審計通過GUC參數配置需要對數據庫的哪些操作…

C語言(11)—— 數組(超絕詳細總結)

Hi!冒險者😎,歡迎闖入 C 語言的奇幻異世界🌌! 我是 ankleless🧑?💻,和你一樣的闖蕩者~ 這是我的冒險筆記打怪升級之路——C語言之路📖,里面有踩過…

【AI生成+補充】高頻 hql的面試問題 以及 具體sql

以下是高頻HQL面試題及對應SQL示例,涵蓋核心語法、優化技巧和典型場景,可直接用于面試準備: 一、基礎操作與DDL 1. 創建分區表 & 動態插入分區 sql -- 創建外部分區表(按日期分區) CREATE EXTERNAL TABLE logs…

開源 Arkts 鴻蒙應用 開發(十七)通訊--http多文件下載

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發,公司安排開發app,臨時學習,完成app的開發。開發流程和要點有些記憶模糊,趕緊記錄,防止忘記。 相關鏈接: 開源 Arkts …

Cloudflare Tunnel 使用SAAS回源加速配置教程

在使用 Cloudflare Tunnel 時,通過“主域名+加速域名”的聯動配置,既能隱藏內網 IP,又能優化訪問速度。本文以實際部署場景為例(主域名 zhuyuming.dpdns.org、加速域名 jiasu.dpdns.org),帶你一步步完成內網服務穿透(以 192.168.1.6:5555 網頁服務為例),實操性強,可直…

C++實戰

Ref deepwiki vuecruddllamma.cpp 目標 計劃實現一個C項目,前端用vue,后端用C和llama.cpp。實現可以進行邏輯功能和AI推理。

dify 調用本地的 stable diffusion api生成圖片的工作流搭建

Dify調用本地Stable Diffusion API的工作流搭建指南 核心架構 #mermaid-svg-ce029i4XFKrDzRgU {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ce029i4XFKrDzRgU .error-icon{fill:#552222;}#mermaid-svg-ce029i4XFK…

【Web后端】Django、flask及其場景——以構建系統原型為例

一、Django 和 Flask 簡介 Django 是一個高級 Python Web 框架,提供了完整的“開箱即用”功能,包括 ORM、認證、管理后臺等,便于快速開發安全且可維護的網站。Flask 是一個輕量級 Python Web 框架,核心功能比較簡單,但…