uniapp app端使用谷歌地圖選點(diǎn)定位

國內(nèi)需要vpn 和申請谷歌地圖的Maps JavaScript API 類型的 key,指引鏈接這里不詳細(xì)介紹

一 、我們得通過webview 跳轉(zhuǎn)谷歌地圖 ,需要創(chuàng)建一個webview頁面,里面跳轉(zhuǎn)承載谷歌地圖的html頁面,如果是放在本地的話 html文件須遵守規(guī)范 放在 "項(xiàng)目根目錄下->hybrid->html->google-map.html" 或static目錄下


image.png
//跳轉(zhuǎn)谷歌地圖前頁面,比如選擇地址 
<template>
    <view @click="onSkip('/pages/mapWeb')">
        即將前往選擇地址
    </view>
</template>
<script>
    export default {
        data() {
            return {}
        },
        onLoad(e) {
            //接收webview傳值,能拿到經(jīng)緯度 詳細(xì)地址等信息
            uni.$on('googleMsg', (data) => {
                console.log('接收到值,繼續(xù)業(yè)務(wù)處理', data)
            });
        },
        methods: {
            //跳轉(zhuǎn)webview
            onSkip(url) {
                uni.navigateTo({
                    url: url
                })
            },
        }
    }
</script>
//webview 頁面  ,如果谷歌地圖不是放本地 src 放線上路徑即可
<template>
    <view>
        <web-view style="width: 100vw;height: 100vh;" src="../hybrid/html/google-map.html"
            @message="postMessageFun"></web-view>
    </view>
</template>

<script>
    export default {
        data() {
            return {    }
        },
        methods: {
//監(jiān)聽html返回的數(shù)據(jù)
            postMessageFun(e) {
                console.log(e.detail.data[0], "77777")
            uni.$emit("googleMsg", e.detail.data[0])
            }
        }
    }
</script>
//google-map.html 頁面
<!DOCTYPE html>
<html style="width: 100vw;height: 100vh;">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script src="https://maps.googleapis.com/maps/api/js?key=你的谷歌地圖key&sensor=false">
        </script>
     //引入uniapp webview才能接收到數(shù)據(jù) 監(jiān)聽到事件
        <script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js">
        </script>
        <script>
            function onBack(data) {
                var timer = setInterval(function() {
                    if (window.uni) {
                        clearInterval(timer);
                        uni.postMessage({
                                data: data
                            }),
                            console.log("谷歌地圖返回:",data)
                            uni.navigateBack()
                    }
                }, 10)

            }
            // 谷歌地址解析
            function reverseGeocode(lat, lng) {
                var geocoder = new google.maps.Geocoder();
                var latlng = new google.maps.LatLng(lat, lng);
                // 調(diào)用地理編碼服務(wù)的geocode方法
                geocoder.geocode({
                    'location': latlng
                }, (results, status) => {
                    if (status === 'OK') {
                        if (results[0]) {
                            const obj = {
                                address: results[0].formatted_address,
                                lat: lat,
                                lng: lng
                            }
                            console.log(results)
                            // console.log('地址:', obj);
                            onBack(obj)
                        } else {
                            console.log('未找到地址');
                        }
                    } else {
                        console.log('逆地理編碼失敗:' + status);
                    }
                });
            }

            function get() {
                function success(position) {
                    console.log(position)
                    var latitude = position.coords.latitude;
                    var longitude = position.coords.longitude;
                    var yourmap = {
                        center: new google.maps.LatLng(latitude, longitude),
                        zoom: 11,
                        mapTypeId: google.maps.MapTypeId.ROADMAP
                    };
                    var map = new google.maps.Map(document.getElementById("googleMap"), yourmap);
                    var marker = new google.maps.Marker({
                        position: new google.maps.LatLng(latitude, longitude),
                    });

                    marker.setMap(map);
                    var infowindow = new google.maps.InfoWindow({
                        content: "當(dāng)前位置!"
                    });
                    infowindow.open(map, marker);
                    google.maps.event.addListener(map, 'click', function(e) {
                        reverseGeocode(e.latLng.lat(), e.latLng.lng())
                    })
                };

                function addMarker(longitude, latitude) {
                    const marker = {
                        id: this.markers.length + 1,
                        longitude,
                        latitude,
                        iconPath: '/static/marker.png',
                        width: 20,
                        height: 20
                    };
                    this.markers.push(marker);
                    this.mapContext.addMarkers({
                        markers: this.markers,
                        clear: true
                    });
                }

                function error(e) {
                    alert('地理位置不可用fa',e);
                };


                if ("geolocation" in navigator) {
                    navigator.geolocation.getCurrentPosition(success, error);
                } else {
                    alert('地理位置不可用ter');
                }
            };
            google.maps.event.addDomListener(window, 'load', initialize);
        </script>
    </head>
    <body>
        <div id="googleMap" style="width:100vw;height:100vh;"></div>
    </body>
