gpt4 book ai didi

java - 使用地理编码获取建筑物的坐标

转载 作者:搜寻专家 更新时间:2023-11-01 08:02:26 24 4
gpt4 key购买 nike

我想通过地理编码获取建筑物的坐标。目前我使用 android 的 GeoCoder 类从选定的地址获取坐标,但这些坐标不对应于建筑物的边缘。 OSM 包含每个建筑物的这些信息,但我不知道如何使用 GeoCoder 类获取这些信息。是否有可能将 OSM 与 Android 的地理编码器类一起使用来获取此信息?

最佳答案

这可能有点复杂。首先,OSM 并不是每个地址都有一座建筑物。有时一个建筑物包含多个地址,或者一个地址可以属于多个建筑物。

但作为第一步,您可以使用 Nominatim 进行地理编码以获得特定地址的坐标。然后将这些坐标传递给 Overpass API 并搜索附近的建筑物。

例子:

我们正在搜索地址为 Franzweg 4, Dresden 的建筑物。 Nominatim 查询可能如下所示(假设我们需要 JSON 输出):

http://nominatim.openstreetmap.org/search.php?q=Franzweg+4%2C+Dresden&addressdetails=1&format=json

它返回完全匹配,因为地址存在于 OSM 的数据库中。您可以通过查看地址详细信息看到,*house_number* 和road 匹配。我们甚至得到一个相应的 way with ID 94892819 ,它有 building 标签,包含 querying the API for the way ID 时建筑物轮廓的坐标(参见 API documentation )。

但如前所述,并非每个地址都属于建筑物。例如,当 searching for Huttenstraße 14, Dresden 时,我们也得到了一个准确的结果,但返回的 with ID 240398228 属于一个区域。该区域包含一座建筑物,因此属于该地址。 Nominatim 还返回一个边界框,在本例中为 51.0508041381836,51.0514030456543,13.7778491973877,13.7796478271484。我们可以用它来检索该区域内的对象。如果您没有 OSM 数据库的本地副本,您可以使用带有以下查询的 Overpass API:

<osm-script output="json">
<query type="way">
<has-kv k="building"/>
<bbox-query e="13.7796478271484" n="51.0514030456543" s="51.0508041381836" w="13.7778491973877"/>
</query>
<print mode="body"/>
<recurse type="down"/>
<print mode="skeleton"/>
</osm-script>

此查询 returns all ways 在给定的边界框中使用 buildings 标签。您可以使用 overpass turbo 可视化结果。如您所见,边界框包含不止一栋建筑物,但只有其中一栋在区域内。所以你必须通过每个建筑物的坐标来查看哪个适合。请记住,一个地址可能属于多个建筑物,因此可以有多个匹配项。

然后还有第三种情况,地址是单个 node 。例如 Striesener Straße 38b 的结果返回 node with ID 1615986605 。这里的node实际上是way建筑的成员,所以很容易确定对应的建筑。但情况并非总是如此,您可能需要运行另一个 Overpass API 查询来确定附近的建筑物,然后再次查看最适合的建筑物。

关于java - 使用地理编码获取建筑物的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19175127/

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