postgis tips for power users [email protected]

110
PostGIS Tips for Power Users [email protected]

Upload: philomena-pope

Post on 13-Jan-2016

229 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: PostGIS Tips for Power Users pramsey@opengeo.org

PostGISTips for Power Users

[email protected]

Page 2: PostGIS Tips for Power Users pramsey@opengeo.org
Page 3: PostGIS Tips for Power Users pramsey@opengeo.org
Page 4: PostGIS Tips for Power Users pramsey@opengeo.org

• Putting things together

• Taking things apart

• Fixing broken things

• Copying other people

• Playing with balls

• Going really fast

Page 5: PostGIS Tips for Power Users pramsey@opengeo.org

Putting things together

Putting things together

Page 6: PostGIS Tips for Power Users pramsey@opengeo.org

ST_GeomFromText( 'POINT('||x||' '||y||')')

Page 7: PostGIS Tips for Power Users pramsey@opengeo.org

• ST_MakePoint(x, y, [z], [m])

• ST_MakeLine( ST_MakePoint(x1, y1), ST_MakePoint(x2, y2) )

• ST_MakeEnvelope( xmin, ymin, xmax, ymax, srid )

Page 8: PostGIS Tips for Power Users pramsey@opengeo.org
Page 9: PostGIS Tips for Power Users pramsey@opengeo.org
Page 10: PostGIS Tips for Power Users pramsey@opengeo.org
Page 11: PostGIS Tips for Power Users pramsey@opengeo.org

CREATE TABLE gps_points ( id SERIAL PRIMARY KEY, point GEOMETRY NOT NULL, db_time TIMESTAMP DEFAULT now(), gps_time TIMESTAMP NOT NULL, track_id INTEGER NOT NULL);

Page 12: PostGIS Tips for Power Users pramsey@opengeo.org

CREATE TABLE gps_tracks AS SELECT ST_MakeLine(point) AS line, track_id FROM ( SELECT * FROM gps_points ORDER BY track_id, gps_time ) AS ordered_points GROUP BY track_id;

Page 13: PostGIS Tips for Power Users pramsey@opengeo.org

ST_MakeLine({point})

Page 14: PostGIS Tips for Power Users pramsey@opengeo.org
Page 15: PostGIS Tips for Power Users pramsey@opengeo.org

ST_Union(A,B)

Page 16: PostGIS Tips for Power Users pramsey@opengeo.org

ST_Union(A,B)

Page 17: PostGIS Tips for Power Users pramsey@opengeo.org

UPDATE gps_tracksSET line = ST_Union(

line, ‘LINESTRING EMPTY’

)

Page 18: PostGIS Tips for Power Users pramsey@opengeo.org

CREATE TABLE gps_lakes AS SELECT ST_BuildArea(line) AS lake, track_id FROM gps_tracks;

Page 19: PostGIS Tips for Power Users pramsey@opengeo.org

ST_BuildArea(multilinestring)

Page 20: PostGIS Tips for Power Users pramsey@opengeo.org

ST_BuildArea(multilinestring)

ST_Polygonize({multilinestring})

vs

Page 21: PostGIS Tips for Power Users pramsey@opengeo.org

LINESTRING(0 0, 1 0)LINESTRING(0 1, 1 1)LINESTRING(0 2, 1 2)LINESTRING(1 0, 2 0)LINESTRING(1 1, 2 1)LINESTRING(1 2, 2 2)LINESTRING(0 0, 0 1)LINESTRING(1 0, 1 1)LINESTRING(2 0, 2 1)LINESTRING(0 1, 0 2)LINESTRING(1 1, 1

2)LINESTRING(2 1, 2 2)

Page 22: PostGIS Tips for Power Users pramsey@opengeo.org
Page 23: PostGIS Tips for Power Users pramsey@opengeo.org

GEOMETRYCOLLECTION( POLYGON((1 0,0 0,0 1,1 1,1 0)), POLYGON((1 1,0 1,0 2,1 2,1 1)), POLYGON((2 0,1 0,1 1,2 1,2 0)), POLYGON((2 1,1 1,1 2,2 2,2 1)))

ST_Polygonize(edges)

Page 24: PostGIS Tips for Power Users pramsey@opengeo.org

ST_Polygonize(edges)

