Snowflake マーケットプレイスからアクセスできる Mapbox の Geocoding API でジオコーディングと逆ジオコーディングを試してみる
はじめに
Snowflake 上でジオコーディング・逆ジオコーディングを試してみたい機会があったので、試した内容を本記事でまとめてみます。
本記事の内容
Snowflake ではデータアプリケーションを構築し、Marketplace での配布・収益化まで実施可能なフレームワークとして、Snowflake ネイティブアプリフレームワークが提供されています。
ここでは、これまでのデータ製品の他、任意の UDF やストアドプロシージャ等も配布できます。
ジオコーディング関連では、Mapbox 社がネイティブアプリとして Snowflake マーケットプレイスで各種機能を提供しています。具体的には、Geocoding API を Snowflake のストアドプロシージャとして実行できる環境を提供しています。
この中には、ジオコーディング・逆ジオコーディングのためのストアドプロシージャがあり、日本にも対応しているため、試してみます。
試してみる
Mapbox Geocoding & Analysis Tools のインストール
マーケットプレイスで「geocoding」などと検索すると、Mapbox 社が提供するアプリケーションがヒットします。

こちらは有償の機能となりますが、7日間のトライアル期間が提供されるので、こちらを試してみます。

トライアル開始とあわせて、アプリケーションを自身の Snowflake アカウントにインストールします。任意のアプリ名(ここではMAPBOX_GEOCODING__ANALYSIS_TOOLS)を指定し、インストールすると下図のようにデータベースメニューから確認できます。また、あわせて各種機能を提供する API へのアクセスに必要な API 統合オブジェクトも作成されます。
CORE スキーマ内に各種のストアドプロシージャが格納されています。

