Wstęp w „przestrzenne bazy danych”
Wiktor Miszuris
W dzisiejszych
czasach do zadań baz danych należy nie tylko przechowywanie informacji czysto
biznesowych, lecz także struktur i obiektów o znacznie bardziej skomplikowanej
budowie. Bazy danych znajdują zastosowanie także w takich dziedzinach jak
elektronika (przechowywanie planów układów scalonych o bardzo dużej skali
złożoności), biologia (przechowywanie struktur białek i innych substancji),
kartografii (przechowywanie informacji kartograficznych). Oczywiście funkcje
baz danych pozostają niezmienne: bezpieczne i dokładne przechowywanie danych
oraz efektywne wyszukiwanie interesujących informacji. Wymaga to jednak, ze
względu na bardziej skomplikowane zastosowania inne podejścia do przechowywania
i wykonywanie zapytań.
Nas interesować
będą bazy danych przechowujące różnego rodzaju obiekty w przestrzeni (spatial databases). Tego typu
bazy danych znajdują zastosowania w elektronice, budownictwie, CAD, robotyce
oraz systemy informacji geograficznej (Geographic Information Systems – GISs). W dość szybkim tempie bazy danych przestrzennych
przeistoczyły się z projektów teoretycznych i doświadczalnych w realnie
działające produkty (komercyjne i darmowe), bez których ciężko byłoby się już
obejść.
Skupimy się tu
głównie na systemach typu GIS, każdy inny system przestrzennych baz danych jest
w pewnym sensie pochodną GIS’u.
Zbieranie
informacji do przestrzennej bazy danych jest zadaniem mało trywialnym,
najlepiej do tego nadaje się system GPS (Global Positioning System). Możliwe jest również zbieranie
informacji na podstawie zdjęć satelitarnych bądź istniejących map – to niestety
jest związane zazwyczaj z błędami.
System GIS powinien zapewniać wykonywać czynności:
Jądrem systemu GIS
jest baza danych (DBMS), która zajmuje się przechowywaniem i zarządzaniem
danymi.
System może być
zastosowany po uprzednim uproszczeniu świata rzeczywistego, który chcemy
reprezentować w bazie danych przestrzennej, proces ten prowadzi do utworzenia modelu świata. Następnym krokiem jest znalezienie
odpowiednich struktur danych dla tego modelu.
W systemach GIS
informacja związana z jakiś konkretnym tematem jest nazywana „theme”, theme jest do relacji w
relacyjnym modelu bazodanowym.
Theme ma schemat i instancje. Rzeki, Miasta, Państwa
– to są przykłady theme’ów.
Jest to podajże
najważniejszy element całego systemu. Theme, to
kolekcja obiektów geograficznych. Obiekt geograficzny odpowiada bytowi ze
świata rzeczywistego ma dwie składowe:
Zważając na dość
skomplikowaną budowę większości obiektów, które występują w świecie
rzeczywistym, trzeba wprowadzić pojęcie atomowego obiektu geograficznego i
złożonego obiektu geograficznego. Złożony obiekt geograficzny składa się z
innych obiektów geograficznych, które mogą być złożone bądź atomowe.
Theme, jest to zbiór jednorodnych obiektów
geograficznych (obiektów mających tę samą strukturę/typ). Rozważmy przykład theme „miasto”. Każde miasto opisywane jest poprzez ten sam
zbiór atrybutów, które tworzą schemat: nazwa, populacja oraz geometria. Sposób
reprezentacji geometrii jest zależny geograficznego modelu
konkretnego systemu GIS. Atrybut przestrzenny nie odnosi się w żaden sposób do
już istniejących typów w relacyjnych bazach danych. Wymaga to użycia owego modelu danych: przestrzennego modelu danych. Zazwyczaj,
następujące podstawowe typy danych są używane w przestrzennym modelu: punkt, linia/odcinek, rejon.
Rozważmy
następujące dwa theme:
Państwa (nazwa,
stolica, zaludnienie, geo:region)
Języki (język, geo:region)
Polega na uzyskaniu
nowego theme poprzez obcięcie innego do pewnego
podzbioru atrybutów.
Np., gdy nie
interesuje nas informacja o stolicach i zaludnieniu możemy dokonać projekcji:
Państwa x [nazwa, geo:region]
Polega na wybraniu
z tematu encji, które odpowiadają podanemu
predykatowi na atrybutach. Jest to odpowiednik selekcji z relacyjnego modelu.
Polega na unii
dwóch theme’ów o tym samym schemacie. Jest to
odpowiednik unii z relacyjnego modelu.
Nowy theme jest tworzony z nałożenia jednego theme
na drugi. W wynikowym theme tworzone są nowe obiekty
geograficzne poprzez zastosowanie przecięcia obiektów z theme
przykrywanego i nałożonego, ich opis jest kombinacją pozostałych atrybutów z
dwóch theme’ów.
Jest to tzw. spatial join – obiekt z jednego theme jest łączony z drugim, jeśli ich kształty się
przecinają, wynikowy obiekt dostaje atrybuty z obydwu theme’ów.
Poprzez okienkowanie otrzymujemy theme
zawierający obiekty, które przecinają się z obszarem okienkowania, (który jest
zazwyczaj prostokątny).
Zwracany jest theme, zawierający obiekty, który kształty
zawierają podany punkt.
Podobne do okienkowania, tyle, że kształty zwracanych
obiektów są dodatkowo obcinane do kształtu okienka.
Operacja, która złącza obiekty na podstawie podanego warunku
(np. złącza wszystkie stany, województwa i inne działy administracyjne
otrzymując w wyniku tylko państwa).
Typu, jaka odległość jest między obiektem A i B.
Typu, zwróć wszystkie obiekty przyległe do obiektu A.
Główne cechy tego podejścia:
Tego typu podejście nadaje się do prostszych rozwiązań, niestety
jest trudny do utrzymania w stanie kompletnego porządku, jest wyjątkowo
nieprzystosowany do bardziej skomplikowanych zapytań. Zapytania, nawet
najprostsze wymagają wpisania kilku linijek kodu SQL złączającego kilka tabel w
logiczną całość.
Przykład:
Państwa (nazwa, stolica, zaludnienie, id-granicy)
Granice (id-granicy, id-kształt)
Kształt (id-kształt, point-num,
id-point)
Point (id-point, x, y)
Bazuje na użyciu silnika zwykłej bazy relacyjnej oraz odrębnego silnika bazy przestrzennej.
Jednakże powstają problemy w powiązaniu struktur oraz efektywnym zapytaniach.
Bazuje na wprowadzeniu nowego typu danych – geometria oraz operatorów i funkcji na tych typach, które można używać w zwykłych zapytaniach SQL. Tego typu baza danych powinna starać się zoptymalizować przechowywane struktury danych ze względu na możliwe do wykonania przez użytkownika zapytania.
Sposoby traktowania i reprezentacji obiektów świata
rzeczywistego.
W tym modelu obiekty są zawieszone
w przestrzeni.
Ten model wprowadza następujące typy:
Punkt, linia, odcinek, łamana (zbiór powiązanych odcinków), wielokąt (zamknięta łamana), wielokąt wypukły, wielokąt prosty.
W tym modelu dla każdego punktu przestrzeni określone są jeden lub więcej atrybutów/charakterystyk. Np. Mapa temperatur.
Dyskretny podział przestrzeni na przylegające komórki.
Podziały dzielą się na:
Regularne (podział na identyczne części)
Nieregularny
è rysunki, przykład reprezentacji figury
Zostają wprowadzone następujące prymitywy:
gdzie [] – krotki, <> – listy, {} – zbiory.
Uwagi:
Wielokąt n-kątny ma 2n reprezentacji, co może utrudniać proces zapytań.
Do zadań programu należy rozróżniać logicznie różnicę pomiędzy łamaną a wielokątem.
Do zadań użytkownika należy także zapewnienie, aby wielokąt był prosty – struktura nie jest wystarczająco mocna, aby nam to zagwarantować.
Mamy zbiór punktów na płaszczyźnie, w których znamy wartość funkcji (wysokość/temperatura), dokonujemy triangulacji i dla każdego trójkąta możemy dokonać interpolacji – a więc otrzymać przybliżoną wartość funkcji dla każdego punktu wewnątrz trójkąta.
Musimy zdefiniować d-wymiarową pół-przestrzeń jako nierówność:
Wypukły d-wymiarowy wielokąt (Polytope) jest definiowany jako przecięcie pewnej skończonej liczby półprzestrzeni.
Unia skończonej liczby Polytope tworzy Polyhedron. Polytope niekoniecznie muszą przystawać, mogą na siebie nachodzić albo być w ogóle niepowiązane.
Dla każdego Polyhedrone’a rozróżniamy wnętrze, granicę oraz obszar nienależący do polyhedrone’a.
è pokazać, jak się robi trójkąt, czworokąt i wielokąt
Rozpatrzyliśmy wektorowe reprezentacje obiektów geometrycznych. Teraz zajmiemy się możliwymi reprezentacjami kolekcji obiektów. Różnią się one między sobą ilością szczegółów topologicznych.
W tym podejściu każdy obiekt geometryczny jest reprezentowany niezależnie od innych już istniejących w bazie. Żadne zależności topologiczne nie są dodatkowo trzymane w bazie.
Plusy:
Prostota wprowadzania danych oraz ich utrzymanie.
Minusy:
Brak topologii
Brak zdefiniowanej możliwości ustalenia punktów wspólnych dla dwóch wielokątów (możliwe pojawienia się „niczyjej” przestrzeni pomiędzy wielokątami, które logicznie powinny być przystające.
Początkowo zaprojektowany do reprezentacji sieci i grafów (połączenia transportowe, telefoniczne etc.). W tym modelu topologiczne relacje pomiędzy punktami oraz łamanymi są trzymane dodatkowo w bazie danych.
Zbiór typów geometrycznych jest rozszerzony o następujące koncepcje:
Nodes, arc. Node – jest to punkt, który łączy listę łuków. Łuk, to łamana, która zaczyna się w Node i kończy się w Node.
è z książki
Mamy więc dwa typu punktów – zwykłe punkty i Node.
Obiekty w tym modelu są definiowane więc jako:
Mamy tu dużą zaletę – operację związane z nawigacją po
reprezentacji sieci są szybsze.
Model topologiczny
Model topologiczny jest podobny do sieciowego, z tym wyjątkiem, że narzucony zostaje warunek planarności na powstającą sieć. Definicja wielokątu zostaje zmieniona – może on zostać utworzony tylko z łuków. Łuk dodatkowo trzyma informację o przystających do niego wielokątów, (które mogą nie mieć rzeczywistych odpowiedników w realnym świecie).
Obiekty w tym modelu są definiowane więc jako:
Została całkowicie wyeliminowana redundancja danych – wielokąty przystające nie będą już miały duplikowanych punktów w bazie danych, bo są one utworzone z tego samego łuku.
è przykład
Dodatkową zaletą w stosunku do modelu sieciowego jest jeszcze większe wzbogacenie informacji topologicznej przechowywanej w bazie. Pewne zapytania będą wykonywane natychmiast. Brak redundancji. Łatwość zmiany granicy między wielokątami vs. Spaghetti.
Niestety są też minusy tego rozwiązania:
Niektóre obiekty trzymane w bazie nie mają żadnego fizycznego uzasadnienia w świecie rzeczywistym. Złożoność powstających struktur jednak może zwalniać niektóre operacje bazodanowe. Przy dodawaniu nowego obiektu niezbędne jest przeliczenie części grafu, aby był nadal poprawny z naszego punktu widzenia.
Wyciąg z dokumentacji Postgres’a:
The geometric types point, box, lseg, line, path, polygon, and circle have a large set of native support
functions and operators.
Table 6-19. Geometric Operators
Operator |
Description |
Usage |
+ |
Translation |
box '((0,0),(1,1))' + point '(2.0,0)' |
- |
Translation |
box '((0,0),(1,1))' - point '(2.0,0)' |
* |
Scaling/rotation |
box '((0,0),(1,1))' * point '(2.0,0)' |
/ |
Scaling/rotation |
box '((0,0),(2,2))' / point '(2.0,0)' |
# |
Intersection |
'((1,-1),(-1,1))' #
'((1,1),(-1,-1))' |
# |
Number of
points in path or polygon |
#
'((1,0),(0,1),(-1,0))' |
## |
Point of closest
proximity |
point '(0,0)' ## lseg '((2,0),(0,2))' |
&& |
Overlaps? |
box '((0,0),(1,1))' && box '((0,0),(2,2))' |
&< |
Overlaps to left? |
box '((0,0),(1,1))' &< box '((0,0),(2,2))' |
&> |
Overlaps to right? |
box '((0,0),(3,3))' &> box '((0,0),(2,2))' |
<-> |
Distance between |
circle '((0,0),1)' <-> circle '((5,0),1)' |
<< |
Left of? |
circle '((0,0),1)' << circle '((5,0),1)' |
<^ |
Is below? |
circle '((0,0),1)' <^ circle '((0,5),1)' |
>> |
Is right
of? |
circle '((5,0),1)' >> circle '((0,0),1)' |
>^ |
Is above? |
circle '((0,5),1)' >^ circle '((0,0),1)' |
?# |
Intersects or
overlaps |
lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))' |
?- |
Is horizontal? |
point '(1,0)' ?- point '(0,0)' |
?-| |
Is perpendicular? |
lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))' |
@-@ |
Length or
circumference |
@-@ path
'((0,0),(1,0))' |
?| |
Is vertical? |
point '(0,1)' ?| point '(0,0)' |
?|| |
Is parallel? |
lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))' |
@ |
Contained or
on |
point '(1,1)' @ circle '((0,0),2)' |
@@ |
Center of |
@@ circle
'((0,0),10)' |
~= |
Same as |
polygon '((0,0),(1,1))' ~= polygon
'((1,1),(0,0))' |
Table 6-20. Geometric Functions
Function |
Returns |
Description |
Example |
area(object) |
double precision |
area of item |
area(box '((0,0),(1,1))') |
box(box,
box) |
box |
intersection
box |
box(box '((0,0),(1,1))',box '((0.5,0.5),(2,2))') |
center(object) |
point |
center of item |
center(box '((0,0),(1,2))') |
diameter(circle) |
double precision |
diameter
of circle |
diameter(circle '((0,0),2.0)') |
height(box) |
double precision |
vertical
size of box |
height(box '((0,0),(1,1))') |
isclosed(path) |
boolean |
a closed
path? |
isclosed(path
'((0,0),(1,1),(2,0))') |
isopen(path) |
boolean |
an open path? |
isopen(path
'[(0,0),(1,1),(2,0)]') |
length(object) |
double precision |
length of item |
length(path '((-1,0),(1,0))') |
npoints(path) |
integer |
number of points |
npoints(path
'[(0,0),(1,1),(2,0)]') |
npoints(polygon) |
integer |
number of points |
npoints(polygon '((1,1),(0,0))') |
pclose(path) |
path |
convert
path to closed |
popen(path
'[(0,0),(1,1),(2,0)]') |
popen(path) |
path |
convert
path to open path |
popen(path
'((0,0),(1,1),(2,0))') |
radius(circle) |
double precision |
radius of circle |
radius(circle '((0,0),2.0)') |
width(box) |
double precision |
horizontal
size |
width(box '((0,0),(1,1))') |
Table 6-21. Geometric Type Conversion Functions
Function |
Returns |
Description |
Example |
box(circle) |
box |
circle
to box |
box(circle '((0,0),2.0)') |
box(point, point) |
box |
points
to box |
box(point '(0,0)', point '(1,1)') |
box(polygon) |
box |
polygon
to box |
box(polygon
'((0,0),(1,1),(2,0))') |
circle(box) |
circle |
to circle |
circle(box '((0,0),(1,1))') |
circle(point, double precision) |
circle |
point to circle |
circle(point '(0,0)', 2.0) |
lseg(box) |
lseg |
box diagonal to lseg |
lseg(box '((-1,0),(1,0))') |
lseg(point, point) |
lseg |
points
to lseg |
lseg(point '(-1,0)', point '(1,0)') |
path(polygon) |
point |
polygon
to path |
path(polygon
'((0,0),(1,1),(2,0))') |
point(circle) |
point |
center |
point(circle '((0,0),2.0)') |
point(lseg, lseg) |
point |
intersection |
point(lseg '((-1,0),(1,0))', lseg '((-2,-2),(2,2))') |
point(polygon) |
point |
center |
point(polygon
'((0,0),(1,1),(2,0))') |
polygon(box) |
polygon |
4-point polygon |
polygon(box '((0,0),(1,1))') |
polygon(circle) |
polygon |
12-point polygon |
polygon(circle '((0,0),2.0)') |
polygon(npts,
circle) |
polygon |
npts polygon |
polygon(12, circle '((0,0),2.0)') |
polygon(path) |
polygon |
path to
polygon |
polygon(path
'((0,0),(1,1),(2,0))') |