SlideShare una empresa de Scribd logo
1 de 38
Descargar para leer sin conexión
Systemy
Informacji
Przestrzennej
Dane
przestrzenne
czyli
Jak nauczyć PHP
geografii?
Michał Mackiewicz
Szczyrk, 25- 27.10.2013
www.gis-support.pl
Systemy
Informacji
Przestrzennej
fot. monokini / sxc.hu
Systemy
Informacji
Przestrzennej Tymczasem w internetach
Systemy
Informacji
Przestrzennej
Podnosimy poprzeczkę
Systemy
Informacji
Przestrzennej
Podnosimy poprzeczkę
„Znajdź wszystkie czynne sklepy monopolowe czynne w piątek po
godzinie 19 nie dalej niż 5 km od hotelu Orle Gniazdo w Szczyrku”
Systemy
Informacji
Przestrzennej Grzechy główne
Spatial
Is
Not
Special
Systemy
Informacji
Przestrzennej Ale co konkretnie jest „specjalne”?
●Typy danych
●Relacje przestrzenne
●Układy współrzędnych
●Formaty przechowywania
●Formaty wymiany
Systemy
Informacji
Przestrzennej Typy danych
Punkt (POINT)
Linia (LINESTRING)
Poligon (POLYGON)
Fot.gimnick /sxc/hu
Fot. linder6580 / sxc.hu
Fot. ColinBroug / sxc.hu
Systemy
Informacji
Przestrzennej Geometrie złożone
Poligon złożony (MULTIPOLYGON)
Linia złożona (MULTILINESTRING)
Rys. rybnik.eu
Rys. rzyjontko / Wikimedia Commons
Systemy
Informacji
Przestrzennej Geometrie non-simple albo invalid
Poligon z bagnetem
Samoprzecinająca się linia
Systemy
Informacji
Przestrzennej Relacje przestrzenne
rys. Krauss/Wikimedia Commons, CC-BY-SA
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
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
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
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
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
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
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
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
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)
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
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
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ę
Systemy
Informacji
Przestrzennej GeoJSON - struktura
{
'type' : 'FeatureCollection',
'features' : [
{
'type' : Feature,
'properties' : {
'atrybut1' : 'wartość1',
'atrybut2' : 2,
'atrybut3' : false
},
'geometry': {
'type' : 'Point', //LineString, Polygon, MultiPolygon etc.
'coordinates' : []
}
},
// etc, etc...
]
}
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
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
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)
Systemy
Informacji
Przestrzennej
Co zrobić z wynikiem
ST_AsGeoJSON?
Rozwiązanie 1.
Rozwiązanie 2.
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
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
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
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);
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);
}
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);
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
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
);
Systemy
Informacji
Przestrzennej Więcej zasobów
●http://www.postgis.org
●http://geophp.net
●http://gis.stackexchange.com
●http://www.bostongis.com
Systemy
Informacji
Przestrzennej
Dziękuję za
uwagę.

Más contenido relacionado

Destacado

How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
ThinkNow
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
Kurio // The Social Media Age(ncy)
 

Destacado (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

Dane przestrzenne w PHP

  • 5. Systemy Informacji Przestrzennej Podnosimy poprzeczkę „Znajdź wszystkie czynne sklepy monopolowe czynne w piątek po godzinie 19 nie dalej niż 5 km od hotelu Orle Gniazdo w Szczyrku”
  • 7. Systemy Informacji Przestrzennej Ale co konkretnie jest „specjalne”? ●Typy danych ●Relacje przestrzenne ●Układy współrzędnych ●Formaty przechowywania ●Formaty wymiany
  • 8. Systemy Informacji Przestrzennej Typy danych Punkt (POINT) Linia (LINESTRING) Poligon (POLYGON) Fot.gimnick /sxc/hu Fot. linder6580 / sxc.hu Fot. ColinBroug / sxc.hu
  • 9. Systemy Informacji Przestrzennej Geometrie złożone Poligon złożony (MULTIPOLYGON) Linia złożona (MULTILINESTRING) Rys. rybnik.eu Rys. rzyjontko / Wikimedia Commons
  • 10. Systemy Informacji Przestrzennej Geometrie non-simple albo invalid Poligon z bagnetem Samoprzecinająca się linia
  • 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ę
  • 24. Systemy Informacji Przestrzennej GeoJSON - struktura { 'type' : 'FeatureCollection', 'features' : [ { 'type' : Feature, 'properties' : { 'atrybut1' : 'wartość1', 'atrybut2' : 2, 'atrybut3' : false }, 'geometry': { 'type' : 'Point', //LineString, Polygon, MultiPolygon etc. 'coordinates' : [] } }, // etc, etc... ] }
  • 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)
  • 28. Systemy Informacji Przestrzennej Co zrobić z wynikiem ST_AsGeoJSON? Rozwiązanie 1. Rozwiązanie 2.
  • 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 );