Intro to PostGIS in
Ruby
What is PostGIS
A set of geo-spatial extensions for the PostgreSQL
database
And for those who don’t know, PostgreSQL is an SQL
database similar to MySQL & MS SQL Server
What do I need to know about
geo-spatial ‘stuff’ to get going?
It depends entirely on what you’re doing :)
The Building Blocks:
Point
LineString
Polygon
With these Blocks, 

we can ask:
Does this LineString intersect any Polygons?
Which Polygons does a Point exist within?
How much do these Polygons overlap?
What are the closest alternative Points to this Point?
much, much more
SRID?
Spatial Reference ID
Need to understand that when displaying a 3D world on
a 2D screen, decisions on how to need to be made
SRID?
Much like a graph needs labeled axis to mean anything,
SRIDs provide context to correctly interpret spatial
coordinates
There’s a collation of industry standard SRID’s that get
setup on your db - look at your shiny new
spatial_ref_sys table
Rule of thumb - unless you know better, just use 4326 :)
Spatial Indexes
Greatly improves the speed of querying complex spatial
datasets
Pulling this all into 

Ruby Land!
RGeo provides the spatial ‘building blocks’ for Ruby
ActiveRecord PostGIS Adapter provides the migration
support & RGeo type casting layer to ActiveRecord/Rails
RGeo
https://github.com/rgeo/rgeo
‘An implementation of the industry standard OGC Simple
Features Specification, which provides data
representations of geometric objects such as points,
lines and polygons, along with a set of geometric
analysis operations.’
What’s missing?
A nice abstraction layer allowing scoped spatial queries

i.e.

Hotel.near(location).with_wifi

Region.within(country)

country.outside?(region)
Common Spatial Commands
ST_Intersects

Does a line or polygon intersect with another line or polygon?

Useful for ‘areas travelled through’ or ‘area union’ kind of questions
ST_DWithin

Lets us ask whether a geographic object is within a certain distance of
another geographic object
ST_Contains

Do all given points lie within a given polygon?
ST_Overlaps

Do 2 different geometries share space?
Common Spatial Commands
Plenty more, check out the API!
So, what is this good for?
Criminally underused in the web dev world
Incredibly powerful for providing context to applications
that utilise location related data

(in the Rails world, think mobile APIs…)
Great for data analysis & strategically targeting markets
- think growth hacking!
So, what is this good for?
Working with existing spatial datasets
ESRI Shapefile
A popular format for storing geometric location
information & associated metadata
Used heavily by the Australian Government

- e.g. municipal boundaries, ABS data & census data
Most of our friendly geo-spatial software will happily
find a way to work with this data format
Some Gotchas
Make sure your schema includes the postgis extension
Don’t delete the spatial_ref_sys table!
Pay close attention to your SRIDs, and unless you’re
sure, stick to using 4326 on your db
When importing data, convert it to 4326 if a data source
is in a different SRID
Some Gotchas
Rails likes to use SELECT table.* - beware that this can
be painful to performance if your table contains lots of
intricate spatial data. Consider using a join to store
complex data in a separate table & only call when
necessary.
Even with spatial indexing, large datasets can become a
burden on the database. Consider using traditional id
based relationships as a cache for complex geospatial
result sets.
Alternatives
MySQL Spatial Extensions
Not as mature as PostGIS
Only MyISAM supports spatial indexes - ok if you’re not
into data retention :)
SQL Server
More mature than MySQL & not a bad choice if you’re a
MS Shop
Alternatives
Oracle Spatial
I’ve heard it’s pretty good if you have the wallet for it!
I’ve also been informed that there’s a free version that may cut it
for many people :)
MongoDB
Great for basic geospatial functionality
Not as fully featured as PostGIS, may leave you wanting in certain
areas
Getting Started in Rails
First step: Get a copy of PostgreSQL & PostGIS
Easiest way on OS/X is to grab Postgres.app from
http://postgresapp.com/
Grab a copy of QGIS while you’re at it - 

http://www.kyngchaos.com/software/qgis for Mac
users
Getting Started in Rails
rails new spatial_project -d postgresql!
gem ‘activerecord-postgis-adapter’

Gemfile!
adapter: postgis

config/database.yml!
rake db:create!
rake db:gis:setup
Getting Started in Rails
You can now run migrations like these:



create_table :spatials, do |t|

t.string :name,

t.multi_polygon, :area, srid: 4326,

t.point, :position, srid: 4326,

t.line_string, :path, srid: 4326

end
Getting Started in Rails
And create spatial indexes like this:



add_index :spatials, :area, spatial: true
Resources
http://gis.stackexchange.com/
http://postgis.net/documentation/
http://daniel-azuma.com/articles/georails
https://www.qgis.org/

