Téradat szerverek workshop Siki Zoltán siki1958@gmail.com 2013. április 24-25. Balatonalmádi
Mi a téradat szerver? Relációs adatbázis kezelő, mely: geometriai adattípussal rendelkezik (pont, törtvonal, felület,...) geometriai adatokat indexelni képes (legalább 2D) geometriai adatokat kezelő függvényekkel rendelkezik (OGC), kb. 300 függvény a PostGIS esetén vetületi rendszereket kezeli térinformatikai kérdések hatékony megválaszolására képes (pl. térbeli összekapcsolás) Minden térbeli funkcionalitás az SQL nyelvből érhető el!
Téradat szerver előnyök, hátrányok Előnyök tranzakció, integritás konkurens felhasználók, konkurens adatmódosítás (zárolás) adatbiztonság, jogosultsági rendszer szabványok (SFS, WKT, SQL/MM Spatial) Hátrányok implementálási költségek lassabb mint a fájl alapú adatszerkezetek esetleges inkompatibilitás a használt asztali GIS szoftverekkel
Téradat szerver programok Kereskedelmi szoftverek ArcGIS Server (Oracle, SQL Server, IBM DB2, PostgreSQL) (korábban ArcSDE) Oracle Spatial (Oracle) MS SQL Server 2008+ Geomedia + MS Access SyBase SQL Anywhere (mobil eszközökre is)... Nyílt forráskódú PostGIS (PostgreSQL) SpatiaLite (SQLite)... PostGIS SpatiaLite
Geometria tárolása Az adatbázis tábla egy oszlopában, mint az egyéb alfanumerikus adatok Speciális adattípusok geometry, geography (bináris tárolás) Speciális (szabványos) függvények a kezeléshez Egy táblában lehet több geometria típusú oszlop (nem minden kliens szoftver támogatja) Egy oszlopban különböző típusú geometriai elemek lehetnek (nem minden kliens szoftver támogatja) vezetek_id anyag 1 KGPVC 2 beton... atmero 400 600 fektetes_eve 1991 1972 geom......... NA 600 b
Geometriai modell
Szabályok az elemekre Vonallánc Metszheti önmagát Ismétlődő pont megengedett Felület A határ nem metszheti önmagát Sziget nem érintkezhet a külső határral egy pontban Összetett felület Egymásba ágyazható (sziget a tavon) Érintkezhetnek egy pontban Él mentén nem érintkezhetnek
Well Known Text (WKT) Jelölő nyelv vektor grafika leírására Első definíció Simple Feature Access (OGC) Az ISO/IEC 13249-3:2011 szabvány része Part 3: Spatial (SQL/MM) SQL nyelvben használható (függvények segítségével) Például: POINT (30 10) LINESTRING (30 10, 10 30, 40 40) POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10)) pont, törtvonal, felület
Well Known Text példák egyszerű elemek (2D) POINT (30 10) pont, LINESTRING (30 10, 10 30, 40 40) törtvonal, POLYGON ((30 10, 10 20, 20 40, 40 40, 30 10)) felület, POLYGON ((35 10, 10 20, 15 40, 45 45, 35 10), felület (20 30, 35 35, 30 20, 20 30)) lyukkal, több azonos típusú részből MULTIPOINT ((10 40 32), (40 30 41), (20 20 22)) 3D MULTIPOINT (10 40 32, 40 30 41, 20 20 22) MULTILINESTRING ((10 10, 20 20, 10 40), (40 40, 30 30, 40 20, 30 10)) MULTIPOLYGON (((30 20, 10 40, 45 40, 30 20)), ((15 5, 40 10, 10 20, 5 10, 15 5))) MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)), ((20 35, 45 20, 30 5, 10 10, 10 30, 20 35), (30 20, 20 25, 20 15, 30 20))) több eltérő típusú részből (nem minden kliens támogatja) GEOMETRYCOLLECTION(POINT(4 6),LINESTRING(4 6,7 10)) POINT ZM (1 1 5 60) 4D POINT M (1 1 80) 2+1D
Well Known Binary 010400000001000000010100000092390064507D1C412F1B85CA03BD0F41 MULTIPOINT(466772.10 260000.47) PostGIS EWKT/EWKB vetületet is tartalmazza "SRID=23700;POINT((466772.097657108 260000.473886692))" SRID vetületi azonosító, pl. EOV = 23700, Google Mercator = 900913 vagy 3857, WGS84 = 4326 (GPS) google ~ 900913 ;)
Elemző függvények (nem teljes lista) ST_Equals(GEOMETRY,GEOMETRY) ST_Contains(GEOMETRY,GEOMETRY) ST_Within(GEOMETRY,GEOMETRY) ST_Intersects(GEOMETRY,GEOMETRY) ST_Crosses(GEOMETRY,GEOMETRY) ST_Disjoint(GEOMETRY,GEOMETRY) ST_DWithin(GEOMETRY,GEOMETRY,DISTANCE) ST_Relate((GEOMETRY,GEOMETRY) ST_Intersection(GEOMETRY,GEOMETRY) ST_Union(GEOMETRY,GEOMETRY) ST_Buffer(GEOMETRY,DISTANCE) ST_ConvexHull(GEOMETRY) ST_Transform(GEOMETRY,SRID)
Lekérdező függvények ST_Area(POLYGON) ST_Perimeter(GEOMETRY) ST_Distance(GEOMETRY,GEOMETRY) ST_Dimension(GEOMETRY) ST_AsText(GEOMETRY) ST_X(POINT) ST_Y(POINT) ST_NumPoints(GEOMETRY) ST_PointN(GEOMETRY,integer) ST_NumGeometries(GEOMETRY) ST_GeometryN(GEOMETRY,integer) ST_GeometryType(GEOMETRY)
Két és három rétegű szerkezet (2-tier, 3-tier architecture) Térbeli adatbázis SQL Asztali GIS (vastag kliens) SQL Web szerver + alkalmazás http Kliens böngésző (vékony kliens)
A SQL Query walks into a bar. In one corner of the bar are two tables. The Query walks up to the tables and asks: - Mind if I join you?
Vége a pihenésnek! Mostantól mindenki dolgozik!
OSGeo Live 6.5 DVD Xubuntu 12.0.4 LTS (Linux)
Operációs rendszer betöltése Indítási variációk 1.Boot menü kiválasztása a gép indulásánál (F10/F12?) USB HDD 2. Del/F2/Crtl S stb. belépés a Setup-ba Boot sorrendben az USB legyen az első 3. Alap operációs rendszer betöltése, virtuális gép fájl bemásolása, virtuális gép indítása A pendrive-ról futtatott operációs rendszer lassabban működik mint a HDD-re telepített!
Magyar billentyűzet beállítása 1 Jobb egér gomb Properties 2 5 3 4 6 7
psql, a fapados eszköz Parancssori felület PostgreSQL/PostGIS-hez Indítás: Applications/Accessories/Terminal Emulator psql Aktuális adatbázis user A psql SQL parancsokat és psql parancsokat érti meg psql parancsok \ karakterrel Kezdődnek Az SQL parancsok több sorosak is lehetnek, a végét ; (pontosvesszővel) kell megjelölni
psql, adatbázis létrehozása CREATE DATABASE workshop; Alfanumerikus adatok tárolására alkalmas új adatbázis létrehozása Új adatbázis létrehozása A létező adatbázisok listáját a \l paranccsal nézhetjük meg. A programból kilépés a \q paranccsal történhet
psql, aktuális adatbázis \c workshop Csatlakozás az új adatbázishoz, egy időben egy adatbázis adatait láthatjuk Új adatbázis aktuálissá tétele A prompt megváltozott, az aktuális adatbázis nevét tartalmazza. A # arra utal, hogy adatbázis adminisztrátor joggal rendelkezünk! A hétköznapi felhasználók promptjában > karakter jelenik meg.
psql, téradatbázissá alakítás CREATE EXTENSION postgis; PostGIS 2.0 megoldás, korábbi változatban (1.5) több parancs kellett Téradatbázissá alakítás A parancs hatására több adatbázis objektum jön létre: új SQL függvények, például AddGeometryColumn, vetületek táblázata spatial_ref_sys Meta nézet táblák, például geometry_columns
psql, téradatbázis elemei \dt \d Aktuális adatbázis táblái Adatbázis objektumok listázása (tábla, nézettábla, index, stb.) Táblák listája Vetület definíciók Adatbázis objektumok listája OGC szabvány Az összes psql parancs listáját a \? paranccsal tekintheti meg
psql, adatbázis objektum leírása \d geometry_columns Adatbázis tábla/nézet tábla leírása, oszlopok neve és típusa Adatbázis objektum leírása A PostgreSQL adatbázisban a tábla és oszlopnevek kisbetűsek. táblanév oszlopnév 2/3/4 vetület (EPSG) point/linestring/...
Tábla létrehozása (psql) Alap tábla CREATE TABLE vezetek ( id serial PRIMARY KEY, nev varchar(50)); Kulcs A kliens programok többsége igényli, hogy a táblában legyen egy egész értékeket tartalmazó kulcs oszlop Automatikus sorszám Geometriai tartalom (új oszlop) SELECT AddGeometryColumn ('vezetek','geom',23700,'linestring',2); tábla név oszlop név A geometriát tartalmazó oszlop neve szokásosan geom vagy the_geom, de tetszőleges más nevet is lehet használni. dimenzió geometria típusa vetület (EPSG)
Adatbevitel/módosítás (psql) INSERT INTO vezetek (nev, geom) VALUES ('cs-1-5-7', ST_GeomFromText( 'LINESTRING(645123 243116, 645110 243242)',23700)); INSERT INTO vezetek (nev, geom) VALUES ('cs-1-5-6', ST_GeomFromText( 'LINESTRING(645146 243151, 645110 243242)',23700)); UPDATE vezetek SET geom=st_geomfromtext( 'LINESTRING(645123 243116, 645090 243240)',23700) WHERE id=1; DELETE FROM vezetek WHERE id=1; Térbeli lekérdezések/műveletek gyorsítása térbeli index CREATE INDEX vezetek_geom_index ON vezetek USING GIST(geom); \q kilépés id=1 id=2
Adatbevitel/módosítás (QGIS) Menü: Geospatial/Desktop GIS/ Quantum GIS Magyar felhasználói felületre áttérés (menüből): Settings/Options 1 2 3 4 Kilépés a programból és újraindítás A QGIS az operációs rendszerben beállított nyelven indul el automatikusan
Adatbevitel/módosítás II. (QGIS) 1 3 2 4 5 6 7
Adatbevitel/módosítás III. (QGIS) Digitalizálás 1 2 3 4 5 6 A QGIS-ben végrehajtott módosítások az adatbázisban csak a szerkesztő mód kikapcsolása után jelennek meg. 7
Adatbevitel/módosítás IV. (QGIS) Attribútumok módosítása Mentés után kap értéket! Módosítások mentése 1 2 A mentés után már mindenki a módosított állapotot látja.
Sajnálom, ön nem szerepel az adatbázisban.
Demo adatok varos: gid, nev, lakos, geom folyo: gid, nev, geom to: gid, nev, terulet, geom megye: gid, nev, geom csapadek: gid, mm, geom nap: gid, ora, geom tal: gid, tipus, geom Talajok: tipus, talaj_nev (geometria nélkül)
Adatok importálása I. Menüből: Applications/Accessories/Terminal Emulator ln -s /media/cdrom/workshop/ ~/workshop shp2pgsql-gui & 2 1 3 5 6 4 7
Adatok importálása II. shp2pgsql-gui 23700 == EOV (EPSG) ISO-8859-2 == kelet-európai kódlap 8 9 13 ISO-8859-2 UTF-8 konverzió az adatbázisban 10 11 12
PgAdmin III. Grafikus felhasználói felület PostgreSQL és PostGIS parancsokhoz Menü: Geospatial/Databases/pgAdmin III Dupla kattintás Fedezzük fel a workshop adatbázis tartalmát!
PgAdmin III. 1 Jobb gomb menüből View All Rows A táblázatban szerkesztheti az adatokat, ha duplán kattint a mezőbe. Teljes sorokat törölhet a sorszám oszlop jobb gomb menüjéből. Módosíthatja a sorrendet az egyes mezők jobb gomb menüjéből.
PgAdmin III. SQL 1 Az SQL ablakban tetszőleges SQL utasításokat, használhatjuk a PostGIS függvényeket is. Nagyobb adatbetöltések után célszerű az adatbázis optimalizálni A vacuum analyze paranccsal. Ezt időnként automatikusan is megteszi a PostgreSQL.
Egyszerű lekérdezések PostGIS verzió SELECT postgis_full_version(); Folyószakaszok hossza SELECT nev, ST_Length(geom) FROM folyo; Folyó hosszak összegzése folyónevenként Leghosszabb magyarországi szakasszal bíró folyó SELECT nev, Sum(ST_Length(geom)) FROM folyo GROUP BY nev ORDER BY 2 DESC LIMIT 1 Egerhez legközelebbi vízfolyás SELECT varos.nev, folyo.nev, ST_Distance(varos.geom, folyo.geom) FROM varos CROSS JOIN folyo WHERE varos.nev='eger' ORDER BY 3 LIMIT 1 Az egyes városokhoz legközelebbi vízfolyás távolsága SELECT v.nev, min(st_distance(v.geom, f.geom)) FROM varos AS v CROSS JOIN folyo AS f GROUP BY v.nev ORDER BY 2;
Egyszerű lekérdezések 2. Egymáshoz legközelebbi város-folyó párok SELECT v.nev, f.nev, ST_Distance(v.geom, f.geom) FROM varos AS v CROSS JOIN folyo AS f WHERE (v.nev, ST_Distance(v.geom, f.geom)) in ( SELECT varos.nev, min(st_distance(varos.geom, folyo.geom)) FROM varos CROSS JOIN folyo WHERE varos.nev = v.nev GROUP BY varos.nev); Városok melyik megyébe esnek SELECT megye.nev AS megye, varos.nev AS varos FROM Varos INNER JOIN megye ON ST_Contains(megye.geom, varos.geom) ORDER BY varos.nev; Veszprém megye szomszédai SELECT b.nev FROM megye AS a INNER JOIN megye AS b ON ST_Touches(a.geom, b.geom) WHERE a.nev='veszprém' and b.nev <> 'Veszprém';
Térbeli elemzések SQL Legcsapadékosabb város SELECT varos.nev, csapadek.mm FROM csapadek INNER JOIN varos ON ST_Contains(csapadek.geom, varos.geom) WHERE csapadek.mm = ( SELECT max(mm) FROM csapadek INNER JOIN varos ON ST_Contains(csapadek.geom, varos.geom)); Összesen a leghosszabb folyószakaszokat tartalmazó megye SELECT nev, sum(st_length(geom)) FROM (SELECT megye.nev as nev, ST_Intersection(megye.geom, folyo.geom) AS geom FROM megye INNER JOIN folyo ON (ST_INTERSECTS(megye.geom, folyo.geom))) AS szakasz GOUP BY nev ORDER BY 2 DESC LIMIT 1;
Tudom hogy érezhetsz...
Térbeli elemzések grafikus eredménnyel A grafikus eredménnyel járó lekérdezések eredmények térképi megjelenítéséhez egy GIS programra van szükségünk. Menüből: Geospatial/DesktopGIS/Quantum GIS 1 5 6 4 2 3 7 8 10 9 11 A QGIS igényli az egyedi egész azonosítót.
Térbeli elemzések grafikus eredménnyel Erdei talajok (tábla összekapcsolás) SELECT tal.gid AS gid, talajok.talaj_nev AS nev, tal.geom AS geom FROM tal INNER JOIN talajok ON tal.tipus=talajok.tipus WHERE talajok.talaj_nev LIKE '%erdei'; Folyó szakaszok megyénként SELECT megye.gid * 100 + folyo.gid AS gid, megye.nev, folyo.nev, ST_Intersection(megye.geom, folyo.geom) AS geom FROM megye INNER JOIN folyo ON (ST_INTERSECTS(megye.geom, folyo.geom)); Talajok és napsütéses órák metszete SELECT ROW_NUMBER() OVER () AS gid, tipus, ora, geom FROM (SELECT tal.tipus, nap.ora, (ST_Dump(ST_Intersection(tal.geom, nap.geom))).geom AS geom FROM tal INNER JOIN nap ON ST_Intersects(tal.geom, nap.geom)) AS talnap WHERE ST_GeometryType(geom) = 'ST_Polygon';
Demo adatok II. Csatorna közmű nyomvonal.dxf zaszlo.dxf arok.dxf megiras.csv
Demo adatok II. Alaptérkép telkek.shp epuletek.shp Műszaki térkép burkolatok.shp fak.shp oszlopok.shp pavilon.shp
Közmű adatok betöltése Shape fájlok átvétele DB Managerrel Menüből: Geospatial/Desktop GIS/Quantum GIS Ellenőrizzük a postgis bővítmény meglétét! PgAdmin III mal létrehozhatjuk. Ellenőrizzük a workshop adatbázis kapcsolat meglétét a QGIS-ben! Áthúzás az egérrel 2 1 Jobb egérgomb az eszközsorban és Böngésző 3
Közmű adatok betöltése DXF fájlok átvétele DB Managerrel Áthúzás az egérrel 2 1 Vetület (EOV) és térbeli index beállítás!
Közmű adatok betöltése CSV fájl betöltése Modulok/Modul kezelő... Szövegfájl hozzáadás modul 1 2 3 4
Felirat pontok Betöltött CSV fájlt mentsük shape fájlként réteg nevén jobb gomb menü Mentés másként... 1 2 áthúzás 3 Feliratok helyett pontok, irány, betűméret és szöveg attribútumokkal
Lekérdezések a közmű adatokon pgadmin III vagy DB Manager (QGIS) A hálózat hossza SELECT sum(st_length(geom)) FROM nyomvonal; Nyomvonallal érintett földrészletek SELECT telek.hrsz FROM telek INNER JOIN nyomvonal ON ST_Intersects(telek.geom, nyomvonal.geom); Nyomvonal 2 méteres körzetébe eső fák száma SELECT count(*) FROM ( SELECT DISTINCT fak.id FROM fak INNER JOIN nyomvonal ON ST_Contains(ST_Buffer(nyomvonal.geom, 2), fak.geom)) AS tmp; Burkolat típusonként az összterületek SELECT tipus, sum(st_area(geom)) AS terulet FROM burkolat GROUP BY tipus; Aszfalt út alatti nyomvonalhossz SELECT sum(st_length(st_intersection(burkolat.geom, nyomvonal.geom) FROM nyomvonal INNER JOIN burkolat ON ST_Intersects(nyomvonal.geom, burkolat.geom) WHERE burkolat.tipus LIKE '%aszfalt%';
OpenJump 1.5.2 kliens Magyar felhasználói felület (parancssorból): openjump -i18n hu Angol felhasználói felület (menüből): Geospatial/Desktop GIS/OpenJump 1 2 3 5 4 6
OpenJump 1.5.2 kliens 2 Lekérdezések az adatbázisból Menüből: File/Run Datastore Query Ide jöhet a lekérdezés
Van számítógépes tapasztalata?
Források: Frank Warmerdam: PostGIS: A Standards Based Geographic Extension for PostgreSQL http://www.pgcon.org/2008/schedule/attachments/52_postgis.pdf Pat Browne: Spatial databases http://www.docstoc.com/docs/48504771/spatial-databases-lecture-1 Regina O. Obe, Leo S. Hsu: PostGIS in action, Manning 2011 PostgreSQL kézikönyv http://www.postgresql.org/docs/9.1/static/index.html PostGIS kézikönyv http://postgis.net/stuff/postgis-2.0.pdf