LinuxFest NW - Using Postgis To Add Some Spatial Flavor To Your App
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

LinuxFest NW - Using Postgis To Add Some Spatial Flavor To Your App

  • 2,477 views
Uploaded on

round 2 of the talk I gave before - a little has changed but not much

round 2 of the talk I gave before - a little has changed but not much

More in: Technology , Business
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
2,477
On Slideshare
2,471
From Embeds
6
Number of Embeds
3

Actions

Shares
Downloads
29
Comments
0
Likes
0

Embeds 6

http://www.techgig.com 4
http://www.slideshare.net 1
http://www.linkedin.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Using PostGIS to add some spatial flavor to your applications Steven Citron-Pousty Applied Technology Leader ICF/Jones & Stokes
  • 2. Agenda
    • What is PostGIS
    • Installing
    • Getting data and importing
    • Using in an application
    • ASK QUESTIONS ALL ALONG
  • 3. Assumptions about you
    • Know PostgreSQL and SQL
    • New to spatial analysis and PostGIS
    • Mainly using a commercial mapping service for your base layers
    • Interested in writing cool applications
    • This will only be a short shallow introduction
  • 4.  
  • 5. What is PostGIS
    • PostGIS adds support for geographic objects and geographic functions to PostgreSQL
      • Points, Lines, Polygon, and Linear References
      • Spatial function such as area, near, overlap, within, clip, and simplify
  • 6. Competitive Offerings
    • SQLLite – has spatiallite which is a kickin' compliment to PostGIS
    • MySQL – doesn’t really implement all the functions and it only deals with bounding boxes
    • SQLServer – only in SQLServer2008 but supported on all editions
    • Oracle Spatial – full featured and includes a broad range of client libraries
    • DB2 and Sybase and Informix and Ingres
    • ESRI’s SDE can use PostGIS as a DB
  • 7. Installing
    • Other libraries you want
      • Proj4.5 for projection
      • GEOS 3.0 for spatial operations
    • Windows – use the “application stack builder”
    • There are RPMs on the PostGIS site – not always the latest
    • You can use Synaptic for Ubuntu – not always the latest
    • Build is really simple, as long as you have required libraries installed
    • http://www.paolocorti.net/2008/01/30/installing-postgis-on-ubuntu/
  • 8. Other Steps
    • Add the objects and functions from the provided SQL files
    • Best practice is to make these into a template for future databases
    • From there making DBs is easy cheesy
  • 9. Two more things you need to understand Almost there – I promise
  • 10.  
  • 11. Shapefiles when is a file not a file
  • 12. Projections and Datums
  • 13.  
  • 14. More Projection Goodness
    • EPSG (European Petroleum Survey Group) has a number for most projections and datum combinations
    • Most online commercial mapping services, expect geographic coordinates with WGS84 datum
    • EPSG:4326
      • Geographic coordinates system with WGS84 datum.
      • Degrees are not constant distance as you move North and South
      • Not very accurate for distance and area calcs except over small areas
    • You want to use projected layers (or project on the fly) for area and distance calcs
  • 15. Why should you care
    • Because most of the data in the world is not in GCS WGS84 – eventhough your GPS is
  • 16. Projecting using ogr2ogr
    • Assuming there is a .prj file you need to find your output projection
    • http://Spatialreference.org
    • ogr2ogr -t_srs EPSG:4326 -f "ESRI Shapefile" water_bodies_gcs.shp water_bodies.shp
  • 17. Now let’s make some SQL
    • Shp2pgsql is a command-line utility to take a shapefile to a SQL file
    • The geometry field is called the_geom
    • shp2pgsql.exe -s 4326 -I C:datawater_bodies_gcs.shp waterbodies > C:datawaterbodies.sql
  • 18. Y’all know what to do with SQL
    • psql -q -U postgres -f C:datawaterbodies.sql kerncounty
    • With lots-o-features you want to use –q option to prevent spamming your terminal
  • 19.  
  • 20. Let’s get this party started
    • SELECT gid, the_geom FROM waterbodies WHERE gid = 2;
    • gid | the_geom
    • -----+------------------------------------------------------------------------------------------------------------------------ 2 | 106000020E6100000010000000103000000010000002E00000002CB8FC170C65DC06200F8D0E7B341408625910970C65DC0DE898BCAE7B3414053748B1A6FC65DC0199092E7E6B34140576BAFCB6EC65DC07815C607E6B34140926B64A66EC65DC0D0D11854E4B34140CA783CC66EC65DC091477CD7E2B34140FD8B372B6FC65DC02D75F091E1B341400748F1756FC65DC02C1C7C06E0B34140A0CBF8846FC65DC01B057AC2DEB34140BD6BDE586FC65DC036C25B1ADEB34140E73E8FBC6EC65DC051B6DE2DDDB3414037EFA3B86DC65DC0A6E75E4DDCB34140EECF5AF16CC65DC007312311DBB341405304E1D16CC65DC0C653541FDAB34140B352AB826CC65DC06800DD22D9B34140FDECCB8C6CC65DC0A8D8188ED7B3414028DA62606DC65DC03020AA9DD5B341401345D79D6EC65DC045CF8743D5B3414039BFF5A56FC65DC071F2D61AD6B34140D4391F4E70C65DC01F041E4CD7B34140FD50463A70C65DC0534507A5D8B3414087FB5FFA6FC65DC0C436FF22DAB3414092BF83B46FC65DC05EEC9961DBB34140456F69BC6FC65DC0E74915C3DCB34140DCCD550170C65DC022859B35DEB34140A929A59870C65DC014E6EA42DFB34140D7388A8E70C65DC0B2B22CD4DFB341405EA0F73270C65DC0E92146C4E0B341402EC4B3DE6FC65DC066AD87D3E1B3414083B732D26FC65DC0583D9907E3B3414017F8104E70C65DC07C37AB39E4B341404DFB09DA70C65DC0AB6838C7E4B341404E376F4871C65DC0D88F88EAE4B34140E290F4CC71C65DC04318C2B1E4B34140B2B1373672C65DC001CD36A7E3B3414094289CBD72C65DC032BF27F1E2B34140551D1E3773C65DC053E9A4C1E2B34140B247EEC273C65DC03C50B08FE3B34140EFFF2CD573C65DC0849F2D84E4B34140BB03E9A973C65DC0D397181FE5B341406292782B73C65DC0103A5EA9E5B34140B2EB752172C65DC0E72BDC89E5B341407818E39771C65DC0978C430BE6B34140AAE00CA471C65DC0E6C241AEE6B341405DD5367B71C65DC050325840E7B3414002CB8FC170C65DC06200F8D0E7B34140
    WTF!
  • 21. Well Known Text (WKT)‏
    • SELECT gid, asText(the_geom) AS Geometry FROM waterbodies WHERE gid = 2;
    • gid | geometry
    • -----+------------------------------------------------------------------------------------------------------------------
    • 2 | MULTIPOLYGON(((-119.100632086203 35.4055119715638,-119.100588218445 35.4055112058011,-119.100531231104 35.4054841485633,-119.100512429531 35.4054574696738,-119.100503538195 35.4054055329503,-119.100511130385 35.4053601605257,-119.100535206075 35.405321352397,-119.100553022028 35.405274210549,-119.100556605305 35.4052355857659,-119.100546090324 35.4052155445137,-119.100508823288 35.4051873528921,-119.100446853726 35.4051605904963,-119.100399340328 35.4051228925546,-119.100391835921 35.4050940667872,-119.100372950847 35.4050639704809,-119.100375365397 35.405015718586,-119.100425812278 35.4049565392201,-119.10050149939 35.4049457944043,-119.100564470279 35.4049714612528,-119.100604563231 35.4050078531802,-119.100599831265 35.4050489697935,-119.100584596379 35.4050945039903,-119.100567940388 35.4051324845866,-119.1005698232335.4051746229123,-119.10058625583 35.4052187928558,-119.100622330944 35.4052508971182,-119.100619921668 35.4052682131054,-19.100598089049 35.4052968351787,-119.100577998689 35.4053291714179,-119.100575017479 35.4053658960572,-119.100604549953 35.405402382471,-119.100637922046 35.4054192567285,-119.100664242372 35.4054234663778,-119.100695837816 35.4054166982392,-119.100720934285 35.4053849237043,-119.100753214358 35.4053632206036,-119.100782184037 35.405357556842,-119.100815518089 35.4053821192651,-119.100819868035 35.4054112646836,-119.10080955272 35.4054297323306,-119.100779407259 35.4054462156383,-119.100715985448 35.4054424595886,-119.100683185361 35.405457885726,-119.100686085296 35.4054773160076,-119.100676349209 35.4054947310111,-119.100632086203 35.4055119715638)))‏
  • 22. Lesson Learned
    • Ask for your responses in Text format when you want to know what is going on
    • eWKT includes the projection information 'SRID=4326;MULTIPOLYGON(((-119.5 35.0, -119.0 35.0, -119.0 35.5, -119.5 35.5, -119.5 35.0)))'
    • asKML, asSVG, asGeoJSON (1.3.4) or asGML
    SELECT asKML(the_geom) FROM watercourses WHERE gid = 17;
  • 23. <MultiGeometry> <Polygon> <outerBoundaryIs> <LinearRing> <coordinates>-118.90476592 907,35.4477387779291 -118.904082378315,35.4465853812531 -118.904745088997,35.447 2133838697 -118.90476592907,35.4477387779291</coordinates> </LinearRing> </outerBoundaryIs> </Polygon> </MultiGeometry>
  • 24. Inserting a new record
    • Projection has to match
    INSERT INTO firestations(station_na, the_geom)‏ VALUES('Best LittleFire House in CA', ST_SetSRID(ST_MakePoint(-119.5, 34.5), 4326) );
  • 25. Select using the geometry
  • 26.  
  • 27. FOSS desktop GIS
    • uDIG
    • OpenJump
    • gvSIG
    • QGIS
    • MapWindows
  • 28.  
  • 29. Distance
    • In units of the underlying coverage
    SELECT gid FROM waterbodies WHERE ST_DWithin('SRID=4326;POINT (-119.103762382096 35.4122898449297)', the_geom, 0.005); gid ----- 4 5 6 7 8
  • 30. Let’s find all the parcels in Agricultural Zones SELECT p.gid FROM parcels AS p, zoning AS z WHERE z.comb_zn LIKE 'A%' AND ST_Within(p.the_geom, z.the_geom);
  • 31. Do something with the geometry after selection
  • 32.  
  • 33. Calculating Area SELECT sum(ST_Area(z.the_geom)) FROM zoning AS z WHERE z.comb_zn LIKE 'NR%'; sum -------------------- 0.0131834159551545
  • 34. Turn polygons into points SELECT gid, asText(ST_Centroid(the_geom)) FROM waterbodies WHERE gid = 124; gid | geometry -----+------------------------------------------- 124 | POINT(-118.427120958287 35.6702299014044)‏ SELECT gid, asText(ST_PointOnSurface(the_geom)) FROM waterbodies WHERE gid = 124; gid | geometry -----+------------------------------------------- 124 | POINT(-118.449967685908 35.6911672413056)‏
  • 35. Create new tables using a select CREATE TABLE biglake WITH OIDS AS SELECT gid, the_geom FROM waterbodies WHERE gid = 124; SELECT ST_AREA(the_geom) FROM biglake; st_area --------------------- 0.00313986591299908
  • 36. Buffering
  • 37. Some SQL to buffer SELECT ST_Area(ST_Buffer(the_geom, 0.1)) FROM biglake; st_area -------------------- 0.0718529848413709 Remember that is used to be 0.003
  • 38.  
  • 39. Spatial Operators
  • 40. Clip to the bounding box SELECT gid, ST_Intersection(the_geom, 'SRID=4326;MULTIPOLYGON((( -119.5 35.0, -119.0 35.0, -119.0 35.5, -119.5 35.5, -119.5 35.0)))') FROM watercourses WHERE ST_Intersects(the_geom, 'SRID=4326;MULTIPOLYGON((( -119.5 35.0, -119.0 35.0, -119.0 35.5, -119.5 35.5, -119.5 35.0)))');
  • 41. Simplifying geometries
    • Most geometries have more information than you can display
    • There are algorithms for weeding out points
    • Trade-off retaining “shape” versus less points
  • 42. Select ST_NPoints(the_geom) FROM watercourses WHERE gid IN (12, 14, 17); st_npoints ------------ 265 68 48
  • 43. SELECT ST_NPoints(ST_Simplify(the_geom, 0.00001)) FROM watercourses WHERE gid IN (12, 14, 17); st_npoints ------------ 65 19 18
  • 44. SELECT ST_NPoints(ST_Simplify(the_geom, 0.0001)) FROM watercourses WHERE gid IN (12, 14, 17); st_npoints ------------ 18 6 7
  • 45. So how do you bring this together in an app
    • Never send 3000 pts to the browser
    • Putting your information in a DB gives you way more control over what you return and display
    • http://demo.decarta.com/opensearchservice/index.html
  • 46. Where do you go now - PostGIS
    • Home
      • http://postgis.refractions.net/
    • Tools to use with PostGIS
      • http://postgis.refractions.net/support/wiki/index.php?ToolsSupportPostgis
    • Good support Wiki
      • http://postgis.refractions.net/support/wiki/
    • Another Introduction
      • http://www.mapbender.org/presentations/Spatial_Data_Management_Arnulf_Christl/Spatial_Data_Management_Arnulf_Christl.pdf
    • Great OS-GEO resources
      • http://www.bostongis.com/
      • PostGIS specific
        • http://www.bostongis.com/postgis_quickguide.bqg?outputformat=PDF
    • Nice GIS on a Stick for Windows http://www.archaeogeek.com/blog/portable-gis /
  • 47. Where to get Data
    • Kern County
      • http://www.co.kern.ca.us/gis/downloads.asp
    • California
      • http://gis.ca.gov/casil/
    • US Census
      • http://www.census.gov/geo/www/tiger/
    • Some UN
      • http://www.grida.no/gis/index.htm
    • http://www.geographynetwork.com/
    • http://gos2.geodata.gov/wps/portal/gos
    • Open source Data
      • http://www.fortiusone.com/
      • OSM
        • http:// wiki.openstreetmap.org/index.php/Planet.osm
        • http://code.google.com/p/osm2shp/
  • 48. Map API to use
    • OpenStreetMap - CloudMade
    • http://developer.decarta.com
    • Google
    • Microsoft
    • Mapquest
  • 49.