🐈

Google Mapsの短縮URLから緯度経度を取得する際の備忘録

2023/08/22に公開

概要

以下のようなGoogle Mapsの短縮URLから緯度経度を取得する機会がありました。

https://goo.gl/maps/aPxUgDJ9KP2FLFkN7

https://goo.gl/maps/aPxUgDJ9KP2FLFkN7

この時、2つの緯度経度が取得できたので、その備忘録です。

抽出方法

GPT-4から以下の回答が得られました。

--- 以下、回答 ---

Google Mapsの短縮URL (goo.gl/maps/...) から直接緯度経度を抽出することはできません。しかし、この短縮URLを展開して元のURLを取得することで、そのURLから緯度経度を抽出することができます。

以下の手順で緯度経度を取得することができます:

  1. 短縮URLを展開します。
  2. 展開されたURLから緯度経度を抽出します。

以下はPythonでこれを実現する一例です:

import requests
import re

def get_lat_lon_from_google_url(short_url):
    # 短縮URLを展開
    response = requests.get(short_url, allow_redirects=False)
    if response.status_code != 302:
        return None

    long_url = response.headers['location']

    # 展開されたURLから緯度経度を抽出
    match = re.search(r'@([\-0-9.]+),([\-0-9.]+)', long_url)
    if match:
        lat, lon = match.groups()
        return float(lat), float(lon)
    else:
        return None

url = "https://goo.gl/maps/aPxUgDJ9KP2FLFkN7"
lat_lon = get_lat_lon_from_google_url(url)
print(lat_lon)

このコードは、短縮URLを展開して緯度経度を抽出するための基本的なものです。しかし、実際の使用環境や目的に応じて、エラーハンドリングや例外処理を追加することが推奨されます。

--- 回答、ここまで ---

上記により、以下のURLに含まれる緯度経度(ここでは、28.3410487,129.9769402)を取得できました。

https://www.google.com/maps/place/鹿児島県大島郡喜界町大字伊砂/@28.3410487,129.9769402,3868m/data=!3m2!1e3!4b1!4m5!3m4!1s0x351f80a0620f4335:0x35d406a5040d7197!8m2!3d28.3439714!4d129.9838012?shorturl=1

しかし、この座標を指定すると、以下の場所が指定され、求めている座標からずれているようでした。

修正

以下のURLを確認すると、末尾にも!3d28.3439714!4d129.9838012という座標が見られました。

https://www.google.com/maps/place/鹿児島県大島郡喜界町大字伊砂/@28.3410487,129.9769402,3868m/data=!3m2!1e3!4b1!4m5!3m4!1s0x351f80a0620f4335:0x35d406a5040d7197!8m2!3d28.3439714!4d129.9838012?shorturl=1

そこで、先ほどプログラムについて、prefixとdelimiterを指定できるように修正しました。

import requests
import re

def get_lat_lon_from_google_url(short_url, prefix= "@", delimiter = ","):
    # 短縮URLを展開
    response = requests.get(short_url, allow_redirects=False)
    if response.status_code != 302:
        return None

    long_url = response.headers['location']

    print(long_url)

    # 展開されたURLから緯度経度を抽出
    pattern = r'{prefix}([\-0-9.]+){delimiter}([\-0-9.]+)'.format(prefix=re.escape(prefix), delimiter=re.escape(delimiter))
    match = re.search(pattern, long_url)
    if match:
        lat, lon = match.groups()
        return float(lat), float(lon)
    else:
        return None

url = "https://goo.gl/maps/aPxUgDJ9KP2FLFkN7"

lat_lon = get_lat_lon_from_google_url(url, prefix="!3d", delimiter="!4d")
print(lat_lon)

結果、28.3439714,129.9838012が取得できました。この座標を使用してみたところ、以下のように、より目的に近い座標にピンが立ちました。

まとめ

答えが一つに決まるものではありませんが、Google Mapsの短縮URLから緯度経度を取得するにあたり、参考になりましたら幸いです。

Discussion