Creating a pinboard map of geotagged photos in a flickr pool
In this post I’ll show how to produce a simple pinboard map of geotagged photos in a flickr group pool, using Python and Basemap/Matplotlib. You’ll need:-
There are two short scripts here:-
- A script to find the longitude and latitude of geotagged photos in the group pool
- A script to generate the plot
The first script produces a CSV file; the second uses this CSV file to produce the plot.
Here’s the script to produce the CSV file with photo locations:-
# -*- coding: UTF8 -*-
'''
Created on 12 May 2009
Based on beejs flickr API
Produce a list of photo locations for a given
group's pool on flickr
@author: Steven Kay
'''
import flickrapi
import string
import datetime
import string
import time
# Enter your API key below
# You can apply for an API key at
# http://www.flickr.com/services/apps/create/apply
api_key = ''
# paste group NSID below
group = '1124494@N22'
# sample... fetch your latest images with
# a count of the views, faves and comments
if __name__ == '__main__':
flickr = flickrapi.FlickrAPI(api_key)
response_photos = flickr.groups_pools_getPhotos(group_id=group,per_page=500,extras='geo')
root=response_photos.findall('.//photos')
pages=int(root[0].get('pages'))
if pages>8:
# stop after 8 pages of 500 images
# not sure if groups.pools.getPhotos has the same
# 4000 image limit as photos.search..?
pages=8
fo=open(r"C:\infoviz\scotland_photos.csv","w")
print "Longitude,Latitude"
fo.write("Longitude,Latitude\n")
for page in range(0,pages):
response_photos = flickr.groups_pools_getPhotos(group_id=group,per_page=500,page=str(page),extras='geo')
for photo in response_photos.findall(".//photos/photo"):
try:
lat=photo.get('latitude')
lon=photo.get('longitude')
st="%s,%s" %(lon,lat)
if not st=="0,0":
# ignore the odd buggy 0,0 coords
print "%s,%s" %(lon,lat)
fo.write("%s,%s\n" %(lon,lat))
except:
pass
time.sleep(1)
fo.close()
You’ll need to find the NSID of the group as an input; you can find this with the flickr API call flickr.group.search.
Now, you have a simple CSV file with the latitude and longitude of each geotagged image in the pool.
Longitude,Latitude -5.167792,58.352519 -4.024359,57.675544 -4.230251,57.497356 -4.2348,57.501045 -4.84703,56.646034 -4.306168,55.873986 -3.586263,56.564732 ...
This demo uses the Photography Guide to Scotland pool.
The next step is to plot the map.
'''
Simple Matplotlib/Basemap pinboard map for
Flickr Groups.
Need to provide a CSV file in following format
Longitude,Latitude
20.1,-3.25
20.225,-3.125
.. etc..
Created on 10 Oct 2009
@author: Steven Kay
'''
from basemap import Basemap
import matplotlib.pyplot as plt
import matplotlib.pylab as pylab
import numpy as np
import string
import matplotlib.cm as cm
x=[] #longitudes
y=[] #latitudes
fi=open(r'C:\infoviz\scotland_photos.csv','r')
linenum=0
for line in fi:
if linenum>0:
line=string.replace(line, "\n","")
try:
fields=string.split(line,",")
lon,lat=fields[0:2]
x.append(float(lon))
y.append(float(lat))
except:
pass
linenum+=1
fi.close()
# cass projection centred on scotland
# will need to replace with a projection more suited
# to the group you're plotting
m = Basemap(llcrnrlon=-8.0,llcrnrlat=54.5,urcrnrlon=1.5,urcrnrlat=59.5,
resolution='h',projection='cass',lon_0=-4.36,lat_0=54.5)
x1,y1=m(x,y)
m.drawmapboundary(fill_color='cyan') # fill to edge
m.drawcountries()
m.drawrivers() # you may want to turn this off for larger areas like continents
m.fillcontinents(color='white',lake_color='cyan',zorder=0)
m.scatter(x1,y1,s=5,c='r',marker="o",cmap=cm.jet,alpha=1.0)
plt.title("Photography Guide to Scotland in FlickR") # might want to change this!
plt.show()
This script uses a projection centred around scotland; you’ll need to change the following line…
m = Basemap(llcrnrlon=-8.0,llcrnrlat=54.5,urcrnrlon=1.5,urcrnrlat=59.5,
resolution='h',projection='cass',lon_0=-4.36,lat_0=54.5)
…to something more suitable for your needs. Basemap provides an intimidating list of projections which should meet your needs.
Categories: Basemap, flickr, Flickr API, Infovis, Matplotlib, Photography, Python
Basemap, Cartography, flickr, Flickr API, geotagging, map, Mapping, Matplotlib, Python






