<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>mobile geo social &#187; location</title>
	<atom:link href="http://hitching.net/tag/location/feed/" rel="self" type="application/rss+xml" />
	<link>http://hitching.net</link>
	<description>a blog by bob hitching</description>
	<lastBuildDate>Fri, 10 Feb 2012 08:43:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Location-aware mobile web apps using Google Maps v3 + geolocation</title>
		<link>http://hitching.net/2009/11/10/location-aware-mobile-web-apps-using-google-maps-v3-geolocation/</link>
		<comments>http://hitching.net/2009/11/10/location-aware-mobile-web-apps-using-google-maps-v3-geolocation/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 09:40:27 +0000</pubDate>
		<dc:creator>bob hitching</dc:creator>
				<category><![CDATA[mobile geo social]]></category>
		<category><![CDATA[geo]]></category>
		<category><![CDATA[geolocation]]></category>
		<category><![CDATA[geomeme]]></category>
		<category><![CDATA[google maps]]></category>
		<category><![CDATA[lbs]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[location]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://hitching.net/?p=15909</guid>
		<description><![CDATA[When hiring Engineers, I always look for evidence of pet projects, so recently I thought it was fair to create one of my own: GeoMeme, the fun way to measure and share real-time local twitter trends. Visitors to GeoMeme choose &#8230; <a href="http://hitching.net/2009/11/10/location-aware-mobile-web-apps-using-google-maps-v3-geolocation/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>When hiring Engineers, I always look for evidence of pet projects, so recently I thought it was fair to create one of my own: <a href="http://www.geome.me/">GeoMeme</a>, the fun way to measure and share real-time local twitter trends.</p>
<p>Visitors to GeoMeme choose a location on the map, and two search terms to compare. GeoMeme then measures and compares the number of matching tweets within the bounds of the map, based on public data from a number of mobile twitter apps.</p>
<p>As an example, GeoMeme can work out that <a href="http://www.geome.me/bGPjK">&#8216;love&#8217; beats &#8216;hate&#8217; in Manhattan</a>:</p>
<p><a href="http://www.geome.me/bGPjK"><img style="border: 1px solid #cccccc;padding:1px;" src="http://hitching.net/wp-content/uploads/2009/11/i_320x356-269x300.png" /></a></p>
<p><a href="http://www.geome.me/">GeoMeme</a> is a desktop web application and also a location-aware mobile web app for iPhone and Android phones. </p>
<p>Implementing the mobile version of GeoMeme as a web app has some advantages and disadvantages, compared to building native iPhone &#038;/or Android applications.</p>
<p>Native apps are great because they currently offer the deepest integration to the full capability of the phone, for example using device APIs to access Contacts, the Camera Roll, an Accelerometer, or the GPS chip. For some applications, this deep device integration is essential and so a native application is beneficial.</p>
<p>On the other hand, emerging HTML5-based mobile browsers are aiming to standardise integration to such device APIs, starting with Geolocation APIs; meaning that location-aware mobile web apps are now becoming viable. Aligned with this development is the new version of the Google Maps API. v3 has been greatly simplified since v2, and is now optimized for use on mobile phones. Less is more.</p>
<p>The deciding factor for me choosing to build a mobile web app for GeoMeme rather than a native app was development speed. A mobile web app enjoys far greater code re-use from the desktop web version, and it is possible to push regular updates and improvements to users, without having to wait for appstore approval or for users to upgrade.</p>
<p>I believe this need for development speed is common among a good proportion of mobile apps that are still in &#8216;rapid iteration&#8217; or &#8216;release early, release often&#8217; mode, so this post is intended to share some of the techniques used in GeoMeme with developers wanting to build their own location-aware mobile web apps.</p>
<p>Let&#8217;s build an example location-aware mobile web app called &#8216;Here I Am!&#8217;, for the photographically challenged. The app will present some local photographs (from Panoramio) which can be shared with friends on Twitter or Facebook.</p>
<h3>Where on earth is that mobile phone..?</h3>
<p>The first job of a location-aware mobile app is to work out where on earth the mobile phone currently is. Unfortunately, at the time of writing, there is still no universally reliable and accurate solution for a mobile web app to detect the location of the mobile phone it is running on. However the following partial solutions can be combined to good effect:</p>
<p><span id="more-15909"></span></p>
<h4>a) Google Loader</h4>
<p>Load the Google Maps v3 API using <a href="http://code.google.com/apis/ajax/documentation/#AutoLoading">Google Loader</a>:</p>
<pre class="brush: jscript; title: ;">
&lt;script type=&quot;text/javascript&quot; src=&quot;http://www.google.com/jsapi?key=YOUR_API_KEY&amp;autoload=%7Bmodules%3A%5B%7Bname%3A%22maps%22%2Cversion%3A3%2Cother_params%3A%22sensor%3Dtrue%22%7D%5D%7D&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
google.setOnLoadCallback(function() {
    // initialize the mobile map...
});
&lt;/script&gt;
</pre>
<p>Google Loader requires developers to sign up for an API key, however the advantage of this approach is that the <a href="http://code.google.com/apis/ajax/documentation/#ClientLocation">approximate location</a> of the user is revealed, based on network IP address.</p>
<p>In the case of a mobile phone user, this network IP address often refers to the mobile operator&#8217;s internet gateway, which can be shared between a large number of subscribers spread over an entire country. This technique becomes more accurate for mobile phones which are connected to the internet via wi-fi rather than GPRS, or becomes less accurate for some phones (e.g. Blackberry) which can connect to the internet via international proxy servers.</p>
<p>Generally, this technique can be successful in working out which country the user is in, but cannot be assumed to be any more accurate than that.</p>
<p>Some example javascript to locate a map based on Google Loader:</p>
<pre class="brush: jscript; title: ;">
if (typeof(google.loader.ClientLocation) != 'undefined') {
	var lat = google.loader.ClientLocation.latitude;
	var lng = google.loader.ClientLocation.longitude;
	var position = new google.maps.LatLng(lat, lng);
	map.setOptions({
		center: position,
		zoom: 10
	});
}
</pre>
<h4>b) W3C Geolocation API</h4>
<p>The World Wide Web Consortium (W3C) has been working since 2008 to standardise web <a href="http://dev.w3.org/geo/api/spec-source.html">geolocation APIs</a>.</p>
<p>Mobile Safari on iPhone (since OS3.0) already supports the emerging W3C standard, to expose location information derived from its GPS chip. The new Chrome mobile browser on Android (from 2.0 Eclair) will also support this standard. For example:</p>
<pre class="brush: jscript; title: ;">
if (typeof(navigator.geolocation) != 'undefined') {
	navigator.geolocation.getCurrentPosition(function(position) {
		var lat = position.coords.latitude;
		var lng = position.coords.longitude;
		var position = new google.maps.LatLng(lat, lng);
		map.setOptions({
			center: position,
			zoom: 15
		});
	});
}
</pre>
<p>The W3C Geolocation API looks likely to feature as part of HTML5 (the next major revision of HTML), and will also be supported by the next generation of Webkit-based mobile browsers, so expect this technique to start working on an increasing proportion of new mobile phones.</p>
<h4>c) Google Gears for Mobile</h4>
<p>Gears adds a number of HTML5 features, including a Geolocation API, to legacy web browsers. Although it is possible for Windows IE Mobile and Mobile Opera browsers to become location-aware in this way, the bigger opportunity here is that Android phones (from version 1.0 through 1.6) come with Gears already pre-installed. This means that we can detect the location of these Android phones with the following javascript:</p>
<pre class="brush: jscript; title: ;">
if (typeof(google.gears) != 'undefined') {
	var geo = google.gears.factory.create('beta.geolocation');
	geo.getCurrentPosition(function(position) {
		var lat = position.latitude;
		var lng = position.longitude;
		var position = new google.maps.LatLng(lat, lng);
		map.setOptions({
			center: position,
			zoom: 15
		});
	});
}
</pre>
<p>Google Gears for Mobile works out the location of a mobile phone from the GPS chip in the phone, or by <a href="http://googlemobile.blogspot.com/2008/06/google-enables-location-aware.html">crowdsourcing</a> the location of the cell-tower to which the mobile phone is connected.</p>
<h3>&#8230; and fetch me some location-based content, fast!</h3>
<p>Once your mobile web app is location-aware, the next thing to do is to retrieve some relevant content, based on current location. <a href="http://www.geome.me/">GeoMeme</a> retrieves local tweets using the Twitter API, but for &#8216;Here I Am!&#8217; we&#8217;ll retrieve local photos from Panoramio (see <a href="http://www.panoramio.com/api/">http://www.panoramio.com/api/</a> for details of the API).</p>
<p>Google Maps v3 API includes a convenient new &#8216;idle&#8217; event which is fired when the map becomes idle after panning or zooming, or after automatic geo-location using the techniques above. By listening for this event, we can fetch the most popular local photos from Panoramio whenever the map is moved. For example:</p>
<pre class="brush: jscript; title: ;">
google.maps.event.addListener(map, 'idle', function() {
    loadPhotos();
});

