學習筆記-1 使用Google Maps API在網頁上顯示地圖與搜尋店家名稱

閱讀時間約 11 分鐘

本篇是一個初學轉職工程師撰寫的,內容都是以原生JS無使用框架的方式達到想要達成的目標,如有刺眼之處還請多見諒

由於參與的專案需要使用到地點以及撈取店家資訊,所以使用了Google Maps api地圖資料來處理。

首先,先至Google Cloud Platform(GCP)申請 api key

google提供各式各樣的 api給客戶使用,只要有了這組金鑰就可以使用他們家的api服務,但要注意的是google api不是免費提供的,每個月有200美金的免費額度,後續用完的計價方式可以去GCP上看相關的說明。

有了這組金鑰之後就可以去js上引用了

    <script>    (g => {      var h, a, k, p = "The Google Maps JavaScript API",
        c = "google",        l = "importLibrary",        q = "__ib__",       
m = document,        b = window;      b = b[c] || (b[c] = {});     
var d = b.maps || (b.maps = {}),        r = new Set,       
e = new URLSearchParams,       
u = () => h || (h = new Promise(async (f, n) => {         
await (a = m.createElement("script"));         
e.set("libraries", [...r] + "");         
for (k in g) e.set(k.replace(/[A-Z]/g, t => "_" + t[0].toLowerCase()), g[k]); 
        e.set("callback", c + ".maps." + q);         
a.src = `https://maps.${c}apis.com/maps/api/js?` + e;          d[q] = f; 
        a.onerror = () => h = n(Error(p + " could not load."));         
a.nonce = m.querySelector("script[nonce]")?.nonce || "";       
  m.head.append(a)        }));     
d[l] ? console.warn(p + " only loads once. Ignoring:", g) : d[l] = (f, ...n)
=> r.add(f) && u().then(() => d[l](f, ...n))    })    ({     
key: "YOUR_KEY",      v: "weekly"    }); 
</script>

在YOUR_KEY上填入你申請的金鑰 就可以引入GOOGLEMAP API的內容了。

接下來來做初始化地圖

<div class="container">      
<div id="map"></div>     
</div>
let map;      
let center;
async function initMap() {       
const { Map } = await google.maps.importLibrary("maps");
  center = {         
lat: 25.0374865,         
lng: 121.5647688,       
};       
map = new Map(document.getElementById("map"), {         
center: center,         
zoom: 14,         
mapId: "4504f8b37365c3d0",       
});     
}

initMap();

這個部分就可以把一張沒有任何標記點的地圖呈現在網頁上

center可以改成你想要搜索以及初始化頁面的位置

zoom的數字可以填入1-20 數字愈大,地圖愈細:1是世界地圖,20就會到街道

raw-image

接下來就可以使用input來搜尋想搜尋的店家名稱

<form action="" method="get">          
<input type="text" name="search" />         
<button>送出</button>       
</form>
let input = document.querySelector("input[name=search]");
let search = document.querySelector("form");

因為搜尋會是使用剛剛初始化過的地圖作呈現,所以這邊的話會在剛剛初始化地圖的function內加入

search.addEventListener("submit", (e) => {          
e.preventDefault();         
findPlaces();       
});

之後開始處理findPlaces()搜尋的部分

let markers = [];
async function findPlaces() {       
const { Place } = await google.maps.importLibrary("places");       
const { AdvancedMarkerElement } = await google.maps.importLibrary(         
"marker"        );
markers.forEach((marker) => marker.setMap(null));       
markers = [];       
const request = {         
textQuery: `${input.value}`,         
fields: [           
"displayName",           
"location",           
"formattedAddress",           
"businessStatus",         
],         
locationBias: {            //可以自行設定想要搜尋的中心點,沒有特定點的話這句刪掉就會是該台裝置目前的定位位置           
center: {             
lat: center.lat,             
lng: center.lng,           
},           
radius: 500,         // 預計搜尋的範圍 最大50000(公尺)         
},         
isOpenNow: true,         
language: "zh-tw",         
maxResultCount: 10,    
//預計搜尋的店家數量  至多20         
minRating: 0,          
//預計搜尋的評價星數         
region: "tw",         
useStrictTypeFiltering: true,       
};       
const { places } = await Place.searchByText(request);
if (places.length) {         
console.log(places);
const { LatLngBounds } = await google.maps.importLibrary("core");         
const bounds = new LatLngBounds();
places.forEach((place) => {           
const markerView = new AdvancedMarkerElement({             
map,             
position:
place.location,             
title: place.displayName,           
});           
markers.push(markerView);           
bounds.extend(place.location);         
});map.setCenter(bounds.getCenter());       
} else {         
alert("No results");         
console.log("No results");       
}       
input.value = "";      }


raw-image


