Upload
others
View
8
Download
0
Embed Size (px)
Citation preview
Vad är PostGIS?
Hmm, PreGIS måste vara papperskartor......., men vad är PostGIS..... ?
Man ser det ofta skrivet PostgreSQL/PostGIS
Vad menas?
PostgreSQLPostgreSQL är en databasprogramvara motsvarande:Microsoft SQL ServerMicrosoft AccessOracleDB2Osv, osv
PostGIS är att tillägg till PostgreSQLsom 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 desktopmiljö 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 GISfunktioner 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 sqlsats som kan resultera I någonting som tex:
namnAvestaBorlängeFalunGagnefHedemoraIdre/Särna/GrövelsjönLeksandLudvikaMalungMoraOrsa RättvikSmedjebackenSälenSäterVansbroÄlvdalen
Det fungerar I alla databaser som förstår SQL
TexMS AccessMS SQL ServerOraclePostgreSQL
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;0106000020BE0B00000100000001030000000100000083040000E8479FE01D1B1D41FB9FEC6ED79759416A94F34FB11B1D41MalungSälen;0106000020BE0B0000010000000103000000010000006C0A0000F0507E8A8EA6184120CF4BC0DEFA5941A188950A9FA61841Gagnef;0106000020BE0B0000010000000103000000010000006B090000CD70A69536DE1E41D3C2FD13CCA45941F0F310583EDF1E41Leksand;0106000020BE0B000002000000010300000007000000481400005B971C91C91F1E4164E86E1D26C25941849B30AFF11F1E41Rättvik;0106000020BE0B00000300000001030000000100000016000000215349EF83341E414D653E601FBD5941BA20AC5DF4361E41Orsa;0106000020BE0B000001000000010300000001000000D00700008F838721A3741D41225D7F38B10A5A41D2AE876B92741D41Älvdalen;0106000020BE0B0000010000000103000000010000007D080000F80BAD55CFB21641C5F2F10E19545A418ED88FCDDCEC1641Smedjebacken;0106000020BE0B0000020000000103000000010000000A000000744EA9BB7A531F414BDEBFA53A725941090A423841511F41Mora;0106000020BE0B0000020000000103000000010000001C000000EB465694AC361E4174AF297E7FBD594147DE44EE64371E41Falun;0106000020BE0B00000800000001030000000100000007000000F99E737BCD951F41E0302BC288B359415E9A566598951F41Borlänge;0106000020BE0B00000400000001030000000100000068000000EB5491CE85F51F410741BEF4497F5941342217989FF51F41Säter;0106000020BE0B000001000000010300000003000000A60800003C8230F43F2121414893875529A1594146A5EAD71D212141Hedemora;0106000020BE0B0000010000000103000000010000005D040000FF262235D25A2141E062FFB69596594126DDB047A05E2141Avesta;0106000020BE0B000001000000010300000001000000B8030000B9703B1531A82141DE2B3E318589594136A8249D66AB2141Ludvika;0106000020BE0B00000200000001030000000100000019000000F62FF6630A491F416411E63096805941C949B10B3B481F41
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,476938.569685915 6MalungSälen;MULTIPOLYGON(((403875.635247483 6810491.00462702,403879.760336051 6810468.68995297,403893.345391391 Gagnef;MULTIPOLYGON(((505741.646142733 6722352.31236334,505807.58600217 6722348.82274123,505805.848285739 6Leksand;MULTIPOLYGON(((493554.391710629 6752408.45989427,493564.42108386 6752406.67278899,493571.853474744 6Rättvik;MULTIPOLYGON(((494880.983678149 6747261.50380833,495037.091476928 6745313.12277712,494915.032422609 Orsa;MULTIPOLYGON(((482600.782743507 6826692.88277367,482596.605009777 6826683.38571284,482590.906649911 Älvdalen;MULTIPOLYGON(((371891.833667933 6901860.23351735,375607.200744041 6900405.30835683,377318.391584888 Smedjebacken;MULTIPOLYGON(((513246.68326304 6670570.58983571,513104.30493942 6670402.8648105,513022.491410882 667Mora;MULTIPOLYGON(((495019.144860371 6747645.97129427,495065.232684587 6747641.5879371,495084.763103153 6Falun;MULTIPOLYGON(((517491.370558247 6737443.03388616,517478.098963177 6737410.8297189,517396.783658645 6Borlänge;MULTIPOLYGON(((523617.451726271 6683943.82411218,523623.898525748 6683778.95122592,523625.274225587 Säter;MULTIPOLYGON(((561311.976932592 6718629.33639986,561294.921712079 6718604.56247125,561196.503554728 Hedemora;MULTIPOLYGON(((568681.103776187 6707798.85933754,569168.140021239 6707000.59412815,569224.236644557 Avesta;MULTIPOLYGON(((578584.541469119 6694420.76941964,578995.306920296 6694177.08911342,579149.971146056 Ludvika;MULTIPOLYGON(((512578.597618818 6685272.76404223,512526.761418488 6685259.15464207,512505.305031116
Eller så kan vi ta in samma tabell I QGIS
Ok, nu har vi alltså våra kommuner liggande I PostGIS.Och ??....
Tex så kan vi ta fram arealen och sortera kommunerna på areal med största först:
SELECT namn, ST_Area(the_geom) as areal FROM dalarnas_kommunerORDER BY ST_Area(the_geom);
Namn arealÄlvdalen 7181825812.02954MalungSälen 4334800351.50391Mora 3126902024.13403Falun 2286147223.44165Rättvik 2147645359.67383Orsa 1806522832.78857Vansbro 1665607163.07153Ludvika 1656379207.64697Leksand 1422736669.07739Smedjebacken1061635436.9646Hedemora 933380369.596191Gagnef 813834459.520508Avesta 672367605.668213Borlänge 638828959.19751Säter 627478468.49292
Och det går fortMycket fortDetta tog 11 ms
Nytt exempel, en skogsbruksplan
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;
Exempel på distansfunktion
avstånd262.905890060985
5 35 65 95 125
155
185
215
245
275
305
335
365
395
425
455
485
515
545
575
605
635
665
695
0
10000
20000
30000
40000
50000
60000
70000
meter från väg
m3sk
Ett annat distansexempel
Ackumulerad volym med ökande avstånd från väg Utifrån beståndens centrumspunkt.
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+10group by n order by n
0.9 sekunder
Sqlkoden som ger data till diagrammet
En karta med de delar av bestånd som ligger mer än 300 meter från väg
CREATE TABLE far_away ASSELECT 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
Sqlkoden som ger kartan
Utifrån denna karta kan man tex skapa en Tabell med arealerna per huggningsklass300 meter från väg
SELECT hkl, (SUM(ST_Area(the_geom))/10000)::integerFROM far_awayGROUP BY hkl ORDER BY SUM(ST_Area(the_geom)) DESC
0,003 sekunder
hkl arealR2 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 avdelningarnaSom 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 Zkoordinaten
PostGIS goes 3D
PostGIS har länge kunnat hantera punkter, linjer och polygoner I 3DSamt 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 3Dfunktioner:
* 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)
A B NY_A B
SELECT ST_Snap(A, B, 2.0) as NY_A
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énEpost: [email protected]: http://blog.jordogskog.noHttp://www.postgisonline.org