RefreshDC - The How Of Geo

Post on 28-Oct-2014

11 views 0 download

Tags:

description

Talk given to RefreshDC at the January 2009 meeting.Since I was only given 2 days to prepare, it's an agglomeration of the last couple of talks I've given in Nairobi, FOWA London, and Web2Expo. The talk is a very broad overview of the current GeoWeb technologies and examples. In future talks I will definitely be focusing more on specific topics to get more in-depth discussion and analysis of tools and techniques.

Transcript of RefreshDC - The How Of Geo

The “How” of Geo

Andrew TurnerFortiusOne - GeoCommons

andrew@fortiusone.comhttp://highearthorbit.com

Who is @ajturner?

Airships

Vehicle Simulation

Astrium EADS

Vehicle Simulation

Convergence

Convergence uLocate WHERE

Where 2.0: The State of the Geospatial Web

August 2008

By Andrew Turner & Brady ForrestPreface by Tim O’Reilly

An O’Reilly Radar Report

Geo Community

Overview

Fast Overview

A Brief History of Mapping

*IANAH

*

StoryMapping

Emphemeral Maps http://maps.google.com

Meaning

Meaning

Navigation

Compass

1492 - Columbus sails the ocean blue

Cartographic Renaissance

So geographers, in Afric maps,With savage pictures fill their gaps,And o’er unhabitable downsPlace elephants for want of towns.

- Jonathan Swift

Ortelius Atlas

Exploration

Travel Guides

Driving Guides

GIS

Internet Maps

2005 - Google slips the map

2005 - Google slips the map

GPS becomes ubiquitous

mobile computing

urban renewalparticipatory web

HousingMaps http://housingmaps.com

Slippy Maps &

Spinny Globes

GoogleMaps http://maps.google.com

Interactivity http://maps.google.com

Design

Usability

http://maps.google.com/maps?f=q&hl=en&geocode=&q=Cape+Town&ie=UTF8&ll=-33.938803,18.486214&spn=0.182293,0.331306&z=12

http://openstreetmap.org/?lat=-33.9377&lon=18.4745&zoom=12&layers=B000FTF

Data Coverage and Quality

Brighton, UK

Brighton, UK

Data Ownership and Access

Data Ownership and Access

Technology Limitations

Technology Limitations

Where Next?

http://flickr.com/photos/loupiote/25426957

Storage

id name rating lat lon

10045 Vibe Bar 4.3 52.81 0.295

10046 Half Moon Pub

3.8 53.432 0.312

10047 Windmill 2.6 50.982 0.256

10048 Marquess oAnglesey

1.7 51.023 1.24

10049 Grange Pub

4.5 52.110 0.4562

10050 Coopers Arms

3.5 50.862 0.821

10051 Old Queens Head

3.2 52.591 0.312

10052 Oxo Tower

1.3 51.93 -0.351

10053 Riverside 3.9 52.18 0.62

id name rating lat lon

10045 Vibe Bar 4.3 52.81 0.295

10046 Half Moon Pub

3.8 53.432 0.312

10047 Windmill 2.6 50.982 0.256

10048 Marquess oAnglesey

1.7 51.023 1.24

10049 Grange Pub

4.5 52.110 0.4562

10050 Coopers Arms

3.5 50.862 0.821

10051 Old Queens Head

3.2 52.591 0.312

10052 Oxo Tower

1.3 51.93 -0.351

10053 Riverside 3.9 52.18 0.62

SELECT name,latitude,longitude, acos(SIN( PI()* 40.7383040 /180 )*SIN( PI()*latitude/180 ))+(cos(PI()* 40.7383040 /180)*COS( PI()*latitude/180) *COS(PI()*longitude/180-PI()* -73.99319 /180))* 3963.191 AS distance

FROM allcountries

WHERE 3963.191 * ACOS( (SIN(PI()* 40.7383040 /180)*SIN(PI() * latitude/180)) +(COS(PI()* 40.7383040 /180)*cos(PI()*latitude/180)*COS(PI() * longitude/180-PI()* -73.99319 /180))) < = 1.5

ORDER BY 3963.191 * ACOS((SIN(PI()* 40.7383040 /180)*SIN(PI()*latitude/180)) +(COS(PI()* 40.7383040 /180)*cos(PI()*latitude/180)*COS(PI() * longitude/180-PI()* -73.99319 /180)))