Page 25: PostGIS Tips for Power Users pramsey@opengeo.org

ST_BuildArea(ST_Collect(edges))

POLYGON(( 1 0,0 0,0 1,0 2, 1 2,2 2,2 1,2 0,1 0))

Page 26: PostGIS Tips for Power Users pramsey@opengeo.org

ST_BuildArea(ST_Collect(edges))

Page 27: PostGIS Tips for Power Users pramsey@opengeo.org

SELECT ST_BuildArea(ST_Collect(edge)) FROM edges GROUP BY area_id;

Page 28: PostGIS Tips for Power Users pramsey@opengeo.org

SELECT ST_Polygonize(edge) FROM edges GROUP BY area_id;

Page 29: PostGIS Tips for Power Users pramsey@opengeo.org
Page 30: PostGIS Tips for Power Users pramsey@opengeo.org

ST_BuildArea(ST_Collect(edges))

Page 31: PostGIS Tips for Power Users pramsey@opengeo.org

ST_Polygonize(edges)

Page 32: PostGIS Tips for Power Users pramsey@opengeo.org

Taking things apart

Taking things apart

Page 33: PostGIS Tips for Power Users pramsey@opengeo.org

geom name

GEOMETRYCOLLECTION( POINT(0 0), POINT(1 1))

Paul

geom name

POINT(0 0) Paul

POINT(1 1) Paul

Page 34: PostGIS Tips for Power Users pramsey@opengeo.org

ST_GeometryN(collection, n)

ST_Dump(collection)

vs

Page 35: PostGIS Tips for Power Users pramsey@opengeo.org

SELECT ST_GeometryN(geom,1), nameFROM the_table;

st_geometryn name

POINT(0 0) Paul

Page 36: PostGIS Tips for Power Users pramsey@opengeo.org

SELECT ST_GeometryN(geom, generate_series( 1, ST_NumGeometries(geom))), nameFROM the_table;

st_geometryn name

POINT(0 0) Paul

POINT(1 1) Paul

Page 37: PostGIS Tips for Power Users pramsey@opengeo.org

SELECT ST_Dump(geom), nameFROM the_table;

st_dump name

({1},0101...000000) Paul

({2},0101...000000) Paul

Page 38: PostGIS Tips for Power Users pramsey@opengeo.org

geometry_dump [ path: array(int) geom: geometry]

Page 39: PostGIS Tips for Power Users pramsey@opengeo.org

SELECT (ST_Dump(geom)).geom, nameFROM the_table;

geom name

POINT(0 0) Paul

POINT(1 1) Paul

Page 40: PostGIS Tips for Power Users pramsey@opengeo.org

ST_Dump(collection)

ST_DumpRings(polygon)

ST_DumpPoints(geometry)*

Page 41: PostGIS Tips for Power Users pramsey@opengeo.org

Fixing broken things

Fixing broken things

Page 42: PostGIS Tips for Power Users pramsey@opengeo.org

Validity

Page 43: PostGIS Tips for Power Users pramsey@opengeo.org

• Polygon rings are simple, closed linestrings.

• Rings that define holes should be inside rings that define exterior boundaries.

• Rings may not cross.

• Rings may not touch other rings, except at a single point.

Page 44: PostGIS Tips for Power Users pramsey@opengeo.org
Page 45: PostGIS Tips for Power Users pramsey@opengeo.org

ESRI OGC

Page 46: PostGIS Tips for Power Users pramsey@opengeo.org
Page 47: PostGIS Tips for Power Users pramsey@opengeo.org

SELECT ST_Area( );

Page 48: PostGIS Tips for Power Users pramsey@opengeo.org

0

Page 49: PostGIS Tips for Power Users pramsey@opengeo.org

+1

-1

Page 50: PostGIS Tips for Power Users pramsey@opengeo.org

ST_IsValidReason()

Interior is disconnected[-2 0]

Ring Self-intersection[2 0]

Page 51: PostGIS Tips for Power Users pramsey@opengeo.org

ST_MakeValid()*

*PostGIS 2.0 / GEOS 3.3

Page 52: PostGIS Tips for Power Users pramsey@opengeo.org

ST_Buffer(geom, 0.0)

Page 53: PostGIS Tips for Power Users pramsey@opengeo.org

