【问题标题】:postgis query for addresses (with osm data)postgis 查询地址(使用 osm 数据)
【发布时间】:2013-11-30 05:37:02
【问题描述】:

我想用来自openstreetmap的数据查询postgis数据库的地址,检查数据库中是否存在这样的地址,如果存在,获取坐标。使用渗透从 .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

我希望我清楚地解释了我的问题。

【问题讨论】:

    标签: sql postgresql openstreetmap postgis


    【解决方案1】:

    这并不像您想象的那么容易。 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 之一。

    【讨论】:

    • 感谢您的回答。我知道地址的某些部分可能与不同表格中的其他元素相关,并且获取它们可能并不容易。我的问题是如何执行查询(我描述的),知道它不会获得所有地址。这是相当临时的捷径,但这是我现在需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多