Upload
javier-de-la-torre
View
1.913
Download
0
Embed Size (px)
Citation preview
A revolution going on...
http://www.flickr.com/photos/toasty/1540997910/
“The future belongs to those who understand how to use location data, tools, and services successfully”
http://www.flickr.com/photos/crschmidt/4972140289/
23
Haiti Earthquake
http://www.flickr.com/photos/37913760@N03/4274633152/
How all this work?
http://www.satimagingcorp.com/gallery/gis-layers.html
A very short GIS class
POINTLINEPOLYGON
http://en.wikipedia.org/wiki/Geographic_information_system
“Manually” create geometries
create table points (the_geom geometry, name varchar);
insert into points values ('POINT(0 0)', 'Location1');insert into points values ('POINT(5 0)', 'Location2');insert into points values ('POINT(0 5)', 'Location3');
select name, ST_AsText(the_geom),
ST_Distance(the_geom, 'POINT(5 5)') from points;
name | astext | distance--------- + -------------- Location1 | POINT(0 0) | 7.07106 Location2 | POINT(5 0) | 5 Location3 | POINT(0 5) | 5 (3 rows)
W W W . R E F R A C T I O N S . N E T
Sample PostGIS Queries
3. Find all docks that are contained completely within a lake, not touching a lake bank.
SELECT a.idFROM docks a, lakes bWHERE a.geom && b.geomAND ST_Relate(a.geom, b.geom, ‘ ’);
SELECT a.idFROM docks a, lakes bWHERE a.geom && b.geomAND ST_Relate(a.geom, b.geom, ‘TFF ’);
SELECT a.idFROM docks a, lakes bWHERE a.geom && b.geomAND ST_Relate(a.geom, b.geom, ‘TFFTFF ’);
SELECT a.idFROM docks a, lakes bWHERE a.geom && b.geomAND ST_Relate(a.geom, b.geom, ‘TFFTFF212’);
SELECT a.idFROM docks a, lakes bWHERE a.geom && b.geomAND ST_Relate(a.geom, b.geom, ‘TFFTFF212’);
http://georuby.rubyforge.org
GeoRuby
require 'rubygems'require 'geo_ruby'
point = GeoRuby::SimpleFeatures::Point.from_lon_lat( -3.726489543914795, 40.453423411115494)
puts point.y# => 40.4534234111155puts point.x# => -3.72648954391479puts point.as_kml# => => "<Point>\n<coordinates>-3.72648954391479,40.4534234111155</coordinates>\n</Point>\n"puts point.as_wkt# => "POINT(-71 33.2)"
Original:
http://rubyforge.org/projects/postgis-adapter
Improvements for ProtectedPlanet.net
http://github.com/tokumine/postgis_adapter
class CreateWadusPolygons1 < ActiveRecord::Migration def self.up create_table :wadus_polygons do |t| t.geometry :the_geom, :srid => 4326, :null => false t.timestamps end end
def self.down drop_table :wadus_polygons endend
class WadusPoint < ActiveRecord::Base has_geom :the_geom => :pointend
class WadusPolygon < ActiveRecord::Base has_geom :the_geom => :polygonend
wpl = WadusPolygon.newp1 = Point.from_lon_lat(-3.7271440029144287, 40.45342545209858)p2 = Point.from_lon_lat(-3.725684881210327, 40.45358056663219)p3 = Point.from_lon_lat(-3.72560977935791, 40.45302541822783)p4 = Point.from_lon_lat(-3.7267684936523438, 40.45290295840354)wpl.the_geom = Polygon.from_points([[p1, p2, p3, p4]])
wc = WadusPoint.newwc.the_geom = Point.from_lon_lat(-3.726392984390259, 40.45302541822783)wc.save
wpl.contains?(wc)
# postgis_adapter/lib/postgis_functions/class.rb
def contains(p, srid=4326) find(:all, :conditions =>
["ST_Contains(geom, GeomFromText('POINT(#{p.x} #{p.y})', #{srid}))"])
end
# Order by distancedef close_to(p, opts = {}) srid = opts.delete(:srid) || 4326 opts.merge!(:order => "ST_Distance(geom, GeomFromText('POINT(#{p.x} #{p.y})', #{srid}))") find(:all, opts)end
http://github.com/fragility/spatial_adapter
Spatial Adapter
http://geokit.rubyforge.org/
Geokit Ruby & Rails
https://github.com/andre/geokit-gem
Gem
Calculate distance between two points
Geocoding using Google, Yahoo... geocoders
Rectangular bounds calculations
ActiveRecord distance-based finders
IP-based location lookup utilizing hostip.info
A before_filter helper to geocoder the user's location based on IP address, and retain the location in a cookie.
class Item < ActiveRecord::Base
acts_as_mappable :default_units => :miles, :default_formula => :sphere, :distance_field_name => :distance, :lat_column_name => :lat, :lng_column_name => :long
end
def close_items(limit = 10) Item.find :all, :origin => [lat,long], :order => 'distance ASC', :limit => limit, :conditions => "id != #{self.id}"end
SELECT *,(ACOS(least(1,COS(0.688863980396179)*COS(-0.00643627778823306)*COS(RADIANS(items.lat))*COS(RADIANS(items.long))+COS(0.688863980396179)*SIN(-0.00643627778823306)*COS(RADIANS(items.lat))*SIN(RADIANS(items.long))+SIN(0.688863980396179)*SIN(RADIANS(items.lat))))*6376.77271)AS distance FROM `items` WHERE (((items.lat>39.4600136605259 AND items.lat<39.4779838100416 AND items.long>-0.380410723713182 AND items.long<-0.357132382365919)) AND ((ACOS(least(1,COS(0.688863980396179)*COS(-0.00643627778823306)*COS(RADIANS(items.lat))*COS(RADIANS(items.long))+COS(0.688863980396179)*SIN(-0.00643627778823306)*COS(RADIANS(items.lat))*SIN(RADIANS(items.long))+SIN(0.688863980396179)*SIN(RADIANS(items.lat))))*6376.77271)
Fusion tables gem
http://github.com/tokumine/fusion-tables
fernando.blat.es
THANKS;)@ferblape
blog.vizzuality.com@jatorre