• Save
OSCON july 2011
Upcoming SlideShare
Loading in...5
×
 

OSCON july 2011

on

  • 1,193 views

 

Statistics

Views

Total Views
1,193
Views on SlideShare
1,173
Embed Views
20

Actions

Likes
1
Downloads
0
Comments
0

1 Embed 20

http://lanyrd.com 20

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

OSCON july 2011 OSCON july 2011 Presentation Transcript

  • +OPEN GEOSPATIAL RUBY LIBRARIES Christopher Helm - GeoIQ http://geocommons.com
  • The Plan• Keep it simple• Introduce you to geospatial• Dive into a few example libs• Demo some code!
  • THIS TALK......is for (~Ruby) geospatial newcomers
  • STAYING SIMPLE GeoSpatial is a deep subjectwe’re barely skimming the surface
  • WHAT IS GEOSPATIAL?
  • LOCATION
  • DATA
  • ANALYSIS
  • VISUALIZATION
  • WHY DOES THIS MATTER? location is everywhere :)
  • GEOGRAPHY LESSON 1: Vector Data TypesPoints Lines Polygons
  • GEOGRAPHY LESSON 1: OGC’s Simple Features POINT(30, 40) LINESTRING(30 10, 10 30, 40 40)POLYGON(30 10, 10 20, 20 40, 40 40, 30 10) MULTI*
  • GEOGRAPHY LESSON 2: Spatial Relationships Buffers Intersections Clips Dissolves Unions Aggregation etc...
  • GEOGRAPHY LESSON 2: Spatial Relationships Buffers
  • GEOGRAPHY LESSON 2: Spatial Relationships Dissolves
  • GEOGRAPHY LESSON 2: Spatial Relationships Clips Intersections
  • GEOGRAPHY LESSON 2: Spatial Relationships Spatial Aggregation
  • GEOGRAPHY LESSON 3: Spatial Reference Systems http://www.cartogrammar.com/blog/accidental-map-projections/
  • GEOGRAPHY LESSON 3: Spatial Reference Systems Plate Carrée, Geographic, or un-projected
  • GEOGRAPHY LESSON 3: Spatial Reference Systems Spherical Mercator (Web Mercator)
  • SOME GEOSPATIAL LIBS•2 categories of libraries • 1. Ruby based GeoSpatial Data Libraries • 2. Ruby bindings location-aware APIs & services
  • GEOS http://trac.osgeo.org/geos/Geometry Engine - Open Source (GEOS) A C++ port of the Java Topology Suite Simple Features and spatial operators
  • GEOSrequire geos@reader = Geos::WktReader.new()# Create pointsp1 = @reader.read(‘POINT(1, 2)’)p2 = @reader.read(‘POINT(3, 4)’)p3 = @reader.read(‘POINT(5, 2)’) p2 y p1 p3 x
  • GEOS# Create a more complex shapesline1 = @reader.read(‘LINESTRING(1 2, 3 4, 5 2)’)polygon = @reader.read(‘POLYGON(1 2, 3 4, 5 2, 1 2)’)line2 = @reader.read(LINESTRING(1 4, 4 1)) line1 Polygon line2
  • GEOS# Perform geometric operations and calculationsline3 = polygon.intersection(line2)dist = line3.distance(p3) line2 dist line3 p3 line3
  • GEOS# new pointp4 = @reader.read(‘POINT(2.5, 3.5)’)# create a buffer on p4buffer = p4.buffer(2)# now test against the bufferbuffer.contains?(p1) # falsebuffer.contains?(p2) # truebuffer.touches?(p3.buffer(1)) # true p2 p4 p1 p3 buffer
  • GEORUBY http://rubyforge.org/projects/georuby/A Library for working with geometric data types in Ruby follows the OGC’s Simple Features Spec Think: Point, Lines, and Polygons Also data formatters / parsers (KML to Well Known Text)
  • SPATIAL ADAPTER https://github.com/fragility/spatial_adapterxt Adapter for ActiveRecordHandles spatial datatypes coming from: PostGreSQL (via PostGIS) & MySQL (via its spatial ext.)
  • RGEO http://virtuoso.rubyforge.org/rgeo/ Geospatial datatypes in Ruby Standard Spatial analysis operations: (buffers, intersections, distances, etc) Data format conversionsFlexible - gem and active-record adapter
  • RUBY GEOCODER http://www.rubygeocoder.com/ Full featured geocoder for Ruby Gem and Rails PluginConverts addresses and IPs in lat/lon coordinates configurable to work with any service Also checkout geokit: http://geokit.rubyforge.org/
  • RUBY GEOCODER http://www.rubygeocoder.com/require ‘geocoder’# look up coordinates of some locationGeocoder.coordinates("25 Main St, Cooperstown, NY")=> [42.700149, -74.922767]# distance between Eiffel Tower and Empire State BuildingGeocoder::Calculations.distance_between([47.858205,2.294359],[40.748433,-73.985655])=> 3619.77359999382# find the geographic coordinates for an IP addressGeocoder.coordinates("71.166.236.36")=> [38.6485, -77.3108]
  • DATABASES PostgreSQL / Postgis MySQL MongoDBCouch...DB....base (via GeoCouch)
  • POSTGRESQL PostGIS - spatial extensionUses GEOS for spatial operations
  • ACTIVERECORD POSTGIS https://github.com/dazuma/activerecord-postgis-adaptercreate_table :my_spatial_table do |t| t.column :shape, :geometry # or t.geometry :shape t.line_string :path, :srid => 3785 t.point :latlon, :geographic => trueendchange_table :my_spatial_table do |t| t.index :latlon, :spatial => trueend# queryingrec = MySpatialTable.where(:latlon => POINT(-122 47)).first
  • MONGODBrequire mongodb = Mongo::Connection.new("localhost", 27017).db("mydb")auth = db.authenticate(my_user_name, my_password)coll = db.collection("testCollection")coll.find("i" => 71).each { |row| puts row.inspect }
  • MONGODB# Spatial indexes / queriescoll.create_index([["loc", Mongo::GEO2D]])coll.find({"loc" => {"$near" => [50, 50]}}, {:limit => 20}).eachdo |p| puts p.inspectend
  • MONGODBbox = [[40.73083, -73.99756], [40.741404, -73.988135]]coll.find({"loc" : {"$within" : {"$box" : box}}})center = [50, 50]radius = 10coll.find({"loc" : {"$within" : {"$center" : [center, radius]}}})
  • SOCIAL MEDIA APIS
  • TWEETSTREAM https://github.com/intridea/tweetstreamSimple wrapper to the Twitter Streaming API Can search via tags or locations (via bboxes)Good way to generate geospatial data/content
  • TWEETSTREAMrequire rubygemsrequire tweetstream# Use track to track a list of single-word keywordsTweetStream::Client.new(username,password).track(term1,term2) do |status| puts "#{status.text}"end# track tweets within a bboxTweetStream::Client.new(username,password).locations(‘-122.75,36.8,-121.75,37.8’) do |status| puts "#{status.text}"end
  • INSTAGRAM https://github.com/Instagram/instagram-ruby-gemWrapper to the Instragram’s photo sharing API Allows for spatial searching via lat/lon very similar to the Flick’r API
  • CARTAGR.AM bloom.io
  • INSTAGRAMrequire "instagram"# All methods require authenticationInstagram.configure do |config| config.client_id = YOUR_CLIENT_KEY config.access_token = YOUR_ACCESS_TOKENend# Get a list of media at a given locationputs Instagram.location_recent_media(514276)# Get a list of media close to a given latitude and longitudeputs Instagram.media_search("37.7808851,-122.3948632")
  • YELP! http://github.com/shaper/yelp Location based lookup for business reviewsHighly local listing accessed in variety of geospatial ways another way to create some geospatial data/content
  • YELP!
  • YELP!# create a new client client = Yelp::Client.new# do an address-based search for cream puffs nearbyrequest = Yelp::Review::Request::Location.new( :address => 650 Mission St, :city => San Francisco, :state => CA, :radius => 2, :term => cream puffs, :yws_id => YOUR_YWSID_HERE)response = client.search(request)
  • YELP!# a location-based search for ice cream or donut shops in SFrequest = Yelp::Review::Request::Location.new( :city => San Francisco, :state => CA, :category => [ donuts, icecream ], :yws_id => YOUR_YWSID_HERE)response = client.search(request)# a neighborhood name lookup for a geo-location pointrequest = Yelp::Neighborhood::Request::GeoPoint.new( :latitude => 37.782093, :longitude => -122.483230, :yws_id => YOUR_YWSID_HERE)response = client.search(request)
  • DATA & ANALYSIS APIS Fusion Tables
  • SIMPLEGEO https://github.com/simplegeo/simplegeo-ruby API for adding geospatial capabilities to appsAccess POIs, Locational Context, and personal data Emphasis on speed, simplicity, and flexibility
  • SIMPLEGEO Context API# grab the context of a lat/lonSimpleGeo::Client.get_context(37.772445,-122.405913)# contextSimpleGeo::Client.get_context_by_address("41 Decatur St, SanFrancisco, CA 94103")SimpleGeo::Client.get_context_ip("184.84.228.110")
  • SIMPLEGEO Places APISimpleGeo::Client.get_places(37.772445, -122.405913)options = {q=>Starbucks, category=>Coffee & Tea,radius=>5}SimpleGeo::Client.get_places(37.772445, -122.405913, options)address = "41 Decatur St, San Francisco, CA"options = {radius => 1}SimpleGeo::Client.get_places_by_address(address, options)ip = 173.164.219.53SimpleGeo::Client.get_places_by_ip(ip)
  • FUSION TABLES https://github.com/tokumine/fusion_tablesDirect access to Google’s Fusion Tables APIFull SQL interface or OO query interfaceEasy integration to other Google services (maps, earth, viz.) Easy storage/retrieve of geospatial data
  • FUSION TABLESrequire fusion_tables# Connect to service@ft = GData::Client::FusionTables.new@ft.clientlogin(username, password)# 1. SQL interface@ft.execute "SHOW TABLES"@ft.execute "INSERT INTO #{my_table_id} (name, geo) VALUES(tokyo, 35.6894 139.6917);"@ft.execute "SELECT count() FROM #{my_table_id};"
  • GEOCOMMONS http://geocommons.comOpen Data Storage, Analysis, and Visualization Strong emphasis on usability Build complex geospatial workflows Share data visualizations on the web
  • GEOCOMMONS CSV Easy Spatial Visualization / Analytics SHPJSONWMS Maps & Viz Analytics
  • GEOCOMMONS GEM API GeoCommons Mgmt Analysis Visualization geoiq- ruby
  • GEOCOMMONS GEM finding data...# create a client@geoiq = Geoiq.client("http://geocommons.com", "user", "password")# search for tags@geoiq.search("tag:economics")# Search for data in a location@geoiq.search("points",{:bbox => ‘-87.2,33.4,-75.9,38.4, :limit=>10})
  • GEOCOMMONS GEM getting data...# get dataset and featuresdataset = geoiq.dataset.find(1348)features = dataset.features# get features with a custom filterfiltered_features = @dataset.features({"filter[PERIMETER][][max]"=> 0.3})bbox_filtered_features = @dataset.features({:bbox =>-87.2,33.4,-75.9,38.4})
  • GEOCOMMONS uploading data...# Upload CSVcsv_file = data/sculptures.csv@dataset = @geoiq.dataset.csv_upload(csv_file, {:title =>"gardensculptures"})# Upload SHP@dataset = @geoiq.dataset.shp_upload("data/simple.shp", "data/simple.dbf", "data/simple.shx")# Upload by URL (type = csv,kml,rss,wms,tile)@dataset = @geoiq.dataset.url_upload("http://geothings.net/geoiq/simple_testing.csv", {:type => "csv"})
  • GEOCOMMONS create new datasets...# Create a new overlaydata = {‘title’ => ‘My Overlay’, ‘attributes’ => {‘attr1’ => ...}}overlay = @geoiq.dataset.create(data)# add features to the overlayfeatures = {features => [{‘type’ => ‘Point’, ‘coordinates’ =>[0,0]},{...}]}@geoiq.dataset.update(id, features)
  • GEOCOMMONS create new visualizations...# Create a new mapmap = @geoiq.map(:title => "my empty map")@geoiq_map = map.create# get a map and its layers@map = @geoiq.map.find(239)layer_titles = @map.layers.map{ |l| l[title]}# add a dataset to a map as a new layer@map.add_layer(1466)#deleting map or dataset@map.delete@dataset.delete
  • PUTTING IT TOGETHER
  • SOME EXAMPLES......THEN QUESTIONS
  • Code Samples from this talk:https://github.com/chelm/OSCON-Ruby-GeoSpatial-Intro