SlideShare uma empresa Scribd logo
1 de 37
Baixar para ler offline
PostGIS on Rails




                                    Matt Nemenman
                           matt@apartmentlist.com
                                     @quarterdome

Friday, April 19,                                   1
About me


                    Programmer

                    Love maps

                    Building map based rental search
                    engine @ Apartment List




Friday, April 19,                                      2
Location Aware Apps



                    Where am I?

                    What is around me?




Friday, April 19,                         3
Where am I?

                    Latitude and Longitude

                      HTML5 geolocation or GPS

                    Address

                      Geocoding

                      Reverse geocoding


Friday, April 19,                                4
Where am I?

                    What if you need to know ...

                      Neighborhood

                      School district

                      National park

                      Earthquake safety zone



Friday, April 19,                                  5
What is around me?


                    Yelp and Google Places API

                      Restaurants, bars, etc.

                      Points of interest




Friday, April 19,                                6
What is around me?

                    What if you want to know ...

                      What are three neighborhoods
                      closest to me?

                      Average rent for 1 bedroom in
                      Lower Pacific Heights

                      Crime rate on my city block

                      Who is around me?

Friday, April 19,                                     7
When 3rd party APIs
                      fall short ...


                    Get your own data set

                    Build your own solution




Friday, April 19,                             8
Spatial Systems

                    MongoDB

                    Solr

                    MySQL

                    Oracle / DB2

                    PostGIS



Friday, April 19,                       9
PostGIS
                     Geospatial extension to Postgres

                     New datatypes

                     Functions to work with those
                     datatypes

                     Spatial indices using GiST


                    create extension postgis;

Friday, April 19,                                       10
A Simple Example




Friday, April 19,                      11
A simple example

                    Yosemite Park Ranger

                    Tracking bears equipped with GPS
                    transmitters

                    Want to show all the bears on Google
                    Maps




Friday, April 19,                                          12
Bears (database
                         migration)
                    create_table :bears do |t|
                      t.column :lat, :float
                      t.column :lon, :float
                    end

                    add_index :bears, :lat
                    add_index :bears, :lon
                    add_index :bears, [:lat, :lon]


Friday, April 19,                                    13
Bears (model)
                    class Bear < ActiveRecord::Base

                    def self.bbox(sw_lon, sw_lat,
                                  ne_lon, ne_lat)
                      self
                        .where( :lon => sw_lon..ne_lon )
                        .where( :lat => sw_lat..ne_lat )
                    end

                    end


Friday, April 19,                                          14
A PostGIS example
                        (migration)
                    create_table :bears do |t|
                      t.column :coordinates,
                        :geometry,
                        :srid => 4326
                    end

                    add_index :bears,
                      :coordinates,
                      :spatial => true

Friday, April 19,                                15
A PostGIS example
                           (model)
                    def self.box(sw_lon, sw_lat, ne_lon, ne_lat)

                      factory = Rails.application.spatial_factory

                      sw   =   factory.point(sw_lon,   sw_lat)
                      nw   =   factory.point(sw_lon,   ne_lat)
                      ne   =   factory.point(ne_lon,   ne_lat)
                      se   =   factory.point(ne_lon,   sw_lat)

                      ring = factory.linear_ring([sw, nw, ne, se])
                      bbox = factory.polygon(ring)

                      self
                        .where('ST_Intersects(coordinates, :bbox)',
                               :bbox => bbox)
                    end


Friday, April 19,                                                     16
A PostGIS example


                    1_000_000.times do
                      Bear.create!( ...)
                    end




Friday, April 19,                          17
1,000,000 bears



                    PostGIS is 1.5x to 50x faster




Friday, April 19,                                   18
Active Record
                       PostGIS Adapter
                    Migration support

                    Automatic conversion of PostGIS
                    datatypes to Ruby (RGeo) objects and
                    back

             gem 'pg'
             gem 'rgeo'
             gem 'activerecord-postgis-adapter'

Friday, April 19,                                          19
Rails Migrations

                    add_column :bears,
                      :coordinates,
                      :geometry, :srid => 4326

                    add_index :bears,
                      :coordinates,
                      :spatial => true


Friday, April 19,                                20
Postgres Table

                    => d bears
                                     Table "public.bears"
                        Column    |            Type
                    -------------+-----------------------------
                     id           | integer
                     coordinates | geometry(Geometry,4326)
                    Indexes:
                         "pins_pkey" PRIMARY KEY, btree (id)
                         "index_pins_on_coordinates" gist (coordinates)