function loadPhotos() {
    var url = 'http://www.panoramio.com/map/get_panoramas.php?order=popularity&amp;set=public&amp;from=0&amp;to=20&amp;size=mini_square&amp;callback=addPhotos';
    var bounds = map.getBounds();
    url += '&amp;minx=' + bounds.getSouthWest().lng().toFixed(6) + '&amp;miny=' + bounds.getSouthWest().lat().toFixed(6);
    url += '&amp;maxx=' + bounds.getNorthEast().lng().toFixed(6) + '&amp;maxy=' + bounds.getNorthEast().lat().toFixed(6);
    url += '&amp;ts=' + new Date().getTime(); // prevent caching

    // use JSONP to retrieve photo data
    // and trigger a callback to addPhotos()
    var script = document.createElement(&quot;script&quot;);
    script.setAttribute(&quot;src&quot;, url);
    script.setAttribute(&quot;type&quot;, &quot;text/javascript&quot;);
    document.body.appendChild(script);
}
</pre>
<p>The above code sends the resulting JSON data to the <span style="font-family: Courier New;">addPhotos()</span> callback function, which handles the display of the photos on the map using <a href="http://code.google.com/apis/maps/documentation/v3/overlays.html#SimpleIcons">Icons</a>, another new feature of Google Maps v3 API.</p>
<p>For speed, we also implement a performance optimization here. Existing Icons are re-used, rather than simply removing and adding new Icons each time the map is relocated:</p>
<pre class="brush: jscript; title: ;">
var markers = {};

