Geocoder
Geocoder PHPライブラリに基づく包括的なジオコーディングAPIモジュールで、複数のジオコーディングサービスプロバイダーをサポートし、順方向および逆方向のジオコーディング操作を可能にします。
geocoder
インストール
composer require 'drupal/geocoder:8.x-4.30'
概要
Geocoderモジュールは、Drupalでジオコーディング(住所を地理座標に変換)および逆ジオコーディング(座標を住所に変換)操作を実行するための堅牢なAPIを提供します。Geocoder PHPライブラリバージョン4.xの上に構築されており、30以上の異なるジオコーディングサービスプロバイダーをサポートする柔軟なプラグインベースのアーキテクチャを提供します。
このモジュールには、ジオコーディングプロバイダーの設定、APIキーの管理、キャッシュオプションの設定のための包括的な管理インターフェースが含まれています。結果は、Dumperプラグインシステムを通じてWKT、GeoJSON、KML、GPXなど、さまざまな地理データ形式にエクスポートできます。
サブモジュール(Geocoder Field、Geocoder Geofield、Geocoder Address)により、DrupalのField APIとシームレスに統合され、Entity保存時にテキストフィールドの自動ジオコーディングや地理フィールドの逆ジオコーディングが可能になります。また、プログラムによるジオコーディング操作のためのREST APIエンドポイントも公開しています。
Features
- 順方向ジオコーディング:住所、地名、場所を地理座標(緯度/経度)に変換
- 逆ジオコーディング:地理座標を人間が読める住所に変換
- Google Maps、Nominatim、OpenStreetMap、Bing Maps、MapQuest、Mapboxなど、30以上のジオコーディングサービスプロバイダーをサポート
- Provider、Dumper、Formatterプラグインの拡張可能なプラグインアーキテクチャ
- 複数の出力形式:WKT、GeoJSON、KML、GPX、WKB、プレーンアドレステキスト
- API呼び出しを削減しパフォーマンスを向上させる組み込みキャッシュシステム
- プロバイダーのレート制限を尊重するリクエストスロットリング
- ジオコーディング操作用のREST APIエンドポイント
- 大量のジオコーディング操作のためのQueueベースの処理
- Geocoder Fieldサブモジュールによるentity保存時の自動フィールドジオコーディング
- 地理データの保存のためのGeofieldモジュールとの統合
- 構造化された住所処理のためのAddressモジュールとの統合
- 画像のEXIFデータ、GPX、KML、GeoJSONファイルからのファイルベースのジオコーディング
- ジオコーディング候補による住所入力のオートコンプリート機能
- 近接検索のためのGeofield Proximityソースプラグイン
- プロバイダー固有の設定オプション(APIキー、地域、ロケールなど)のサポート
Use Cases
住所入力から位置座標を保存
コンテンツタイプのGeofieldを設定して、テキスト住所フィールドから自動的にジオコーディングします。ユーザーが住所を入力すると、座標が自動的にGeofieldに保存されます。geocoder_fieldとgeocoderサブモジュールを有効にし、住所入力用のテキストフィールドと座標用のGeofieldを追加してから、Geofieldの「Geocode」設定で希望のプロバイダーを使用して住所フィールドからジオコーディングするように設定します。
地図上の位置から人間が読める住所を表示
逆ジオコーディングを使用して、保存された座標からフォーマットされた住所を表示します。Geofieldから逆ジオコーディングするようにテキストフィールドを設定します。座標が保存される(例:地図ウィジェットから)と、住所が自動的に入力されます。
アップロードされた写真からGPS座標を抽出
GPS情報が埋め込まれた写真から位置データを自動的に抽出します。EXIF GPSデータを含む画像をアップロードすると、Fileジオコーダープロバイダーが座標を抽出してGeofieldに保存します。
住所オートコンプリート付きの近接検索を構築
「Geocode Origin」proximity sourceを使用してViewsの公開フィルターを作成します。ユーザーはオートコンプリート候補付きで住所を入力でき、結果はその場所からの距離でソートされます。
REST API経由で住所をジオコーディング
/geocoder/api/geocodeエンドポイントを使用してプログラムで住所をジオコーディングします。クエリパラメータとして住所とプロバイダーを渡すと、座標と住所コンポーネントを含むJSON結果を受け取ります。JavaScriptアプリケーションや外部統合に便利です。
既存コンテンツを一括ジオコーディング
Geocoder設定でQueue処理を有効にし、既存コンテンツの保存をトリガーします。ジオコーディングはCron経由で処理され、大規模データセットでのタイムアウトを回避します。進捗状況は「geocoder_field」Queueを監視してください。
GPX/KMLトラックデータのインポート
ルートデータを含むGPXまたはKMLファイルをアップロードし、地理情報を自動的にGeofield値に抽出します。ハイキングトレイル、配送ルート、境界データのインポートに便利です。
Tips
- 本番サイトでは、APIコストを削減しパフォーマンスを向上させるために常にキャッシュを構成してください。キャッシュされた結果を永続化するために、Permanent Cache Binモジュールの使用を検討してください。
- Nominatimなどの無料プロバイダーを使用する場合、スロットリングを構成してレート制限を尊重してください(例:2秒ごとに1リクエスト)。Nominatimにはデフォルトの組み込みスロットリングがあります。
- フィールド統合を設定する前に、APIエンドポイントでジオコーディングをテストしてください:/geocoder/api/geocode?address=YOUR_ADDRESS&geocoder=YOUR_PROVIDER
- フォールバックとして複数のプロバイダーを構成してください - 結果を返す最初のプロバイダーが使用され、失敗した場合に他のプロバイダーが試行されます。
- コンテンツ移行時は、インポート中のジオコーディングを防ぐために一時的に「Geocoder Presave無効化」を有効にし、その後ジオコーディングを別途処理してください。
- 「ターゲット値が空でない場合はジオコードをスキップ」オプションを使用して、新しいコンテンツを自動ジオコーディングしながら手動で入力した座標を保持してください。
- WKTダンパー出力形式は通常、Geofieldに結果を保存する場合に必要であり、GeoJSONはAddressフィールドに必要です。
- Google Mapsの場合、サーバーサイドのジオコーディングはブラウザでキーを公開しないため、リファラー制限のないAPIキーを使用してください。
- 外部API呼び出しによる保存操作の遅延を防ぐため、トラフィックの多いサイトではQueue処理を有効にしてください。
Technical Details
Admin Pages 3
/admin/config/system/geocoder
キャッシュ動作、Queue処理、ジオコーディング操作のグローバルな無効化機能を含む、Geocoderモジュールのグローバル設定を構成します。
/admin/config/system/geocoder/geocoder-provider
ジオコーディングプロバイダーを管理します。ドロップダウンからプロバイダータイプを選択し、設定を構成して新しいプロバイダーを追加します。既存のプロバイダーの表示、編集、削除ができます。ジオコーディング操作を使用する前に、ここでプロバイダーを作成する必要があります。
/admin/config/system/geocoder/geocoder-provider/add/{geocoder_provider_id}
新しいジオコーダープロバイダーを設定します。設定はプロバイダータイプによって異なりますが、通常はAPIキー、地域、ユーザーエージェント、その他のプロバイダー固有のオプションが含まれます。
権限 2
Hooks 10
hook_geocode_address_string_alter
モジュールがジオコーディングされる前の住所文字列を変更できるようにします。
hook_geocode_address_geocode_query
モジュールがジオコーディング前にGeocodeQueryオブジェクトを変更できるようにします。
hook_reverse_geocode_coordinates_alter
モジュールが逆ジオコーディング前に緯度・経度座標を変更できるようにします。
hook_geocode_country_code_alter
モジュールがジオコーディング結果から抽出された国コードを変更できるようにします。プロバイダーが標準の国コードを返さない場合に便利です。
hook_geocoder_provider_info_alter
モジュールが利用可能なジオコーダープロバイダープラグインのリストを変更できるようにします。デフォルト実装では、ハンドラークラスがインストールされていないプラグインを削除します。
hook_geocode_source_fields_alter
ジオコーディング操作のソースとして使用できるフィールドタイプのリストを変更します。geocoder_fieldサブモジュールで提供されます。
hook_reverse_geocode_source_fields_alter
逆ジオコーディング操作のソースとして使用できるフィールドタイプのリストを変更します。geocoder_fieldサブモジュールで提供されます。
hook_geocode_entity_field_address_string_alter
entity presave時にジオコーディングする住所文字列を変更します。geocoder_fieldサブモジュールで提供されます。
hook_reverse_geocode_entity_field_coordinates_alter
entity presave時の逆ジオコーディング前に座標を変更します。geocoder_fieldサブモジュールで提供されます。
hook_geocoder_address_values_alter
ジオコーディング前の住所値を変更します。geocoder_addressサブモジュールで提供されます。
Troubleshooting 7
プロバイダーのComposerパッケージがインストールされていることを確認してください。例えばGoogle Mapsの場合:composer require geocoder-php/google-maps-provider。モジュールのsrc/Plugin/Geocoder/Providerフォルダを確認してください - そこにプラグインがあるプロバイダーのみがサポートされます。
詳細なエラーメッセージについてはDrupalログを確認してください。APIキーが正しく、レート制限されていないことを確認してください。Nominatim/OpenStreetMapの場合、User-AgentとRefererヘッダーが設定されていることを確認してください。まずよく知られた単純な住所でテストしてください。
繰り返しのAPI呼び出しを避けるため、Geocoder設定でキャッシュを有効にしてください。一括操作には、Queue処理を有効にしてください。キャッシュクリア後もキャッシュを永続化するために、Permanent Cache Binモジュールの使用を検討してください。
一部のプロバイダーは不完全なデータ(国コードや郵便番号の欠落など)を返します。国コードの問題を修正するにはhook_geocode_country_code_alterフックを使用してください。選択したダンパー(Addressフィールドの場合はGeoJSON)がターゲットフィールドと互換性があることを確認してください。
設定で「Geocoder Presave無効化」がチェックされていないことを確認してください。フィールドの「Geocode」設定で少なくとも1つのプロバイダーが選択されていることを確認してください。ソースフィールドに値があり、前回の保存から変更されていないかどうか確認してください。
プロバイダー設定でスロットリング(期間と制限)を構成してください。API呼び出しを減らすためにキャッシュを使用してください。Cron経由でリクエストを分散するためにQueue処理を有効にすることを検討してください。
settings.phpでプロキシ設定を構成してください:$settings['http_client_config']['proxy']。geocoder.http_adapterサービスはこれらの設定を尊重するGuzzleを使用しています。
Security Notes 5
- ジオコーディングプロバイダーのAPIキーは設定に保存されます。本番キーをバージョン管理から除外するために、環境固有のsettings.phpオーバーライドを使用してください。
- 「access geocoder api endpoints」権限はREST APIへのアクセスを制御します。APIクォータを消費するため、信頼できるロールにのみ付与してください。
- settings.phpでオーバーライドされているときに管理インターフェースでAPIキーを非表示にするために、COI(Config Override Inspector)モジュールの使用を検討してください。
- 匿名ユーザーにオートコンプリート機能を公開する場合、APIクォータの悪用の可能性に注意してください。スロットリングを構成し、追加のレート制限の実装を検討してください。
- ジオコーディング結果には個人の位置データが含まれる場合があります。ジオコーディングされたデータを保存するフィールドに適切なアクセス制御を確保し、GDPRの影響を考慮してください。