Friday, April 19,                                                         21
PostGIS Data

             => select id, coordinates from bears limit 4;
              id |                    coordinates
             ----+----------------------------------------------------
               1 | 0101000020E61000002A8A632C341F664021805D8DDBEB4BC0
               2 | 0101000020E61000004DF900A54A5866C0A2BAB6AC827D50C0
               3 | 0101000020E61000002450EA628F5259C01C789C77C2883040
               4 | 0101000020E610000038760C7B85443C4013206005DC2C48C0
             (4 rows)




Friday, April 19,                                                        22
RGeo

             ##> bear=Bear.first
              => #<Bear id: 1, coordinates:
             #<RGeo::Geos::CAPIPointImpl:0x3fd52ab501b4 "POINT
             (176.9751188224921 -55.84263770165877)">>

             ##> bear.coordinates.x
              => 176.9751188224921

             ##> bear.coordinates.y
              => -55.84263770165877




Friday, April 19,                                                23
More examples
             # d parks
                       Column        |            Type
             ------------------------+-----------------------------
              id                     | integer
              name                   | character varying(255)
              boundary               | geometry(Geometry,4326)

             Indexes:
                 "parks_pkey" PRIMARY KEY, btree (id)
                 "index_parks_on_name" btree (name)
                 "index_parks_on_boundary" gist (polygon)

             # select id, name, boundary from parks limit 2;
                id   |    name     |      boundary
             --------+-------------+------------------------
                   1 | Yosemite    |0103000020E6100000010000...
                   2 | Yellowstone |0103000020E6100000010000...



Friday, April 19,                                                     24
How many bears are
                     in Yosemite now?

          ##> park = Park.find_by_name(‘Yosemite’)

          ##> bears = Bear.where(‘ST_Intersects(coordinates, :bounds)’,
                         :bounds => park.boundary)

          ##> bear_count = bears.count




Friday, April 19,                                                         25
How Many Bears in
                    Yosemite and Yellowstone
                             (Ruby)?

          ##> yosemite = Park.find_by_name(‘Yosemite’)

          ##> yellowstone = Park.find_by_name(‘Yellowstone’)

          ##> bounds = yosemite.boundary + yellowstone.boundary

          ##> bears = Bear.where(‘ST_Intersects(coordinates, :bounds)’,
                         :bounds => bounds)

          ##> bear_count = bears.count




Friday, April 19,                                                         26
How Many Bears in
                    Yosemite and Yellowstone
                             (SQL)?


          select count(*) from bears
            inner join parks
              on ST_Intersects(bears.coordinates,
                               parks.boundary)
            where parks.name in (‘Yosemite’,
                                 ‘Yellowstone’);




Friday, April 19,                                   27
Three parks closest
                          to me?
                    Distance operator (KNN) is a feature
                    of Postgres 9.1 and above


          select id, name,
               boundary <-> ST_Point(37.775, -122.44) as distance
          from parks
          order by distance
          limit 3;




Friday, April 19,                                                   28
What else is
                     possible?



Friday, April 19,                  29
Geometry
                       Simplification

                    ST_Simplify

                    ST_ConvexHull

                    ST_ConcaveHull




Friday, April 19,                       30
Spatial
                        Relationships
                    ST_Centroid

                    ST_Contained

                    ST_Area

                    ST_Perimeter

                    ST_DWithin



Friday, April 19,                       31
Format Conversions



                    ST_AsGeoJSON

                    ST_AsText




Friday, April 19,                        32
Do Try It at Home

                    Heroku Postgres
                      https://devcenter.heroku.com/articles/heroku-
                      postgres-extensions-postgis-full-text-search


                    Postgres.app
                      http://postgresapp.com/


                    select postgis_full_version();



Friday, April 19,                                                     33
Data Sources
                             (free)

                    US Census Data (Tiger)
                      http://www.census.gov/geo/maps-data/data/tiger.html


                    Zillow Neighborhoods
                      http://www.zillow.com/howto/api/neighborhood-
                      boundaries.htm




Friday, April 19,                                                           34
Data Sources
                         (commercial)
                    Maponics

                      http://www.maponics.com/

                    Urban Mapping

                      http://www.urbanmapping.com/

                    Onboard Informatics

                      http://www.onboardinformatics.com/


Friday, April 19,                                          35
Links
                    PostGIS

                      http://postgis.net/

                    Active Record PostGIS Adapter

                      https://github.com/dazuma/
                      activerecord-postgis-adapter

                    RGeo

                      https://github.com/dazuma/rgeo


Friday, April 19,                                      36
Q & A




                    We are hiring @apartmentlist!
Friday, April 19,                                   37

