質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.21%

OpenStreetMapデータをimportしたOpenStreetMap Nominatimで公式のエンドポイント異なる結果が返る

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 1,293

i_love_perl

score 17

自分でデータimportしたNominatimのサーバへの逆ジオコーディングのリクエスト結果が公式のエンドポイントにリクエストした結果と一部地域で異なるものになってしまいます。

何度か試してみましたが必ず同じ結果になってしまいます。

公式にリクエストを投げると

$shell> curl "http://nominatim.openstreetmap.org/reverse?format=json&lat=34.63356018066406&lon=135.53524780273438&zoom=18&addressdetails=1" | jq .
{
  "boundingbox": [
    "34.6316972",
    "34.6316991",
    "135.5348612",
    "135.5349827"
  ],
  "place_id": "148949807",
  "licence": "Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright",
  "osm_type": "way",
  "osm_id": "384528515",
  "lat": "34.6316991",
  "lon": "135.5349827",
  "display_name": "水門橋, 東住吉区, 大阪市, 大阪府, 5460002, 日本",
  "address": {
    "country_code": "jp",
    "country": "日本",
    "postcode": "5460002",
    "state": "大阪府",
    "city": "大阪市",
    "suburb": "東住吉区",
    "path": "水門橋"
  }
}

自分でimportしたサーバにリクエストを投げると

$shell> curl "http://localhost/reverse?format=json&lat=34.63356018066406&lon=135.53524780273438&zoom=18&addressdetails=1" | jq .
{
  "place_id": "972762",
  "licence": "Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright",
  "osm_type": "way",
  "osm_id": "384528515",
  "lat": "34.6316991",
  "lon": "135.5349827",
  "display_name": "水門橋, 東住吉区, 大阪市, 泉北郡, 大阪府, 5440034, 日本 (Japan)",
  "address": {
    "path": "水門橋",
    "suburb": "東住吉区",
    "city": "大阪市",
    "county": "泉北郡",
    "state": "大阪府",
    "postcode": "5440034",
    "country": "日本 (Japan)",
    "country_code": "jp"
  },
  "boundingbox": [
    "34.6316972",
    "34.6316991",
    "135.5348612",
    "135.5349827"
  ]
}

上記のように大阪市の一つ上に泉北郡が入ってしまいます。

 質問したいこと

https://github.com/openstreetmap/Nominatim/blob/master/docs/Import_and_update.md

./utils/setup.php --osm-file ../../planet-latest.osm.pbf --all --osm2pgsql-cache 28000

上記のimportの手順以外にデータをimportする際に気をつけなければいけないことはありますか?

どのようにしたら公式の結果と同じ結果を得ることができるのでしょうか?

 調べたこと

実際にpostgresqlの中のplacex tableの大阪市を見てみると、

nominatim=# select parent_place_id, place_id, type, name, admin_level, osm_type, osm_id, rank_search from placex where place_id = 1059308;
-[ RECORD 1 ]---+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
parent_place_id | 105034
place_id        | 1059308
type            | administrative
name            | "name"=>"大阪市", "name:ca"=>"Osaka", "name:de"=>"Osaka", "name:en"=>"Osaka", "name:eo"=>"Osako", "name:et"=>"Ōsaka", "name:fr"=>"Ōsaka", "name:hi"=>"ओसक", "name:ia"=>"Osaka", "name:io"=>"Osaka", "name:ja"=>"大阪市", "name:kn"=>"ಓಸಕ", "name:ko"=>"오사카 시", "name:lt"=>"Osaka", "name:pl"=>"Osaka", "name:ru"=>"Осака", "name:sl"=>"Osaka", "name:sv"=>"Osaka", "name:uk"=>"Осака", "name:zh"=>"大阪市", "name:jbo"=>".osakas.", "name:ja_rm"=>"Ōsaka-shi", "name:ja_kana"=>"おおさかし"
admin_level     | 7
osm_type        | R
osm_id          | 358674
rank_search     | 14


そして、大阪市(Relation)のparent_location_idを調べると

nominatim=# select parent_place_id, place_id, type, name, admin_level, osm_type, osm_id, rank_search from placex where place_id = 105034;
-[ RECORD 1 ]---+--------------------------------------------------------------------------------------------------
parent_place_id | 1059230
place_id        | 105034
type            | county
name            | "name"=>"泉北郡", "name:en"=>"Senboku District", "name:ja"=>"泉北郡", "name:ja_rm"=>"Senboku-gun"
admin_level     | 15
osm_type        | N
osm_id          | 551364644
rank_search     | 12


osm_typeがノードである泉北郡が入ってしまいます。

osmの生データを見ても、泉北郡(Node)は泉北郡(Relation)のlabel memberで、relation的には大阪市の上位にくるような場所には見えませんでした。

泉北郡(Node)のparent_place_idは

nominatim=# select parent_place_id, place_id, type, name, admin_level, osm_type, osm_id, rank_search from placex where place_id = 1059230;
-[ RECORD 1 ]---+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
parent_place_id | 0
place_id        | 1059230
type            | administrative
name            | "name"=>"大阪府", "name:en"=>"Osaka Prefecture", "name:ja"=>"大阪府", "name:ko"=>"오사카 부", "name:pl"=>"Prefektura Osaka", "name:ru"=>"Осака", "name:uk"=>"Префектура Осака", "name:ja_rm"=>"Ōsaka-fu", "name:ja_kana"=>"おおさかふ"
admin_level     | 4
osm_type        | R
osm_id          | 341906
rank_search     | 8


大阪府(Relation)になっていました。

rank_searchが大阪市(Relation)>泉北郡(Node)になっているのでproceduerの中以下の処理あたりで

https://github.com/openstreetmap/Nominatim/blob/master/sql/partition-functions.src.sql#L87-L112
https://github.com/openstreetmap/Nominatim/blob/master/sql/functions.sql#L1767-L1782

なんかparent_place_idに入りそうな気もしたのですが、geometry周りがよく理解できておらず追いきれない状況になってしまいました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る