ST_Buffer(geom, 0.0)

Page 54: PostGIS Tips for Power Users pramsey@opengeo.org

ST_Buffer(geom, 0.0)

Page 55: PostGIS Tips for Power Users pramsey@opengeo.org

ST_Perimeter(new)~

ST_Perimeter(old)

Page 56: PostGIS Tips for Power Users pramsey@opengeo.org

ST_ExteriorRing()

Page 57: PostGIS Tips for Power Users pramsey@opengeo.org

ST_Union()

Page 58: PostGIS Tips for Power Users pramsey@opengeo.org

ST_BuildArea()

Page 59: PostGIS Tips for Power Users pramsey@opengeo.org

SELECT ST_BuildArea( ST_Union( ‘LINESTRING EMPTY’, ST_ExteriorRing( ‘POLYGON((...))’ ) ) );

Page 60: PostGIS Tips for Power Users pramsey@opengeo.org

Copying other people

Copying other people

Page 61: PostGIS Tips for Power Users pramsey@opengeo.org

“Dissolve” (Union)

“Union” (Overlay)

Page 62: PostGIS Tips for Power Users pramsey@opengeo.org

“Dissolve” (Union)“Dissolve” (Union)

Page 63: PostGIS Tips for Power Users pramsey@opengeo.org

SELECT ST_Union(geom), stateFROM countiesGROUP BY state;

SELECT ST_Union(geom), stateFROM countiesGROUP BY state;

Page 64: PostGIS Tips for Power Users pramsey@opengeo.org

“Union” (Overlay)“Union” (Overlay)

Page 65: PostGIS Tips for Power Users pramsey@opengeo.org

A

B

AB

Page 66: PostGIS Tips for Power Users pramsey@opengeo.org

AB

ST_Intersection(A,B)

Page 67: PostGIS Tips for Power Users pramsey@opengeo.org

A

ST_Difference(A,B)

Page 68: PostGIS Tips for Power Users pramsey@opengeo.org

ST_Difference(B,A)

B

Page 69: PostGIS Tips for Power Users pramsey@opengeo.org

a

b

Page 70: PostGIS Tips for Power Users pramsey@opengeo.org

SELECT a.*, b.*, ST_Intersection(a.geom, b.geom)FROM a, bWHERE ST_Intersects(a.geom, b.geom);

Page 71: PostGIS Tips for Power Users pramsey@opengeo.org
Page 72: PostGIS Tips for Power Users pramsey@opengeo.org
Page 73: PostGIS Tips for Power Users pramsey@opengeo.org
Page 74: PostGIS Tips for Power Users pramsey@opengeo.org
Page 75: PostGIS Tips for Power Users pramsey@opengeo.org
Page 76: PostGIS Tips for Power Users pramsey@opengeo.org
Page 77: PostGIS Tips for Power Users pramsey@opengeo.org
Page 78: PostGIS Tips for Power Users pramsey@opengeo.org
Page 79: PostGIS Tips for Power Users pramsey@opengeo.org

A

Aa

a

bAb

B

Ba

Page 80: PostGIS Tips for Power Users pramsey@opengeo.org

A

Aa

a

bAb

B

Ba

Page 81: PostGIS Tips for Power Users pramsey@opengeo.org
Page 82: PostGIS Tips for Power Users pramsey@opengeo.org

Playing with balls

Playing with balls

Page 83: PostGIS Tips for Power Users pramsey@opengeo.org
Page 84: PostGIS Tips for Power Users pramsey@opengeo.org

GEOGRAPHY

Page 85: PostGIS Tips for Power Users pramsey@opengeo.org

• Index over sphere

• Calculate over poles / dateline

• Precise calculations on spheroid

GEOGRAPHY Rocks!

Page 86: PostGIS Tips for Power Users pramsey@opengeo.org

• Way slower to do calculations

• Far fewer functions

GEOGRAPHY Sucks!

Page 87: PostGIS Tips for Power Users pramsey@opengeo.org

double dx = x2 - x1double dy = y2 - y1;double d2 = dx * dx + dy * dy;double d = sqrt(d2);

Pythagoras (Plane)

Page 88: PostGIS Tips for Power Users pramsey@opengeo.org

