Introduction to PostGIS Spatial Extensions for PostgreSQL Mark Leslie Geospatial Architect LISAsoft
  <ul><li>What is PostGIS?
Why is PostGIS?
What can PostGIS do?
Who is using PostGIS?
Why use PostGIS? </li></ul>
What is PostGIS? <ul><li>Spatial Extensions for PostgreSQL
Geometry represented by linear shapes
Spatial Functions (Constructors, Accessors, Editors, Processors, Relational Operators, Processing Functions)
Advanced geometric indexing </li></ul>
Why is PostGIS <ul><li>Shapefile are limited in their transactional capacity
Data management of files problematic
Existing GIS data services (as of 2001) were terribly expensive
No existing integrated spatial databases
Refractions had some time to kill </li></ul>
Installation - Requirements <ul><li>Proj4 - Cartographic Projections Library
GEOS - Geometry Engine - Open Source
              Provides spatial predicate functions, spatial operators and topological functions.
PostgreSQL - helpful little application </li></ul>
Installation - Debian <ul><li>sudo apt-get install postgresql-8.3-postgis </li></ul>
Installation - Debian sudo apt-get install postgresql-8.3-postgis or from source svn co http://svn.refractions.net/postgis...
Installation - Windows <ul><li>Included in the PostgreSQL installer </li></ul>
Installation - Windows <ul><li>Included in the PostgreSQL installer
or need a more recent version?
Use the Stack Builder application for version PostgreSQL 8.3
Download the  installer for PostgreSQL 8.3 from
http://postgis.refractions.net/download/windows/ </li></ul>
Installation - Windows <ul><li>Included in the PostgreSQL installer
or need a more recent version?
Use the Stack Builder application for version PostgreSQL 8.3
Download the  installer for PostgreSQL 8.3 from
http://postgis.refractions.net/download/windows/
or from source?
Good luck. </li></ul>
Loading Data - shp2pgsql <ul><li>shp2pgsql -s 4326 -D -I -S roads.shp roads | psql demo
-s 4326 – Use WGA83 coordinate reference system
-D – Use PostgreSQL dump format (faster than inserts)
-I – Create spatial (GIST) index after loading
-S – Generate simple geometries (eg. Line instead of Multiline) </li></ul>
Loading Data - shp2pgsql <ul><li>  shp2pgsql -s 4326 -D -I -S roads.shp roads | psql demo
On Windows use:
shp2pgsql -s 4326 -D -I -S roads.shp roads > roads.sql
psql -f roads.sql demo
or setup a .pgpass file </li></ul>
Loading Data - ogr2ogr <ul><li>ogr2ogr -f &quot;PostgreSQL&quot; PG:dbname=demo cities/
Format options include: </li></ul><ul><li>ESRI Shapefile  MapInfo File  TIGER
S57  DGN  Memory  BNA  CSV  MySQL
GML  GPX  KML  GeoJSON  Interlis 1
Interlis 2  GMT  SQLite  ODBC  PostgreSQL </li></ul>
Loading Data - osm2pgsql <ul><li>osm2pgsql --host seymour.ms.a2end.com --database osm --verbose planet-latest.osm.bz2
 
