Vad är PostGIS? Hmm, PreGIS måste vara papperskartor..., men vad är PostGIS...?
Man ser det ofta skrivet PostgreSQL/PostGIS Vad menas? PostgreSQL är en databasprogramvara motsvarande: Microsoft SQL Server Microsoft Access Oracle DB2 Osv, osv PostGIS är att tillägg till PostgreSQL som ger PostgreSQL möjligheter att hantera spatiala data
Vad PostGIS kryddar PostgreSQL med är först och främst nya datatyper för att kunna lagra geometrisk och geografisk data. Om man är van att hantera GIS I desktop miljö som tex Arciew 3.x, ArcMap, Mapinfo eller liknande så är antagligen första tanken att PostGIS är bara ett annat lagringsformat istället för shape eller liknande. I webbapplikationer är också PostGIS ofta använt som lagringsformat I bakgrunden. MEN...
PostGIS kan så mycket mer Förutom att lägga till nya datatyper till PostgreSQL databasen så följer det också med ett stort antal funktioner. Det förnämliga är att dessa GIS funktioner hanteras av databasen som vilken annan funktion som helst. Det är databasen, PostgreSQL som räknar ut det bästa sättet att kombinera de olika funktionerna för att det skall gå så snabbt som möjligt.
SELECT namn FROM dalarnas_kommuner; Detta är en sql sats som kan resultera I någonting som tex: namn Avesta Borlänge Falun Gagnef Hedemora Idre/Särna/ Grövelsjön Leksand Ludvika Malung Mora Orsa Rättvik Smedjebacken Sälen Säter Vansbro Älvdalen Det fungerar I alla databaser som förstår SQL Tex MS Access MS SQL Server Oracle PostgreSQL
Men om vi har PostGIS installerat och har en tabell som inte bara innehåller namnen utan också kommunernas polygoner Då kan vi skriva tex SELECT namn, the_geom FROM dalarnas_kommuner; Och få tillbaka:
Vansbro;0106000020BE0B00000100000001030000000100000083040000E8479FE01D1B1D41FB9FEC6ED Malung Sälen;0106000020BE0B0000010000000103000000010000006C0A0000F0507E8A8EA6184120CF4 Gagnef;0106000020BE0B0000010000000103000000010000006B090000CD70A69536DE1E41D3C2FD13C Leksand;0106000020BE0B000002000000010300000007000000481400005B971C91C91F1E4164E86E1D26 Rättvik;0106000020BE0B00000300000001030000000100000016000000215349EF83341E414D653E601FBD Orsa;0106000020BE0B000001000000010300000001000000D00700008F838721A3741D41225D7F38B10A5 Älvdalen;0106000020BE0B0000010000000103000000010000007D080000F80BAD55CFB21641C5F2F10E Smedjebacken;0106000020BE0B0000020000000103000000010000000A000000744EA9BB7A531F414BDE Mora;0106000020BE0B0000020000000103000000010000001C000000EB465694AC361E4174AF297E7FBD Falun;0106000020BE0B00000800000001030000000100000007000000F99E737BCD951F41E0302BC288B Borlänge;0106000020BE0B00000400000001030000000100000068000000EB5491CE85F51F410741BEF449 Säter;0106000020BE0B000001000000010300000003000000A60800003C8230F43F2121414893875529A159 Hedemora;0106000020BE0B0000010000000103000000010000005D040000FF262235D25A2141E062FFB6 Avesta;0106000020BE0B000001000000010300000001000000B8030000B9703B1531A82141DE2B3E31858 Ludvika;0106000020BE0B00000200000001030000000100000019000000F62FF6630A491F416411E630968 Wow! Imponerade?
Ok, det sa inte så mycket Men om vi ber om att få tillbaka the_geom i textformat istället: SELECT namn, ST_AsText(the_geom) FROM dalarnas_kommuner; Och få tillbaka:
Vansbro;MULTIPOLYGON(((476871.469357608 6709085.73319244,476908.32807762 6708983.84571009,47 Malung Sälen;MULTIPOLYGON(((403875.635247483 6810491.00462702,403879.760336051 6810468.6899 Gagnef;MULTIPOLYGON(((505741.646142733 6722352.31236334,505807.58600217 6722348.82274123,505 Leksand;MULTIPOLYGON(((493554.391710629 6752408.45989427,493564.42108386 6752406.67278899,4 Rättvik;MULTIPOLYGON(((494880.983678149 6747261.50380833,495037.091476928 6745313.12277712,49 Orsa;MULTIPOLYGON(((482600.782743507 6826692.88277367,482596.605009777 6826683.38571284,482 Älvdalen;MULTIPOLYGON(((371891.833667933 6901860.23351735,375607.200744041 6900405.30835683, Smedjebacken;MULTIPOLYGON(((513246.68326304 6670570.58983571,513104.30493942 6670402.864810 Mora;MULTIPOLYGON(((495019.144860371 6747645.97129427,495065.232684587 6747641.5879371,4950 Falun;MULTIPOLYGON(((517491.370558247 6737443.03388616,517478.098963177 6737410.8297189,51739 Borlänge;MULTIPOLYGON(((523617.451726271 6683943.82411218,523623.898525748 6683778.95122592,5 Säter;MULTIPOLYGON(((561311.976932592 6718629.33639986,561294.921712079 6718604.56247125,5611 Hedemora;MULTIPOLYGON(((568681.103776187 6707798.85933754,569168.140021239 6707000.59412815 Avesta;MULTIPOLYGON(((578584.541469119 6694420.76941964,578995.306920296 6694177.08911342,579 Ludvika;MULTIPOLYGON(((512578.597618818 6685272.76404223,512526.761418488 6685259.15464207,5
Eller så kan vi ta in samma tabell I QGIS
Tex så kan vi ta fram arealen och sortera kommunerna på areal med största först: Ok, nu har vi alltså våra kommuner liggande I PostGIS. Och??... SELECT namn, ST_Area(the_geom) as areal FROM dalarnas_kommuner ORDER BY ST_Area(the_geom); Namn areal Älvdalen 7181825812.02954 Malung Sälen 4334800351.50391 Mora 3126902024.13403 Falun 2286147223.44165 Rättvik 2147645359.67383 Orsa 1806522832.78857 Vansbro 1665607163.07153 Ludvika 1656379207.64697 Leksand 1422736669.07739 Smedjebacken1061635436.9646 Hedemora 933380369.596191 Gagnef 813834459.520508 Avesta 672367605.668213 Borlänge 638828959.19751 Och det går fort Mycket fort Detta tog 11 ms
Nytt exempel, en skogsbruksplan
Exempel på distansfunktion avstånd 262.905890060985 SELECT ST_Distance(b.the_geom, v.the_geom) AS avstånd FROM bestand_ytor b, vatten v where v.namn='rattsjön' and b.avdnr=95;
Ett annat distansexempel Ackumulerad volym med ökande avstånd från väg Utifrån beståndens centrumspunkt. m3sk 70000 60000 50000 40000 30000 20000 10000 0 5 35 65 95 125 155 185 215 245 275 305 335 365 395 425 455 485 515 545 575 605 635 665 695 meter från väg
Sqlkoden som ger data till diagrammet SELECT SUM(d.vol)::integer, n+5 AS klass FROM (SELECT DISTINCT ON (a.gid) a.gid, ST_Distance(ST_Centroid(a.geom), b.geom) dist, ST_Area(a.geom)/10000*a.m3skha as vol from bestand_ytor a inner join (SELECT * FROM veger WHERE typ IN (21,22)) b ON ST_Dwithin(a.geom, b.geom, 1000) ORDER BY a.gid, ST_Distance(ST_Centroid(a.geom), b.geom)) d right join generate_series(0, 700, 10) as n on d.dist>=n and d.dist < n+10 group by n order by n 0.9 sekunder
En karta med de delar av bestånd som ligger mer än 300 meter från väg
Sqlkoden som ger kartan CREATE TABLE far_away AS SELECT ST_CollectionExtract(st_difference(a.geom, b.geom),3) AS the_geom,a.* FROM (SELECT ST_Union(ST_Buffer(geom, 300)) AS geom FROM veger) b CROSS JOIN bestand_ytor a ; 1,4 sekunder
Utifrån denna karta kan man tex skapa en Tabell med arealerna per huggningsklass 300 meter från väg SELECT hkl, (SUM(ST_Area(the_geom))/10000)::integer FROM far_away GROUP BY hkl ORDER BY SUM(ST_Area(the_geom)) DESC 0,003 sekunder hkl areal R2 24 G1 19 S2 7 3 S1 1 G2 0 ÖF 0 R1 0 K1 0
Här har jag tagit och skurit ut den del av avdelningarna Som ligger mellan 5 och 10 meter från vägmitt.
Geography type Från version 1.5 av PostGIS Hanterar oprojiserad data I srid 4326 Funktioner ger svar I meter Betydligt mer avancerade algoritmer, därför långsammare Med andra ord: Om ni jobbar över ett mindre område, tex Sverige: Använd projiocerade data. Om ni jobbar över stora områden som ger för stora avvikelser I en och Kartsystem så är det antagligen bättre att lagra I geography type. Kan anges vid lagring eller så kan man få geography tye genom en omvandling under körning
PostGIS goes 3D Varför hantera GISdata I 3D? * Visualisering, tex byggnader I en stad eller landskapets höjdskillnader * Mer komplexa analyser där hänsyn tas till Z koordinaten
PostGIS goes 3D PostGIS har länge kunnat hantera punkter, linjer och polygoner I 3D Samt haft en del funktioner som har haft stöd för 3D, Helt eller delvis Det som nu tillkommer är:
PostGIS goes 3D Nya datatyper: Polyhedralsurface är sammanfogade polygoner TIN är sammanfogade trianglar
PostGIS goes 3D Nya 3D funktioner: * ST_3DDistance * ST_3DClosestPoint * ST_3DShortestLine * ST_3DDWithin * ST_3DMaxDistance * ST_3DLongestLine * ST_3DDFullyWithin
Andra intressanta nya funktioner ST_Split(geometry, geometry) select st_split(ageom, bgeom) as the_geom from (Select 'POLYGON((1 1, 1 10,10 10, 10 1,1 1))'::geometry as ageom, 'LINESTRING(0 3, 15 20)'::geometry as bgeom) g
Andra intressanta nya funktioner ST_Snap(geometry, geometry, tolerance) SELECT ST_Snap(A, B, 2.0) as NY_A A B NY_A B
POSTGIS Raster Integreras I PostGIS I version 2.0 Man kan idag göra en overlay mot et vektorlager Man kan använda mapalgebra på ett lager, det a på gång med två lager. Hur kan man titta på rasterdatat?
Tack för mig! Nicklas Avén E post: nicklas.aven@jordogskog.no Blog: http://blog.jordogskog.no Http://www.postgisonline.org