Adelaide Ruby Meetup PostGIS Notes

  • 1.
  • 2.
    What is PostGIS Aset of geo-spatial extensions for the PostgreSQL database And for those who don’t know, PostgreSQL is an SQL database similar to MySQL & MS SQL Server
  • 3.
    What do Ineed to know about geo-spatial ‘stuff’ to get going? It depends entirely on what you’re doing :)
  • 4.
  • 5.
    With these Blocks,
 we can ask: Does this LineString intersect any Polygons? Which Polygons does a Point exist within? How much do these Polygons overlap? What are the closest alternative Points to this Point? much, much more
  • 6.
    SRID? Spatial Reference ID Needto understand that when displaying a 3D world on a 2D screen, decisions on how to need to be made
  • 7.
    SRID? Much like agraph needs labeled axis to mean anything, SRIDs provide context to correctly interpret spatial coordinates There’s a collation of industry standard SRID’s that get setup on your db - look at your shiny new spatial_ref_sys table Rule of thumb - unless you know better, just use 4326 :)
  • 8.
    Spatial Indexes Greatly improvesthe speed of querying complex spatial datasets
  • 9.
    Pulling this allinto 
 Ruby Land! RGeo provides the spatial ‘building blocks’ for Ruby ActiveRecord PostGIS Adapter provides the migration support & RGeo type casting layer to ActiveRecord/Rails
  • 10.
    RGeo https://github.com/rgeo/rgeo ‘An implementation ofthe industry standard OGC Simple Features Specification, which provides data representations of geometric objects such as points, lines and polygons, along with a set of geometric analysis operations.’
  • 11.
    What’s missing? A niceabstraction layer allowing scoped spatial queries
 i.e.
 Hotel.near(location).with_wifi
 Region.within(country)
 country.outside?(region)
  • 12.
    Common Spatial Commands ST_Intersects
 Doesa line or polygon intersect with another line or polygon?
 Useful for ‘areas travelled through’ or ‘area union’ kind of questions ST_DWithin
 Lets us ask whether a geographic object is within a certain distance of another geographic object ST_Contains
 Do all given points lie within a given polygon? ST_Overlaps
 Do 2 different geometries share space?
  • 13.
    Common Spatial Commands Plentymore, check out the API!
  • 14.
    So, what isthis good for? Criminally underused in the web dev world Incredibly powerful for providing context to applications that utilise location related data
 (in the Rails world, think mobile APIs…) Great for data analysis & strategically targeting markets - think growth hacking!
  • 15.
    So, what isthis good for? Working with existing spatial datasets
  • 16.
    ESRI Shapefile A popularformat for storing geometric location information & associated metadata Used heavily by the Australian Government
 - e.g. municipal boundaries, ABS data & census data Most of our friendly geo-spatial software will happily find a way to work with this data format
  • 17.
    Some Gotchas Make sureyour schema includes the postgis extension Don’t delete the spatial_ref_sys table! Pay close attention to your SRIDs, and unless you’re sure, stick to using 4326 on your db When importing data, convert it to 4326 if a data source is in a different SRID
  • 18.
    Some Gotchas Rails likesto use SELECT table.* - beware that this can be painful to performance if your table contains lots of intricate spatial data. Consider using a join to store complex data in a separate table & only call when necessary. Even with spatial indexing, large datasets can become a burden on the database. Consider using traditional id based relationships as a cache for complex geospatial result sets.
  • 19.
    Alternatives MySQL Spatial Extensions Notas mature as PostGIS Only MyISAM supports spatial indexes - ok if you’re not into data retention :) SQL Server More mature than MySQL & not a bad choice if you’re a MS Shop
  • 20.
    Alternatives Oracle Spatial I’ve heardit’s pretty good if you have the wallet for it! I’ve also been informed that there’s a free version that may cut it for many people :) MongoDB Great for basic geospatial functionality Not as fully featured as PostGIS, may leave you wanting in certain areas
  • 21.
    Getting Started inRails First step: Get a copy of PostgreSQL & PostGIS Easiest way on OS/X is to grab Postgres.app from http://postgresapp.com/ Grab a copy of QGIS while you’re at it - 
 http://www.kyngchaos.com/software/qgis for Mac users
  • 22.
    Getting Started inRails rails new spatial_project -d postgresql! gem ‘activerecord-postgis-adapter’
 Gemfile! adapter: postgis
 config/database.yml! rake db:create! rake db:gis:setup
  • 23.
    Getting Started inRails You can now run migrations like these:
 
 create_table :spatials, do |t|
 t.string :name,
 t.multi_polygon, :area, srid: 4326,
 t.point, :position, srid: 4326,
 t.line_string, :path, srid: 4326
 end
  • 24.
    Getting Started inRails And create spatial indexes like this:
 
 add_index :spatials, :area, spatial: true
  • 25.