2017-03-21 42 views
0

Nominatimのソースコードを見てみましたが、ほとんどの機能はSQL照会の準備と結果の書式作成のようなものです。Nominatimやその他のジオデコーダを使用する代わりに直接SQLクエリを使用できますか?

可能な他のジオ(デコーダー)コーダーも同じように機能します。直接SQLクエリを使用してDBからデータを取得できますか?

どこの例がありますか?私は座標から地名を取得したいと思います。

答えて

1

はい、可能です。

私は数年前にそれを試してみましたが、あなたはGitHubの上で見つけることができるシンプルな、粗製のジオコーダを思い付いた:

https://github.com/plechi/mini-geocoderは、インストールのPostGISとhstoreの拡張子を持つPostgreSQLの-サーバを必要としています。

新しいPostgresデータベースを作成します。

のPostGISとhstoreの拡張を有効にします。その後

CREATE EXTENSION postgis; 
CREATE EXTENSION hstore; 

をあなたはOsmosisとOpenStreetMapのからデータセットを必要とし、詳細については、OSM-ウィキで見て:http://wiki.openstreetmap.org/wiki/Downloading_data

浸透(実行からデータベーススキーマを作成します。端末内のコマンド):

psql -d <database> -f <osmosis-folder>/script/pgsnapshot_schema_0.6.sql 

データをインポートします(端末でも実行します):

osmosis --read-xml file="<downloaded_datafile>.osm" --write-apidb host="<dbhost>" database="<dbname>" user="<dbuser>" password="<dbpassword>" 

理論的には、結果のデータベースを照会することができます(詳細はスキーマを参照してください)。

CREATE TABLE geocode_optimized 
AS SELECT 
    w.tags -> 'addr:street'       AS street, 
    w.tags -> 'addr:housenumber'      AS housenumber, 
    w.tags -> 'addr:postcode'       AS postcode, 
    w.tags -> 'addr:city'        AS city, 
    w.tags -> 'addr:country'       AS country, 
    AVG(ST_X(n.geom))         AS longitude, 
    AVG(ST_Y(n.geom))         AS latitude, 
    to_tsvector(concat_ws(' ', w.tags -> 'addr:street', 
          w.tags -> 'addr:housenumber', 
          w.tags -> 'addr:postcode', 
          w.tags -> 'addr:city', 
          w.tags -> 'addr:country' 
       ))          AS full_text, 
    st_makepoint(AVG(ST_X(n.geom)), AVG(ST_Y(n.geom))) AS point 
    FROM ways w 
    INNER JOIN way_nodes wn ON w.id = wn.way_id 
    INNER JOIN nodes n ON n.id = wn.node_id 
    WHERE exist(w.tags, 'addr:housenumber') AND exist(w.tags, 'addr:street') 
    GROUP BY housenumber, street, postcode, city, country; 

CREATE INDEX idx_geocode_full_text ON geocode_optimized USING GIN (full_text); 

ジオコード(座標へのアドレス):私のジオコーダについては

は、私は簡単にクエリに対して "最適化テーブル" を作成し

SELECT 
    street, 
    housenumber, 
    postcode, 
    city, 
    country, 
    longitude, 
    latitude 
FROM geocode_optimized 
WHERE full_text @@ plainto_tsquery('YOUR ADDRESS') 

リバースジオコード(座標対処するため)

SELECT 
    street, 
    housenumber, 
    postcode, 
    city, 
    country, 
    longitude, 
    latitude, 
    CAST (st_distance_sphere(st_makepoint(longitude,latitude), st_makepoint('<longitude>','<latitude>')) AS FLOAT) as distance 
FROM geocode_optimized; 

前述のように、これは非常に粗雑であり、おそらく最もパフォーマンスの高い解決策ではありませんイオン。

関連する問題