7. Systemy
Informacji
Przestrzennej Ale co konkretnie jest „specjalne”?
●Typy danych
●Relacje przestrzenne
●Układy współrzędnych
●Formaty przechowywania
●Formaty wymiany
12. Systemy
Informacji
Przestrzennej Układy współrzędnych
● Współrzędne mogą być geograficzne albo płaskie
● Istnieje bardzo wiele układów współrzędnych
● Układy identyfikowane są przez kod EPSG, tzw. SRID
● Układy można przeliczać (transformować) z użyciem
odpowiednich bibliotek
13. Systemy
Informacji
Przestrzennej Współrzędne geograficzne
South Pole
North Pole
Equator
Prime Meridian
0
30
60
-60
-30
90
-90
0
30
-60
60
90
-90
-30
180
-120
-150 150
120
o
o
o
o
o
o
o
● Współrzędne sferyczne, jednostki - stopnie
● Zakres od -90 do 90 (szerokość), -180 do 180 (długość)
● Jednolite dla całego świata
● Bardziej złożone obliczeniowo – uwzględnienie krzywizny Ziemi
14. Systemy
Informacji
Przestrzennej Współrzędne płaskie
● Współrzędne kartezjańskie, jednostki – metry / stopy
● Liczby 6-9 cyfrowe, najczęściej wyłącznie dodatnie
● (bardzo) wiele lokalnych układów
● Proste obliczenia – bez uwzględnienia krzywizny
15. Systemy
Informacji
Przestrzennej Układ współrzędnych Google
● Współrzędne rysunku mapy w odwzorowaniu Merkatora
● Ogromne zniekształcenia długości i powierzchni
● Nadają się do renderowania map, ale nie do obliczeń
EPSG:900913
EPSG:3785
EPSG:3875
16. Systemy
Informacji
Przestrzennej PHP a dane przestrzenne
ZŁA WIADOMOŚĆ
Większość bibliotek przeznaczonych do pracy z danymi przestrzennymi ma
bardzo słabe wsparcie dla PHP
DOBRA WIADOMOŚĆ
Większość potrzebnych operacji na danych przestrzennych można wykonać
po stronie bazy danych
17. Systemy
Informacji
Przestrzennej Bazy danych dla geoinformacji
SQL
PostgreSQL + PostGIS
MS SQL Server (natywnie)
SQLite + SpatiaLite
Oracle (natywnie ograniczony zestaw funkcji, +Spatial)
MySQL(natywnie)
NoSQL
MongoDB (2.4+ natywnie)
CouchDB + GeoCouch
18. Systemy
Informacji
Przestrzennej Bazy danych dla geoinformacji
Typy przestrzenne
Funkcje przestrzenne
Indeksy przestrzenne
Specjalne typy kolumn dedykowane przechowywaniu geometrii
Specjalne funkcje np. do obliczania długości, powierzchni, wyszukiwania wg kryteriów
przestrzennych, testowania relacji przestrzennych
Ułatwiają wyszukiwanie wg kryteriów przestrzennych
19. Systemy
Informacji
Przestrzennej Typy przestrzenne
Typ GEOMETRY
Typ GEOGRAPHY
Umożliwia przechowywanie geometrii w dowolnym układzie współrzędnych.
Dane do obliczeń (np. maksymalna odległość) muszą być zadane w tych samych
jednostkach, co układ współrzędnych.
Dostępny w każdej bazie oferującej rozszerzenia przestrzenne
Umożliwia przechowywanie geometrii tylko w układzie współrzędnych geograficznych.
Dane do obliczeń (np. maksymalna odległość) są zadawane w metrach.
Dostępny w PostgreSQL + PostGIS, MS SQL Server
Wada: wolniejsze działanie, ograniczona liczba funkcji przestrzennych
20. Systemy
Informacji
Przestrzennej Funkcje przestrzenne
Przykłady:
Służą do operacji na typach GEOMETRY i GEOGRAPHY
Podstawą jest specyfikacja OpenGIS SQL/MM
Nazwy funkcji są częściowo zunifikowane między różnymi DBMS i mają przedrostek ST_
● Funkcje pomiarów – ST_Length (zwraca długość), ST_Area (zwraca powierzchnię),
ST_Extent (zwraca zasięg), ST_Distance (zwraca odległość między 2 geometriami)
● Funkcje testujące relacje przestrzenne – ST_Equals (czy geometrie są identyczne?),
ST_Intersects (czy geometrie się przecinają?), ST_Disjoint (czy geometrie nie
mają punktów wspólnych?)
● Funkcje tworzące nowe geometrie – ST_Buffer (strefa buforowa o zadanym
promieniu), ST_Intersection (część wspólna z przecięcia 2 geometrii)
● Funkcje eksportu – ST_AsText (zwraca geometrię w postaci tekstowej), ST_AsKML
(zwraca geometrię w formie zgodnej z Google Earth)
● Funkcje importu – ST_GeomFromText (tworzy geometrię na podstawie tekstu w
formacie WKT), ST_MakePoint (tworzy geometrię punktu na podstawie pary
współrzędnych x i y)
21. Systemy
Informacji
Przestrzennej Indeksy przestrzenne
PostGIS:
CREATE INDEX tabela1_gist ON tabela1(geom) USING gist;
SpatiaLite:
SELECT CreateSpatialIndex('tabela1','geom');
Służą do przyspieszenia wyszukiwania według kryteriów przestrzennych, np. w promieniu od
zadanego punktu
22. Systemy
Informacji
Przestrzennej Forma zapisu w bazie
ATRYBUTY GEOMETRIA
Dane opisowe
Dowolne typy dopuszczone przez DBMS
Kształt obiektu
Typ GEOMETRY/GEOGRAPHY
Dane binarne
Dodatkowe ograniczenia dot. typu geometrii i układu współrzędnych
Nieobowiązkowe w aplikacjach WEB, przydatne dla DesktopGIS
23. Systemy
Informacji
Przestrzennej Format wymiany: GeoJSON
● Prosty w użyciu i implementacji
● Zgodny z bibliotekami WebGIS
(OpenLayers,Leaflet, Geo5)
● Zgodny z aplikacjami DesktopGIS (np. QGIS)
i biblioteką GDAL/OGR
● Opublikowany na GitHub automagicznie
zmienia się w mapę
25. Systemy
Informacji
Przestrzennej GeoJSON – budowa w PHP
Haczyk:
Geometria musi być zapisana oddzielnie od atrybutów
Problemy z nim związane:
Trzeba znać nazwę kolumny z geometrią
Trzeba przekształcić geometrię z bazy na format zgodny z specyfikacją GeoJSON
26. Systemy
Informacji
Przestrzennej Rozpoznanie kolumny z geometrią
Rozwiązanie 1. Zawsze trzymać się konwencji
Kolumnę geometrii zwykło się nazywać „geom” albo „the_geom” (stara konwencja)
Rozwiązanie 2. Uczynić nazwę kolumny geometrii definiowalną
Podanie nazwy kolumny geometrii jako jednego z parametrów zapytania do
serwera i odczytanie z $_GET / $_POST
Rozwiązanie 3. Skorzystać z systemowej tabeli/widoku geometry_columns
Wymaga dodatkowego zapytania do bazy. Nie należy korzystać z
information_schema ponieważ rozpoznaje geometrię jako typ USER_DEFINED
– możliwa kolizja
27. Systemy
Informacji
Przestrzennej
Przetworzenie geometrii z bazy na
GeoJSON
Rozwiązanie 1. Skorzystanie z funkcji ST_AsGeoJSON (tylko PostGIS)
Rozwiązanie 2. Konwersja po stronie PHP
● Eksport funkcją ST_AsText (dostępna w PostGIS, MySQL, SQL Server,
SpatiaLite) i własna funkcja parsowania
● Eksport funkcją ST_AsBinary (PostGIS, MySQL, SQL Server, SpatiaLite)
i konwersja biblioteką geoPHP
● Użycie geoPHP bez funkcji eksportu (tylko PostGIS)
29. Systemy
Informacji
Przestrzennej geoPHP
●Biblioteka na podwójnej licencji (Modified BSD albo GPL)
●Nie ma dodatkowych zależności
●Może wykorzystać moduł GEOS – wówczas dysponuje
rozszerzonym zestawem funkcji
●Możliwa integracja z Drupalem
●Umożliwia:
● Odczyt i zapis geometrii w formatach tekstowych i WKB/EWKB
(wewnętrzny PostGIS)
● Obliczanie długości i powierzchni
● Obliczanie centroidu i zasięgu (bounding box)
● Sprawdzenie układu współrzędnych
● Rozbijanie geometrii złożonych na proste
● Rozbijanie geometrii poligonowych i liniowych na punkty
http://github.com/phayes/geoPHP
30. Systemy
Informacji
Przestrzennej GeoPHP – użycie z PostGIS
$sql = 'SELECT * FROM poi LIMIT 1';
$row = $pdo->query($sql)->fetch();
//geometria pobrana bezpośrednio z bazy jest zakodowana w
postaci HEX
$wkb = hex2bin($row['geom']);
$geophpGeom = geoPHP::load($wkb,'ewkb');
$exporter = new GeoJSON();
$geojsonArray = $exporter->getArray($geophpGeom);
Założenia:
Instancja PDO o nazwie $pdo, tryb pobierania danych FETCH_ASSOC
Kolumna geometrii o nazwie geom
31. Systemy
Informacji
Przestrzennej
GeoPHP – użycie z funkcją
ST_AsBinary()
$sql = 'SELECT nazwa,adres,ST_AsBinary(geom) AS geom FROM poi
LIMIT 1';
$row = $pdo->query($sql)->fetch();
//geometria pobrana bezpośrednio z bazy jest zakodowana w
postaci HEX
$wkb = hex2bin($row['geom']);
$geophpGeom = geoPHP::load($wkb,'wkb');
$exporter = new GeoJSON();
$geojsonArray = $exporter->getArray($geophpGeom);
Założenia:
Instancja PDO o nazwie $pdo, tryb pobierania danych FETCH_ASSOC
Kolumna geometrii o nazwie geom
32. Systemy
Informacji
Przestrzennej Kompletny skrypt (prawie DBMS-agnostic)
require_once('geoPHP/geoPHP.inc');
$pdo = new PDO('pgsql:host=localhost;port=5432;dbname=gis;user=geo;password=***');
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$sql = 'SELECT nazwa,adres,ST_AsBinary(geom) AS geom FROM poi';
$rs = $pdo->query($sql)->fetchAll();
$geojson = ['type'=>'FeatureCollection','features'=>[]];
foreach($rs as $row) {
$wkb = hex2bin($row['geom']);
$geophpGeom = geoPHP::load($wkb,'wkb');
$exporter = new GeoJSON();
$geojsonArray = $exporter->getArray($geophpGeom);
unset($row['geom']);
$feature = ['type'=>'Feature','geometry'=>$geojsonArray,'properties'=>[]];
foreach($row as $key=>$value) {
$feature['properties'][$key] = $value;
}
array_push($geojson,$feature);
}
header('Content-type: application/json');
echo json_encode($geojson);
33. Systemy
Informacji
Przestrzennej Zapis geometrii z GeoJSON
$geojson = json_decode($_POST['geojson'],true);
foreach($geojson['features'] as $feature) {
$geojsonGeom = $feature['geometry'];
$attributes = $feature['properties'];
$geophpGeom = geoPHP::load($geojsonGeom,'json');
$wkbGeom = geoPHP::out($geophpGeom,'wkb');
$hexHeom = bin2hex($wkbGeom);
$columns = implode(',',array_keys($attributes));
$values = array_values($attributes);
$str = str_repeat('?,',count($values)).”ST_GeomFromWKB('$hexGeom',4326)”;
$sql = „INSERT INTO tabela($columns,geom) VALUES($valueString)”;
$stmt = $pdo->prepare($sql);
$result = $stmt->execute($values);
}
34. Systemy
Informacji
Przestrzennej
Zapis geometrii z pary
współrzędnych
$x = $_POST['x'];
$y = $_POST['y'];
$info = $_POST['info'];
//dla PostGIS
$sql = INSERT INTO poi(info,geom)
VALUES('$info',ST_SetSRID(ST_MakePoint($x,$y),4326));
//dla pozostałych
$sql = INSERT INTO poi(info,geom)
VALUES('$info',ST_GeomFromText('POINT($x $y)',4326);
35. Systemy
Informacji
Przestrzennej Format KML
Do użycia w Google Maps / Earth
Najważniejsze różnice:
● Zapis atrybutów w postaci HTML
● Opcjonalne dołączenie stylu
Pozyskiwanie z bazy danych:
PostGIS – funkcja ST_AsKML(geom)
Pozostałe – metoda geoPHP::out($geophpGeom,'kml')
Włączenie fragmentu surowego XML do DOM
Więcej informacji - https://developers.google.com/kml/articles/phpmysqlkml
36. Systemy
Informacji
Przestrzennej
…no dobrze, ale gdzie jest ten
sklep monopolowy?
Poszukiwanie w promieniu – ST_DWithin(geometria,promień) – tylko PostGIS
SELECT * FROM poi WHERE
type='alcohol'
AND open_till > 19
AND ST_DWithin(
geom,ST_GeomFromText('POINT(19.02456,49.72074)',4326),5000
);