Monday, March 31, 2008
SoFoMoBoGoGoGo
Posted by Unknown at 7:38 AM 4 comments
Labels: creativity, inspiration, sofobomo
Sunday, March 30, 2008
the candid frame
Posted by Unknown at 6:49 AM 0 comments
Labels: artists, inspiration, photographers interviews, portraits, process, strangers
Friday, March 28, 2008
flickr set parser for GPSVisualizer
Geekier than normal post today. If you aren't interested in python programming, flickr's API and GPS display of images in Google maps or Google Earth then I'd stop reading now. Here's another picture from Death Valley. See you again tomorrow.
Right. Still here ? I've been using GPSVisualizer to combine a GPS tracklog, with geotagged images on flickr. Images are entered into GPSVisualizer as a series of CSV values, in a fairly flexible format. The first line provides the layout:latitude, longitude, name, url, thumbnail, descEach line after that is one entry for an image, with the location in decimal degrees, followed by various text fields containing the description, title and links to the actual image. For example:
36.366953, -117.391867, "shot up car", "http://flickr.com/photos/mcgregorphoto/2355449153/", "http://farm3.static.flickr.com/2323/2355449153_c733f5ee1e.jpg", "a long way from nowhere, burnt out and shot up, just off the access road" 36.442947, -117.435447, "half way point", http://flickr.com/photos/mcgregorphoto/2356283640/, http://farm3.static.flickr.com/2388/2356283640_be78036888.jpg, "lunch about half way into the hike"Initially I generated this file by hand, extracting the EXIF location from the image files using exiftool. I then went through each image, entered a title, found the URL for the image on flickr, extracted the URL for a thumbnail image and added a longer description. This was painful to say the least. It was only 16 images but it was a pain. Particularly as all the information was already there, in a flickr set. So I looked up the information on the flickr API, found a python library to access it and wrote the script below in half an hour. Given the URL or set id for a flickr set, it iterates over all of the photos and produces a CSV formatted list that's suitable to load straight into GPSVisualizer. This can then be linked along with the original GPS track log to generate a map with images and also the path traveled. It can be used for both Google Earth and Google maps path generation and runs pretty quickly. I'm posting it here in case it proves useful to anyone. To run, you'll need an up to date python install and additionally will need to download and install the flickrAPI for python. The final step is to obtain an API key for flickr. This key has to be added to the script, in the marked location. Once installed the program is run with:
python flickr2gpsv.py -s set_id > results.csvor, alternatively,
python flickr2gpsv.py -s http://www.flickr.com/set_url/ > results.csvIf you find this useful, please let me know. You can download the script here. (probably better than cutting and pasting from below, because the download will keep the correct indentation). The archived version also includes a patch from Brad Crittenden to add unicode support.
# Author : Gordon McGregor # Contact: http://gordonmcgregor.blogspot.com # # License : public domain # # Purpose: parses a flickr set to extract information to generate a map overlay, via http://gpsvisualizer.com # # Usage: python flickr2gpsv.py -s 72157604221838137 # or # python flickr2gpsv.py -s http://flickr.com/photos/mcgregorphoto/sets/72157604221838137/ # # If the URL is given, the set_id is automatically extracted # Typically, you'll want to redirect the output to a file, as errors & comments will appear on stderr (not in the file) # # e.g., python flickr2gpsv.py -s 72157604221838137 > output_list.csv # # # only generates entries for photos with geographic information attached # # Required libraries: # the flickrapi python libraries, from http://flickrapi.sourceforge.net/ # installation info here http://flickrapi.sourceforge.net/installation.html # import flickrapi import time import sys from optparse import OptionParser from urlparse import urlparse # enter your api_key here to connect to flickr # obtain one from http://www.flickr.com/services/api/keys/apply/ # api_key = 'your_key_goes_here' def getURL(sizes, size): for element in sizes.sizes[0].size: if element['label'] == size: return element['source'] raise flickrapi.exceptions.FlickrError, "No " + size+ " URL found." # the main routine # pass in a flickr set id # outputs the appropriate data for GPSVisualizer to stdout def parseSet(set_id): cnt = 0 flickr = flickrapi.FlickrAPI(api_key) photoset = flickr.photosets_getPhotos(photoset_id=set_id) # iterate over list of photos in list print 'latitude, longitude, name, thumbnail, url, desc' for photo in photoset.photoset[0].photo: try: # get the various bits of data sizes = flickr.photos_getSizes(photo_id = photo['id']) info = flickr.photos_getInfo(photo_id = photo['id']) # extract the required fields try: lat = info.photo[0].location[0]['latitude'] lon = info.photo[0].location[0]['longitude'] except AttributeError: raise flickrapi.exceptions.FlickrError, "No Geographical data found." name = photo['title'] thumbnail = getURL(sizes, 'Small') url = info.photo[0].urls[0].url[0].text desc = info.photo[0].description[0].text.strip() # strip to remove extra newlines if(len(desc)): print '%s, %s, "%s", "%s", "%s", "%s"' % (lat, lon, name, thumbnail, url, desc) else: print '%s, %s, "%s", "%s", "%s",' % (lat, lon, name, thumbnail, url) sys.stderr.write('.') cnt = cnt + 1 except flickrapi.exceptions.FlickrError, e: sys.stderr.write( '\n'+photo['title'] +' : ' + e.__str__() + ' Skipping.\n') return cnt def main(argv=None): if argv is None: argv = sys.argv usage = "usage: %prog [options]\nPass in a flickr set to produce output suitable for GPSVisualizer's google maps overlay" opt_parser = OptionParser(usage=usage) opt_parser.add_option('-s', '--set', dest='set', help="flickr set to process (full url or set number)") (options, args) = opt_parser.parse_args() if(options.set == None): opt_parser.print_help() return 1 # treat the command line value as a url url = urlparse(options.set) # even if it is just a set id, the value ends up in field 3 after urlparse (url[2]) # this removes any trailing /, explodes around any remaining /'s and takes the last value [-1] # works for a full URL or simple set id set_id = url[2].strip('/').split('/')[-1] if (not set_id.isdigit()): sys.stderr.write("set_id" + set_id + "is not a number. This is not expected.") return 1 sys.stderr.write("Processing set id "+set_id+"\n") start_time = time.time() num = parseSet(set_id) end_time = time.time() total_time = end_time - start_time average = 0 if(num): average = total_time/num results = "\nProcessed %d valid photos in %0.1f seconds (%0.2f seconds/photo). Finished.\n" % (num, total_time, average) sys.stderr.write(results) if __name__ == "__main__": sys.exit(main())
Posted by Unknown at 10:55 PM 2 comments
Wednesday, March 26, 2008
high dynamic range - it's not just for Saturday mornings
Posted by Unknown at 8:59 PM 1 comments
Labels: hdr, landscapes, process
SoFoBoMoSho
Tuesday, March 25, 2008
SoFoBoMoExpresso
Posted by Unknown at 9:37 PM 2 comments
SoFoMoBoCheapo
More of a 2 for the price of 1 deal, rather than 'one book free' but it might be useful for anyone doing the SoFoMoBo thing. Offer info is here. I'm not endorsing or reviewing mypublisher here, just passing on the coupon offer. They may well spam your email to death too. I suggest using a disposable email account, such as those available from Spamgourmet.com
Posted by Unknown at 8:58 PM 0 comments
Sunday, March 23, 2008
birthday in the valley
One of the reasons I went to Death Valley at the beginning of the month was to spend my birthday out there. Amanda was away for work and I wanted do something, rather than sitting around the house! I spent the first few days doing a bit of short hiking and taking a lot of pictures. I wanted to try something a bit more adventurous on my actual birthday. I got up bright and early on the 4th, at 4:30am and headed out to the Badwater salt flats to shoot the pre-dawn and sunrise. A quiet, soft start to the day and almost nobody out there. I walked out further than I've been before, about a mile and a half, to where the salt really gets flat and white. Peaceful, beautiful and not a sound. Amanda recorded herself singing 'Happy Birthday' on my birthday present, a digital audio recorder, so I listened to that a few times out there!
After breakfast and a bit of packing, I drove over to the Panamint Valley. Both times I'd been to the park before I'd looked longingly at the Panamint dunes. They are a bit tough to get to - about 6 miles of dirt roads then another 5 mile cross country hike, over a rocky alluvial fan then up through sand dunes. You can see the road in the distance on the far left of this shot and then the dunes on the hillside to the far right. This time I was going to get there. The hike was great - I took about a gallon and a half of water, my camera and some food and set off up to the dunes. It was a warm 85F and sunny at the start and got pretty hot as the afternoon wore on. Click here for a flickr slideshow of the hike. The soft dirt and sand made for quite tough going and I averaged a slow 2.5 mph on the way up. Just before the dunes, I found a big creosote bush and slept under it for an hour while the shadows lengthened and the light got better for photos. My Tilley hat made for a great shade, hung up in the branches of the bush. That was the first respite from the sun I'd found all afternoon and it was really welcome. So much cooler out there out of the sun with the really low humidity. Lovely. About 3 pm I left the pack behind and walked up into the dunes with my camera. It was a beautiful experience to have that whole expanse of dunes to myself, no foot prints, no people, no noise. Nobody for miles around. The dunes there are steeper than those near Stove Pipe Wells, the hillside and wind have combined to really pile them high and sharp. A couple of times I wasn't sure I'd be able to make it to the top of the highest dune, I almost rolled off down one slope. Eventually though I clambered to the top - the view was stunning - all the valley opened out below me. The narrow peak of the dune actually split into the 3 spines - a star shaped dune! Shooting right at the top was a bit disorientating, looking through the camera and trying not to step off into space. I sat for a while and drank it all in. Heading back down was a whole lot easier, once I found my pack. Creosote bushes all look the same from a distance! A GPS waypoint made life easier, though I did worry about my batteries dying. It was all downhill to the car and not so much weight to carry either. I think I need to find some hikes where I start off at the top, hike down drinking the water then have a lighter load to carry up the hill! I got back to the car just as the sun dipped behind the mountains. All in all, a great way to spend my birthday. A really beautiful desert hike. Lots more pictures in the map below - click on the labels on the right or zoom in and pan around. I've been trying out various GPS tools and GPS Visualizer has been really useful. Massaging the data into a form to create the map above took a bit of work, some use of GPSBabel and a few custom python scripts that I wrote to convert co-ordinates into the right forms. The profile came straight from the GPS track log.Posted by Unknown at 11:12 PM 2 comments
Labels: "death valley", geeky, gps, insanity, landscapes
Saturday, March 22, 2008
Friday, March 21, 2008
dune dawn
Posted by Unknown at 7:56 AM 2 comments
Labels: "death valley", landscapes
Thursday, March 20, 2008
sunspot
Wednesday, March 19, 2008
dawkins
Posted by Unknown at 11:03 PM 3 comments
Labels: geeky
trial balloon: experiences with blurb.com
Posted by Unknown at 7:29 AM 7 comments
Tuesday, March 18, 2008
the great cheese race
Amanda will attest to my love of cheese. This event is one of the things I'd love to participate in or photograph. Some day.
Posted by Unknown at 11:39 PM 2 comments
Labels: geeky
photography. book. now.
good enough
Monday, March 17, 2008
work in progress
Posted by Unknown at 6:44 AM 4 comments
Labels: sofobomo
Saturday, March 15, 2008
sharpie
Posted by Unknown at 10:49 PM 0 comments
Friday, March 14, 2008
happy π day
Posted by Unknown at 1:59 PM 0 comments
Labels: geeky
ghost rider meets Venus
Posted by Unknown at 12:24 AM 0 comments
Labels: "death valley"
Wednesday, March 12, 2008
zabriske
Posted by Unknown at 10:43 PM 1 comments
Labels: "death valley"
Austin Strobist GTG
Posted by Unknown at 9:11 PM 0 comments
Tuesday, March 11, 2008
titus canyon
Posted by Unknown at 10:35 PM 2 comments
Labels: "death valley", gps
stove pipe wells
Posted by Unknown at 7:55 AM 2 comments
Labels: "death valley", process
Monday, March 10, 2008
contrast
Posted by Unknown at 7:52 AM 1 comments
Labels: "death valley", "las vegas", colour
Sunday, March 09, 2008
GPS tagging
- Geotagging on Wikipedia
- Geotagging on Flickr
- Geocoding photos on Wikipedia
- Imageingester pro (another tagging program that I hear works well on the Mac)
Saturday, March 08, 2008
birthday
Posted by Unknown at 5:10 PM 0 comments
Labels: books
Thursday, March 06, 2008
rhyolite
Posted by Unknown at 8:00 AM 5 comments
Labels: "death valley", portraits