</html>
//本段代碼來源于網(wǎng)絡(luò) 僅作自己記錄方便后期查詢,和給正在踩坑的友友們一個借鑒 侵刪

以上就是所有獲取谷歌選點(diǎn)定位的流程
以下是當(dāng)用戶輸入地址 ,實(shí)現(xiàn)地址解析的方法

    // 解析地址
//用戶輸入時可以動態(tài)調(diào)用這個函數(shù) 也可以當(dāng)用戶輸入完成,根據(jù)自己的業(yè)務(wù)邏輯調(diào)整
            getGoogleLocation(address) {
                if (!address) return
                        const apiKey = '你的谷歌地圖key';
                const url =`https://maps.googleapis.com/maps/api/geocode/json?address=${encodeURIComponent(address)}&key=${apiKey}`;
                uni.request({
                    url: url,
                    method: 'GET',
                    success: (res) => {
                        console.log("res:", res)
                        // 解析API響應(yīng)
                        const results = res.data.results;
                        if (results.length > 0) {
                            // 獲取解析后的位置信息
                            const location = results[0].geometry.location;
                            const latitude = location.lat;
                            const longitude = location.lng;
                            this.userInfo.newAddress = address
                            this.userInfo.longitude = longitude
                            this.userInfo.latitude = latitude
                            this.userInfo.address = address
                            // 在這里可以使用解析后的位置信息進(jìn)行后續(xù)操作
                            console.log("Latitude:", latitude);
                            console.log("Longitude:", longitude);
                        } else {
                            uni.showToast({
                                title: '未查詢到該地址宵膨,請重試',
                                icon: 'none'
                            })
                            console.log("No results found.");
                        }
                    },
                    fail: (err) => {
                        console.log("Error:", err);
                    }
                });
            },

奇葩需求: app內(nèi)嵌套h5的另一套代碼系統(tǒng)里面也需要使用谷歌地圖,這怎么辦呢 h5接收不到webview返回的值;原理都大差不差就得用原生js的方法來實(shí)現(xiàn),下面紙列出了有變動的代碼 其他的都和上面一樣

//跳轉(zhuǎn)谷歌地圖前頁面 
mounted(){
        const key = 'LocationAddress';
                const data = localStorage.getItem(key);
                localStorage.removeItem(key);
                if (typeof data !== "string") return;
                const x = JSON.parse(data);
                console.log('===x拿到返回的數(shù)據(jù) 處理業(yè)務(wù)邏輯啦', x);
}
/webview 頁面 
<template>
    <view>
        <iframe id="iframe" src="../../../static/html/google-map.html"></iframe>
    </view>
</template>

<script>
    var iframe = document.getElementById('iframe');
    window.addEventListener('message', (e) => {
        console.log(e, 'eeeeee')
    }, false);
</script>
//google-map.html 頁面 的返回函數(shù)改成這樣
      function onBack(data) {
            localStorage.setItem('LocationAddress', JSON.stringify(data));
            history.back();
        }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末摇邦,一起剝皮案震驚了整個濱河市怀估,隨后出現(xiàn)的幾起案子常侦,更是在濱河造成了極大的恐慌星爪,老刑警劉巖疆栏,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曾掂,死亡現(xiàn)場離奇詭異,居然都是意外死亡壁顶,警方通過查閱死者的電腦和手機(jī)珠洗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來若专,“玉大人许蓖,你說我怎么就攤上這事。” “怎么了蛔糯?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵拯腮,是天一觀的道長。 經(jīng)常有香客問我蚁飒,道長动壤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任淮逻,我火速辦了婚禮琼懊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爬早。我一直安慰自己哼丈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布筛严。 她就那樣靜靜地躺著醉旦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪桨啃。 梳的紋絲不亂的頭發(fā)上车胡,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機(jī)與錄音照瘾,去河邊找鬼匈棘。 笑死,一個胖子當(dāng)著我的面吹牛析命,可吹牛的內(nèi)容都是我干的主卫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼鹃愤,長吁一口氣:“原來是場噩夢啊……” “哼簇搅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起昼浦,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤馍资,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后关噪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸟蟹,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年使兔,在試婚紗的時候發(fā)現(xiàn)自己被綠了建钥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡虐沥,死狀恐怖熊经,靈堂內(nèi)的尸體忽然破棺而出泽艘,到底是詐尸還是另有隱情,我是刑警寧澤镐依,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布匹涮,位于F島的核電站,受9級特大地震影響槐壳,放射性物質(zhì)發(fā)生泄漏然低。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一务唐、第九天 我趴在偏房一處隱蔽的房頂上張望雳攘。 院中可真熱鬧,春花似錦枫笛、人聲如沸吨灭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喧兄。三九已至,卻和暖如春海诲,著一層夾襖步出監(jiān)牢的瞬間繁莹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工特幔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闸昨。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓蚯斯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饵较。 傳聞我的和親對象是個殘疾皇子拍嵌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容