如何使用 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】:从<photo>
元素中提取id
属性,然后将其传递给flickr.photos.getInfo 并从<location>
元素中提取数据。文档页面上的示例未显示此内容,但您可以使用 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 图像数据中提取图像地理数据?的主要内容,如果未能解决你的问题,请参考以下文章