Mais conteúdo relacionado

Destaque

Cic rds product portfolio october 2013
Cic rds product portfolio   october 2013Cic rds product portfolio   october 2013
Cic rds product portfolio october 2013Ehab Fawzy
 
Case study of Fem HRS college demonstration @ 22nd feb 2010
Case study of Fem HRS college demonstration @ 22nd feb 2010Case study of Fem HRS college demonstration @ 22nd feb 2010
Case study of Fem HRS college demonstration @ 22nd feb 2010Archan Gurtu
 
Human face-of-accessibility
Human face-of-accessibilityHuman face-of-accessibility
Human face-of-accessibilityelianna james
 
Imp drishti farm to fork club
Imp drishti farm to fork clubImp drishti farm to fork club
Imp drishti farm to fork clubSHIVA CSG PVT LTD
 
Dbpl bioproducts for sustainable farming
Dbpl bioproducts for sustainable farmingDbpl bioproducts for sustainable farming
Dbpl bioproducts for sustainable farmingSHIVA CSG PVT LTD
 
Wcag 2.0 level_a_all_ejames
Wcag 2.0 level_a_all_ejamesWcag 2.0 level_a_all_ejames
Wcag 2.0 level_a_all_ejameselianna james
 
Content marketing tips & tricks
Content marketing tips & tricksContent marketing tips & tricks
Content marketing tips & tricksYael Kochman
 
Skills needed-for-a-job-in-accessibility
Skills needed-for-a-job-in-accessibilitySkills needed-for-a-job-in-accessibility
Skills needed-for-a-job-in-accessibilityelianna james
 
Magento 2 integration tests
Magento 2 integration testsMagento 2 integration tests
Magento 2 integration testsDusan Lukic
 
QA Accessibility-testing
QA Accessibility-testingQA Accessibility-testing
QA Accessibility-testingelianna james
 
Lowendalmasaï social charges optimization
Lowendalmasaï social charges optimizationLowendalmasaï social charges optimization
Lowendalmasaï social charges optimizationGiuseppe Mele
 
Lowendalmasaï - Enterprise Cost Management
Lowendalmasaï - Enterprise Cost ManagementLowendalmasaï - Enterprise Cost Management
Lowendalmasaï - Enterprise Cost ManagementGiuseppe Mele
 
Lowendalmasaï - Funding Innovation
Lowendalmasaï - Funding InnovationLowendalmasaï - Funding Innovation
Lowendalmasaï - Funding InnovationGiuseppe Mele
 
Knorr Sampling in Train activity photographs
Knorr Sampling in Train activity photographsKnorr Sampling in Train activity photographs
Knorr Sampling in Train activity photographsArchan Gurtu
 
Tagetik Solvency II introduction
Tagetik Solvency II introductionTagetik Solvency II introduction
Tagetik Solvency II introductionEntrepreneur
 
מצגת מדיה חברתית
מצגת מדיה חברתיתמצגת מדיה חברתית
מצגת מדיה חברתיתAlon Zakai
 

Destaque (18)

Service profile scsg mining
Service profile scsg miningService profile scsg mining
Service profile scsg mining
 
Cic rds product portfolio october 2013
Cic rds product portfolio   october 2013Cic rds product portfolio   october 2013
Cic rds product portfolio october 2013
 
Case study of Fem HRS college demonstration @ 22nd feb 2010
Case study of Fem HRS college demonstration @ 22nd feb 2010Case study of Fem HRS college demonstration @ 22nd feb 2010
Case study of Fem HRS college demonstration @ 22nd feb 2010
 
Human face-of-accessibility
Human face-of-accessibilityHuman face-of-accessibility
Human face-of-accessibility
 
Imp drishti farm to fork club
Imp drishti farm to fork clubImp drishti farm to fork club
Imp drishti farm to fork club
 
Dbpl bioproducts for sustainable farming
Dbpl bioproducts for sustainable farmingDbpl bioproducts for sustainable farming
Dbpl bioproducts for sustainable farming
 
Wcag 2.0 level_a_all_ejames
Wcag 2.0 level_a_all_ejamesWcag 2.0 level_a_all_ejames
Wcag 2.0 level_a_all_ejames
 
Content marketing tips & tricks
Content marketing tips & tricksContent marketing tips & tricks
Content marketing tips & tricks
 
Skills needed-for-a-job-in-accessibility
Skills needed-for-a-job-in-accessibilitySkills needed-for-a-job-in-accessibility
Skills needed-for-a-job-in-accessibility
 
Magento 2 integration tests
Magento 2 integration testsMagento 2 integration tests
Magento 2 integration tests
 