SELECT the_geom FROM geom_table WHERE ST_Distance(the_geom, GeomFromText('POINT(0.02839 51.50807)', -1)) < 100

SELECT the_geom FROM geom_table WHERE the_geom && 'BOX3D(0.02 51,0.03 52)'::box3d ANDST_Distance(the_geom, GeomFromText('POINT(0.02839 51.50807)', -1)) < 100

SpatiaLite

http://www.gaia-gis.it/spatialite/

SQLite + Spatial Types

GeoHash

http://geohash.org/

GeoHash

http://geohash.org/

GeoHash

http://geohash.org/

SELECT nameFROM pubsWHERE geohash LIKE "GCPUV%"

GeoHash

http://geohash.org/

SELECT nameFROM pubsWHERE geohash LIKE "GCPUVR%" OR geohash LIKE "GCPVJ2%"

Data

GeoNames http://geonames.org

GeoNames http://geonames.org

Implicit GeoData http://geocodr.net

Implicit GeoData http://geocodr.net

OpenStreetMap http://openstreetmap.org

OpenStreetMap http://openstreetmap.org

Wiki for the World

Flickr OSM http://www.flickr.com/map?&fLat=39.9227&fLon=116.4694&zl=6

Flickr Photos

OpenAerialMap http://openaerialmap.org

DC CTO http://data.octo.dc.gov/

GeoCommons Finder! http://geocommons.com

Sharing

GeoRSS

GeoRSS

GeoRSS

+

GeoRSS

<georss:point>45.256 -71.92

</georss:point>+

GeoRSS

<georss:point>45.256 -71.92

</georss:point>+

GeoRSS

<georss:point>45.256 -71.92

</georss:point>+

RSS / Atom<?xml version="1.0" encoding="UTF-8"?><feed xml:lang="en-US" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="http://grwifi.net/feed" xmlns="http://www.w3.org/2005/Atom"> <title>Grand Rapids WiFi: News, Updated Hotspot Locations, and Comments</title> <id>http://grwifi.net/atom/locations</id> <link href="http://grwifi.net/feed" rel="self" type="application/atom+xml"/> <rights>Creative Commons Attribution-NonCommercial-ShareAlike 2.0 http://creativecommons.org/licenses/by-nc-sa/2.0/ </rights> <updated>2007-03-28T17:31:33+00:00</updated> <entry> <id>http://grwifi.net/location/view/skelletones#comment3862</id> <title>Grand Rapids WiFi: Comment on The Euclid</title> <link href="http://grwifi.net/location/view/skelletones#comment3862" rel="alternate" type="text/html"/> <category term="The Euclid"/> <author><name>mari</name></author> <content type="xhtml"><p>i know a local band in kalamazoo called rising vacancy. i was wondering how …/p></content> <published>2007-03-28T17:31:33+00:00</published> </entry> <entry> <id>http://grwifi.net/location/view/bk-east-paris#comment3855</id> <title>Grand Rapids WiFi: Comment on Burger King - East Paris</title> <link href="http://grwifi.net/location/view/bk-east-paris#comment3855" rel="alternate" type="text/html"/> <category term="Burger King - East Paris"/> <author><name>Brandino</name></author> <content type="xhtml"><p>I love burger king </p></content> <published>2007-03-21T16:38:19+00:00</published> </entry> <entry> <id>http://grwifi.net/location/view/common-ground#comment3843</id> <title>Grand Rapids WiFi: Comment on Common Ground Coffee Shop</title> <link href="http://grwifi.net/location/view/common-ground#comment3843" rel="alternate" type="text/html"/> <category term="Common Ground Coffee Shop"/> <author> <name>Rex Cowan</name> </author> <content type="xhtml"> <div xmlns="http://www.w3.org/1999/xhtml"><p>Common Ground is a welcoming place with a warm atmosphere, the clerk I talked to had …</p></content> <published>2007-03-17T01:45:59+00:00</published> </entry></feed>

