Nominatimのソースコードを見てみましたが、ほとんどの機能はSQL照会の準備と結果の書式作成のようなものです。Nominatimやその他のジオデコーダを使用する代わりに直接SQLクエリを使用できますか?
可能な他のジオ(デコーダー)コーダーも同じように機能します。直接SQLクエリを使用してDBからデータを取得できますか?
どこの例がありますか?私は座標から地名を取得したいと思います。
Nominatimのソースコードを見てみましたが、ほとんどの機能はSQL照会の準備と結果の書式作成のようなものです。Nominatimやその他のジオデコーダを使用する代わりに直接SQLクエリを使用できますか?
可能な他のジオ(デコーダー)コーダーも同じように機能します。直接SQLクエリを使用してDBからデータを取得できますか?
どこの例がありますか?私は座標から地名を取得したいと思います。
はい、可能です。
私は数年前にそれを試してみましたが、あなたは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;
前述のように、これは非常に粗雑であり、おそらく最もパフォーマンスの高い解決策ではありませんイオン。