PostGIS og OGR(2OGR)

Workshop

Niels Kjøller Hansen
niha07@frederiksberg.dk
linkedin.com/in/nielskjoller
@nkjoller

Følg med på http://lab.kjlr.dk/slides/postgis-ogr-workshop/

PostgreSQL PostGIS

Et (geo)databasesystem

  • Performance
  • Rigtigt god understøttelse i andet Open Source
  • Administrationsværktøj med syntax highlighting
  • En god mængde hjælp på nettet

Screenshot

Billede fra PG-Admin

Ingen grund til at stå ude i regnen

Installation - en masse billeder

Der kommer en masse spørgsmål om raster-dimser. Sig nej i denne omgang

Øvelse 1: Kom op at køre

Opgaver:

  • Installer PostgreSQL og PostGIS
  • Forbind med PgAdmin III
  • Bonus: opret en bruger og et skema som den bruger ejer

At oprette et lag direkte

CREATE TABLE punkter
(
   fid serial PRIMARY KEY NOT NULL, 
   geom geometry(POINT,25832),
   tekst text
);

At lave et view

CREATE VIEW bufferzoner AS
   SELECT fid,
          ST_Buffer(geom,50) as geom,
          tekst
     FROM punkter;

Bemærk: Man kan som udgangspunkt ikke redigere i et view

Øvelse 2: Data og views

Opgaver:

  • Opret et punktlag
  • Forbind til laget i QGIS og tegn nogle punkter
  • Opret et view med en spatial funktion, fx ST_Buffer

GDAL - Geospatial Data Abstraction Library

Et oversættelsesbibliotek til en lang række geodataformater

  • Geodatas svar på en schweizerkniv
  • Læs, skriv og konverter mellem en masse formater
  • Omprojicering
  • Georeferering, skalering (raster)
  • En masse små værktøjer


Jeg vil snakke om min yndling - OGR2OGR

Hvordan?

  1. Kommer med i OSGEO4W (http://osgeo4w.osgeo.org/)
  2. Kald ogr2ogr fra kommandoprompten, og husk
    • Hvor data skal skrives, og i hvilket format
    • Hvor data skal læses fra
    • Diverse options, som geometri-type, rumlig reference mv.

Kald af OGR2OGR

c:\>ogr2ogr


      

Mål

c:\>ogr2ogr -f PostgreSQL PG:"host=kosgis.kjlr.dk dbname=kosgis user=kosgis 
password=kgsoroe"

      

Kilde

c:\>ogr2ogr -f PostgreSQL PG:"host=kosgis.kjlr.dk dbname=kosgis user=kosgis 
password=kgsoroe" WFS:"http://arealinformation.miljoeportal.dk/gis/services/
public/MapServer/WFSServer?SERVICE=WFS" 
      

Det specifikke lag

c:\>ogr2ogr -f PostgreSQL PG:"host=kosgis.kjlr.dk dbname=kosgis user=kosgis 
password=kgsoroe" WFS:"http://arealinformation.miljoeportal.dk/gis/services/
public/MapServer/WFSServer?SERVICE=WFS" dmp:DKJord_V1 
      

Begræns kaldet geografisk

c:\>ogr2ogr -f PostgreSQL PG:"host=kosgis.kjlr.dk dbname=kosgis user=kosgis 
password=kgsoroe" WFS:"http://arealinformation.miljoeportal.dk/gis/services/
public/MapServer/WFSServer?SERVICE=WFS" dmp:DKJord_V1 -spat 660900 6138000 6
62200 6150000

Nyt navn til database-tabellen

c:\>ogr2ogr -f PostgreSQL PG:"host=kosgis.kjlr.dk dbname=kosgis user=kosgis 
password=kgsoroe" WFS:"http://arealinformation.miljoeportal.dk/gis/services/
public/MapServer/WFSServer?SERVICE=WFS" dmp:DKJord_V1 -spat 660900 613800 6
62200 6150000 -nln "jordforurening_v1"

Lidt hjælp

c:\>ogr2ogr -f PostgreSQL PG:"host=kosgis.kjlr.dk dbname=kosgis user=kosgis 
password=kgsoroe" WFS:"http://arealinformation.miljoeportal.dk/gis/services/
public/MapServer/WFSServer?SERVICE=WFS" dmp:DKJord_V1 -spat 660900 6138000 6
62200 6150000 -nln "jordforurening_v1" -a_srs "EPSG:25832" -nlt MULTIPOLYGON

Samlet, på én linje

ogr2ogr -f PostgreSQL PG:"host=kosgis.kjlr.dk dbname=kosgis user=kosgis password=kgsoroe" WFS:"http://arealinformation.miljoeportal.dk/gis/services/public/MapServer/WFSServer?SERVICE=WFS" dmp:DKJord_V1 -spat 660200 6138000 662200 6150000 -nln "jordforurening_v1" -a_srs "EPSG:25832" -nlt MULTIPOLYGON

Lidt simplere konvertering

Shape til Tab

ogr2ogr -f "MapInfo TAB" data.tab data.shp -a_srs "EPSG:25832"

Fil til database

ogr2ogr -f "PostgreSQL" PG:"..." data.tab -a_srs "EPSG:25832" -nlt POINT

Database til fil (med transformation)

ogr2ogr -f "GeoJSON" data.geojson PG:"..." -t_srs "EPSG:4326" -lco COORDINAT
E_PRECISION=5

Øvelse 3: Data ud,ind,frem,tilbage

  • Eksporter dine punkter fra øvelse 2 til en geojson i WGS84
  • Hvis du har noget data med, så prøv at indlæse det i databasen
  • Indlæs V1-flader til din database
  • Bonus: Find en anden service, og prøv at få den indlæst

Bonus: OGRINFO

ogrinfo er et værktøj til at få informationer om ogr-kompatible data

ogrinfo -so mystiskdata.shp

ogrinfo kan også bruges på databaser, også til queries

ogrinfo -so PG:"..." -sql "SELECT fid,geom FROM punkter"

Queries er ikke kun SELECT-queries, man kan også ødelægge ting :-)

