<?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; geomeme</title>
	<atom:link href="http://hitching.net/tag/geomeme/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:37:59 +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>GeoMeme adds Google Buzz to detect real-time geo-located trends</title>
		<link>http://hitching.net/2010/05/23/geomeme-adds-google-buzz-to-detect-real-time-geo-located-trends/</link>
		<comments>http://hitching.net/2010/05/23/geomeme-adds-google-buzz-to-detect-real-time-geo-located-trends/#comments</comments>
		<pubDate>Sun, 23 May 2010 10:30:42 +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 buzz]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[social]]></category>

		<guid isPermaLink="false">http://hitching.net/?p=16188</guid>
		<description><![CDATA[If you&#8217;ve been using Google Buzz on a mobile phone recently, you would know that you can choose between two filters to the real-time stream of content: Social &#8211; choose &#8216;Following&#8217; to filter the stream based on your social graph, &#8230; <a href="http://hitching.net/2010/05/23/geomeme-adds-google-buzz-to-detect-real-time-geo-located-trends/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img src="http://hitching.net/wp-content/uploads/2010/05/geomeme_adds_google_buzz.png" /></p>
<p>If you&#8217;ve been using <a href="http://www.google.com/mobile/buzz/">Google Buzz</a> on a mobile phone recently, you would know that you can choose between two filters to the real-time stream of content:</p>
<ul>
<li><b>Social</b> &#8211; choose &#8216;Following&#8217; to filter the stream based on your social graph, or social &#8216;circle&#8217; as Google prefers to call it. You will see posts from your friends, and also some public posts from friends-of-friends if the Buzz filtration algorithm thinks you want to flex your social circle.
<li><b>Geo</b> &#8211; choose &#8216;Nearby&#8217; to filter the stream based on your location, as <a href="http://hitching.net/2009/11/10/location-aware-mobile-web-apps-using-google-maps-v3-geolocation/">detected</a> by your mobile phone. You will see public posts from nearby Buzz users, as a chronological list, or located on a map. Most of the value here comes from the stream being updated in real-time.
</ul>
<p><img src="http://hitching.net/wp-content/uploads/2010/05/buzz_mobile_social_geo.png" style="padding:1px;border:1px solid #CCCCCC;" /></p>
<p>Now, with the release of the new <a href="http://code.google.com/apis/buzz/">Google Buzz API</a> from Google Labs, I have added the real-time stream of geo-located Google Buzz content to <a href="http://www.geome.me">GeoMeme</a>, my pet project.</p>
<p><a href="http://www.geome.me">GeoMeme</a> detects real-time geo-located trends, now based on millions of daily posts from various Google Buzz and Twitter and MySpace mobile apps.</p>
<p>GeoMeme can detect, for example, that <a href="http://www.geome.me/NemWJ">Justin Bieber beats Lady Gaga in New York City</a>.</p>
<p><a href="http://www.geome.me/NemWJ"><img src="http://hitching.net/wp-content/uploads/2010/05/geomeme_with_buzz.png" border="0" /></a></p>
<p>If you&#8217;re curious about Justin Bieber, or about the amount and contents of geo-located Buzz posts, compared to geo-located Twitter and MySpace posts, <a href="http://www.geome.me">check it out</a> and let me know what you think.</p>
]]></content:encoded>
			<wfw:commentRss>http://hitching.net/2010/05/23/geomeme-adds-google-buzz-to-detect-real-time-geo-located-trends/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>GeoMeme Wins MySpace Developer Challenge</title>
		<link>http://hitching.net/2010/03/14/geomeme-wins-myspace-developer-challenge/</link>
		<comments>http://hitching.net/2010/03/14/geomeme-wins-myspace-developer-challenge/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 04:13:38 +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[linkedin]]></category>
		<category><![CDATA[myspace]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://hitching.net/?p=16126</guid>
		<description><![CDATA[How exciting! My pet project GeoMeme has been awarded ‘Most innovative use of the Real-Time Stream API’ in the MySpace Developer Challenge. The awards were judged by Mike Jones, MySpace’s new Co-President, and Ron Conway, renowned angel investor, and David &#8230; <a href="http://hitching.net/2010/03/14/geomeme-wins-myspace-developer-challenge/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>How exciting! My pet project <a href="http://www.geome.me">GeoMeme</a> has been awarded ‘Most innovative use of the Real-Time Stream API’ in the <a href="http://www.myspace.com/developerchallenge">MySpace Developer Challenge</a>.</p>
<p><img alt="GeoMeme Wins MySpace Developer Challenge" src="http://hitching.net/wp-content/uploads/2010/03/myspace_developer_challenge.png" style="border:1px solid #CCCCCC;padding:1px" width="198" height="102" /></p>
<p>The awards were judged by <a href="http://www.myspace.com/mike">Mike Jones</a>, MySpace’s new Co-President, and <a href="http://www.crunchbase.com/person/ron-conway">Ron Conway</a>, renowned angel investor, and <a href="http://www.google.com/profiles/dglazer94062">David Glazer</a>, Director of Engineering at Google, and <a href="http://scobleizer.com/">Robert Scoble</a>, tech blogger and uber-geek.</p>
<p>GeoMeme uses the new <a href="http://developerwiki.myspace.com/index.php?title=Category:Real_Time_Stream">MySpace Real-Time Stream API</a> to tap into the flood of geo-located updates being posted by MySpace users all around the world.</p>
<p><a href="http://activitystrea.ms/">Activity Streams</a> from MySpace are mashed up with tweets from a number of mobile Twitter apps, and located onto a Google Map. Local trends are identified using semantic analysis services from Yahoo.</p>
<p>For example, GeoMeme knows that <a href="http://www.geome.me/6anMj">Rihanna beats Lady Gaga in New York</a> and that <a href="http://www.geome.me/vL8Cp">Avatar beats Hurt Locker in Los Angeles</a>.</p>
<p>Beyond the discovery and measurement of real-time local trends, GeoMeme also provides a unique view into local activity streams, as a way to discover new like-minded and nearby friends. You can then buy the t-shirt (really, you can!) to share your trends with your friends.</p>
<p>GeoMeme is a lightning fast web app, and is also available on iPhone as a mobile web app, optimized for mobile using <a href="http://googlegeodevelopers.blogspot.com/2009/11/geolocation-mobile-web-apps-geo.html">Google Maps v3 API</a>. GeoMeme is built on Google App Engine for <a href="http://hitching.net/2009/11/10/scalable-fast-accurate-geo-apps-using-google-app-engine-geohash-faultline-correction/">massive scalability</a>.</p>
<p>And congratulations to the other winners of the Challenge:</p>
<ul>
<li>Best New MySpace App: <a href="http://profile.myspace.com/Modules/Applications/Pages/Canvas.aspx?appId=180074" target="_blank">Paradise Paintball</a></li>
<li>Most innovative use of the Real-Time Stream API: <a href="http://www.geome.me" target="_blank">GeoMeme</a></li>
<li>Most innovative use of the Open Search API: <a href="http://socialmention.com/" target="_blank">Social Mention</a></li>
<li>Most innovative use of the Photos API: <a href="http://www.browsernotincluded.com" target="_blank">Browser Not Included</a></li>
<li>Most innovative MySpace Integration on Mobile: <a href="http://iskoot.com/" target="_blank">iSkoot</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://hitching.net/2010/03/14/geomeme-wins-myspace-developer-challenge/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>GeoMeme adds MySpace real-time local trends</title>
		<link>http://hitching.net/2010/03/04/geomeme-adds-myspace-real-time-local-trends/</link>
		<comments>http://hitching.net/2010/03/04/geomeme-adds-myspace-real-time-local-trends/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 13:10:53 +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[linkedin]]></category>
		<category><![CDATA[myspace]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://hitching.net/?p=16105</guid>
		<description><![CDATA[In other news, GeoMeme now measures real-time local trends based on both MySpace and Twitter content. GeoMeme uses the new Real-Time Stream API from MySpace to tap into the flood of geo-located updates being posted by MySpace users all around &#8230; <a href="http://hitching.net/2010/03/04/geomeme-adds-myspace-real-time-local-trends/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>In other news, <a href="http://www.geome.me">GeoMeme</a> now measures real-time local trends based on both MySpace and Twitter content.</p>
<p>GeoMeme uses the new <a href="http://developerwiki.myspace.com/index.php?title=Category:Real_Time_Stream">Real-Time Stream API</a> from MySpace to tap into the flood of geo-located updates being posted by MySpace users all around the world.</p>
<p><a href="http://www.geome.me"><img src="http://hitching.net/wp-content/uploads/2010/03/myspace_added.png" /></a></p>
<p>MySpace content is mashed up with tweets from a number of mobile Twitter apps, and located onto a Google Map. Local trends are identified using semantic analysis services from Yahoo. </p>
<p>A couple of example GeoMemes generated by all this real-time geo-located content: <a href="http://www.geome.me/6anMj">Rihanna beats Lady Gaga in New York</a>, and <a href="http://www.geome.me/vL8Cp">Avatar beats Hurt Locker in Los Angeles</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://hitching.net/2010/03/04/geomeme-adds-myspace-real-time-local-trends/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>OpenAustralia Hackfest: ‘Mobile + Geo + Social’ slides</title>
		<link>http://hitching.net/2009/11/11/openaustralia-hackfest-mobile-geo-social-slides/</link>
		<comments>http://hitching.net/2009/11/11/openaustralia-hackfest-mobile-geo-social-slides/#comments</comments>
		<pubDate>Wed, 11 Nov 2009 10:44:48 +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[gov2.0]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[openaustralia]]></category>
		<category><![CDATA[social]]></category>

		<guid isPermaLink="false">http://hitching.net/?p=15951</guid>
		<description><![CDATA[I popped into the OpenAustralia Hackfest at the weekend to learn and talk about some of the latest developments in the Gov2.0 revolution. There are now some quite interesting public datasets available, and the developer community is hard at work &#8230; <a href="http://hitching.net/2009/11/11/openaustralia-hackfest-mobile-geo-social-slides/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I popped into the <a href="http://hackfest.openaustralia.org/">OpenAustralia Hackfest</a> at the weekend to learn and talk about some of the latest developments in the Gov2.0 revolution.</p>
<p>There are now some quite interesting public <a href="http://data.australia.gov.au/">datasets</a> available, and the developer community is hard at work turning this data into useful APIs, and building innovative applications to consume the data.</p>
<p>Some of the notable apps to emerge from OpenAustralia include:</p>
<ul>
<li><a href="http://its-buggered-mate.apps.lpmodules.com/">It&#8217;s Buggered, Mate</a> &#8211; from the Canberra Hackfest, a geo app to crowdsource the reporting of broken public infrastructure.</li>
<li><a href="http://www.suburbmatchmaker.com.au/lgabrowser?">Suburb Matchmaker</a> &#8211; the winner of the Sydney Hackfest, a tool to help you find your ideal suburb to live in.</li>
<li><a href="http://fridgemate.creativepossums.net/">FridgeMate</a> &#8211; currently winning the MashupAustralia contest and only a couple of days away from the $10,000 prize. FridgeMate lets you assemble a map of local public amenities to stick on your fridge door. My advice to the Creative Possums behind FridgeMate would be to look at using the <a href="http://www.zazzle.com/magnets">Zazzle API</a> so people could buy the actual fridge magnet.</li>
</ul>
<p>My own presentation focussed on some mobile, geo and social technologies to create location-aware mobile mashups to share OpenGov content with friends on Twitter, friends on Facebook, and *real* friends on a t-shirt. Here&#8217;s the <a href="http://bit.ly/oahack_mgs">deck</a>:</p>
<p><iframe src="http://docs.google.com/present/embed?id=dfs3s34c_58hdnhg5dh" frameborder="0" width="410" height="342"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://hitching.net/2009/11/11/openaustralia-hackfest-mobile-geo-social-slides/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>Scalable, fast, accurate geo apps using Google App Engine + geohash + faultline correction</title>
		<link>http://hitching.net/2009/11/10/scalable-fast-accurate-geo-apps-using-google-app-engine-geohash-faultline-correction/</link>
		<comments>http://hitching.net/2009/11/10/scalable-fast-accurate-geo-apps-using-google-app-engine-geohash-faultline-correction/#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[geohash]]></category>
		<category><![CDATA[geolocation]]></category>
		<category><![CDATA[geomeme]]></category>
		<category><![CDATA[google app engine]]></category>
		<category><![CDATA[linkedin]]></category>

		<guid isPermaLink="false">http://hitching.net/?p=15953</guid>
		<description><![CDATA[GeoMeme is a web app (and also a mobile web app for iPhone and Android) that I recently developed as a pet project. It measures real-time local twitter trends. Visitors to GeoMeme choose a location on the map, and two &#8230; <a href="http://hitching.net/2009/11/10/scalable-fast-accurate-geo-apps-using-google-app-engine-geohash-faultline-correction/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.geome.me/">GeoMeme</a> is a web app (and also a mobile web app for iPhone and Android) that I recently developed as a pet project. It 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/VrIXq"> <img src='http://hitching.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  beats <img src='http://hitching.net/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  in San Francisco</a>:</p>
<p><a href="http://www.geome.me/VrIXq"><img src="http://hitching.net/wp-content/uploads/2009/11/w_screenshot-291x300.png" /></a></p>
<p>A large amount of geo-data is generated by GeoMeme, and so arises a need shared by many geo apps: scalable, fast, and accurate spatial queries, used to select a subset of geo-data for display as markers on a <a href="http://www.geome.me/">map</a>, or on <a href="http://earth.geome.me/">Google Earth</a>.</p>
<h3><img style="width: 21px; height: 34px; float: left; margin-left: 0pt; margin-right: 1em;" src="http://chart.apis.google.com/chart?chst=d_map_pin_letter&#038;chld=:)|FF0000|000000" alt=":)" />Google App Engine</h3>
<p><a href="http://appengine.google.com/">Google App Engine</a> is an obvious choice for hosting your geo app. The App Engine datastore is built on top of Google&#8217;s BigTable technology which scales very well, and is optimized for fast data retrieval. And it doesn&#8217;t cost the earth like some traditional GIS database solutions.</p>
<h3><img style="width: 21px; height: 34px; float: left; margin-left: 0pt; margin-right: 1em;" src="http://chart.apis.google.com/chart?chst=d_map_pin_letter&#038;chld=:(|FF0000|000000" alt=":(" /> Inequality constraint</h3>
<p>If you are coming from a background of relational databases, you might think the solution here would be to store the latitude and longitude of all your markers in a database table, and do a simple query to retrieve only those contained within the bounds of the map.</p>
<p>However, the flipside of being optimized for fast data retrieval is that BigTable only allows inequality filters on a single dimension, to avoid the burden of full table scans. For example, the following form of spatial query is not supported because it specifies inequality filters on both latitude and longitude dimensions:</p>
<p><span id="more-15953"></span></p>
<pre class="brush: python; title: ;">
SELECT latitude, longitude, title FROM myMarkers
WHERE latitude &gt;= :south AND latitude &lt;= :north
  AND longitude &gt;= :west AND longitude &lt;= :east

&gt;&gt;&gt; BadFilterError: invalid filter: Only one property per query may have inequality filters
</pre>
<h3><img style="width: 21px; height: 34px; float: left; margin-left: 0pt; margin-right: 1em;" src="http://chart.apis.google.com/chart?chst=d_map_pin_letter&#038;chld=:)|FF0000|000000" alt=":)" /> Geohash to the rescue</h3>
<p>Fortunately, there is an answer to this: <strong>geohash</strong>, the geocoding system invented by Gustavo Niemeyer.</p>
<p>My suspicion is that Niemeyer has travelled back in time after working out how to collapse two-dimensional space into a single dimension, but you might want to read the Wikipedia explanation of <a href="http://en.wikipedia.org/wiki/Geohash">the algorithm</a> instead.</p>
<p>An example: the location of the Sydney Opera House can be specified in two dimensions as {latitude: -33.858, longitude: 151.215}, or in a single dimension as {geohash: <a href="http://geohash.org/r3gx2ur29zzg7">r3gx2ur29zzg7</a>}.</p>
<p>Schuyler Erle has written an open source geohash <a href="http://mappinghacks.com/code/geohash.py.txt">python module</a>, which enables the following form of spatial query on Google App Engine, because the inequality filter is specified only on a single dimension:</p>
<pre class="brush: python; title: ;">
sw_geohash = Geohash((west, south))
ne_geohash = Geohash((east, north))

SELECT latitude, longitude, title FROM myMarkers
WHERE geohash &gt;= :sw_geohash AND geohash &lt;= :ne_geohash
</pre>
<h3><img style="width: 21px; height: 34px; float: left; margin-left: 0pt; margin-right: 1em;" src="http://chart.apis.google.com/chart?chst=d_map_pin_letter&#038;chld=;(|FF0000|000000" alt=";(" />Don&#8217;t hash me, coz I&#8217;m close to the edge</h3>
<p>However&#8230;! We&#8217;re not done yet, because an artifact of the geohash algorithm is that queries like the one above can often return rogue markers which are outside of the required bounds, when the map spans what we shall call a geohash &#8220;faultline&#8221;.</p>
<p>This problem is particularly evident near the equator and the Greenwich Meridian, which are the biggest faultlines, but there are actually faultlines all over the place at every zoom level.</p>
<h3><img style="width: 21px; height: 34px; float: left; margin-left: 0pt; margin-right: 1em;" src="http://chart.apis.google.com/chart?chst=d_map_pin_letter&#038;chld=:D|FF0000|000000" alt=":D" />Faultline correction</h3>
<p>GeoMeme solves this problem using &#8220;faultline correction&#8221;, an approach that I would like to share here:</p>
<ul>
<li>If a spatial query is vulnerable to faultlines, it is split into multiple sub-queries that do not cross the faultline.</li>
<li>Sub-query limits are approximately weighted according to their relative size.</li>
<li>Sub-queries are executed in parallel, taking advantage of BigTable&#8217;s distributed goodness, and the results combined, so all this happens very fast.</li>
<li>Even though the sub-queries are executed in parallel without any significant impact on user experience, App Engine CPU costs can increase to around 2x the CPU cost of a single less accurate query. Sub-query results are memcached to reduce this CPU overhead.</li>
</ul>
<p>Here&#8217;s a demo showing the effect of geohash faultlines, and the relative accuracy of spatial queries with or without faultline correction. Rogue markers are shown in the area surrounding the map. Switch between Correction: off / on / double and compare the accuracy.</p>
<p><iframe src="http://geohash-fcdemo.appspot.com/" width="600" height="450" frameborder="0"><br />
<a href="http://geohash-fcdemo.appspot.com/"><img src="http://geohash-fcdemo.googlecode.com/svn/trunk/screenshot.png" /></a></iframe></p>
<p>Note: &#8220;double&#8221; correction is an advanced option which splits the sub-queries into sub-sub-queries so that they do not cross any faultlines either. This can further increase accuracy, but with further CPU cost (up to 8x the CPU cost of a single less accurate query).</p>
<p>All the source code can be found <a href="http://code.google.com/p/geohash-fcdemo/">here</a>, including ffGeoSearch, a python module to handle faultline-friendly geo search, if you want to use this technique on your own geo app.</p>
<p>Enjoy!</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/fast-map-re-location-using-google-static-maps-v2-geocoder/">fast map re-location</a> using Google Static Maps v2, and <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.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://hitching.net/2009/11/10/scalable-fast-accurate-geo-apps-using-google-app-engine-geohash-faultline-correction/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>GeoMeme: measure and share real-time local twitter trends</title>
		<link>http://hitching.net/2009/09/13/geomeme-measure-and-share-real-time-local-twitter-trends/</link>
		<comments>http://hitching.net/2009/09/13/geomeme-measure-and-share-real-time-local-twitter-trends/#comments</comments>
		<pubDate>Sun, 13 Sep 2009 11:50:34 +0000</pubDate>
		<dc:creator>bob hitching</dc:creator>
				<category><![CDATA[mobile geo social]]></category>
		<category><![CDATA[geo]]></category>
		<category><![CDATA[geomeme]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[social]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://hitching.net/?p=15848</guid>
		<description><![CDATA[I am pleased to announce the launch of GeoMeme, the fun way to measure and share real-time local twitter trends. I got thinking about this when a recent Los Angeles earthquake was being measured in tweets per second rather than &#8230; <a href="http://hitching.net/2009/09/13/geomeme-measure-and-share-real-time-local-twitter-trends/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.geome.me/" target="_blank"><img src="http://www.geome.me/i/geomeme_logo.png" border="0" /></a></p>
<p>I am pleased to announce the launch of <a href="http://www.geome.me" target="_blank">GeoMeme</a>, the fun way to measure and share real-time local twitter trends.</p>
<p>I got thinking about this when a recent Los Angeles earthquake was being measured in <a href="http://twitter.com/hitching/statuses/1832772593" target="_blank">tweets per second</a> rather than using the <a href="http://en.wikipedia.org/wiki/Richter_magnitude_scale" target="_blank">Richter Scale</a>.</p>
<p>Then came the <a href="http://hitching.net/2009/07/20/how-to-measure-twitter-trending-topics/" target="_blank">Magnitwude Calculator</a> as a standard way to measure the magnitude of Twitter trends.</p>
<p><em>[Then came twotspot.com but that domain name was just too damn <a href="http://twot.urbanup.com/3687907" target="_blank">rude</a>, so it was quickly renamed to GeoMeme.]</em></p>
<h3>What does GeoMeme do?</h3>
<p>GeoMeme measures real-time local twitter trends.</p>
<p><img src="http://www.geome.me/i/help1.png" style="padding:1px;border:1px solid #CCCCCC" /></p>
<p>Tweeps are located on the map using public data from a number of iPhone twitter apps. When twitter launches its <a href="http://blog.twitter.com/2009/08/location-location-location.html" target="_blank">geolocation API</a>, that will be used to locate even more people on the map.</p>
<p>GeoMeme measures and compares how many people on the map are tweeting about each of your two search terms:</p>
<p><img src="http://www.geome.me/i/help3.png" style="padding:1px;border:1px solid #CCCCCC" /></p>
<p>The &#8216;magnitude&#8217; of each search term is equal to the number of unique people tweeting per hour per square kilometer, so it increases when more people are tweeting in a smaller area.</p>
<p>Example: if 100 different people in an area of 10km<sup>2</sup> have tweeted about &#8216;love&#8217; in the last 2 hours, the magnitude is 5.0 (100 divided by 10 divided by 2).</p>
<p>So you can search for &#8216;love&#8217; and &#8216;hate&#8217; and GeoMeme works out which one &#8220;beats&#8221; the other with the higher magnitude.</p>
<p>The default search terms are <img src='http://hitching.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  and <img src='http://hitching.net/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  smiley faces which provides a good measure of local happiness, as an example.</p>
<h3>Can I use my iPhone?</h3>
<p>Sure, or your iPod Touch. Here&#8217;s the screenshot:</p>
<p><img src="http://hitching.net/wp-content/uploads/2009/09/GeoMeme_iPhone_screenshot.png" style="padding:1px;border:1px solid #CCCCCC" /></p>
<h3>Give me an example!</h3>
<p>Thanks to some early coverage on <a href="http://www.theregister.co.uk/2009/09/01/twitter_tracker/" target="_blank">The Register</a>, <a href="http://mashable.com/2009/09/06/hot-twitter-trends/" target="_blank">Mashable</a>, and <a href="http://googlemapsmania.blogspot.com/2009/09/local-twitter-trends-on-google-maps.html" target="_blank">Google Maps Mania</a>, and winning Mashup of the Day on <a href="http://www.programmableweb.com/mashup/geomeme-2?date" target="_blank">ProgrammableWeb</a>, we&#8217;re off to a flying start. I&#8217;m glad GeoMeme is hosted on Google App Engine for scalability.</p>
<p>Here&#8217;s a selection of the most popular GeoMemes so far:</p>
<ul>
<li><a href="http://www.geome.me/XMFwh"> <img src='http://hitching.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  beats <img src='http://hitching.net/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  in New York City</a></li>
<li><a href="http://www.geome.me/FG7ts">Mega Shark beats Giant Octopus in LA</a></li>
<li><a href="http://www.geome.me/dcHDb">Snow Leopard beats Windows 7 in Cupertino</a></li>
<li><a href="http://www.geome.me/yLO2x">bridge beats swimming in San Francisco Bay</a></li>
<li><a href="http://www.geome.me/ZuGsi">wtf beats ftw in Washington</a></li>
</ul>
<h3>How does it all work?</h3>
<p>I will leave the details of how it all works to another post, stay tuned for that.</p>
]]></content:encoded>
			<wfw:commentRss>http://hitching.net/2009/09/13/geomeme-measure-and-share-real-time-local-twitter-trends/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