double R = 6371000; /* meters */double d_lat = lat2-lat1; /* radians */double d_lon = lon2-lon1; /* radians */double sin_lat = sin(d_lat/2);double sin_lon = sin(d_lon/2);double a = sin_lat * sin_lat +        cos(lat1) * cos(lat2) *         sin_lon * sin_lon; double c = 2 * atan2(sqrt(a), sqrt(1-a)); double d = R * c;

Haversine (Sphere)

Page 89: PostGIS Tips for Power Users pramsey@opengeo.org

• ST_Area(g1)

• ST_Distance(g1, g2)

• ST_DWithin(g1, g2, d)

• ST_Intersects(g1, g2)

• ST_Covers(gpoly1, gpt2)

GEOGRAPHY Functions

Page 90: PostGIS Tips for Power Users pramsey@opengeo.org

ST_Buffer(geography)

Page 91: PostGIS Tips for Power Users pramsey@opengeo.org

ST_Transform( _ST_BestSRID($1) ),

ST_Buffer( $2),

ST_Transform( 4326)

SELECT geography( )

geometry($1),

ST_Buffer(geography)

Page 92: PostGIS Tips for Power Users pramsey@opengeo.org

_ST_BestSRID(geog)

Page 93: PostGIS Tips for Power Users pramsey@opengeo.org

_ST_BestSRID(geog)

_ST_BestSRID(geog1, geog2)

Page 94: PostGIS Tips for Power Users pramsey@opengeo.org

SELECT geography( ST_StartPoint( geometry($1) ))

ST_StartPoint(geography)

Page 95: PostGIS Tips for Power Users pramsey@opengeo.org

Going really fast

Going really fast

Page 96: PostGIS Tips for Power Users pramsey@opengeo.org

CREATE INDEX your_geoindexON your_table

USING GIST (your_geocolumn);

Page 97: PostGIS Tips for Power Users pramsey@opengeo.org

4-32GB4-32GB4-32GB4-32GB

Server Memory

OSOS

15%

*_mem*_mem

20%65%

shared_buffersshared_buffers

Page 98: PostGIS Tips for Power Users pramsey@opengeo.org

Run-time Parameters!

• SET work_mem TO 2GB;

• SET maintenance_work_mem TO 1GB;

• SET client_min_messages TO DEBUG;

Page 99: PostGIS Tips for Power Users pramsey@opengeo.org

Spend some money

• I/O is biggest bottleneck

• Invest in

• Great file system

• Good memory

• Adequate CPU(s)

Page 100: PostGIS Tips for Power Users pramsey@opengeo.org

Clustering

Page 101: PostGIS Tips for Power Users pramsey@opengeo.org

Clustering

Page 102: PostGIS Tips for Power Users pramsey@opengeo.org

Cluster on R-Tree

CLUSTER your_table USING your_geoindex;

Page 103: PostGIS Tips for Power Users pramsey@opengeo.org
Page 104: PostGIS Tips for Power Users pramsey@opengeo.org
Page 105: PostGIS Tips for Power Users pramsey@opengeo.org

Cluster on GeoHash

CREATE INDEX your_geohash_index ON your_table (ST_GeoHash(your_geocolumn));

CLUSTER your_table USING your_geohash_index;

Page 106: PostGIS Tips for Power Users pramsey@opengeo.org

Stay curiousStay curious

Page 107: PostGIS Tips for Power Users pramsey@opengeo.org

• Join the mailing listhttp://postgis.org/mailman/listinfo/postgis-users

• Read the wiki! And add stuff!http://trac.osgeo.org/postgis

• Buy the bookhttp://www.manning.com/obe/

• Read GIS StackExchangehttp://gis.stackexchange.com/

Page 108: PostGIS Tips for Power Users pramsey@opengeo.org

• Start using PL/R!http://www.joeconway.com/plr/

• Use R Geostatistics!http://geodacenter.asu.edu/r-spatial-projects

• Join IRC!irc://irc.freenode.net/postgis

• Use the sourcehttp://svn.osgeo.org/postgis/trunk/

Page 109: PostGIS Tips for Power Users pramsey@opengeo.org

ThanksThanks

Page 110: PostGIS Tips for Power Users pramsey@opengeo.org

http://s3.opengeo.org/postgis-power.pdf