ogrinfo -so PG:"..." -sql "DELETE FROM punkter WHERE Tekst = 'Punkt 1'"

Case: Frederiksbergs Boligsociale Landkort (BoSoLaK)

Det boligsociale landkort

Indlæs data

Hent data ind fra LOIS

ogr2ogr -overwrite -f PostgreSQL PG:"..." -lco SCHEMA=temp -nln bbr_enheder_%DATE% 
MSSQL:server=dblois\dblois;database=LOIS;trusted_connection=yes;Tables=dbo.NyBBR_E
nhedView"

Kør en funktion, der loader ind i master-tabellen

ogrinfo -q -sql "SELECT funktioner.bs_load_bbr('temp.bbr_enheder_%DATE:~0,2%_%DATE:
~3,2%_%DATE:~-4%', 'temp.bbr_bygninger_%DATE:~0,2%_%DATE:~3,2%_%DATE:~-4%', '%temp
.osak_adresser_%DATE:~0,2%_%DATE:~3,2%_%DATE:~-4%', '%DATE:~-4%-%DATE:~3,2%-%DATE:
~0,2%'::date);" PG:"..."

Lav en masse optællinger!

SELECT 
  distrikter.type_navn,
  distrikter.distrikt_id,
  count(cpr.*)
  FROM konfiguration.distrikter
  LEFT JOIN individ.cpr
    ON ST_INTERSECTS(cpr.geometry,distrikter.geometry)

  WHERE cpr.udtraek_dato = '2014-10-01' 

  GROUP BY distrikter.type_navn,
           distrikter.distrikt_id;        

Export til JSON

 SELECT array_to_json(array_agg(row_to_json(t.*))) AS array_to_json
   FROM ( SELECT db.distrikt_id, db.type_id, db.antal_borger AS antal_samlet, 
            db.udtraek_dato
           FROM aggregeret.distrikt_demografi db
          WHERE db.type_id = 11
          ORDER BY db.udtraek_dato) t;