-- SQL Beispiele zum Workshop PostGIS für Einsteiger -- http://www.fossgis.de/konferenz/2015/programm/events/794.de.html --Daten für den Workshop -- OSGEO-Live unter: /home/user/data/natural_earth2/ -- OSM -- http://download.geofabrik.de/europe/germany/nordrhein-westfalen/muenster-regbez-latest.shp.zip -- Kommentare erfolgen über -- ------------------------------------------------------------------ -- Übung 1: pgAdmin III ------------------------------------------------------------------ -- 1.1 Anlegen einer Datenbank mit PostGIS Erweiterung CREATE DATABASE fossgis; --Wechseln zur Datenbank fossgis CREATE EXTENSION postgis; -- 1.2 Tabelle anlegen -- poi - eine einfache Tabelle CREATE TABLE poi ( gid serial, name varchar, geom geometry( point , 4326 ), CONSTRAINT pk_poi_gid PRIMARY KEY (gid) ); -- 1.3 Füllen der Tabelle poi mit Daten INSERT INTO poi (name , geom) VALUES ('Schloß Münster', ST_SetSRID(ST_MakePoint(7.61334,51.963586), 4326) ); INSERT INTO poi (name , geom) VALUES ('Aasee Münster', ST_GeometryFromText('POINT(7.62517 51.95616)', 4326) ); -- 1.4 Anzeige der Daten (SQL Editor oder Tabellensymbol) SELECT *, ST_AsText(geom) from poi; -- Anzeige der Sicht geometry_column SELECT * from geometry_columns; -- poi Ausgabe der Geometrie als WKT, EWKT, Lon und Lat SELECT geom, ST_AsText(geom), ST_AsEWKT(geom), ST_X(geom), ST_Y(geom) from poi; ------------------------------------------------------------------ -- Übung 2: Natural Earth2 ------------------------------------------------------------------ --2.1 QGIS SQL-Fenster oder pgAdmin SQL-Editor verwenden -- QGIS Filter auf ne_10m_admin_1_states_provinces_shp admin = 'Germany' -- Import der Daten (nur admin='Germany') unter dem Namen laender -- ESPG 4326 -- SQL Editor -- Nur NRW ausgeben SELECT * FROM laender WHERE admin = 'Germany' AND name = 'Nordrhein-Westfalen' -- Berechung der Fläche der Länder SELECT ST_Area(geom), * from laender; SELECT ST_Area(ST_transform(geom,25832)) as flaeche, * from laender; --- das größte Bundesland? SELECT ST_Area(ST_transform(geom,25832)) as flaeche, * from laender ORDER BY flaeche DESC LIMIT 1; -- In welchem Bundesland liegen die pois? SELECT poi.*, l.* from poi, laender l WHERE st_distance(poi.geom, l.geom) = 0; -- ST_UNION - Vereinigen der Bundeslaender Create view brd as Select 1, st_union(geom) as geom from laender; -- Import der Natural Earth2 river in die Tabelle fluesse (mit gid, Geometrieindex und Angeb der Projektion EPSG 4326) -- ST_Buffer - Puffern von Daten Create view fluesse_puffer as Select gid,name, st_buffer(geom,0.0001)::geometry(polygon,4326) as geom_buffer from fluesse WHERE name = 'Rhine'; ------------------------------------------------------------------ -- Übung 3: ------------------------------------------------------------------ --3.1 QGIS SQL-Fenster oder pgAdmin SQL-Editor verwenden CREATE OR REPLACE VIEW plz_flaechen as SELECT ST_Area(geom) from plz; -- 3.2. PLZ -- st_transform rechnet die Fläche nach ETRS89 Zone 32 um (EPSG 25832) SELECT ST_Area(ST_Transform(geom,25832)),* from plz; -- Welche ist die größte Fläche? SELECT max(ST_Area(ST_Transform(geom,25832))) as flaeche from plz; SELECT ST_Area(ST_Transform(geom,25832)) as flaeche, * from plz ORDER BY flaeche desc limit 1; -- st_distance - Distanz zwischen Objekten -- In welchem PLZ liegen die Punkte der Tabelle poi? SELECT poi.*, plz.* from poi, plz WHERE st_distance(poi.geom, plz.geom) = 0; -- 3.3 POI -- Entfernung der zwei Punkte der Tabelle poi SELECT * from poi schloss where gid = 1; SELECT * from poi see where gid = 2; SELECT *, st_distance(schloss.geom, see.geom) from poi schloss, poi see where schloss.gid = 1 AND see.gid=2; SELECT *, st_distance(st_transform(schloss.geom,25832), st_transform(see.geom,25832)) from poi schloss, poi see where schloss.gid = 1 AND see.gid=2; Create view line_poi as SELECT *, st_MakeLine(schloss.geom, see.geom) from poi schloss, poi see where schloss.gid = 1 AND see.gid=2; Create VIEW linie_zwischen_poi as SELECT schloss.gid, st_MakeLine(schloss.geom, see.geom)::geometry(linestring,4326) from poi schloss, poi see where schloss.gid = 1 AND see.gid=2; -- Nur die Seen mit Beschriftung übertragen: 321 Stück -- Filter in QGIS setzen: type = 'water' and name != '' CREATE VIEW water_envelope as SELECT st_envelope(geom) from water; -- besser Abgabe Geometrietyp und srid DROP VIEW water_envelope; CREATE VIEW water_envelope as SELECT st_envelope(geom)::geometry(polygon,4326) from water; -- 3.4 roads -- Länge der Straße Schlossplatz SELECT geom, ST_AsText(geom), ST_AsEWKT(geom), ST_X(geom), ST_Y(geom) from poi; -- Puffern der Straßen am Schlossplatz Create view roads_buffer as Select gid,name, st_buffer(geom,0.0001)::geometry(polygon,4326) as geom_buffer from roads where name = 'Schlossplatz'; CREATE TABLE poi_linie as SELECT schloss.gid, st_MakeLine(schloss.geom, see.geom)::geometry(linestring,4326) from poi schloss, poi see where schloss.gid = 1 AND see.gid=2; -- Validierung SELECT * from plz where st_isvalid(geom) = false; st_isvalidreason(geom) st_makevalid(geom)