Fun with Maps and PHP

Preview:

DESCRIPTION

On a recent road trip around Iceland, my friends (PHP developers Andrei and Helgi) and I decided to make a travel site. We brought our cameras, GPS, and Flips, and we used PHP to: * Aggregate our experience in the form of photos (Flickr), tweets (Twitter), and videos (Vimeo). * Geotag all of these assets, so we'd remember precisely where we were. * Create a map that marks our path each day and plots our photos, tweets, and videos. We made most of this while taking in scenic views and experiencing all Iceland has to offer, and we learned a lot about geotagging, GPSes, time zones, and maps along the way. This talks shows you how to do the same, but you'll have to buy your own flight.

Citation preview

FUN WITH MAPS & PHPChris Shiflett — @shiflett — shiflett.org

Who am I? Web aficionado, author, blogger, soccer player, bike rider, beer drinker, music lover, Brooklynite.

0. Landice

Dettifoss

TRAVELOG

Tag everything– #landice

Blog– every night

Timeline Visualizations– maps?

A!regate and Plot– photos, tweets, videos, etc.

1. Research

Sjónarsker

EXISTING TOOLS

GPS– Garmin GPS 60CSx

GPSBabel– gpsbabel.org

EveryTrail– everytrail.com

HoudahGeo– houdah.com/houdahGeo/

2. Reykjavík

Stóra-Víti

3. Photos

Kirkjufell

<?xml version="1.0" encoding="UTF-8"?><gpx version="1.0" creator="GPSBabel - http://gpsbabel.org/" xmlns:xsi="http://w3.org/2001/XMLSchema-instance" xmlns="http://topografix.com/GPX/1/0" xsi:schemaLocation="http://topografix.com/GPX/1/0 http://topografix.com/GPX/1/0/gpx.xsd"><time>2009-06-14T23:52:23Z</time><bounds minlat="64.143006038" minlon="-21.955686333" maxlat="64.153455254" maxlon="-21.915427381"/><trk> <name>14-JUN-09 01</name><number>1</number><trkseg><trkpt lat="64.150910676" lon="-21.946594650"> <ele>13.115112</ele> <time>2009-06-14T21:01:25Z</time></trkpt><trkpt lat="64.150785115" lon="-21.945423950"> <ele>13.595825</ele> <time>2009-06-14T21:02:08Z</time></trkpt></trkseg></trk></gpx>

$xml = simplexml_load_file('trip.gpx'); foreach($xml->trk as $part) { foreach ($part->trkseg->trkpt as $point) { /* $point['lat'] $point['lon'] $point->time $point->ele */ }}

PARSING GPX

4. Maps

Bláa lónið

HoudahGeo

Garmin GPS 60CSx Nikon D300

EVERYTRAIL

$query = $db->prepare("SELECT lat, lon FROM points WHERE timestamp > '$start' AND timestamp < '$end' ORDER BY timestamp");$query->execute();

$points = array();

while ($row = $query->fetch()) { $points[] = array('lat' => $row['lat'], 'lon' => $row['lon']);}

$trip['points'] = $points;$json = json_encode($trip);file_put_contents("/tmp/landice-$day.json", $json);

// FIXME: http://tr.im/selectclosest$sql = "SELECT lat, lon, elevation, ABS(timestamp - :timestamp) as distance FROM points ORDER BY distance LIMIT 1"$select = $this->db->prepare($sql); foreach ($this->photos as $photo) { $id = (string)$photo['id'];  // Get lat and lon from points table. $select->execute(array('timestamp' => $photo['timestamp'])); $row = $select->fetch(); $this->photos[$id]['lat'] = $row['lat']; $this->photos[$id]['lon'] = $row['lon']; $this->photos[$id]['elevation'] = $row['elevation'];}

$flickrMethod = 'flickr.photos.getInfo';$apiUrl = "http://api.flickr.com/services/rest/?method={$flickrMethod}&api_key={$this->apiKey}&photo_id={$id}";$xml = simplexml_load_file($apiUrl); $title = (string)$xml->photo->title;$desc = (string)$xml->photo->description;

FLICKR API

Google Maps OpenStreetMaps

5. Challenges

Stykkishólmur

CLUSTERS

20,000 points loaded on a single map is very slow

You don’t need a# points for every view

Mature solutions exist–http://tr.im/polyline

PERFORMANCE

6. Storytelling

Reykjavík

7. Future

Tjörnin

TRAILS

GPX Tracking

GEOLOCATION API

http://mozi#a.com/en-US/firefox/geolocation/http://dev.w3.org/geo/api/spec-source.html

Click here

Fo#ow me on Twitter– @shiflett

Comment on my blog– shiflett.org

Email me– chris@shiflett.org

FEEDBACK?

Chris Shiflett — @shiflett — shiflett.org

Thanks for listening!

Recommended