GeoRSS<?xml version="1.0" encoding="UTF-8"?><feed xml:lang="en-US" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:base="http://grwifi.net/feed" xmlns:georss="http://www.georss.org/georss" xmlns="http://www.w3.org/2005/Atom"> <title>Grand Rapids WiFi: News, Updated Hotspot Locations, and Comments</title> <id>http://grwifi.net/atom/locations</id> <link href="http://grwifi.net/feed" rel="self" type="application/atom+xml"/> <rights>Creative Commons Attribution-NonCommercial-ShareAlike 2.0 http://creativecommons.org/licenses/by-nc-sa/2.0/ </rights> <updated>2007-03-28T17:31:33+00:00</updated> <entry> <id>http://grwifi.net/location/view/skelletones#comment3862</id> <title>Grand Rapids WiFi: Comment on The Euclid</title> <link href="http://grwifi.net/location/view/skelletones#comment3862" rel="alternate" type="text/html"/> <category term="The Euclid"/> <author><name>mari</name></author> <georss:point>42.960126 -85.667997</georss:point> <content type="xhtml"><p>i know a local band in kalamazoo called rising vacancy. i was wondering how …/p></content> <published>2007-03-28T17:31:33+00:00</published> </entry> <entry> <id>http://grwifi.net/location/view/bk-east-paris#comment3855</id> <title>Grand Rapids WiFi: Comment on Burger King - East Paris</title> <link href="http://grwifi.net/location/view/bk-east-paris#comment3855" rel="alternate" type="text/html"/> <category term="Burger King - East Paris"/> <author><name>Brandino</name></author> <georss:point>42.911495 -85.568665</georss:point> <content type="xhtml"><p>I love burger king </p></content> <published>2007-03-21T16:38:19+00:00</published> </entry> <entry> <id>http://grwifi.net/location/view/common-ground#comment3843</id> <title>Grand Rapids WiFi: Comment on Common Ground Coffee Shop</title> <link href="http://grwifi.net/location/view/common-ground#comment3843" rel="alternate" type="text/html"/> <category term="Common Ground Coffee Shop"/> <author> <name>Rex Cowan</name> </author> <georss:point>42.962927 -85.637179</georss:point> <content type="xhtml"> <div xmlns="http://www.w3.org/1999/xhtml"><p>Common Ground is a welcoming place with a warm atmosphere, the clerk I talked to had …</p></content> <published>2007-03-17T01:45:59+00:00</published> </entry></feed>

GeoNames GeoRSS http://www.geonames.org/rss-to-georss-converter.html

KML<?xml version="1.0" encoding="UTF-8"?><kml xmlns="http://earth.google.com/kml/2.2"> <Placemark> <name>Simple placemark</name> <description>Attached to the ground. Intelligently places itself at the height of the underlying terrain.</description> <Point> <coordinates>-122.0822035425683,37.42228990140251,0</coordinates> </Point> </Placemark></kml>

KML Extended Data

<ExtendedData id="rooms"> <name>Rooms</name> <value>3</value></ExtendedData>

KML Network Links

</NetworkLink> <NetworkLink> <name><![CDATA[Pubs in London]]></name> <Link> <href>http://maker.geocommons.com/maps/839/overlays/1</href> </Link></NetworkLink>

{ "type": "Point", "coordinates": [100.0, 0.0] }

GeoJSON

GeoJSON { "blog": { "posts": [ { "type": "atom:item", "atom:summary": "post 1", "atom:description": "i love blogging" }, { "type": "atom:item", "atom:summary": "post 2 from CA", "atom:description": "geoblogging in California" "geometry": { "type", "Point", "coordinates": [-120, 40] } }, ], "geometry": { "type": "Polygon", "coordinates": [[[-121, 39], [-119, 39], [-119, 41], [-121, 41], [-121, 39]]] } } }

GeoWeb

Resources

• /places

• /places/89

• /places/89.atom

• /places/89.kml

Formats

HTML : RSS

Formats

HTML : RSS ::

Formats

HTML : RSS KML : GeoRSS::

Formats

Visualization : Syndication

HTML : RSS KML : GeoRSS::

OpenSearch

http://search.org?q={searchTerm}

OpenSearch

http://search.org?q={searchTerm}

OpenSearch

http://search.org?q={searchTerm}&lat={geo:lat}&lon={geo:lon}

-Geo

OpenSearch-Geohttp://maps.google.com/maps?near=43.3+-0.03

http://local.yahoo.com/?csz=43.3,-0.03http://upcoming.org/search?lat=43.3&lon=-0.03

http://api.flickr.com/services/photos_public.gne?bbox=-0.03,43.3, -0.04,43.4http://mapufacture.com/search?lat=43.3&lon=-0.03

OpenSearch-Geohttp://maps.google.com/maps?near=43.3+-0.03