QA Accessibility-testing
QA Accessibility-testingQA Accessibility-testing
QA Accessibility-testing
 
Lowendalmasaï social charges optimization
Lowendalmasaï social charges optimizationLowendalmasaï social charges optimization
Lowendalmasaï social charges optimization
 
Lowendalmasaï - Enterprise Cost Management
Lowendalmasaï - Enterprise Cost ManagementLowendalmasaï - Enterprise Cost Management
Lowendalmasaï - Enterprise Cost Management
 
Lowendalmasaï - Funding Innovation
Lowendalmasaï - Funding InnovationLowendalmasaï - Funding Innovation
Lowendalmasaï - Funding Innovation
 
Poisonous plants of world
Poisonous plants of worldPoisonous plants of world
Poisonous plants of world
 
Knorr Sampling in Train activity photographs
Knorr Sampling in Train activity photographsKnorr Sampling in Train activity photographs
Knorr Sampling in Train activity photographs
 
Tagetik Solvency II introduction
Tagetik Solvency II introductionTagetik Solvency II introduction
Tagetik Solvency II introduction
 
מצגת מדיה חברתית
מצגת מדיה חברתיתמצגת מדיה חברתית
מצגת מדיה חברתית
 

Último

Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfPrecisely
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESmohitsingh558521
 

Último (20)

Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
 