function addPhotos(data) {
	var new_markers = {};

	for (var i = 0; i &amp;amp;lt; data.photos.length; i++) {
		var photo = data.photos[i];

		// for speed and to reduce flicker,
		// reuse existing markers rather than removing and re-adding
		if (photo.photo_id in markers) {
			new_markers[photo.photo_id] = markers[photo.photo_id];
		} else {
			// create new marker
			marker = new google.maps.Marker({
				position: new google.maps.LatLng(photo.latitude, photo.longitude),
				icon: photo.photo_file_url,
				map: map
			});
			new_markers[photo.photo_id] = marker;
		}
	}

	// remove old markers
	for (var photo_id in markers) {
		if (!(photo_id in new_markers)) {
			markers[photo_id].setMap(null);
			delete markers[photo_id];
		}
	}

	markers = new_markers;
}
</pre>
<h2>&#8216;Here I Am!&#8217; &#8211; a simple location-aware mobile web application</h2>
<p>The final part of &#8216;Here I Am!&#8217; is a feature to share one of the Panoramio photos to friends on Twitter or Facebook. This is done using ordinary web links to Twitter and Facebook share pages. No complex platform integration is required for web apps to do this because, as they say, &#8220;the web is the platform.&#8221; Simply click on a photo on the map and follow the prompts.</p>
<p>Visit <a href="http://j.mp/lbsdemo">http://j.mp/lbsdemo</a> on your mobile phone to try out &#8216;Here I Am!&#8217;</p>
<p><iframe src="http://lbs-postcard.googlecode.com/svn/trunk/hero_frame.html" width="250" height="500" frameborder="0"><br />
<a href="http://lbs-postcard.googlecode.com/svn/trunk/hero_frame.html"><img src="http://lbs-postcard.googlecode.com/svn/trunk/hero_hereiam.png" /></a></iframe></p>
<p>The full source code of &#8216;Here I Am!&#8217; (weighing in at just under 8Kb) can be located <a href="http://code.google.com/p/lbs-postcard/">here</a>.</p>
<p>The app has been tested to work on iPhone, iPod Touch, Android, and Symbian Series 60 (which remains &#8211; for now at least &#8211; the dominant device family for mobile data consumption).</p>
<p>I hope you enjoy using some of these ideas in your own location-aware mobile web apps.</p>
<p><em>This post is one of a <a href="http://googlegeodevelopers.blogspot.com/2009/11/geolocation-mobile-web-apps-geo.html">series</a> that aims to share some of the technology innovation that can be found in <a href="http://www.geome.me/">GeoMeme</a>. Other posts cover topics such as using Google App Engine for <a href="http://hitching.net/2009/11/10/scalable-fast-accurate-geo-apps-using-google-app-engine-geohash-faultline-correction/">scalable and fast hosting</a> of your location-based content, and <a href="http://hitching.net/2009/11/10/fast-map-re-location-using-google-static-maps-v2-geocoder/">fast map re-location</a> using Google Static Maps v2.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://hitching.net/2009/11/10/location-aware-mobile-web-apps-using-google-maps-v3-geolocation/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Fast map re-location using Google Static Maps v2 + geocoder</title>
		<link>http://hitching.net/2009/11/10/fast-map-re-location-using-google-static-maps-v2-geocoder/</link>
		<comments>http://hitching.net/2009/11/10/fast-map-re-location-using-google-static-maps-v2-geocoder/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 01:00:00 +0000</pubDate>
		<dc:creator>bob hitching</dc:creator>
				<category><![CDATA[mobile geo social]]></category>
		<category><![CDATA[geo]]></category>
		<category><![CDATA[geo-autocomplete]]></category>
		<category><![CDATA[geocode]]></category>
		<category><![CDATA[geomeme]]></category>
		<category><![CDATA[google maps]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[location]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[static maps]]></category>

		<guid isPermaLink="false">http://hitching.net/?p=15938</guid>
		<description><![CDATA[GeoMeme is a pet project of mine. It&#8217;s a web app, and also a mobile web app for iPhone and Android, that measures real-time local twitter trends. Visitors to GeoMeme choose a location on the map, and two search terms &#8230; <a href="http://hitching.net/2009/11/10/fast-map-re-location-using-google-static-maps-v2-geocoder/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.geome.me/">GeoMeme</a> is a pet project of mine. It&#8217;s a web app, and also a mobile web app for iPhone and Android, that measures real-time local twitter trends.</p>
<p>Visitors to GeoMeme choose a location on the map, and two search terms to compare. GeoMeme then measures and compares the number of matching tweets within the bounds of the map, based on public data from a number of mobile twitter apps.</p>
<p>As an example, GeoMeme can work out that <a href="http://www.geome.me/Rebr1">&#8216;District 9&#8242; beats &#8216;Inglorious Basterds&#8217; in Manhattan</a>.</p>
<p>As well as offering users the normal pan and zoom controls to move the map around, GeoMeme also introduces an innovative geo-autocomplete control which is powered by the geocoder service from <a href="http://code.google.com/apis/maps/documentation/v3/">Google Maps v3 API</a> and the new <a href="http://code.google.com/apis/maps/documentation/staticmaps/">Static Maps v2 API</a>.</p>
<p><img style="width: 301px; height: 314px; border: 1px solid #cccccc; padding: 1px;" src="http://www.geome.me/i/help1.png" /></p>
<p>This blog post shares some details of how the geo-autocomplete control works, and offers some code so you can build your own geo-autocomplete controls.</p>
<p><strong>1. Based on a partial location typed by the user, obtain a list of possible matching locations</strong>:</p>
<p>If the user has already typed &#8216;San&#8217; into a form field, we can obtain a list of possible matching locations by passing this partial location to the geocoder service from Google Maps v3 API, as follows:</p>
<p><span id="more-15938"></span></p>
<pre class="brush: jscript; title: ;">
var partial_location = document.getElementById(&quot;location&quot;).value;
var geocoder = new google.maps.Geocoder();

geocoder.geocode({'address': partial_location}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
        document.getElementById(&quot;results&quot;).innerHTML = '';
        for (var i = 0; i &lt; results.length; i++) {
            showResult(results[i]);
        }
    } else {
        document.getElementById(&quot;results&quot;).innerHTML = 'Geocode was not successful for the following reason: ' + status;
    }
});

function showResult(result) {
    document.getElementById(&quot;results&quot;).innerHTML += 'It could be: ' + result.formatted_address + '&lt;br/&gt;';
}
</pre>
<p><strong>2. Decorate these possible matching locations with a Static Maps thumbnail to help the user choose the right one:</strong></p>
<p>The geocoder returns more than just a formatted address. The full response is a JSON object of the following form:</p>
<pre class="brush: jscript; title: ;">
results[]: {
    types[]: google.maps.GeocoderLocationType,
    formatted_address: String,
    address_components[]: {
        short_name: String,
        long_name: String,
        types[]: String
    },
    geometry: {
        location: LatLng,
        location_type: String,
        viewport: LatLngBounds,
        bounds: LatLngBounds
    }
}
</pre>
<p><strong style="font-family: Courier New;">geometry.viewport</strong> represents the recommended viewport for each returned result, from which we can derive the required Static Maps URL, as follows:</p>
<pre class="brush: jscript; title: ;">
function showResult(result) {
    var src = 'http://maps.google.com/maps/api/staticmap';

    // the visible parameter specifies one or more locations
    // to show on the map. so we need to specify the south-west
    // and north-east corners of geometry.viewport
    src += '?visible=' + result.geometry.viewport.getSouthWest().toUrlValue() + '|' + result.geometry.viewport.getNorthEast().toUrlValue();

    // other parameters as per http://code.google.com/apis/maps/documentation/staticmaps/#URL_Parameters
    src += '&amp;size=100x100&amp;maptype=terrain&amp;key=YOUR_API_KEY&amp;sensor=false';

    document.getElementById(&quot;results&quot;).innerHTML += '&lt;img src=&quot;' + src + '&quot; /&gt; ' + result.formatted_address + '&lt;br/&gt;';
}
</pre>
<p>Working out the required Static Maps URL is now a much simpler task with v2 of the Static Maps API, because there is no longer any need to manually calculate a zoom level or latitude / longitude span values.</p>
<p>You can see this working on <a href="http://www.geome.me/Q9zbo">GeoMeme</a> by clicking on the location control at the top of the screen and entering a partial location. When you choose from the list of possible matches, the main map is moved to that location, providing a refreshingly quick way for users to re-position the map.</p>
<p>You can also download a hello world example <a href="http://code.google.com/p/geo-autocomplete/">here</a>, built as a jQuery plugin to work with a modified version of the excellent Autocomplete plugin:</p>
<p><iframe src="http://geo-autocomplete.googlecode.com/svn/trunk/demo/index.html" width="550" height="480" frameborder="0"><br />
<a href="http://geo-autocomplete.googlecode.com/svn/trunk/demo/index.html"><img src="http://geo-autocomplete.googlecode.com/svn/trunk/demo/screenshot.png" /></a></iframe></p>
<p>Using this <a href="http://code.google.com/p/geo-autocomplete/">geo-autocomplete</a> plugin is recommended because it includes a number of features which protect the geocoder service from being hit too often. Including; waiting for keystrokes to stop before sending a request to the geocoder, waiting for a minimum number of characters to by typed, and caching geocoder responses to avoid duplicate requests. Options are also available to set the size and maptype of the Static Map thumbnails.</p>
<p><b>Update: geo-autocomplete has been rebuilt upon the jQuery UI framework, as a UI Widget rather than a jQuery plugin, with more powerful options for customization.</b></p>
<p><em>This post is one of a <a href="http://googlegeodevelopers.blogspot.com/2009/11/geolocation-mobile-web-apps-geo.html">series</a> that aims to share some of the technology innovation that can be found in <a href="http://www.geome.me/">GeoMeme</a>. Other posts cover topics such as <a href="http://hitching.net/2009/11/10/location-aware-mobile-web-apps-using-google-maps-v3-geolocation/">location-aware mobile web apps</a> using Google Maps v3, and <a href="http://hitching.net/2009/11/10/scalable-fast-accurate-geo-apps-using-google-app-engine-geohash-faultline-correction/">scalable geo apps</a> using Google App Engine.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://hitching.net/2009/11/10/fast-map-re-location-using-google-static-maps-v2-geocoder/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>The Human Race and Space/Time poverty</title>
		<link>http://hitching.net/2008/03/15/the-human-race-and-spacetime-poverty/</link>
		<comments>http://hitching.net/2008/03/15/the-human-race-and-spacetime-poverty/#comments</comments>
		<pubDate>Fri, 14 Mar 2008 20:36:19 +0000</pubDate>
		<dc:creator>bob hitching</dc:creator>
				<category><![CDATA[mobile geo social]]></category>
		<category><![CDATA[geo]]></category>
		<category><![CDATA[human race]]></category>
		<category><![CDATA[location]]></category>
		<category><![CDATA[singapore]]></category>
		<category><![CDATA[walking]]></category>

		<guid isPermaLink="false">http://hitching.net/2008/03/15/the-human-race-and-spacetime-poverty/</guid>
		<description><![CDATA[When I found out that the human race was speeding up, by around 10% over the past decade, I deliberately walked around slower that day. A study carried out in the early 1990s demonstrated that pedestrians’ speed of walking provides &#8230; <a href="http://hitching.net/2008/03/15/the-human-race-and-spacetime-poverty/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>When I found out that the human race was speeding up, by around 10% over the past decade, I deliberately walked around  slower that day.</p>
<p>A study carried out in the early 1990s demonstrated that pedestrians’ speed of walking provides a reliable measure of the pace of life in a city, and that people in fast-moving cities are less likely to help others and have higher rates of coronary heart disease.</p>
<p>Using identical methods to those employed in the previous work, the present day research teams discovered that the pace of life is now 10% faster than in the early 1990s. The biggest changes were found in the Far East, with the pace of life in Guangzhou (China) increasing by over 20%, and Singapore showing a 30% increase, resulting in it becoming the fastest moving city in the study. More <a href="http://www.richardwiseman.com/quirkology/pace_home.htm">here</a> from Richard Wiseman.</p>
<p>I find that rate of evolutionary acceleration a bit unnerving. And here I am, sleepless in Sydney at 4am, waiting for baby to arrive and now wondering if there&#8217;s any geo dimension to all of this. So here goes:</p>
<ol>
<li>A Google <a href="http://spreadsheets.google.com/pub?key=p5rigHdQXgoff_DGWZ8L6Qg">spreadsheet</a> of the data</li>
<li>geo-coding from <a href="http://www.geonames.org/export/geonames-search.html">Geonames</a>, imported into the spreadsheet using <a href="http://documents.google.com/support/spreadsheets/bin/answer.py?hl=en&#038;answer=75507">importXML</a></li>
<li>a <a href="http://www.flickr.com">flickr</a> photo of someone walking in each city, imported into the spreadsheet using <a href="http://documents.google.com/support/spreadsheets/bin/answer.py?hl=en&#038;answer=75507">importFeed</a> via a Yahoo <a href="http://pipes.yahoo.com/pipes/pipe.info?_id=EJeE6Pfx3BG23iwMjtzu1g">Pipe</a>.  The photos don&#8217;t look too releveant, maybe I need to clean my pipe.</li>
<li>some Google Maps code generated from Pamela Fox&#8217;s <a href="http://gmaps-samples.googlecode.com/svn/trunk/spreadsheetsmapwizard/makecustommap.htm">Spreadsheet Map Wizard</a></li>
</ol>
<h3>Space/Time poverty: how fast do people walk, where?</h3>
<p>Click on the markers or list to see how fast.</p>
<div style="width:575px; font-family:Arial,sans-serif; font-size:11px; border:1px solid black">
<table id="cm_mapTABLE">
<tbody>
<tr id="cm_mapTR">
<td>
<div id="cm_map" style="width:450px; height:450px"></div>
</td>
</tr>
</tbody>
</table>
</div>
<p><script src="http://maps.google.com/maps?file=api&#038;v=2&#038;key=ABQIAAAAbnvDoAoYOSW2iqoXiGTpYBQXORlegGR5KwfkdLJD1dGigRCduhR3v2pj487UHjEAsgBkxVBmlr8avw" type="text/javascript"></script><br />
<script src="/humanrace.js" type="text/javascript"></script></p>
]]></content:encoded>
			<wfw:commentRss>http://hitching.net/2008/03/15/the-human-race-and-spacetime-poverty/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

