如何使用 python 从 flickr xml 图像数据中提取图像地理数据?

Posted

技术标签:

【中文标题】如何使用 python 从 flickr xml 图像数据中提取图像地理数据?【英文标题】:How to extract image geodata out of flickr xml image data with python? 【发布时间】:2014-07-19 22:03:18 【问题描述】:

我正在研究电子垃圾的问题,并在 flickrapi py 模块中使用此代码来获取带有#e-waste 标记的 Flickr 图像的 xml 数据。

import flickrapi
import xml
api_key='myAPI key'
api_secret ='myAPI secret'

flickr = flickrapi.FlickrAPI(api_key,secret=api_secret)
r = flickr.photos_search(tags='e-waste', has_geo="1", per_page='100')
xml.etree.ElementTree.dump(r)

运行代码给我结果:

<rsp stat="ok">
<photos page="1" pages="58" perpage="100" total="5785">
    <photo farm="3" id="13982876982" isfamily="0" isfriend="0" ispublic="1" owner="100231432@N02" secret="2d33e5efb1" server="2903" title="Sean Gallagher, Pulitzer Photojournalist visits MSA" />
    <photo farm="8" id="13962977066" isfamily="0" isfriend="0" ispublic="1" owner="100231432@N02" secret="aeb6bc1454" server="7139" title="Sean Gallagher, Pulitzer Photojournalist visits MSA" />
</photos>
</rsp>

现在,我还想打印这些图像应具有的地理元数据。我怎样才能做到这一点?我最终想将该地理数据提取到一个 csv 中,然后我可以进行映射。

干杯!

【问题讨论】:

【参考方案1】:

&lt;photo&gt; 元素中提取id 属性,然后将其传递给flickr.photos.getInfo 并从&lt;location&gt; 元素中提取数据。文档页面上的示例未显示此内容,但您可以使用 API Explorer 查看示例。以下是我的一张照片的示例:

<location latitude="38.829786" longitude="-77.52202" accuracy="14" context="0" place_id="ioKEzZ1TV7oQ55R_" woeid="2501239">
  <locality place_id="ioKEzZ1TV7oQ55R_" woeid="2501239">Sudley Springs</locality>
  <county place_id="hF2V0rlQUL9MlAlEkA" woeid="12590406">Prince William</county>
  <region place_id="pPrhG7VTUb6SbYO." woeid="2347605">Virginia</region>
  <country place_id="nz.gsghTUb4c2WAecA" woeid="23424977">United States</country>
</location>

【讨论】:

【参考方案2】:

另一种方法是 REST API。 看看这个: https://www.flickr.com/services/api/flickr.photos.search.html

您可以使用很多参数来缩小搜索范围。如果要执行地理查询,请使用 bbox 并在搜索中包含纬度/经度,并通过添加标签 (#e-waste) 缩小搜索范围。使用 url.open 调用每个 URL,然后将其传递给 BeautifulSoup (http://www.crummy.com/software/BeautifulSoup/),这是一个解析 XML 的工具。 与上面的答案相比,您为自己节省了一步:

它可能看起来像这样:

from bs4 import BeautifulSoup

url = "https://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=5....b&per_page=250&has_geo=1&extras=geo,tags,views,description"
soup = BeautifulSoup(urlopen(url)) #pass it to Beautiful Soup

for data in soup.find_all('photo'): #iterate through the XML Document
    scraping = (
    data.get("id"), #find the data you want and write it into a tuple which you then can write to a csv
    data.get("title"),
    data.get("tags"),
    data.get("longitude"),
    data.get("latitude"),
    )

【讨论】:

以上是关于如何使用 python 从 flickr xml 图像数据中提取图像地理数据?的主要内容,如果未能解决你的问题,请参考以下文章

带卷曲的Flickr搜索

为啥从 Flickr 下载相同大小的图像需要不同的时间?

Python-随机Flickr

如何确保我的 Python 正则表达式输出字典?

使用 PHP、curl 解码从 Flickr API 返回的 json 字符串

使用 Flickr API 时出现 Alamofire AFError