Przestrzenne typy danych w SQL Server 2008, cz. 1/4 Udostępnij na: Facebook

Opublikowano: 2010-10-18

Dane przestrzenne to dane określające położenie, kształt i wielkość obiektów w przestrzeni, np. na kuli ziemskiej. Mogą one służyć do opisu miast, dróg czy budynków. SQL Server 2008 dostarczył nam dwa typy danych przestrzennych – geometry i geography.

            Typ geometry służy do przechowywania informacji o obiektach znajdujących się w przestrzeni dwuwymiarowej. Najprostszym przykładem takiej przestrzeni może być znany każdemu z lekcji matematyki układ współrzędnych XY, gdzie położenie każdego punktu określane jest za pomocą wartości X i Y. Ograniczenie do dwóch wymiarów powoduje, że Ziemię musimy traktować jako powierzchnię płaską, przez co możemy przechowywać tylko dane obiektów na tyle małych, aby nie wpływała na nie krzywizna planety. Mogą to być np. plany pomieszczeń w budynkach.

            Typem danych, który uwzględnia elipsoidalną budowę kuli ziemskiej jest geography. Jego przeznaczeniem jest przechowywanie danych o względnie dużych obiektach (takich, gdzie krzywizna Ziemi ma znaczenie) oraz współrzędnych geograficznych budynków, miast czy państw. Możliwe jest to dzięki temu, że informacje o położeniu podawane są za pomocą długości i szerokości geograficznej.

            Zarówno w geometry, jak i w geography opis położenia punktu możliwy jest tylko w dwóch wymiarach. SQL Server dostarcza nam również dwie dodatkowe wartości do opisu każdego punktu – Z i M. Dane te nie są wykorzystywane w żadnych obliczeniach, pozostają jedynie do dyspozycji użytkownika, np. do przechowywania informacji o wysokości położenia punktu nad poziomem morza.

            Dane typów geography i geometry możemy przedstawiać w trzech formatach: Well-Known Text (WKT), Well-Known Binary (WKB) oraz Geography Markup Language (GML). Wszystkie te typy zdefiniowane są w standardach dostarczanych przez Open Geospatial Consortium (OGC). SQL Server 2008 wspiera siedem typów obiektów służących do przedstawiania danych w przestrzeni (tabela 1).

Nazwa Opis Przykład
Point Punkt
LineString Linia  
Polygon Wielokąt
MultiPoint Zbiór punktów
MultiLineString Zbiór linii  
MultiPolygon Zbiór wielokątów
GeometryCollection Zbiór figur geometrycznych

Tab. 1.  Typy obiektów wspierane przez SQL Server 2008.

            Przy tworzeniu nowych obiektów typu geography i geometry możemy skorzystać z jednej z wielu funkcji, jakie oferuje nam SQL Server. Oto one:

STGeomFromText  – tworzy figurę na podstawie WKT.

STPointFromText  – tworzy punkt na podstawie WKT.

STLineFromText – tworzy linię na podstawie WKT.

STPolyFromText – tworzy wielokąt na podstawie WKT.

STMPointFromText – tworzy zbiór punktów na podstawie WKT.

STMLineFromText – tworzy zbiór linii na podstawie WKT.

STMPolyFromText – tworzy zbiór wielokątów na podstawie WKT.

STGeomCollFromText – tworzy kolekcję figur na podstawie WKT.

STGeomFromWKB – tworzy figurę na podstawie WKB.

STPointFromWKB – tworzy punkt na podstawie WKB.

STLineFromWKB – tworzy linię na podstawie WKB.

STPolyFromWKB – tworzy wielokąt na podstawie WKB.

STMPointFromWKB – tworzy zbiór punktów na podstawie WKB.

STMLineFromWKB – tworzy zbiór linii na podstawie WKB.

STMPolyFromWKB – tworzy zbiór wielokątów na podstawie WKB.

STGeomCollFromWKB – tworzy kolekcję figur na podstawie WKB.

 

Przykład 1. Tworzenie nowego obiektu typu POINT.

DECLARE @g geometry;

SET @g = geometry::STPointFromText('POINT (100 100)', 0);

Kolejne wartości w nawiasie to odpowiednio współrzędne X i Y. Natomiast wartość poza nawiasem (w naszym przypadku 0) określa Spatial Reference ID (SRID), czyli system identyfikacji współrzędnych geograficznych. Warto wspomnieć, że SQL Server wykonuje działania jedynie na danych o tym samym SRID. Domyślna wartość dla geometry wynosi 0, a dla geography 4326.

            Wersja serwera z 2008 roku dostarcza również szereg innych funkcji służących do przetwarzania, sprawdzania położenia, obliczania pola powierzchni czy obwodu. Poniżej przedstawiam funkcje dostępne dla danych typu geometry:

Na początku stwórzmy kilka figur, których użyjemy później w naszych przykładach.

Przykład 2. LineString

DECLARE @c GEOMETRY =' LINESTRING (80 100, 40 100, 40 50, 100 50, 100 80)'

Przykład 3. Polygon

DECLARE @czworokat GEOMETRY ='POLYGON ((40 80, 40 40, 90 40,90 80, 40 80))'

Przykład 4.Kwadraty

DECLARE @kwadrat1 GEOMETRY='POLYGON((30 30, 60 30, 60 60, 30 60, 30 30))'

DECLARE @kwadrat2 GEOMETRY='POLYGON((45 45, 45 75, 75 75, 75 45, 45 45))'

A teraz przyjrzyjmy się poszczególnym funkcjom:

STArea – zwraca powierzchnię podanej figury.

Przykład 5. STArea

DECLARE @czworokat GEOMETRY ='POLYGON ((40 80, 40 40, 90 40,90 80, 40 80))'

SELECT @czworokat.STArea() AS STArea

STAsBinary – zwraca w postaci OGC WKB ciąg reprezentujący figurę.

Przykład 6. STAsBinary

DECLARE @czworokat GEOMETRY ='POLYGON ((40 80, 40 40, 90 40,90 80, 40 80))'

SELECT @czworokat.STAsBinary()

AsGml – zwraca wartość reprezentującą podaną figurę w postaci Geography Markup Language (GML)

Przykład 7. AsGml

DECLARE @point geometry = 'POINT(3 2)'

SELECT @point.AsGml() AS AsGml

<Point xmlns="http://www.opengis.net/gml">

  <pos>3 2</pos>

</Point>

STAsText – zwraca w postaci OGC WKT ciąg reprezentujący figurę.

Przykład 8. STAsText

DECLARE @czworokat GEOMETRY ='POLYGON ((40 80, 40 40, 90 40,90 80, 40 80))'

SELECT @czworokat.STAsText() AS STAsText

AsTextZM – zwraca wartość reprezentującą podaną figurę w postaci OGC WKT, włącznie z wartościami M i Z.

Przykład 9. AsTextZM

DECLARE @g geometry;

SET @g = geometry::STGeomFromText('POINT(1 2 3 4)', 0);

SELECT @g.STAsText() AS STAsText, @g.AsTextZM() AS AsTextZM

STBoundary – zwraca ciąg linii stanowiący obwód figury.

Przykład 10. STBoundary

DECLARE @czworokat GEOMETRY ='POLYGON ((40 80, 40 40, 90 40,90 80, 40 80))'

SELECT @czworokat.STBoundary().ToString() AS STBoundary