3. Standaryzacja modeli danych przestrzennych Budowa baz danych systemów SIP w oparciu o różne modele danych nie ułatwia późniejszej wymiany danych między systemami. Problem stał się na tyle istotny, że organizacja Open Geospatial Consortium Inc. opracowała standard Simple Feature Access, który szczegółowo określa zasady odzwierciedlania geometrii obiektów przechowywanych w systemie. Opracowany standard został przyjęty również jako norma ISO 19125. Przed szczegółowym omówieniem wprowadzimy kilka potrzebnych definicji. Boundary Point - Curve - Surface - GeometryCollection - istoty standardu Simple Feature Access reprezentacja granicy obiektu, zerowymiarowy podstawowy element geometryczny reprezentujący pozycję, jednowymiarowy podstawowy element geometryczny reprezentujący linie łamaną, dwuwymiarowy podstawowy element geometryczny reprezentujący obszar, kolekcja geometrii. Na poniższym rysunku przedstawiono schemat Simple Feature Access opisany w notacji UML w postaci diagramu klas. Rys. 3.1. Schemat prostego modelu geometrycznego Cały schemat składa się klasy geometrii podstawowej (base geometry) i geometrii rozszerzonej (extended geometry). Geometria podstawowa zawiera w sobie klasy Point, Curve, Surface oraz GeometryCollection. Geometria rozszerzona zawiera wyspecjalizowane klasy 0, 1 i 2-wymiarowe MultiPoint, MultiLineString i MultiPolygon oraz dwie abstrakcyjne nadklasy MultiCurve i MultiSurface zbierające obiekty typu Curve i Surface. Waldemar Izdebski - Wykłady z przedmiotu SIT 3.1. 42 Klasa Geometry W modelu zaproponowanym przez OGC wszystkie typy obiektów są skupione w klasie Geometry, która zawiera wspólne właściwości obiektów. Jest to tzw. klasa abstrakcyjna. Oznacza to, że nie może być ona reprezentacją żadnego obiektu rzeczywistego, a zawiera jedynie zbiór reguł definiujących inne klasy. Obiekty geometryczne rozpatrywane są w przestrzeni dwuwymiarowej. 3.1.1. Podstawowe metody klasy Geometry Dla klasy Geometry zdefiniowano kilka podstawowych metod służących określaniu właściwości obiektów, nalezą do nich metody: • Dimension( ):Integer – zwraca wymiarowość obiektu, która musi być mniejsza lub równa wymiarowi układu współrzędnych, • GeometryType( ):String – zwraca nazwę typu geometrii, • SRID( ):Integer – zwraca identyfikator układu współrzędnych w którym podane są współrzędne obiektu, • Envelope( ):Geometry – zwraca minimalny prostokąt ograniczający geometrię, prostokąt jest definiowany jako poligon [(minX, minY), (MaxX, MinY), (MaxX, MaxY), (MinX, MaxY), (MinX, MinY)], • AsText( ):String – zwraca geometrię w postaci tekstowej, • AsBinary( ):Binary – zwraca geometrię w postaci binarnej, • IsEmpty( ):Integer – zwraca wartość 1, jeśli obiekt nie posiada geometrii, • IsSimple( ):Integer – zwraca wartość 1, jeśli obiekt jest obiektem prostym tzn. nie posiadającym żadnych anomali typu przecięcia wzajemne boków obiektu, w przypadku obydwu obiektów przedstawionych na rysunku 3.2 metoda IsSimple nie zwróci wartości 1 ponieważ występują w nich wzajemne przecięcie odcinków definiujących obiekty, • Boundary( ):Geometry – zwraca granicę obiektu. punkt początkowy punkt końcowy punkt początkowy = punkt końcowy Rys. 3.2. Ilustracja wyników metod IsClosed oraz IsSimple Jeśli geometria obiekt jest kolekcją geometrii wtedy aby uzyskać dostęp do konkretnej geometrii musimy skorzystać z dwóch metod: • NumGeometries( ):Integer – zwraca liczbę geometriii w obiekcie, • GeometryN(N:integer):Geometry – zwraca N-tą geometrię z kolekcji. Waldemar Izdebski - Wykłady z przedmiotu SIT 43 3.1.2. Metody klasy Geometry służące testowaniu relacji z innymi obiektami Inna grupą metod zdefiniowanych dla klasy Geometry są metody służące do określania relacji przestrzennych miedzy danym obiektem, a innym wskazanym obiektem. Ogólnie definicje każdej z tych metod można zapisać następująco: Metoda(innaGeometria:Geometry):Integer – zwraca wartość 1 jeśli prawda. Poniżej przedstawiono wszystkie zdefiniowane poszczególnych relacji przestrzennych obiektów. Operator Opis metody Eqals zwraca wartość 1 jeśli obiekty są równe przestrzennie, tzn. ich geometrie się pokrywają, Disjoint zwraca wartość 1 jeśli obiekty są całkowicie rozdzielne przestrzennie, Intersects zwraca wartość 1 jeśli obiekty wzajemnie się przecinają, Touches zwraca wartość 1 obiekty przylegają do siebie, Crosses zwraca wartość 1 jeśli obiekty przecinają się krawędziami, Within zwraca wartość 1 jeśli jeden obiekt znajduje się całkowicie wewnątrz drugiego Contains odwrotność Within, zwraca wartość 1 jeśli obiekt całkowicie zawiera w sobie inny obiekt, Overlaps zwraca wartość 1 jeśli obiekt częściowo „przykrywa” inny obiekt, i ilustracje graficzne Ilustracja geometryczna Waldemar Izdebski - Wykłady z przedmiotu SIT 44 3.1.3. Metody klasy Geometry związane z analizami przestrzennymi Ostatnia grupa metod zdefiniowanych dla klasy Geometry są metody przydatne w procesie analiz przestrzennych. Do metod tej grupy zaliczamy: • Distance(innaGeometria:Geometry):Double – zwraca najmniejszą odległość między obiektami, • Buffer(odleglosc:Double):Geometry – zwraca geometrię buforu we wskazanej odległości od geometrii obiektu, • ConvexHull( ):Geometry – zwraca geometrię otoczki wypukłej dla obiektu, • Intersectionl(innaGeometria:Geometry):Geometry – zwraca zbiór punktów przecinania się geometrii obiektów, • Union(innaGeometria:Geometry):Geometry – zwraca zbiór punktów zawierających wszystkie punkty obydwu geometrii, • Difference(innaGeometria:Geometry):Geometry – zwraca zbiór punktów zawierających wszystkie punkty stanowiące różnicę obydwu geometrii, • SymDifference(innaGeometria:Geometry):Geometry – zwraca zbiór punktów zawierających wszystkie punkty stanowiące symetryczną różnicę obydwu geometrii. 3.1.4. Metody charakterystyczne dla poszczególnych klas obiektów Oprócz opisanych wcześniej metod ogólnych związanych z klasą Geometry każdy typ geometrii posiada charakterystyczne metody specyficzne dla siebie. Klasa Point Najbardziej podstawową klasą geometryczną jest Punkt. Jest to 0-wymiarowa reprezentacja geometryczna pozycji w przestrzeni. Posiada współrzędne x i y. Granica (Boundary) dla punktu nie istnieje, gdyż granica to zawsze obiekt n-1 wymiarowy w stosunku do obiektu ograniczanego. Metody dostępne w klasie Point to • X( ):Double – wartość współrzędnej X dla punktu, • Y( ):Double – wartość współrzędnej Y dla punktu. Klasa MultiPoint MultiPoint jest klasą geometryczną złożoną z wielu punktów. Znaczy to, że jeden obiekt jest reprezentowany przez zbiór punktów. Również jak w przypadku Point obiekt nie posiada granicy, a punkty nie są uszeregowane w żaden sposób. Klasa Curve Curve jest geometrycznym obiektem zbudowanym z sekwencji punktów. Dla klasy Curve zdefiniowane są następujące metody: • • • • • Length( ):Double – wyznaczenie długości linii, StartPoint( ):Point – zwraca punkt początkowy, EndPoint( ):Point – zwraca punkt końcowy, IsClosed( ):Integer – zwraca wartość 1 jeśli obiekt jest zamknięty tzn. StartPoint()=EndPoint(), IsRing( ):Integer – zwraca wartość 1 jeśli obiekt jest zamknięty tzn. StartPoint()=EndPoint() oraz nie występują w nim wzajemne przecięcia odcinków. Waldemar Izdebski - Wykłady z przedmiotu SIT 45 Geometria i metody klasy LineString, Line, LinearRing LineString jest linią łamaną (Curve) w którym każda para współrzędnych definiuje odcinek linii prostej. W szczególności Line składa się dokładnie z dwóch punktów, a LinearRing charakteryzuje się tym, że jest obiektem zamkniętym tzn. punkt początkowy i końcowy się pokrywają. Metody związane z tymi obiektami to: • NumPoints( ):Integer – zwraca liczbę punktów wchodzących w skład obiektu, • PointN(N:integer):Point – zwraca konkretny punkt związany z obiektem. Geometria i metody klasy MultiCurve MultiCurve jest kolekcją obiektów klasy Curve. Obiekt jest obiektem prostym tylko wtedy jeśli wchodzące w skład kolekcji obiekty składowe nie przecinają się w innych punktach niż punkty definiujące obiekty. Z klasą związane są dwie metody: • • IsClosed( ):Integer – zwraca wartość 1 jeśli obiekt jest zamknięty tzn. StartPoint()=EndPoint() zachodzi dla każdego elementu Curve w MultiCurve, Length( ):Double – wyznaczenie długości wszystkich elementów Curve chodzących w skład obiektu. Geometria i metody klasy Surface Surface wyznacza obszar płaszczyzny. Związane z nim metody to: • • • Area( ):Double – pole powierzchni, Centroid( ):Point – punktowa interpretacja obszaru, PointOnSurface( ):Point – zwraca punkt z gwarancja, że jest położony wewnątrz obszaru obiektu. Geometria i metody klasy Polygon Polygon jest obszarem zdefiniowanym przez jeden zewnętrzny obiekt stanowiący granicę oraz wiele obiektów wewnętrznych, które definiują obszary wyłączone (wyspy). Do specyficznych metod klasy należą: • ExteriorRing( ):LineStringe – zwraca zewnętrzny obiekt definiujący poligon, • NumInteriorRing( ):Integer – zwraca liczbę wewnętrznych obszarów poligonu, • InteriorRingN(N:integer):LineString – zwraca geometrie wskazanego obszaru w ramach poligonu, Geometria i metody klasy MultiSurface MultiSurface jest kolekcją elementów typu Surface. Wnętrza (interiors) elementów Surface wchodzących w skład kolekcji nie mogą się wzajemnie przecinać. Klasa MultiSurface jest jedynie klasą abstrakcyjną i tylko definiuje pewne charakterystyczne dla niej metody. Instancyjną podklasą dla MutliSurface jest klas MultiPolygon. Poniżej przedstawiono metody zdefiniowane dla klasy MultiSurface: • Area( ):Double – pole powierzchni, • Centroid( ):Point – punktowa interpretacja obszaru, rezultat nie gwarantuje że uzyskany punkt będzie leżał w obszarze konkretnego MuluSurface. • PointOnSurface( ):Point – zwraca punkt z gwarancja, że jest położony wewnątrz obszaru obiektu. Waldemar Izdebski - Wykłady z przedmiotu SIT 4. 46 Ogólne informacje o strukturach i bazach danych Przyjęte do modelowania rzeczywistości modele przestrzenne w praktycznej realizacji systemu muszą znaleźć odzwierciedlenie w odpowiednich danych, zapisanych w bazach danych z zastosowaniem struktur danych określających ich interpretację. 4.1. Struktury danych Elementy składowe danych (określone typy liczb, ciągi znaków alfanumerycznych) są ze sobą łączone, tworząc struktury danych, na których wykonuje się właściwe tym strukturom operacje. Struktury danych stanowią formy pośrednie między modelami danych, które mają charakter koncepcyjny i fizycznymi reprezentacjami danych w postaci numerycznej. Struktury danych określają sposób dostępu do określonego obszaru lub obszarów pamięci i ich interpretację. Najważniejsze struktury danych przedstawiono schematycznie na rysunku 3.1. a) P1 P2 b) Pq Pi i,j c) dane dane dane dane wskaźnik wskaźnik wskaźnik wskaźnik wskaźnik-1 wskaźnik-1 wskaźnik-1 wskaźnik-1 dane dane dane dane wskaźnik-2 wskaźnik-2 wskaźnik-2 wskaźnik-2 wskazanie puste d) wskazanie puste e) f) Rys. 4.1.Przykładowe struktury danych wskazanie puste Waldemar Izdebski - Wykłady z przedmiotu SIT 47 Rekord Rekord (rysunek 3.1a) jest zbiorem q elementów, które mogą być różnych typów i zapisywane są w ustalonej kolejności. Elementy rekordu nazywane są polami. W szczególności pola mogą być również innymi strukturami danych. Tablica Tablica (rysunek 3.1b) jest uporządkowanym zbiorem elementów tego samego typu. Elementy identyfikowane są za pomocą q indeksów, gdzie q określa wymiar tablicy. Tablica jednowymiarowa jest reprezentacją wektora, a tablica dwuwymiarowa - macierzy. Elementy tablicy zapisywane są w ustalony sposób, np. wiersz po wierszu lub kolumna po kolumnie. Lista Lista jest uporządkowanym zbiorem elementów, które mogą być pojedynczymi danymi określonych typów lub też innymi strukturami danych np. innymi listami. Lista nie zawierająca innych list nazywa się listą liniową, natomiast zawierająca inne listy nazywa się strukturą listową. Uporządkowanie elementów listy może być ustalone kolejnością zapisu lub wskaźnikiem dołączonym do każdego elementu i wskazującym miejsce następnego lub sygnalizującym koniec listy. W zależności od powiązań między elementami listy wyróżnia się: • listę jednokierunkową - dla każdego składnika poza ostatnim określony jest składnik następny (rysunek 3.1c), • listę dwukierunkową - każdy składnik z wyjątkiem pierwszego i ostatniego posiada określony element poprzedni i następny, dla elementu pierwszego określony jest jedynie element następny, a dla ostatniego element poprzedni (rysunek 3.1d). Szczególnymi przypadkami list liniowych są stosy i kolejki. Stos jest listą liniową, do której dostęp istnieje tylko w jednym miejscu. Miejsce dostępu nazywa się wierzchołkiem stosu i jest jedynym miejscem do którego można dołączyć lub z którego można usuwać elementy. Oznacza to, że element wprowadzony na stos jako ostatni będzie odczytany jako pierwszy. Kolejka jest listą liniową, do której elementy mogą być wprowadzane tylko w jednym końcu (na początku kolejki) a usuwane w drugim końcu (na początku kolejki). Drzewo Drzewo jest strukturą ustanawiającą hierarchie elementów. Każdy element (węzeł) jest przyporządkowany jednemu elementowi nadrzędnemu i ma pewną liczbę elementów podrzędnych. Pierwszy element drzewa zwany korzeniem nie ma elementu nadrzędnego. Elementy na najniższym poziomie nie mają elementów podrzędnych. Jeśli każdy z elementów posiada co najwyżej dwa elementy następne (następniki) wtedy drzewo nazywany drzewem binarnym. W przeciwnym wypadku drzewo nazywanym drzewem wielokierunkowym rzędu n, gdzie n określa maksymalną liczbę następników. Rysunek 3.1e ilustruje drzewo binarne. Graf Graf jest klasą struktur reprezentujących sieć elementów. Każdy element może być połączony z dowolnym innym elementem grafu. Z tego też względu grafy definiowane są przez dwa zbiory: zbiór wierzchołków i zbiór krawędzi określający powiązania między poszczególnymi wierzchołkami (rysunek 3.1f). Waldemar Izdebski - Wykłady z przedmiotu SIT 4.2. 48 Bazy danych Bazę danych określa się jako zbiór powiązanych wzajemnie danych. Powiązanie danych realizowane jest przez zastosowanie odpowiednich struktur danych. Ponieważ jedna baza danych może być wykorzystywana przez różne programy aplikacyjne, dla odciążenia tych programów od powtarzających się czynności związanych z obsługa bazy danych, wszystkie funkcje z tym związane wykonywane są przez specjalny pakiet programów zwany systemem zarządzania bazą danych (DBMS - Database Management System). Główne zadania DBMS można określić następująco: 1. zapamiętywanie danych oraz ich wyszukiwanie na podstawie różnych warunków, 2. oddzielenie funkcji zapamiętywania i wyszukiwania od programów aplikacyjnych, co powoduje, że programy stają się mniej wrażliwe na zmiany bazy danych, 3. umożliwienie korzystania z danych na podstawie ich logicznego opisu; system przejmuje całkowicie kontrolę nad wykorzystaniem urządzeń pamięciowych dla zapisu danych, 4. umożliwienie dostępu do danych wielu użytkownikom jednocześnie, 5. weryfikowanie danych za pomocą odpowiednio zdefiniowanych procedur kontrolnych, 6. ochrona danych (archiwizacja, zarządzanie prawami użytkowników). Dostęp do bazy danych powinien być realizowany za pośrednictwem łatwego w użyciu języka zapytań oraz z zastosowaniem języków programowania wysokiego poziomu. Z punktu widzenia stosowanych struktur można wyróżnić cztery podstawowe rodzaje baz danych: hierarchiczne, sieciowe, relacyjne i obiektowe. Wymieniona kolejność jest również kolejnością chronologiczną w jakiej poszczególne bazy powstawały. W hierarchicznej bazie danych stosuje się struktury typu drzewa. Węzłom w strukturze drzewa odpowiadają zbiory rekordów danych. Zbiór rekordów poziomu wyższego jest łączony relacjami 1:m (one-to-many) ze zbiorami poziomu niższego. Dzięki takiej budowie, wyszukiwanie określonych elementów w bazie odbywa się stosunkowo szybko. Istotna wadą baz hierarchicznych jest jednak redundancja danych wynikająca z faktu, że można wykorzystywać jedynie relacje typu 1:m. Duże kłopoty sprawia również zmiana struktury istniejącej bazy. Sieciowa baza danych jest rozwinięciem bazy hierarchicznej przez dodanie możliwości zapisu relacji m:m (many-to-many). Tak więc w bazie sieciowej poza relacjami hierarchicznymi występują dodatkowe połączenia, umożliwiające uzyskanie dostępu do danego rekordu bez potrzeby każdorazowego przechodzenia przez strukturę drzewa. Wprowadzone zmiany spowodowały zmniejszenia redundancji danych przez dodatkowe możliwości powiązania danych, które już istnieją, ale nie wyeliminowały trudności związane ze zmianą struktury bazy istniejącej. W relacyjnej bazie danych wykorzystywana jest struktura tablicy. W skład bazy wchodzi jedna lub więcej powiązanych ze sobą tablic. Każda kolumna tablicy zawiera elementy tego samego typu, ma swoją nazwę i jest przez nią identyfikowana. Zbiór wartości jakie mogą występować w danej kolumnie nazywa się jej dziedziną. Wiersz tablicy, nazywany rekordem lub krotką, identyfikowany jest za pośrednictwem wartości zapisanych w nim elementów (atrybutów). Funkcję klucza, jednoznacznie określającego poszczególne wiersze, może spełniać pojedyncza kolumna lub też kilka odpowiednio wybranych kolumn. Waldemar Izdebski - Wykłady z przedmiotu SIT 49 Podstawą sprawnego i bezpiecznego operowania relacyjną bazą danych jest właściwy podział danych na tablice, który dokonywany jest fazie projektowania bazy danych. Wyszukiwanie danych w bazie dokonywane jest za pośrednictwem języka zapytań (query language). W relacyjne bazie danych typowym językiem zapytań jest język SQL (ang. Structured Query Language). Wyszukiwanie w więcej niż jednej tablicy dokonywane jest z wykorzystaniem wspólnych wartości tego samego typu atrybutów. Operowanie baz relacyjnych na prostej strukturze jaką są tablice powoduje, że dane posiadające struktury złożone muszą być przechowywane w wielu powiązanych tablicach. Proces rekonstrukcji tak rozdzielonych danych jest więc związany z przeszukiwaniem i analizowaniem zawartości wielu tablic. Obiektowe bazy danych rozwinęły się wraz z rozwojem i rozpowszechnieniem programowania zorientowanego obiektowo. Cechą charakterystyczną obiektowych baz danych jest to, że przechowują obiekty o dowolnych strukturach wraz z przywiązanymi do nich metodami (procedurami). Dzięki takiemu rozwiązaniu bazy takie mają znaczną przewagę nad innymi rodzajami baz kiedy zachodzi konieczność przechowywania bardzo złożonych struktur. Znaczącą wadą baz obiektowych w chwili obecnej jest problem z realizacją zapytań. Większość współczesnych baz pozwala jedynie na proste przeszukiwanie przechowywanych obiektów. Takie udogodnienia jakie bez problemów można wykorzystywać w bazach relacyjnych na razie są nieosiągalne i znajdują się jedynie w stadium rozwojowych prac badawczych. Rozwiązanie w przyszłości tych problemów prawdopodobnie sprawi, że bazy te będą miały coraz większe zastosowania również w systemach informacji przestrzennej. Obecnie najczęściej stosowanymi bazami danych w systemach informacji przestrzennej są bazy relacyjne. Pakiet programów służący zarządzaniu relacyjną bazą danych nazywany jest RDBMS (ang. Relational Database Management System). Bazy te z powodzeniem realizują wszystkie funkcje związane z zarządzaniem informacją opisową. W przypadku zarządzania informacją przestrzenną pojawiają się natomiast pewne kłopoty wynikające z dużej liczby danych przestrzennych oraz konieczności dostępu do nich w trybie interaktywnym. Ma to szczególne znaczenie przy wyszukiwaniu obiektów spełniających wymagane warunki przestrzenne (np. wybranie wszystkich obiektów leżących wewnątrz danego wielokąta) lub topologiczny (np. wybór obiektów stykających się z obiektem danym). Skrócenie czasu dostępu wiąże się przede wszystkim ze zredukowaniem liczby kontaktów z pamięcią dyskową. Służy temu najczęściej i najskuteczniej wyposażanie RDBMS w odpowiednie metody indeksowanie przestrzennego zgromadzonych danych (Quad-tree, R-tree).