以上code所呈現的會如上圖所示,接著在搜尋地點內打想要查閱的地點關鍵字,地圖就會以你所設定的中心點向外搜尋

raw-image

如果想要更精確的搜尋,可以在request內輸入"includedTypes",以便增加搜尋條件,想知道實際有甚麼type可以使用可以上google map api的說明文件上搜尋

0會員
1內容數
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
創作者要怎麼好好休息 + 避免工作過量?《黑貓創作報#4》午安,最近累不累? 這篇不是虛假的關心。而是《黑貓創作報》發行以來可能最重要的一篇。 是的,我們這篇講怎麼補充能量,也就是怎麼休息。
Thumbnail
avatar
黑貓老師
2024-06-29
【跨領域轉職數據】轉職商業分析師第一個月學習筆記 1/2 從8月底決定開始上課,到11月才正式進入軌道,中間9-10月因特殊原因無法自學,整個流程延到11月正式開始進入數據領域,透過小白的眼睛第一次感受到數據學習的奇妙。   我的背景介紹 : 英語教學產業8年,服飾設計電商8年(設計為主要工作,是自學,商業部分也是自學)。從文員轉到商業,再開始現在
Thumbnail
avatar
sarah
2023-11-13
JS 學習筆記 #1 - 提升 Hoisting提升(Hoisting) 指的是在創造環境階段時就把變數準備好,這時值還沒被賦予到變數上。此類型的概念可以使用執行環境的「創造階段」與「執行階段」來理解。
Thumbnail
avatar
傑米
2023-08-16
Python學習筆記-1A2B遊戲今天想跟大家分享一個用python做的小遊戲,叫做1A2B,這個遊戲的規則很簡單,就是電腦會隨機產生一個四位數的數字,然後玩家要猜這個數字是什麼,每次猜完,電腦會給出幾A幾B的提示,A表示位置和數字都對,B表示數字對但位置不對;例如,如果電腦產生的數字是1234,玩家猜5678,那麼電腦會回
Thumbnail
avatar
好奇的小仙人掌
2023-07-05
使用 ChatGPT API 建立對話系統 學習筆記 - 1這堂課闡述開發ChatGPT所需的重要概念和工具。涵蓋語言模型如何處理文字(Token),LLM的兩種類型(Base LLM和Instruction tuned LLM),系統、助手和用戶的角色定義。並介紹以Prompting簡化AI開發流程,且透過實戰教學說明如何進行分類和預防注入提示
Thumbnail
avatar
Ted Chen
2023-06-30
Python學習筆記2.1-for迴圈迴圈對象可以是列表或範圍,透過定義重複動作的內容,我們可以在迴圈中執行指定次數的操作。利用range函數,我們可以自訂重複執行的次數。同時,我們也介紹了break和continue的使用,以及巢狀迴圈的特性。
Thumbnail
avatar
好奇的小仙人掌
2023-06-20
Python學習筆記1-基本語法和資料型態本篇將帶你學習 Python 的基本語法和資料型態。我們將從變數和資料型態開始,包括整數、浮點數、字串和布林值。接著,我們將探討輸入和輸出的方法,讓你能夠與使用者進行互動。最後,我們會介紹基本運算符和運算子,以進行數值計算。通過這些學習筆記,你將輕鬆掌握 Python 的基礎知識,讓我們開始吧!
Thumbnail
avatar
好奇的小仙人掌
2023-06-20
開發者的 ChatGPT 提示工程 學習筆記- 1這篇其實就是 Andrew Ng 大大與 OpenAI 合作的一門免費課程【Chatgpt Prompt Engineering For Developers】的筆記。很建議大家直接看原本的課程影片,內容蠻淺顯易懂的。 另外因為篇幅有限,所以我們會將他的第一堂課的內容(Guidelines),拆分成
Thumbnail
avatar
Ted Chen
2023-05-06
【如何獲得快樂】《2021第6屆卓越青年生命探索營》 學習筆記#1一般人追求這三樣東西:健康、財富與人際關係。 一旦任何一個受到影響,就會不快樂。 那要如何更快樂呢? 要學習「認識自己」、「了解別人」
Thumbnail
avatar
賴堯賢
2021-09-05
📈 策略交易學習筆記 #1 本篇紀錄向梁老師學習的過程,也希望能同時跟一些投資新手分享投資觀念和工具。​
Thumbnail
avatar
Ehlsnote
2021-01-15
【日商小職員學習筆記1】監査業務知多少?由日本100%投資台灣子公司的小職員我,也待了第一個十年了。待越久好像可以漸漸明白一些日本特有職場文化,從矇矇懂到豁然開朗。從一般人的印象中,日商似乎比美商等強調自由風氣的外商,還要多一些紀律、謹慎的感覺,日商的職場生態也是充滿神秘。
Thumbnail
avatar
Hi海苔醬
2020-12-14