gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:05:39 24 4
gpt4 key购买 nike

我想使用来自 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:housenumber, addr:street, addr:city 和 v 是相应的值。首先,我搜索城市名称是否与数据库中的城市名称匹配,然后在结果集中搜索街道而不是门牌号。问题是我不知道如何进行只询问一次就能得到这个结果的 SQL 查询。我可以首先只询问城市名称,获取与我的城市匹配的所有 node_id 并将它们保存在 java 程序中,而不是查询街道的每个找到的(匹配我的城市)id_number(来 self 的 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

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

最佳答案

这并不像您想象的那么容易。 OSM 中的地址是分层的,就像在现实世界中一样。不是所有elements在 OSM 中附有完整地址。有些只有 addr:housenumber 并且只属于最近的街道。有些有 addr:housenumberaddr:street 但没有 addr:city 因为它们只是属于最近的城市。或者它们被 boundary relation 括起来其中指定相应的城市。而不是 addr:housenumber 有时也只是地址 interpolationsaddr:interpolation 键描述。查看addr key wiki page获取更多信息。

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

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

关于sql - postgis 查询地址(使用 osm 数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20024591/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com