http://local.yahoo.com/?csz=43.3,-0.03http://upcoming.org/search?lat=43.3&lon=-0.03

http://api.flickr.com/services/photos_public.gne?bbox=-0.03,43.3, -0.04,43.4http://mapufacture.com/search?lat=43.3&lon=-0.03

lat={geo:lat}&lon={geo:lon}&radius={geo:radius}

OpenSearch-Geohttp://maps.google.com/maps?near=43.3+-0.03

http://local.yahoo.com/?csz=43.3,-0.03http://upcoming.org/search?lat=43.3&lon=-0.03

http://api.flickr.com/services/photos_public.gne?bbox=-0.03,43.3, -0.04,43.4http://mapufacture.com/search?lat=43.3&lon=-0.03

lat={geo:lat}&lon={geo:lon}&radius={geo:radius}

bbox={geo:box}

OpenSearch-Geohttp://maps.google.com/maps?near=43.3+-0.03

http://local.yahoo.com/?csz=43.3,-0.03http://upcoming.org/search?lat=43.3&lon=-0.03

http://api.flickr.com/services/photos_public.gne?bbox=-0.03,43.3, -0.04,43.4http://mapufacture.com/search?lat=43.3&lon=-0.03

lat={geo:lat}&lon={geo:lon}&radius={geo:radius}

bbox={geo:box}

where={geo:locationString}

OpenSearch-Geohttp://maps.google.com/maps?near=43.3+-0.03

http://local.yahoo.com/?csz=43.3,-0.03http://upcoming.org/search?lat=43.3&lon=-0.03

http://api.flickr.com/services/photos_public.gne?bbox=-0.03,43.3, -0.04,43.4http://mapufacture.com/search?lat=43.3&lon=-0.03

lat={geo:lat}&lon={geo:lon}&radius={geo:radius}

bbox={geo:box}

where={geo:locationString}

area={geo:polygon}

Why should I share my data?

GeoStack

http://flickr.com/photos/alfr3do/7436142/

Create

Publish

Aggregate

Consume

Exif GeoRSS KML GeocodingGPX

GeoRSS KML Microformats MachineTags

GML KML GeoRSS GeoJSONWFS

Geo

Stac

k

Visualization

Mapstraction

Mapstraction API<script src="http://maps.google.com/maps?file=api&v=2&key=YOUR_KEY" type="text/javascript"></script><script type="text/javascript" src="mapstraction.js"></script>

<div id="mapstraction" style="width: 400px; height: 400px;"></div>

<script type="text/javascript">var mapstraction = new Mapstraction('mapstraction','google');

var myPoint = new LatLonPoint(37.4041, -122.0081);mapstraction.setCenterAndZoom(myPoint, 10);

mapstraction.addControls({ pan: true, zoom: 'small', map_type: true });

</script>

Power of the Swap

var mapstraction = new Mapstraction(‘map’, ‘google’);

Power of the Swap

mapstraction.swap(‘mapstraction’, ‘yahoo’);

Power of the Swap

mapstraction.swap(‘mapstraction’, ‘microsoft’);

Power of the Swap

mapstraction.swap(‘mapstraction’, ‘openstreetmap’);

Overlays

mapstraction.addImageOverlay("over","images/santodomingo.png",50,-70.01544, 18.39777, -69.80567, 18.563517);

mapstraction.addImageOverlay("over",file,opacity,west,south,east,north);

Filters

mapstraction.removeAllFilters();mapstraction.addFilter('category', 'eq', 10 );mapstraction.doFilter();

Filters

mapstraction.removeAllFilters();mapstraction.addFilter('category', 'eq', 10 );mapstraction.doFilter();

mapstraction.toggleFilter('category', 'eq', 10 );

Sliders

OpenLayers http://openlayers.org

map = new OpenLayers.Map("map", { maxResolution: 360/512, projection: "EPSG:4326" , numZoomLevels: 20, minZoomLevel: 0, maxZoomLevel: 19, controls: [ new OpenLayers.Control.Navigation(), new OpenLayers.Control.PanPanel(), new OpenLayers.Control.ZoomPanel() ]});var wms = new OpenLayers.Layer.WMS( "world", "/cgi-bin/tilecache/tilecache.cgi?", {layers: 'world'});map.addLayers([wms]);map.setCenter(new OpenLayers.LonLat(0, 32), 7);