Then get some coffee, in Perth.
Node stats: total(231808103), max(256523410) Way stats: total(18781596), max(23689770) Relation stats: total(6967), max(97...
Loading Data – Spatial Data Integrator
Basic Schema Objects <ul><li>geometry_columns
     Allows standard discovery of geographic objects and their parameters: point dimension, type, projection.
spatial_reference_sys
     Provides definitions of available projections. </li></ul>
Inserting Data <ul><li>INSERT INTO fishing_hole (name, the_geom)
Upcoming SlideShare
Loading in...5
×

Introduction To PostGIS

12,653

Published on

High level (and incomplete) overview of PostGIS.

Published in: Technology
0 Comments
14 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
12,653
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
0
Comments
0
Likes
14
Embeds 0
No embeds

No notes for slide
  • Introduction To PostGIS

    1. 1. Introduction to PostGIS Spatial Extensions for PostgreSQL Mark Leslie Geospatial Architect LISAsoft
    2. 2.   <ul><li>What is PostGIS?
    3. 3. Why is PostGIS?
    4. 4. What can PostGIS do?
    5. 5. Who is using PostGIS?
    6. 6. Why use PostGIS? </li></ul>
    7. 7. What is PostGIS? <ul><li>Spatial Extensions for PostgreSQL
    8. 8. Geometry represented by linear shapes
    9. 9. Spatial Functions (Constructors, Accessors, Editors, Processors, Relational Operators, Processing Functions)
    10. 10. Advanced geometric indexing </li></ul>
    11. 11. Why is PostGIS <ul><li>Shapefile are limited in their transactional capacity
    12. 12. Data management of files problematic
    13. 13. Existing GIS data services (as of 2001) were terribly expensive
    14. 14. No existing integrated spatial databases
    15. 15. Refractions had some time to kill </li></ul>
    16. 16. Installation - Requirements <ul><li>Proj4 - Cartographic Projections Library
    17. 17. GEOS - Geometry Engine - Open Source
    18. 18.              Provides spatial predicate functions, spatial operators and topological functions.
    19. 19. PostgreSQL - helpful little application </li></ul>
    20. 20. Installation - Debian <ul><li>sudo apt-get install postgresql-8.3-postgis </li></ul>
    21. 21. Installation - Debian sudo apt-get install postgresql-8.3-postgis or from source svn co http://svn.refractions.net/postgis/trunk/ postgis/ cd postgis ./autogen.sh ./configure make sudo make install
    22. 22. Installation - Windows <ul><li>Included in the PostgreSQL installer </li></ul>
    23. 23. Installation - Windows <ul><li>Included in the PostgreSQL installer
    24. 24. or need a more recent version?
    25. 25. Use the Stack Builder application for version PostgreSQL 8.3
    26. 26. Download the installer for PostgreSQL 8.3 from
    27. 27. http://postgis.refractions.net/download/windows/ </li></ul>
    28. 28. Installation - Windows <ul><li>Included in the PostgreSQL installer
    29. 29. or need a more recent version?
    30. 30. Use the Stack Builder application for version PostgreSQL 8.3
    31. 31. Download the installer for PostgreSQL 8.3 from
    32. 32. http://postgis.refractions.net/download/windows/
    33. 33. or from source?
    34. 34. Good luck. </li></ul>
    35. 35. Loading Data - shp2pgsql <ul><li>shp2pgsql -s 4326 -D -I -S roads.shp roads | psql demo
    36. 36. -s 4326 – Use WGA83 coordinate reference system
    37. 37. -D – Use PostgreSQL dump format (faster than inserts)
    38. 38. -I – Create spatial (GIST) index after loading
    39. 39. -S – Generate simple geometries (eg. Line instead of Multiline) </li></ul>
    40. 40. Loading Data - shp2pgsql <ul><li>  shp2pgsql -s 4326 -D -I -S roads.shp roads | psql demo
    41. 41. On Windows use:
    42. 42. shp2pgsql -s 4326 -D -I -S roads.shp roads > roads.sql
    43. 43. psql -f roads.sql demo
    44. 44. or setup a .pgpass file </li></ul>
    45. 45. Loading Data - ogr2ogr <ul><li>ogr2ogr -f &quot;PostgreSQL&quot; PG:dbname=demo cities/
    46. 46. Format options include: </li></ul><ul><li>ESRI Shapefile MapInfo File TIGER
    47. 47. S57 DGN Memory BNA CSV MySQL
    48. 48. GML GPX KML GeoJSON Interlis 1
    49. 49. Interlis 2 GMT SQLite ODBC PostgreSQL </li></ul>
    50. 50. Loading Data - osm2pgsql <ul><li>osm2pgsql --host seymour.ms.a2end.com --database osm --verbose planet-latest.osm.bz2
    51. 51.  
    52. 52. Then get some coffee, in Perth.
    53. 53. Node stats: total(231808103), max(256523410) Way stats: total(18781596), max(23689770) Relation stats: total(6967), max(9763) real    806m40.109s user    394m41.460s sys    5m8.507s </li></ul>
    54. 54. Loading Data – Spatial Data Integrator
    55. 55. Basic Schema Objects <ul><li>geometry_columns
    56. 56.     Allows standard discovery of geographic objects and their parameters: point dimension, type, projection.
    57. 57. spatial_reference_sys
    58. 58.     Provides definitions of available projections. </li></ul>
    59. 59. Inserting Data <ul><li>INSERT INTO fishing_hole (name, the_geom)
    60. 60. VALUES (&quot;Greenwich Ferry Wharf&quot;,
    61. 61. ST_SetSRID(ST_GeometryAsText(
    62. 62. &quot;POINT(151.18323 -33.84162)&quot;), 4283); </li></ul>
    63. 63. Inserting Data <ul><li>INSERT INTO fishing_hole (name, the_geom) VALUES (&quot;Greenwich Ferry Wharf&quot;, ST_SetSRID(ST_GeometryAsText(&quot;POINT(151.18323 -33.84162)&quot;), 4283);
    64. 64. ...&quot;LINESTRING(151.18456 -33.84225,151.18424 -33.84196,151.18342 -33.84122)&quot;... </li></ul>
    65. 65. Inserting Data <ul><li>INSERT INTO fishing_hole (name, the_geom) VALUES (&quot;Greenwich Ferry Wharf&quot;, ST_SetSRID(ST_GeometryAsText(&quot;POINT(151.18323 -33.84162)&quot;), 4283);
    66. 66. ...&quot;LINESTRING(151.18456 -33.84225,151.18424 -33.84196,151.18342 -33.84122)&quot;...
    67. 67. ...&quot;POLYGON((151.2111 -33.8754,151.2109 -33.8753,151.211 -33.8749,151.2111 -33.8749,151.2111 -33.8753)(151.211 -33.8750,151.2111 -33.8751,151.211 -33.8751,151.211 -33.875,151.211 -33.8750))&quot;... </li></ul>
    68. 68. Inserting Data <ul><li>INSERT INTO fishing_hole (name, the_geom) VALUES (&quot;Greenwich Ferry Wharf&quot;, ST_SetSRID(ST_GeometryAsText(&quot;POINT(151.18323 -33.84162)&quot;), 4283);
    69. 69. ...&quot;LINESTRING(151.18456 -33.84225,151.18424 -33.84196,151.18342 -33.84122)&quot;...
    70. 70. ...&quot;POLYGON((151.2111 -33.8754,151.2109 -33.8753,151.211 -33.8749,151.2111 -33.8749,151.2111 -33.8753)(151.211 -33.8750,151.2111 -33.8751,151.211 -33.8751,151.211 -33.875,151.211 -33.8750))&quot;...
    71. 71. Plus MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, COLLECTION </li></ul>
    72. 72. Inserting Data <ul><li>INSERT INTO fishing_hole (name, the_geom) VALUES (&quot;Greenwich Ferry Wharf&quot;, ST_SetSRID(ST_GeometryAsText(&quot;POINT(151.18323 -33.84162)&quot;), 4283);
    73. 73. ...&quot;LINESTRING(151.18456 -33.84225,151.18424 -33.84196,151.18342 -33.84122)&quot;...
    74. 74. ...&quot;POLYGON((151.2111 -33.8754,151.2109 -33.8753,151.211 -33.8749,151.2111 -33.8749,151.2111 -33.8753)(151.211 -33.8750,151.2111 -33.8751,151.211 -33.8751,151.211 -33.875,151.211 -33.8750))&quot;...
    75. 75. Plus MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, COLLECTION
    76. 76. And even CIRCULARSTRING, COMPOUNDCURVE, CURVEPOLYGON, MULTICURVE and MULTISURFACE </li></ul>
    77. 77. Accessing Data <ul><li>select the_geom from road where gid = 1; 0102000020E6100000020000000000008029F65B400000000000000000000000800BF65B4000000080F9595FBF </li></ul>
    78. 78. Accessing Data <ul><li>select the_geom from road where gid = 1; 0102000020E6100000020000000000008029F65B400000000000000000000000800BF65B4000000080F9595FBF
    79. 79. select ST_asText(the_geom) from road where gid = 1; LINESTRING(111.846282958984 0,111.844451904297 -0.00191354146227241) </li></ul>
    80. 80. Accessing Data <ul><li>select the_geom from road where gid = 1; 0102000020E6100000020000000000008029F65B400000000000000000000000800BF65B4000000080F9595FBF
    81. 81. select ST_asText(the_geom) from road where gid = 1; LINESTRING(111.846282958984 0,111.844451904297 -0.00191354146227241)
    82. 82. select ST_asGML(the_geom) from road where gid = 1; <gml:LineString srsName=&quot;EPSG:4326&quot;><gml:coordinates>111.846282958984,0 111.844451904297,-0.00191354146227241</gml:coordinates></gml:LineString> </li></ul>
    83. 83. Accessing Data <ul><li>select the_geom from road where gid = 1; 0102000020E6100000020000000000008029F65B400000000000000000000000800BF65B4000000080F9595FBF
    84. 84. select ST_asText(the_geom) from road where gid = 1; LINESTRING(111.846282958984 0,111.844451904297 -0.00191354146227241)
    85. 85. select ST_asGML(the_geom) from road where gid = 1; <gml:LineString srsName=&quot;EPSG:4326&quot;><gml:coordinates>111.846282958984,0 111.844451904297,-0.00191354146227241</gml:coordinates></gml:LineString>
    86. 86. select ST_asSVG(the_geom) from road where gid = 1; M 111.84628295898437 0 111.84445190429687 0.001913541462272 </li></ul>
    87. 87. Accessing Data <ul><li>select the_geom from road where gid = 1; 0102000020E6100000020000000000008029F65B400000000000000000000000800BF65B4000000080F9595FBF
    88. 88. select ST_asText(the_geom) from road where gid = 1; LINESTRING(111.846282958984 0,111.844451904297 -0.00191354146227241)
    89. 89. select ST_asGML(the_geom) from road where gid = 1; <gml:LineString srsName=&quot;EPSG:4326&quot;><gml:coordinates>111.846282958984,0 111.844451904297,-0.00191354146227241</gml:coordinates></gml:LineString>
    90. 90. select ST_asSVG(the_geom) from road where gid = 1; M 111.84628295898437 0 111.84445190429687 0.001913541462272
    91. 91. select ST_asGeoJSON(the_geom) from road where gid = 1; {&quot;type&quot;:&quot;LineString&quot;,&quot;coordinates&quot;:[[111.846282958984375,0.000000000000000],[111.844451904296875,-0.001913541462272]]} </li></ul>
    92. 92. Basic Operations - Constructors <ul><li>ST_Polygonize(linestring set), ST_BuildArea(linestring)
    93. 93. ST_MakePoint(x, y, [z], [m]), ST_MakePointM(x, y, m)
    94. 94. ST_MakeLine(point, point), ST_MakeLine(point set)
    95. 95. ST_LineFromMultiPoint(multipoint)
    96. 96. ST_MakePolygon(linestring, linestring[])
    97. 97. ST_Collect(geometry, geometry), ST_Collect(geometry set)
    98. 98. ST_Dump(geometry) </li></ul>
    99. 99. Basic Operations - Transformation <ul><li>ST_Transform(geometry, integer) </li></ul><ul><li>ST_Affine(geometry, float8, float8, float8, float8, float8, float8, [float8, float8, float8, float8, float8, float8]) </li></ul><ul><li>ST_Translate(geometry, x, y, z) 
    100. 100. ST_Scale(geometry, xScale, yScale, zScale)
    101. 101. ST_RotateX(geometry, radians) 
    102. 102. ST_RotateY(geometry, radians)
    103. 103. ST_RotateZ(geometry, radians) </li></ul>
    104. 104. Basic Operations - Validation <ul><li>ST_isValid(geometry)
    105. 105. ST_Reverse(geometry)
    106. 106. ST_ForceRHR(geometry)
    107. 107. ST_SnapToGrid(geometry, originX, originY, sizeX, sizeY)
    108. 108. ST_SnapToGrid(geometry, sizeX, sizeY)
    109. 109. ST_SnapToGrid(geometry, size)
    110. 110. ST_SnapToGrid(geometry, geometry, sizeX, sizeY, sizeZ, sizeM) </li></ul>
    111. 111. Basic Operations - Accessing and Editing <ul><li>ST_GeometryN(multigeom)
    112. 112. ST_ExteriorRing(polygon), ST_InteriorRingN(polygon)
    113. 113. ST_PointN(linestring), ST_StartPoint(linestring), ST_EndPoint(linestring)
    114. 114. ST_X(point), ST_Y(point), ST_Z(point), ST_M(point)
    115. 115. ST_AddPoint(linestring), ST_RemovePoint(linestring), ST_SetPoint(linestring) </li></ul>
    116. 116. Relational Operators <ul><li>Numerical relational operators work on 1d values with no width.
    117. 117. <, <=, ==, >=, >, != </li></ul>
    118. 118. Relational Operators <ul><li>Numerical relational operators work on 1d values with no width.
    119. 119. <, <=, ==, >=, >, !=
    120. 120. Geometric relational operators work on 2d-4d values with or without width, height or depth </li></ul>
    121. 121. ST_Within, ST_Contains <ul><li>Geometry A is completely within Geometry B
    122. 122. ST_Within(A, B) = ST_Contains(B, A) </li></ul>
    123. 123. ST_Overlaps <ul><li>Geometries share space, are of the same dimension, but are not completely contained by each other.
    124. 124.  
    125. 125.   </li></ul>
    126. 126. ST_Disjoint <ul><li>Geometries do not share any space together. </li></ul>
    127. 127. ST_Touches <ul><li>Geometries have at least one point in common, but their interiors do not intersect. </li></ul>
    128. 128. ST_Crosses <ul><li>Geometries have some, but not all, interior points in common. </li></ul>
    129. 129. ST_Intersects <ul><li>Geometries share any portion of space. </li></ul>
    130. 130. ST_Covers, ST_CoveredBy <ul><li>No point in Geometry B is outside Geometry A
    131. 131. ST_Covers(A, B) = ST_CoveredBy(B, A) </li></ul>
    132. 132. Basic Operations - Relational Operators <ul><li>ST_DWithin( GeomA, GeomB, N ) – GeomB is within N of GeomA
    133. 133. ST_Distance – Minimum distance beteen geometries
    134. 134. ST_Distance_Spheroid – Minimum distance between geometries over a specific spheroid
    135. 135. ST_DistanceSphere – Minimum distance between geometries over a perfect sphere </li></ul>
    136. 136. Real Estate Evaluation <ul><li>cities:
    137. 137. wkb_geometry – Geometry column (Point)
    138. 138. name – City name
    139. 139. boundaries:
    140. 140. the_geom – Geometry column (Polygon)
    141. 141. state – State containing boundary
    142. 142. earthquake_risk:
    143. 143. the_geom – Geometry column (Polygon)
    144. 144. riskval – Indicator of earthquake risk </li></ul>
    145. 145. Real Estate Evaluation <ul><li>SELECT c.name
    146. 146. FROM cities c, earthquake_risk er, boundaries b
    147. 147. WHERE er.riskval = '> 0.10'
    148. 148. AND ST_Within(c.wkb_geometry, er.the_geom)
    149. 149. AND c.name IS NOT NULL
    150. 150. AND ST_Within(c.wkb_geometry, b.the_geom)
    151. 151. AND b.state = 'NEW SOUTH WALES'; </li></ul>
    152. 152. Real Estate Evaluation <ul><li>name
    153. 153. ---------------
    154. 154. Stratford
    155. 155. Craven
    156. 156. Bunyah
    157. 157. Chichester
    158. 158. Salisbury
    159. 159. Coolongolook
    160. 160. Wootton
    161. 161. ...
    162. 162. (36 rows) </li></ul>
    163. 163. Environmental Change <ul><li>Data describes the type and coverage of vegetation in Australia in 1788 and 1988.
    164. 164. nveg_1788, pveg_1988
    165. 165. the_geom – Geometry (Polygon)
    166. 166. tn_d – Percentage of ground shaded by vegetation </li></ul>
    167. 167. Environmental Change <ul><li>SELECT n.ts_d as n_ts_d, p.ts_d as p_ts_d,
    168. 168. CASE WHEN n.ts_d > p.ts_d THEN 'Loss'
    169. 169. WHEN n.ts_d < p.ts_d THEN 'Gain'
    170. 170. ELSE 'No Change' END as change,
    171. 171. ST_Intersection(n.the_geom, p.the_geom) as the_geom
    172. 172. FROM nveg_1788 as n, pveg_1988 as p
    173. 173. WHERE ST_Intersects(n.the_geom, p.the_geom); </li></ul>
    174. 174. Verify Assumptions
    175. 175. Better Verification <ul><li>SELECT ST_Area(ST_SymDifference(a.the_geom, b.the_geom)) FROM
    176. 176. (SELECT ST_Union(the_geom) AS the_geom FROM nveg_1788) a,
    177. 177. (SELECT ST_Union(the_Geom) AS the_geom FROM pveg_1988) b;
    178. 178. st_area
    179. 179. 4.58800965870143e-05 </li></ul>
    180. 180. Environmental Change <ul><li>SELECT count(*), change
    181. 181. FROM change GROUP BY change;
    182. 182. count | change
    183. 183. -------+-----------
    184. 184. 4785 | No Change
    185. 185. 2013 | Gain
    186. 186. 2465 | Loss </li></ul>
    187. 187. Environmental Change <ul><li>SELECT count(*), change,
    188. 188. sum(ST_Area(ST_Intersection)) AS area
    189. 189. FROM change GROUP BY change;
    190. 190. count | change | sum
    191. 191. -------+-----------+------------------
    192. 192. 4785 | No Change | 521.507080938973
    193. 193. 2013 | Gain | 54.5533372716394
    194. 194. 2465 | Loss | 119.174361913388 </li></ul>
    195. 195. Environmental Change
    196. 196. ST_Relate <ul><li><http://docs.codehaus.org/display/GEOTDOC/Point+Set+Theory+and+the+DE-9IM+Matrix#PointSetTheoryandtheDE-9IMMatrix-9IntersectionMatrix> </li></ul>
    197. 197. Advanced Operations <ul><li>Nearest Neighbor <http://postgis.refractions.net/support/wiki/index.php?Nearest%20Neighbor%20Search>
    198. 198. Relational Constraints <http://www.nabble.com/Any-Projected-Straights-Function--td19439097.html#a19448155>
    199. 199. Tiger Geocoder <http://postgis.refractions.net/support/wiki/index.php?Tiger%20Geocoder>
    200. 200. Topology <http://postgis.refractions.net/support/wiki/index.php?PostgisTopology> </li></ul>
    201. 201. Who is Using PostGIS <ul><li>Infoterra, United Kingdom
    202. 202. Infoterra, a leading European satellite and aerial imagery provider, runs their data provision and sales systems on PostGIS, and stores the complete Ordnance Survey database on PostGIS. </li></ul>
    203. 203. Who is Using PostGIS <ul><li>Infoterra, United Kingdom
    204. 204. EU Joint Research Centre
    205. 205. With billion dollar satellites and PostGIS, the EU Joint Research Centre monitors fishing vessels in the North Atlantic and provides real-time reporting and mapping to decision makers and regulators. </li></ul>
    206. 206. Who is Using PostGIS <ul><li>Infoterra, United Kingdom
    207. 207. EU Joint Research Centre
    208. 208. MADEIRA GPS
    209. 209. MADEIRA GPS, a company that started in 2005, with a simple project in mind: Deliver PDA-based navigation, with auto-routing, for Madeira Island's tourism. </li></ul>
    210. 210. Why Use PostGIS <ul><li>Huge client/server/library support
    211. 211. Advanced indexing
    212. 212. Transformation support
    213. 213. Variety of output format options ((E)WKB, (E)WKT, GeoJSON, GML, KML, SVG)
    214. 214. Wide variety of processing and relational operators </li></ul><ul><li>Accessors and editors
    215. 215. Measurement and Linear Referencing
    216. 216. Spatial Aggregates </li></ul><ul><li>http://www.bostongis.com/PrinterFriendly.aspx?content_name=sqlserver2008_postgis_mysql_compare </li></ul>
    217. 217. Limitations <ul><li>No true geodetic support
    218. 218. Fewer hosting providers than Oracle/MSSQLServer/mySQL
    219. 219. Incomplete curve support
    220. 220. Non-production topology support </li></ul>
    221. 221. Resources <ul><li>Support WIKI
    222. 222. http://postgis.refractions.net/support/wiki/
    223. 223. User List
    224. 224. http://postgis.refractions.net/mailman/listinfo/postgis-users
    225. 225. IRC
    226. 226. irc://chat.freenode.net/postgis
    227. 227. Me
    228. 228. [email_address] </li></ul>
    229. 229. <ul><li>Presentations
    230. 230. Workshops and tutorials
    231. 231. Climate Change Integration Plugfest
    232. 232. Installfest
    233. 233. Bird of a Feather sessions
    234. 234. Code Sprint
    235. 235. Good times </li></ul>

    ×