postgis查询地址(使用osm数据)

时间:2013-11-16 22:13:20

标签: sql postgresql openstreetmap postgis

我想使用openstreetmap中的数据查询postgis数据库的地址,检查数据库中是否存在此类地址,如果存在,请获取坐标。使用osmosis从.pbf文件填充数据库。这是数据库http://pastebin.com/Yigjt77f的架构。我有城市名称,街道名称和街道数量的地址。对我来说最重要的是这张表:

CREATE TABLE node_tags (
    node_id BIGINT NOT NULL,
    k text NOT NULL,
    v text NOT NULL
);

k列是标记形式,我感兴趣的是:addr:housenumberaddr:streetaddr:city,v是对应的值。首先,我正在搜索城市名称是否与数据库中的一个匹配,而不是搜索结果集我正在搜索街道而不是房屋号码。问题是我不知道如何进行SQL查询只能询问一次这个结果。我首先只询问城市名称,获取与我的城市匹配的所有node_id并将它们保存在java程序中,而不是询问每个找到的(匹配我的城市)id_number(来自我的java程序的列表)的街道,依此类推。这种方式真的很慢,因为要求更详细的信息(城市比街道而不是数字)我必须提出越来越多的查询,而且我还要检查很多地址。一旦我有匹配的node_id,我就可以轻松找到坐标,所以这不是问题。

此表的示例:

    node_id | k | v <br>
    123 | addr:housenumber | 50
    123 | addr:street | Kingsway
    123 | addr:city | London
    123 | (some other stuff) | .....
    100 | addr:housenumber | 121
    100 | addr:street | Edmund St
    100 | addr:city | London

我希望我能清楚地解释我的问题是什么。

1 个答案:

答案 0 :(得分:3)

这并不像你想象的那么容易。 OSM中的地址是分层次的,就像在现实世界中一样。并非OSM中的所有elements都附加了完整地址。有些只有addr:housenumber并且只属于最近的街道。有些人有addr:housenumberaddr:street但没有addr:city因为他们只是属于最近的城市。或者它们由boundary relation括起来,指定相应的城市。而不是addr:housenumber,有时也只有addr:interpolation键描述的地址插值。有关详细信息,请参阅addr key wiki page

OSM wiki中的Karlsruhe Schema页面解释了很多OSM中的地址。它还提到了associatedStreet关系,这些关系有时用于对门牌号码及其相应的街道进行分组。

正如您所看到的,数据库中的单个查询可能还不够。如果您需要一些灵感,可以查看OSM的地址搜索引擎Nominatim。但请注意,为了优化地址查询,Nominatim使用与通常不同的数据库方案。您还可以查看众多routing applications中的一个,它们都必须进行地址查找。