map = new OpenLayers.Map("map", { maxResolution: 360/512, projection: "EPSG:4326" , numZoomLevels: 20, minZoomLevel: 0, maxZoomLevel: 19, controls: [ new OpenLayers.Control.Navigation(), new OpenLayers.Control.PanPanel(), new OpenLayers.Control.ZoomPanel() ]});var wms = new OpenLayers.Layer.WMS( "world", "/cgi-bin/tilecache/tilecache.cgi?", {layers: 'world'});map.addLayers([wms]);map.setCenter(new OpenLayers.LonLat(0, 32), 7);

<link rel="stylesheet" href="../themes/gray.css" type="text/css" media="screen" />

<div id="map" class="gray smallmap"></div>

div.gray .olControlZoomPanel { top: 14px; left: 14px;}

div.gray .olControlZoomPanel div { background-image: url(img/gray/gray_zoom_horiz.png); height: 18px; width: 18px;}

div.gray .olControlZoomPanel .olControlZoomInItemInactive { top: 0px; left: 25px; background-position: 18px 0px;}

div.gray .olControlZoomPanel .olControlZoomToMaxExtentItemInactive { top: 0px; left: 0px; background-position: 0px -18px;}

div.gray .olControlZoomPanel .olControlZoomOutItemInactive { top: 0px; left: 0px; background-position: 0px 0px;}

<link rel="stylesheet" href="../themes/gray.css" type="text/css" media="screen" />

<div id="map" class="gray smallmap"></div>

div.gray .olControlZoomPanel { top: 14px; left: 14px;}

div.gray .olControlZoomPanel div { background-image: url(img/gray/gray_zoom_horiz.png); height: 18px; width: 18px;}

div.gray .olControlZoomPanel .olControlZoomInItemInactive { top: 0px; left: 25px; background-position: 18px 0px;}

div.gray .olControlZoomPanel .olControlZoomToMaxExtentItemInactive { top: 0px; left: 0px; background-position: 0px -18px;}

div.gray .olControlZoomPanel .olControlZoomOutItemInactive { top: 0px; left: 0px; background-position: 0px 0px;}

<link rel="stylesheet" href="../themes/gray.css" type="text/css" media="screen" />

<div id="map" class="gray smallmap"></div>

<link rel="stylesheet" href="../themes/hearts.css" type="text/css" media="screen" /><div id="map" class="hearts smallmap"></div>

.hearts .olControlZoomPanel div { background-image: url(img/hearts/hearts-zoom.png);}.hearts .olControlPanPanel div { background-image: url(img/hearts/hearts-panel.png);}

<link rel="stylesheet" href="../themes/hearts.css" type="text/css" media="screen" /><div id="map" class="hearts smallmap"></div>

.hearts .olControlZoomPanel div { background-image: url(img/hearts/hearts-zoom.png);}.hearts .olControlPanPanel div { background-image: url(img/hearts/hearts-panel.png);}

<link rel="stylesheet" href="../themes/hearts.css" type="text/css" media="screen" /><div id="map" class="hearts smallmap"></div>

Accessibility

ModestMaps

package { public class ModestMapsSample extends Sprite { private var map:Map; public function ModestMapsSample() { map = new TweenMap(stage.stageWidth - 2 * PADDING, stage.stageHeight - 2 * PADDING, true, new MicrosoftRoadMapProvider(), new MapExtent(37.829853, 37.700121, -122.212601, -122.514725)); map.addChild(new MapControls(map)); map.addChild(new ZoomSlider(map)); addChild(map); } }}

London2012 http://london2012.co.uk

Hurricane Tracking http://hurricanewiki.org

GeoCommons Maker! http://maker.geocommons.com

Analysis

WalkScore http://walkscore.com

MySociety House Price vs. Travel Time

http://www.mysociety.org/2007/more-travel-maps/

pgRouting

http://pgrouting.postlbs.org/

Safe Routing http://www.ridethecity.com

Fuel Efficiency Routing

Bakery Routing

Cartography

wrp.geothings.net

Maps for Farmers http://serveyourcountryfood.com

Tiles

Tiles

Tiles

TileCache http://tilecache.org

TileCache

TileCache http://tilecache.org

Image

WMS

Mapnik

Image

CRS

TileCache

TileCache http://tilecache.org

Image

WMS

Mapnik

Image

CRS

TileCacheTMS