PostGIS on Rails

  • 1. PostGIS on Rails Matt Nemenman matt@apartmentlist.com @quarterdome Friday, April 19, 1
  • 2. About me Programmer Love maps Building map based rental search engine @ Apartment List Friday, April 19, 2
  • 3. Location Aware Apps Where am I? What is around me? Friday, April 19, 3
  • 4. Where am I? Latitude and Longitude HTML5 geolocation or GPS Address Geocoding Reverse geocoding Friday, April 19, 4
  • 5. Where am I? What if you need to know ... Neighborhood School district National park Earthquake safety zone Friday, April 19, 5
  • 6. What is around me? Yelp and Google Places API Restaurants, bars, etc. Points of interest Friday, April 19, 6
  • 7. What is around me? What if you want to know ... What are three neighborhoods closest to me? Average rent for 1 bedroom in Lower Pacific Heights Crime rate on my city block Who is around me? Friday, April 19, 7
  • 8. When 3rd party APIs fall short ... Get your own data set Build your own solution Friday, April 19, 8
  • 9. Spatial Systems MongoDB Solr MySQL Oracle / DB2 PostGIS Friday, April 19, 9
  • 10. PostGIS Geospatial extension to Postgres New datatypes Functions to work with those datatypes Spatial indices using GiST create extension postgis; Friday, April 19, 10
  • 11. A Simple Example Friday, April 19, 11
  • 12. A simple example Yosemite Park Ranger Tracking bears equipped with GPS transmitters Want to show all the bears on Google Maps Friday, April 19, 12
  • 13. Bears (database migration) create_table :bears do |t| t.column :lat, :float t.column :lon, :float end add_index :bears, :lat add_index :bears, :lon add_index :bears, [:lat, :lon] Friday, April 19, 13
  • 14. Bears (model) class Bear < ActiveRecord::Base def self.bbox(sw_lon, sw_lat, ne_lon, ne_lat) self .where( :lon => sw_lon..ne_lon ) .where( :lat => sw_lat..ne_lat ) end end Friday, April 19, 14
  • 15. A PostGIS example (migration) create_table :bears do |t| t.column :coordinates, :geometry, :srid => 4326 end add_index :bears, :coordinates, :spatial => true Friday, April 19, 15
  • 16. A PostGIS example (model) def self.box(sw_lon, sw_lat, ne_lon, ne_lat) factory = Rails.application.spatial_factory sw = factory.point(sw_lon, sw_lat) nw = factory.point(sw_lon, ne_lat) ne = factory.point(ne_lon, ne_lat) se = factory.point(ne_lon, sw_lat) ring = factory.linear_ring([sw, nw, ne, se]) bbox = factory.polygon(ring) self .where('ST_Intersects(coordinates, :bbox)', :bbox => bbox) end Friday, April 19, 16
  • 17. A PostGIS example 1_000_000.times do Bear.create!( ...) end Friday, April 19, 17
  • 18. 1,000,000 bears PostGIS is 1.5x to 50x faster Friday, April 19, 18
  • 19. Active Record PostGIS Adapter Migration support Automatic conversion of PostGIS datatypes to Ruby (RGeo) objects and back gem 'pg' gem 'rgeo' gem 'activerecord-postgis-adapter' Friday, April 19, 19
  • 20. Rails Migrations add_column :bears, :coordinates, :geometry, :srid => 4326 add_index :bears, :coordinates, :spatial => true Friday, April 19, 20
  • 21. Postgres Table => d bears Table "public.bears" Column | Type -------------+----------------------------- id | integer coordinates | geometry(Geometry,4326) Indexes: "pins_pkey" PRIMARY KEY, btree (id) "index_pins_on_coordinates" gist (coordinates) Friday, April 19, 21
  • 22. PostGIS Data => select id, coordinates from bears limit 4; id | coordinates ----+---------------------------------------------------- 1 | 0101000020E61000002A8A632C341F664021805D8DDBEB4BC0 2 | 0101000020E61000004DF900A54A5866C0A2BAB6AC827D50C0 3 | 0101000020E61000002450EA628F5259C01C789C77C2883040 4 | 0101000020E610000038760C7B85443C4013206005DC2C48C0 (4 rows) Friday, April 19, 22
  • 23. RGeo ##> bear=Bear.first => #<Bear id: 1, coordinates: #<RGeo::Geos::CAPIPointImpl:0x3fd52ab501b4 "POINT (176.9751188224921 -55.84263770165877)">> ##> bear.coordinates.x => 176.9751188224921 ##> bear.coordinates.y => -55.84263770165877 Friday, April 19, 23
  • 24. More examples # d parks Column | Type ------------------------+----------------------------- id | integer name | character varying(255) boundary | geometry(Geometry,4326) Indexes: "parks_pkey" PRIMARY KEY, btree (id) "index_parks_on_name" btree (name) "index_parks_on_boundary" gist (polygon) # select id, name, boundary from parks limit 2; id | name | boundary --------+-------------+------------------------ 1 | Yosemite |0103000020E6100000010000... 2 | Yellowstone |0103000020E6100000010000... Friday, April 19, 24
  • 25. How many bears are in Yosemite now? ##> park = Park.find_by_name(‘Yosemite’) ##> bears = Bear.where(‘ST_Intersects(coordinates, :bounds)’, :bounds => park.boundary) ##> bear_count = bears.count Friday, April 19, 25
  • 26. How Many Bears in Yosemite and Yellowstone (Ruby)? ##> yosemite = Park.find_by_name(‘Yosemite’) ##> yellowstone = Park.find_by_name(‘Yellowstone’) ##> bounds = yosemite.boundary + yellowstone.boundary ##> bears = Bear.where(‘ST_Intersects(coordinates, :bounds)’, :bounds => bounds) ##> bear_count = bears.count Friday, April 19, 26
  • 27. How Many Bears in Yosemite and Yellowstone (SQL)? select count(*) from bears inner join parks on ST_Intersects(bears.coordinates, parks.boundary) where parks.name in (‘Yosemite’, ‘Yellowstone’); Friday, April 19, 27
  • 28. Three parks closest to me? Distance operator (KNN) is a feature of Postgres 9.1 and above select id, name, boundary <-> ST_Point(37.775, -122.44) as distance from parks order by distance limit 3; Friday, April 19, 28
  • 29. What else is possible? Friday, April 19, 29
  • 30. Geometry Simplification ST_Simplify ST_ConvexHull ST_ConcaveHull Friday, April 19, 30
  • 31. Spatial Relationships ST_Centroid ST_Contained ST_Area ST_Perimeter ST_DWithin Friday, April 19, 31
  • 32. Format Conversions ST_AsGeoJSON ST_AsText Friday, April 19, 32
  • 33. Do Try It at Home Heroku Postgres https://devcenter.heroku.com/articles/heroku- postgres-extensions-postgis-full-text-search Postgres.app http://postgresapp.com/ select postgis_full_version(); Friday, April 19, 33
  • 34. Data Sources (free) US Census Data (Tiger) http://www.census.gov/geo/maps-data/data/tiger.html Zillow Neighborhoods http://www.zillow.com/howto/api/neighborhood- boundaries.htm Friday, April 19, 34
  • 35. Data Sources (commercial) Maponics http://www.maponics.com/ Urban Mapping http://www.urbanmapping.com/ Onboard Informatics http://www.onboardinformatics.com/ Friday, April 19, 35
  • 36. Links PostGIS http://postgis.net/ Active Record PostGIS Adapter https://github.com/dazuma/ activerecord-postgis-adapter RGeo https://github.com/dazuma/rgeo Friday, April 19, 36
  • 37. Q & A We are hiring @apartmentlist! Friday, April 19, 37