SlideShare a Scribd company logo
1 of 37
Download to read 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

More Related Content

Viewers also liked

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
 

Viewers also liked (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
 
מצגת מדיה חברתית
מצגת מדיה חברתיתמצגת מדיה חברתית
מצגת מדיה חברתית
 

Recently uploaded

Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observabilityitnewsafrica
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditSkynet Technologies
 
React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...Karmanjay Verma
 
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...BookNet Canada
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Alkin Tezuysal
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesThousandEyes
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Nikki Chapple
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxGenerative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxfnnc6jmgwh
 
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...amber724300
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
QMMS Lesson 2 - Using MS Excel Formula.pdf
QMMS Lesson 2 - Using MS Excel Formula.pdfQMMS Lesson 2 - Using MS Excel Formula.pdf
QMMS Lesson 2 - Using MS Excel Formula.pdfROWELL MARQUINA
 
WomenInAutomation2024: AI and Automation for eveyone
WomenInAutomation2024: AI and Automation for eveyoneWomenInAutomation2024: AI and Automation for eveyone
WomenInAutomation2024: AI and Automation for eveyoneUiPathCommunity
 
Infrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsInfrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsYoss Cohen
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Kaya Weers
 

Recently uploaded (20)

Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance Audit
 
React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...React JS; all concepts. Contains React Features, JSX, functional & Class comp...
React JS; all concepts. Contains React Features, JSX, functional & Class comp...
 
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
Microsoft 365 Copilot: How to boost your productivity with AI – Part two: Dat...
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptxGenerative AI - Gitex v1Generative AI - Gitex v1.pptx
Generative AI - Gitex v1Generative AI - Gitex v1.pptx
 
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
JET Technology Labs White Paper for Virtualized Security and Encryption Techn...
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
QMMS Lesson 2 - Using MS Excel Formula.pdf
QMMS Lesson 2 - Using MS Excel Formula.pdfQMMS Lesson 2 - Using MS Excel Formula.pdf
QMMS Lesson 2 - Using MS Excel Formula.pdf
 
WomenInAutomation2024: AI and Automation for eveyone
WomenInAutomation2024: AI and Automation for eveyoneWomenInAutomation2024: AI and Automation for eveyone
WomenInAutomation2024: AI and Automation for eveyone
 
Infrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platformsInfrared simulation and processing on Nvidia platforms
Infrared simulation and processing on Nvidia platforms
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 
Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)Design pattern talk by Kaya Weers - 2024 (v2)
Design pattern talk by Kaya Weers - 2024 (v2)
 

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