Laravel google api 反向地址查找

註冊以及啟用 Geocoding API

先到 GCP 註冊,前三個月免費,然後申請 api

創建金鑰

點選 API 和服務->點選憑證->建立憑證->API 金鑰

這樣子就建立成功囉

點選限制金鑰,可以將它選擇只用來使用 Geocoding API

啟用服務

Geocoding API點擊啟用

撰寫程式碼

env

修改.env檔案,加上以下程式碼
GOOGLE_API=YOUR_API_KEY

利用經緯度取得地址

Geocoding API有以下參數可選

  • language — 返回結果的語言
  • location_type — 一種或多種位置類型的過濾器
  • result_type — 一種或多種地址類型的過濾器

必填參數為

  • latlng — 填入 經度,緯度 中間不能有空格
  • key — 你的 google api key

以下範例result_type選用street_address表示返回準確的街道地址。

接下來我們使用 Guzzle HTTP clientGOOGLE API發出請求,而Illuminate\Http\Client\Response類實現了 PHPArrayAccess接口,所以可以直接訪問 JSON 響應數據。

use Illuminate\Support\Facades\Http;

public function get_address($lat, $lng)
{
try {
$language = 'zh-TW';
$result_type = 'street_address';
$api_key = env("GOOGLE_API");
$url = "https://maps.googleapis.com/maps/api/geocode/json";
$response = Http::get($url, [
'latlng' => "$lat,$lng",
'key' => $api_key,
'language' => $language,
'result_type' => $result_type,
]);
if ($response->ok()) {
$contents = $response->json();
if ($contents['status'] == 'OK') {
$data['name'] = $contents['results'][0]['formatted_address'];
return $data;
} else {
return false;
}
} else {
return false;
}
} catch (\Throwable $th) {
report($th);
return $url;
}
}

Response

以台南火車站經緯度為例返回資料

{
"plus_code": {
"compound_code": "X6W7+R5Q 台灣台南市東區",
"global_code": "7QJ2X6W7+R5Q"
},
"results": [
{
"address_components": [
{
"long_name": "4",
"short_name": "4",
"types": ["street_number"]
},
{
"long_name": "北門路二段",
"short_name": "北門路二段",
"types": ["route"]
},
{
"long_name": "成大里",
"short_name": "成大里",
"types": ["administrative_area_level_4", "political"]
},
{
"long_name": "東區",
"short_name": "東區",
"types": ["administrative_area_level_3", "political"]
},
{
"long_name": "台南市",
"short_name": "台南市",
"types": ["administrative_area_level_1", "political"]
},
{
"long_name": "台灣",
"short_name": "TW",
"types": ["country", "political"]
},
{
"long_name": "701",
"short_name": "701",
"types": ["postal_code"]
}
],
"formatted_address": "701台灣台南市東區北門路二段4號",
"geometry": {
"location": {
"lat": 22.9971305,
"lng": 120.2129885
},
"location_type": "ROOFTOP",
"viewport": {
"northeast": {
"lat": 22.9984794802915,
"lng": 120.2143374802915
},
"southwest": {
"lat": 22.99578151970849,
"lng": 120.2116395197085
}
}
},
"place_id": "ChIJs1S-8Ix2bjQRAJqtZowd7UQ",
"plus_code": {
"compound_code": "X6W7+V5 台灣台南市東區",
"global_code": "7QJ2X6W7+V5"
},
"types": ["street_address"]
}
],
"status": "OK"
}