Przestrzenne typy danych w SQL Server 2008, cz. 1/4
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