900913(google)

Mapstraction Tilesmapstraction.addTileLayer("http://oakland-1950s.s3.amazonaws.com/{Z}-r{Y}-c{X}.jpg", 80);

New Orleans http://maps.thinknola.com

EveryBlock http://everyblock.com

BurningManEarth http://earth.burningman.org

What is a “Choropleth”?

Read

Public Geodata Repository

GeoData Visualization

Thematic Styling

Classification

Styling

Base Data

Comparative Analysis http://maker.geocommons.com/maps/839

Inspect the Data

Styled KML

Print Maps

Mapnik

Mapnik http://mapnik.com

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE Map><Map bgcolor="#b5d0d0" srs="+proj=latlong +datum=WGS84"> <Style name="world"> <Rule> <MaxScaleDenominator>250000000000</MaxScaleDenominator> <MinScaleDenominator>6000000</MinScaleDenominator> <PolygonSymbolizer> <CssParameter name="fill">#f2efe9</CssParameter> </PolygonSymbolizer> <LineSymbolizer> <CssParameter name="stroke">#b5d0d0</CssParameter> <CssParameter name="stroke-width">0.5</CssParameter> </LineSymbolizer> </Rule> </Style> <Layer name="world" status="on" srs="+proj=latlong +datum=WGS84"> <StyleName>world</StyleName> <Datasource> <Parameter name="type">shape</Parameter> <Parameter name="file">/Users/ajturner/Projects/mapnik/world_borders</Parameter> </Datasource> </Layer></Map>

OpenCycleMap http://opencyclemap.org

GPSies http://gpsies.com/

OpenCycleMap http://opencyclemap.org

Shenzen Maps

StumbleSafely http://www.outsideindc.com/stumblesafely

Cascadenick http://code.google.com/p/mapnik-utils/

* { line-width: 1; line-color: #999; polygon-fill: #fff; }

*[zoom>=6][zoom<12] { line-color: #f90;}#world-borders[zoom<10] NAME{ text-fill: #333;}

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE Map><Map bgcolor="#b5d0d0" srs="..."> <Stylesheet> Map { map-bgcolor: #ccc; } </Stylesheet> <Stylesheet src="example.mss"/> <Layer name="world" status="on" srs="..."> <StyleName>world</StyleName> <Datasource> <Parameter name="type">shape</Parameter> <Parameter name="file">...</Parameter> </Datasource> </Layer></Map>

example.mml example.mss

Geolocation

GPS

GSM

WiFi

IP Address

Proximity

User Tracking

W3C Geolocation http://dev.w3.org/geo/api/spec-source.html

navigator.geolocation.getCurrentPosition(function(pos) { alert( pos.latitude + ", " + pos.longitude );})

interface Geolocation { readonly attribute Position lastPosition;

void getCurrentPosition(in PositionCallback successCallback);

int watchPosition(in PositionCallback successCallback);

void clearWatch(in int watchId); };

PlundrDS

GeoClue

Core Location

FireEagle http://fireeagle.com

geotagging pacersM T W Th

geotagging pacersM T W Th1 23 4

geotagging pacersM T W Th1 23 4

geotagging pacersM T W Th1 23 4

geotagging pacersM T W Th1 23 4

BBC Bangladesh Boat Journey

Mobile

Mobline Placemarking

Android Innovations

cab4me

Ambient Location

OmniFocus

UrbanSpoon

VoteReport http://twittervotereport.com

Navigating Washington http://navigatingwashington.com

Navigating Washington http://navigatingwashington.com

Navigating Washington http://navigatingwashington.com

Ushahidi

Ushahidi

Ushahidi - Gaza http://labs.aljazeera.net/warongaza/

Dash http://dash.net

API

PocketMaps

PocketMaps

ruby: http://github.com/ajturner/pocketmapspython: http://aaronland.info/python/pocketMMap

height = 11width = 8.5margin = .25dpi = 144

bbox = (45.482882,-73.619899,45.532687,-73.547801)zoom = 16

out = "montreal_pocketmmap.pdf"

pm = pocketMMap(height, width, margin, dpi)pm.load_provider('OPEN_STREET_MAP')pm.draw(bbox, zoom)pm.save(out)

We’re Hiring Help build the GeoWeb

GeoWeb

Asante sana!

andrew@highearthorbit.comhighearthorbit.comtwitter.com/ajturner