Using PostGIS To Add Some Spatial Flavor To Your Application

15,085 views

Published on

Published in: Technology

Using PostGIS To Add Some Spatial Flavor To Your Application

  1. Using PostGIS to add some spatial flavor to your applications Steven Citron-Pousty Developer Evangelist deCarta
  2. Agenda <ul><li>What is PostGIS </li></ul><ul><li>Installing </li></ul><ul><li>Getting data and importing </li></ul><ul><li>Using in an application </li></ul><ul><li>ASK QUESTIONS ALL ALONG </li></ul>
  3. Assumptions about you <ul><li>Know PostgreSQL and SQL </li></ul><ul><li>New to spatial analysis and PostGIS </li></ul><ul><li>Mainly using a commercial mapping service for your base layers </li></ul><ul><li>Interested in writing cool applications </li></ul><ul><li>This will only be a short shallow introduction </li></ul>
  4.  
  5. What is PostGIS <ul><li>PostGIS adds support for geographic objects and geographic functions to PostgreSQL </li></ul><ul><ul><li>Points, Lines, Polygon, and Linear References </li></ul></ul><ul><ul><li>Spatial function such as area, near, overlap, within, clip, and simplify </li></ul></ul>
  6. Competitive Offerings <ul><li>MySQL – doesn’t really implement all the functions and it only deals with bounding boxes </li></ul><ul><li>SQLServer – only in SQLServer2008 but supported on all editions </li></ul><ul><li>Oracle Spatial – full featured and includes a broad range of client libraries </li></ul><ul><li>DB2 and Sybase and Informix and Ingres </li></ul><ul><li>ESRI’s SDE can use PostGIS as a DB </li></ul>
  7. Installing <ul><li>Other libraries you want </li></ul><ul><ul><li>Proj4.5 for projection </li></ul></ul><ul><ul><li>GEOS 3.0 for spatial operations </li></ul></ul><ul><li>Windows – use the “application stack builder” </li></ul><ul><li>There are RPMs on the PostGIS site – not always the latest </li></ul><ul><li>You can use Synaptic for Ubuntu – not always the latest </li></ul><ul><li>Build is really simple, as long as you have required libraries installed </li></ul>
  8. Other Steps <ul><li>Add the objects and functions from the provided SQL files </li></ul><ul><li>Best practice is to make these into a template for future databases </li></ul><ul><li>From there making DBs is easy cheesy </li></ul>
  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 <ul><li>EPSG (European Petroleum Survey Group) has a number for most projections and datum combinations </li></ul><ul><li>deCarta, and those other no names, expect geographic coordinates with WGS84 datum </li></ul><ul><li>EPSG:4326 </li></ul><ul><ul><li>Geographic coordinates system with WGS84 datum. </li></ul></ul><ul><ul><li>Degrees are not constant distance as you move North and South </li></ul></ul><ul><ul><li>Not very accurate for distance and area calcs except over small areas </li></ul></ul><ul><li>You want to use projected layers (or project on the fly) for area and distance calcs </li></ul>
  15. Projecting using ogr2ogr <ul><li>Assuming there is a .prj file you need to find your output projection </li></ul><ul><li>http://Spatialreference.org </li></ul><ul><li>ogr2ogr -t_srs EPSG:4326 -f &quot;ESRI Shapefile&quot; water_bodies_gcs.shp water_bodies.shp </li></ul>
  16. Now let’s make some SQL <ul><li>Shp2pgsql is a command-line utility to take a shapefile to a SQL file </li></ul><ul><li>The geometry field is called the_geom </li></ul><ul><li>shp2pgsql.exe -s 4326 -I C:datawater_bodies_gcs.shp waterbodies > C:datawaterbodies.sql </li></ul>
  17. Y’all know what to do with SQL <ul><li>psql -q -U postgres -f C:datawaterbodies.sql kerncounty </li></ul><ul><li>With lots-o-features you want to use –q option to prevent spamming your terminal </li></ul>
  18.  
  19. Let’s get this party started <ul><li>SELECT gid, the_geom FROM waterbodies WHERE gid = 2; </li></ul><ul><li>gid | the_geom </li></ul><ul><li>-----+------------------------------------------------------------------------------------------------------------------------ 2 | 106000020E6100000010000000103000000010000002E00000002CB8FC170C65DC06200F8D0E7B341408625910970C65DC0DE898BCAE7B3414053748B1A6FC65DC0199092E7E6B34140576BAFCB6EC65DC07815C607E6B34140926B64A66EC65DC0D0D11854E4B34140CA783CC66EC65DC091477CD7E2B34140FD8B372B6FC65DC02D75F091E1B341400748F1756FC65DC02C1C7C06E0B34140A0CBF8846FC65DC01B057AC2DEB34140BD6BDE586FC65DC036C25B1ADEB34140E73E8FBC6EC65DC051B6DE2DDDB3414037EFA3B86DC65DC0A6E75E4DDCB34140EECF5AF16CC65DC007312311DBB341405304E1D16CC65DC0C653541FDAB34140B352AB826CC65DC06800DD22D9B34140FDECCB8C6CC65DC0A8D8188ED7B3414028DA62606DC65DC03020AA9DD5B341401345D79D6EC65DC045CF8743D5B3414039BFF5A56FC65DC071F2D61AD6B34140D4391F4E70C65DC01F041E4CD7B34140FD50463A70C65DC0534507A5D8B3414087FB5FFA6FC65DC0C436FF22DAB3414092BF83B46FC65DC05EEC9961DBB34140456F69BC6FC65DC0E74915C3DCB34140DCCD550170C65DC022859B35DEB34140A929A59870C65DC014E6EA42DFB34140D7388A8E70C65DC0B2B22CD4DFB341405EA0F73270C65DC0E92146C4E0B341402EC4B3DE6FC65DC066AD87D3E1B3414083B732D26FC65DC0583D9907E3B3414017F8104E70C65DC07C37AB39E4B341404DFB09DA70C65DC0AB6838C7E4B341404E376F4871C65DC0D88F88EAE4B34140E290F4CC71C65DC04318C2B1E4B34140B2B1373672C65DC001CD36A7E3B3414094289CBD72C65DC032BF27F1E2B34140551D1E3773C65DC053E9A4C1E2B34140B247EEC273C65DC03C50B08FE3B34140EFFF2CD573C65DC0849F2D84E4B34140BB03E9A973C65DC0D397181FE5B341406292782B73C65DC0103A5EA9E5B34140B2EB752172C65DC0E72BDC89E5B341407818E39771C65DC0978C430BE6B34140AAE00CA471C65DC0E6C241AEE6B341405DD5367B71C65DC050325840E7B3414002CB8FC170C65DC06200F8D0E7B34140 </li></ul>WTF!
  20. Well Known Text (WKT) <ul><li>SELECT gid, asText(the_geom) AS Geometry FROM waterbodies WHERE gid = 2; </li></ul><ul><li>gid | geometry </li></ul><ul><li>-----+------------------------------------------------------------------------------------------------------------------ </li></ul><ul><li>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))) </li></ul>
  21. Lesson Learned <ul><li>Ask for your responses in Text format when you want to know what is going on </li></ul><ul><li>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)))' </li></ul><ul><li>asKML, asSVG, or asGML </li></ul>SELECT asKML(the_geom) FROM watercourses WHERE gid = 17;
  22. <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>
  23. Inserting a new record <ul><li>Projection has to match </li></ul>INSERT INTO firestations(station_na, the_geom) VALUES('Best LittleFire House in CA', ST_SetSRID(ST_MakePoint(-119.5, 34.5), 4326) );
  24. Select using the geometry
  25.  
  26. Distance <ul><li>In units of the underlying coverage </li></ul>SELECT gid FROM waterbodies WHERE ST_DWithin('SRID=4326;POINT (-119.103762382096 35.4122898449297)', the_geom, 0.005); gid ----- 4 5 6 7 8
  27. 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);
  28. Do something with the geometry after selection
  29.  
  30. Calculating Area SELECT sum(ST_Area(z.the_geom)) FROM zoning AS z WHERE z.comb_zn LIKE 'NR%'; sum -------------------- 0.0131834159551545
  31. 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)
  32. 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
  33. Buffering
  34. 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
  35.  
  36. Spatial Operators
  37. 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)))');
  38. Simplifying geometries <ul><li>Most geometries have more information than you can display </li></ul><ul><li>There are algorithms for weeding out points </li></ul><ul><li>Trade-off retaining “shape” versus less points </li></ul>
  39. Select ST_NPoints(the_geom) FROM watercourses WHERE gid IN (12, 14, 17); st_npoints ------------ 265 68 48
  40. SELECT ST_NPoints(ST_Simplify(the_geom, 0.00001)) FROM watercourses WHERE gid IN (12, 14, 17); st_npoints ------------ 65 19 18
  41. SELECT ST_NPoints(ST_Simplify(the_geom, 0.0001)) FROM watercourses WHERE gid IN (12, 14, 17); st_npoints ------------ 18 6 7
  42. So how do you bring this together in an app <ul><li>Never send 3000 pts to the browser </li></ul><ul><li>Putting your information in a DB gives you way more control over what you return and display </li></ul><ul><li>http://demo.decarta.com/opensearchservice/index.html </li></ul>
  43. Where do you go now - PostGIS <ul><li>Home </li></ul><ul><ul><li>http://postgis.refractions.net/ </li></ul></ul><ul><li>Tools to use with PostGIS </li></ul><ul><ul><li>http://postgis.refractions.net/support/wiki/index.php?ToolsSupportPostgis </li></ul></ul><ul><li>Good support Wiki </li></ul><ul><ul><li>http://postgis.refractions.net/support/wiki/ </li></ul></ul><ul><li>Another Introduction </li></ul><ul><ul><li>http://www.mapbender.org/presentations/Spatial_Data_Management_Arnulf_Christl/Spatial_Data_Management_Arnulf_Christl.pdf </li></ul></ul><ul><li>Great OS-GEO resources </li></ul><ul><ul><li>http://www.bostongis.com/ </li></ul></ul><ul><ul><li>PostGIS specific </li></ul></ul><ul><ul><ul><li>http://www.bostongis.com/postgis_quickguide.bqg?outputformat=PDF </li></ul></ul></ul><ul><li>Nice GIS on a Stick for Windows http://www.archaeogeek.com/blog/portable-gis / </li></ul>
  44. Where to get Data <ul><li>Kern County </li></ul><ul><ul><li>http://www.co.kern.ca.us/gis/downloads.asp </li></ul></ul><ul><li>California </li></ul><ul><ul><li>http://gis.ca.gov/casil/ </li></ul></ul><ul><li>US Census </li></ul><ul><ul><li>http://www.census.gov/geo/www/tiger/ </li></ul></ul><ul><li>Some UN </li></ul><ul><ul><li>http://www.grida.no/gis/index.htm </li></ul></ul><ul><li>http://www.geographynetwork.com/ </li></ul><ul><li>http://gos2.geodata.gov/wps/portal/gos </li></ul><ul><li>Open source Data </li></ul><ul><ul><li>http://www.fortiusone.com/ </li></ul></ul><ul><ul><li>OSM </li></ul></ul><ul><ul><ul><li>http:// wiki.openstreetmap.org/index.php/Planet.osm </li></ul></ul></ul><ul><ul><ul><li>http://code.google.com/p/osm2shp/ </li></ul></ul></ul>
  45. Map API to use <ul><li>http://developer.decarta.com </li></ul><ul><li>Free to develop – sign up and be mapping and mashing within 12 hours </li></ul><ul><li>If you want a web page with JavaScript look at the JavaScript API </li></ul><ul><li>If you want to use Web Services then look at the web services area on the left </li></ul>
  46.  

×