Skip to main content
 首页 » 编程设计

python之从openstreetmap获取tag信息,具体为tag info

2025年05月04日27cyq1162

我有一些代码可以提供有关从 flickr 获得的图像的地理标记信息。代码如下:

geolocator = Nominatim() 
location = geolocator.reverse("{}, {}".format(lat, lon)) 
print(location.address) 
print url 
print(location.raw) 
dict = location.raw 
osmid = dict.get('osm_id', 'default_value_if_null_here') 
osmtype = dict.get('osm_type', 'default_value_if_null_here') 
print osm_type 

我正在从获取的图像中获取 lat、lon 和 url 变量。然后使用 geopy 包我收到以下结果

5, Linnaeusweg, Paardenveld, IJsselstein, Bestuur Regio Utrecht, Utrecht, Nederland, 3401MS, Nederland 
https://farm2.staticflickr.com/1456/24640378196_c096ea190b_m.jpg 
{u'display_name': u'5, Linnaeusweg, Paardenveld, IJsselstein, Bestuur Regio Utrecht, Utrecht, Nederland, 3401MS, Nederland', u'place_id': u'37712154', u'lon': u'5.0540829', u'osm_type': u'node', u'licence': u'Data \xa9 OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright', u'osm_id': u'2919181986', u'lat': u'52.0175634', u'address': {u'town': u'IJsselstein', u'industrial': u'Paardenveld', u'house_number': u'5', u'country': u'Nederland', u'county': u'Bestuur Regio Utrecht', u'suburb': u'IJsselstein', u'state': u'Utrecht', u'postcode': u'3401MS', u'country_code': u'nl', u'road': u'Linnaeusweg'}} 
node 

我的代码的最终目标是以某种方式使用 openstreetmap 来查看此位置是否对应于某个地标。但是现在我的问题如下。

如果我将返回的所有结果作为 osm_type 节点,我将如何将我收到的信息输入到 openstreetmap 以获取有关该节点的信息,例如我找到的以下示例

< node id =" 592637238 " lat =" 47.1675211 " lon =" 9.5089882 " 
       version ="2" changeset =" 6628391 " 
       user =" phinret " uid =" 135921 " 
       timestamp =" 2010 -12 -11 T19:20:16Z " > 
   < tag k=" amenity " v=" bar " / > 
   < tag k=" name " v=" Black Pearl " / > 

如果我能得到这些数据,也许我就可以使用标签来查看它是否是地标。我研究过 osmapi,但我不知道如何使用它

很抱歉我的问题很杂乱,我是 python 的新手,也是 openstreetmap,所以任何帮助将不胜感激!

请您参考如下方法:

您可以通过 API 下载节点详细信息,例如 ID 为 2919181986 的节点:http://www.openstreetmap.org/api/0.6/node/2919181986 .但是请记住,Nominatim 返回 nodes, ways and relations ,每个元素都需要一个略有不同的 API 调用。另一个问题是对应的地标可能更远(例如拍摄大型建筑物或山脉时),因此最近的结果不一定是正确的。

另一种方法是完全跳过 Nominatim 并使用 Overpass API而不是返回相关坐标周围的所有数据。通过这种方式,您可以查看所有结果并根据重要性和距离对它们进行加权。此外,您只需为每个坐标调用一次,因为 Overpass API 已返回所有标签。