機能
執筆時点で Mapbox Geocoding & Analysis Tools では以下のストアドプロシージャを利用できます。
- ジオコーディング(住所と座標を相互に変換する機能)
geocode_forward_enrich- 住所や場所の名前(テキスト)から、対応する地理座標(緯度・経度)を取得
geocode_reverse_enrich- 緯度・経度(地理座標)から、対応する住所や場所の情報(テキスト)を取得
geocode_structured_enrich- 住所を「通り」「都市」「郵便番号」などの構成要素に分けて入力することで、より精度の高い地理座標を取得
- ナビゲーションおよびアクセシビリティ分析
distance_and_duration_enrich- 2点間の実際の移動距離と所要時間を、指定した移動手段(車、徒歩など)で計算
isochrone_enrich- 特定の地点から、指定された時間または距離で到達可能な地理的エリア(ポリゴン)を計算
- データエンリッチメント・境界データ検索(座標がどの地理的・政治的な境界内に位置するかを特定する機能)
mapbox_boundaries_reverse_enrich- 緯度・経度座標を入力として、その地点がどの行政区画(国、州、郵便番号など)や指定された境界内に位置するかを特定し、その境界情報を取得
各プロシージャの概要や実際の API との対応は以下の記事が参考になります。
費用
こちらは有償のアプリケーションとなり、使用量ベースの料金モデルが設定されています。
具体的には、各ストアドプロシージャでは、テーブル形式のデータを与えますが、この際処理された行数に基づいた従量課金制となっており、基本的な考え方は以下の通りです。
- 基本料金:$5 / 1,000行処理から開始
- 月額上限 (Out of pocket maximum):$50,000/月
- ストレージ費用:無し
- Snowflakeのコンピューティング費用:仮想ウェアハウスの使用料は別途発生
ただし、機能によって詳細な料金が異なります。特に高度な分析機能(IsochroneやDistance and duration)は高めに設定されています。
| 機能カテゴリ | 料金 (1,000行あたり) |
|---|---|
| 境界データ検索 (Basic Layers) | $5.00 |
| 境界データ検索 (Detailed Layers) | $5.50 |
| ジオコーディング (フォワード、リバース、構造化) | $5.50 |
| Isochrone (等時間帯) | $10.00 |
| Distance and duration (距離と所要時間) | $10.00 |
サンプルデータを用意
ここでは、ジオコーディングと逆ジオコーディングを主に試してみます。検証用のデータベースと、サンプルデータとして以下を用意しました。
CREATE DATABASE my_db;
USE SCHEMA my_db.public;
-- テスト用のテーブルを作成
CREATE OR REPLACE TABLE GEOCoding_Test (
id INT,
address_query VARCHAR,
geocode_response VARIANT -- MapboxからのJSON応答を格納するカラム
);
-- テストデータ
INSERT INTO GEOCoding_Test (id, address_query) VALUES
-- アメリカの住所
(1, 'ドジャー・スタジアム'), -- 具体的な施設名
(2, '1000 Vin Scully Ave, Los Angeles, CA 90012'), -- ドジャー・スタジアムの住所
-- 日本の住所
(3, '東京タワー'), -- 具体的な施設名
(4, '東京都港区芝公園4丁目2-8'), -- 東京タワー
(5, 'なら100年会館'), -- 具体的な施設名
(6, '奈良市三条宮前町7−1 1F'), -- 全角数字とフロア情報
(7, '奈良市三条宮前町7-1'), -- 半角数字
(8, '日比谷フォートタワー'), -- 具体的な施設名
(9, '港区西新橋1丁目1−1'), -- 全角数字
(10, '港区西新橋1丁目1-1'); -- 半角数字
権限の付与
アプリケーションがデータにアクセスするための権限を付与します。
-- 各種権限をMapboxアプリに付与
-- データベースの使用権限
GRANT USAGE ON DATABASE MY_DB TO APPLICATION MAPBOX_GEOCODING__ANALYSIS_TOOLS;
-- スキーマの使用権限
GRANT USAGE ON SCHEMA MY_DB.PUBLIC TO APPLICATION MAPBOX_GEOCODING__ANALYSIS_TOOLS;
-- テーブルの参照権限
GRANT SELECT ON TABLE MY_DB.PUBLIC.GEOCoding_Test TO APPLICATION MAPBOX_GEOCODING__ANALYSIS_TOOLS;
-- テーブルのUPDATE(書き込み)権限を付与 (結果を格納するため)
GRANT UPDATE ON TABLE MY_DB.PUBLIC.GEOCoding_Test TO APPLICATION MAPBOX_GEOCODING__ANALYSIS_TOOLS;
ジオコーディング
以下のコマンドで基本的なジオコーディング処理を実行できます。実行すると、テーブルの出力列に結果が書き込まれます。
CALL MAPBOX_GEOCODING__ANALYSIS_TOOLS.core.geocode_forward_enrich (
'MY_DB', -- DB_NAME
'PUBLIC', -- SCHEMA_NAME
'GEOCoding_Test', -- TABLE_NAME
'geocode_response', -- DESTINATION_COLUMN_NAME
false, -- INCREMENTAL
'address_query', -- QUERY (入力カラム名)
null, -- PARAM_BBOX
null, -- PARAM_COUNTRY
null, -- PARAM_FORMAT
null, -- PARAM_LANGUAGE
null, -- PARAM_PROXIMITY
null, -- PARAM_TYPES
null -- PARAM_WORLDVIEW
);
見やすいように結果を整形し表示します。
-- 結果から特定のプロパティ(緯度、経度など)を抽出
>SELECT
id,
address_query,
geocode_response:context:country.name::VARCHAR AS country_name,
geocode_response:context:district.name::VARCHAR AS district_name,
geocode_response:context:region.name::VARCHAR AS region_name,
geocode_response:longitude::FLOAT AS longitude,
geocode_response:latitude::FLOAT AS latitude,
geocode_response:name::VARCHAR AS place_name,
geocode_response:place_formatted::VARCHAR AS place_formatted
FROM MY_DB.PUBLIC.GEOCoding_Test;
+----+--------------------------------------------+---------------+--------------------+------------------+-------------+-----------+------------------------+----------------------------------------------+
| ID | ADDRESS_QUERY | COUNTRY_NAME | DISTRICT_NAME | REGION_NAME | LONGITUDE | LATITUDE | PLACE_NAME | PLACE_FORMATTED |
|----+--------------------------------------------+---------------+--------------------+------------------+-------------+-----------+------------------------+----------------------------------------------|
| 1 | ドジャー・スタジアム | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 2 | 1000 Vin Scully Ave, Los Angeles, CA 90012 | United States | Los Angeles County | California | -118.240471 | 34.072944 | 1000 Vin Scully Avenue | Los Angeles, California 90012, United States |
| 3 | 東京タワー | Japan | NULL | Tokyo Prefecture | 139.692912 | 35.688985 | 東京 | Tokyo Prefecture, Japan |
| 4 | 東京都港区芝公園4丁目2-8 | Japan | NULL | Tokyo Prefecture | 139.745442 | 35.658592 | 芝公園4丁目2番 | 港区, Tokyo Prefecture, Japan |
| 5 | なら100年会館 | France | NULL | Isère | 4.857348 | 45.340496 | 阿年 | Isère, France |
| 6 | 奈良市三条宮前町7−1 1F | Japan | NULL | Nara | 135.8155 | 34.679639 | 三条宮前町 | 奈良市, Nara, Japan |
| 7 | 奈良市三条宮前町7-1 | Japan | NULL | Nara | 135.816544 | 34.680278 | 三条宮前町7番 | 奈良市, Nara, Japan |
| 8 | 日比谷フォートタワー | Japan | NULL | Saitama | 139.505702 | 35.806832 | 日比田 | 所沢市, Saitama, Japan |
| 9 | 港区西新橋1丁目1−1 | Japan | NULL | Tokyo Prefecture | 139.754539 | 35.669719 | 西新橋1丁目2番 | 港区, Tokyo Prefecture, Japan |
| 10 | 港区西新橋1丁目1-1 | Japan | NULL | Tokyo Prefecture | 139.753003 | 35.670253 | 西新橋1丁目1番 | 港区, Tokyo Prefecture, Japan |
+----+--------------------------------------------+---------------+--------------------+------------------+-------------+-----------+------------------------+----------------------------------------------+
簡単な数件のサンプルデータに基づく暫定的な考察ですが、以下の点が挙げられます。
- 日本語住所への対応
- 日本の標準的な住所形式や地名には、概ね正確に対応していることが確認できました
- 固有名詞の誤認識
- 特定の固有名詞(ドジャー・スタジアム、なら100年会館、日比谷フォートタワー)について、結果が
NULLとなったり、意図しない場所や国が返され、固有名詞の処理は難しいと考えられます
- 特定の固有名詞(ドジャー・スタジアム、なら100年会館、日比谷フォートタワー)について、結果が
- 全角・半角の違いによる精度の差
- 数値部分に全角文字が混ざっている場合と半角文字の場合を比較すると、半角文字を使用した方が、より正確な番地(例:
三条宮前町7番)が返される傾向が見られました。データ内容によっては、事前のクレンジングで精度の向上が見込まれる可能性があります
- 数値部分に全角文字が混ざっている場合と半角文字の場合を比較すると、半角文字を使用した方が、より正確な番地(例:
逆ジオコーディング
ジオコーディングの出力から逆ジオコーディングも試してみます。
-- 逆ジオコーディングの結果を格納する新しいテーブルを作成
CREATE OR REPLACE TABLE MY_DB.PUBLIC.GEOCoding_Results_Table AS
SELECT
id,
address_query,
geocode_response:longitude::FLOAT AS lon_float, -- 経度
geocode_response:latitude::FLOAT AS lat_float, -- 緯度
-- 逆ジオコーディングの結果を格納する空の列
NULL::VARIANT AS reverse_geocode_response
FROM MY_DB.PUBLIC.GEOCoding_Test;
-- 権限付与
-- テーブルのSELECT(読み取り)権限を付与
GRANT SELECT ON TABLE MY_DB.PUBLIC.GEOCoding_Results_Table TO APPLICATION MAPBOX_GEOCODING__ANALYSIS_TOOLS;
-- テーブルのUPDATE(書き込み)権限を付与 (結果を格納するため)
GRANT UPDATE ON TABLE MY_DB.PUBLIC.GEOCoding_Results_Table TO APPLICATION MAPBOX_GEOCODING__ANALYSIS_TOOLS;
逆ジオコーディングを実行
CALL MAPBOX_GEOCODING__ANALYSIS_TOOLS.core.geocode_reverse_enrich (
'MY_DB', -- DB_NAME
'PUBLIC', -- SCHEMA_NAME
'GEOCoding_Results_Table', -- TABLE_NAME
'reverse_geocode_response', -- DESTINATION_COLUMN_NAME
false, -- INCREMENTAL
'lon_float', -- LONGITUDE (入力カラム名)
'lat_float', -- LATITUDE (入力カラム名)
null, -- PARAM_COUNTRY
null, -- PARAM_LANGUAGE
null, -- PARAM_TYPES
null -- PARAM_WORLDVIEW
);
整形し結果を確認すると以下のようになっていました。
>SELECT
id,
address_query,
lon_float,
lat_float,
reverse_geocode_response:name::VARCHAR AS place_name,
reverse_geocode_response:place_formatted::VARCHAR AS place_formatted,
reverse_geocode_response:context:country.name::VARCHAR AS country_name,
reverse_geocode_response:context:region.name::VARCHAR AS region_name,
reverse_geocode_response:context:place.name::VARCHAR AS place_name,
reverse_geocode_response:context:locality.name::VARCHAR AS locality_name,
reverse_geocode_response:context:neighborhood.name::VARCHAR AS neighborhood_name
FROM MY_DB.PUBLIC.GEOCoding_Results_Table;
+----+--------------------------------------------+-------------+-----------+------------------------+----------------------------------------------+---------------+-------------+-------------+---------------+-------------------+
| ID | ADDRESS_QUERY | LON_FLOAT | LAT_FLOAT | PLACE_NAME | PLACE_FORMATTED | COUNTRY_NAME | REGION_NAME | PLACE_NAME | LOCALITY_NAME | NEIGHBORHOOD_NAME |
|----+--------------------------------------------+-------------+-----------+------------------------+----------------------------------------------+---------------+-------------+-------------+---------------+-------------------|
| 1 | ドジャー・スタジアム | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 2 | 1000 Vin Scully Ave, Los Angeles, CA 90012 | -118.240471 | 34.072944 | 1000 Vin Scully Avenue | Los Angeles, California 90012, United States | United States | California | Los Angeles | NULL | Elysian Park |
| 3 | 東京タワー | 139.692912 | 35.688985 | 西新宿2丁目5番 | 日本, 〒160-0023 東京都新宿区 | 日本 | 東京都 | 新宿区 | 西新宿 | 2丁目 |
| 4 | 東京都港区芝公園4丁目2-8 | 139.745442 | 35.658592 | 芝公園4丁目2番8号 | 日本, 〒105-0011 東京都港区 | 日本 | 東京都 | 港区 | 芝公園 | 4丁目 |
| 5 | なら100年会館 | 4.857348 | 45.340496 | Impasse De La Fontaine | 38150 Agnin, France | France | Isère | Agnin | NULL | NULL |
| 6 | 奈良市三条宮前町7−1 1F | 135.8155 | 34.679639 | 三条宮前町279番地1 | 日本, 〒630-8121 奈良県奈良市 | 日本 | 奈良県 | 奈良市 | 三条宮前町 | NULL |
| 7 | 奈良市三条宮前町7-1 | 135.816544 | 34.680278 | 三条宮前町7番1号 | 日本, 〒630-8121 奈良県奈良市 | 日本 | 奈良県 | 奈良市 | 三条宮前町 | NULL |
| 8 | 日比谷フォートタワー | 139.505702 | 35.806832 | 日比田552番地2 | 日本, 〒359-0015 埼玉県所沢市 | 日本 | 埼玉県 | 所沢市 | 日比田 | NULL |
| 9 | 港区西新橋1丁目1−1 | 139.754539 | 35.669719 | 西新橋1丁目2番9号 | 日本, 〒105-0003 東京都港区 | 日本 | 東京都 | 港区 | 西新橋 | 1丁目 |
| 10 | 港区西新橋1丁目1-1 | 139.753003 | 35.670253 | 西新橋1丁目1番 | 日本, 〒105-0003 東京都港区 | 日本 | 東京都 | 港区 | 西新橋 | 1丁目 |
+----+--------------------------------------------+-------------+-----------+------------------------+----------------------------------------------+---------------+-------------+-------------+---------------+-------------------+
こちらも基本的な動作は問題なさそうです。
さいごに
Snowflake マーケットプレイスでアクセスできる、Mapbox 社の Geocoding API の基本的な機能を試してみました。マーケットプレイスで提供されていれば、すぐに本格的な機能にアクセスでき、便利と思います。
本記事の内容が何かの参考になれば幸いです。








