Przestrzenne typy danych w SQL Server 2008, cz. 4/4
Opublikowano: 2010-10-25
STInteriorRingN – zwraca wewnętrzny pierścień figury.
Przykład 28. STInteriorRing
DECLARE @c GEOMETRY =' LINESTRING (80 100, 40 100, 40 50, 100 50, 100 80)'
SELECT @c.STBuffer(20).STInteriorRingN(1).ToString() AS STInterioring
STIntersection – zwraca figurę zawierającą punkty współdzielone przez podane figury.
Przykład 29. STIntersection
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))'
SELECT @kwadrat1.STIntersection(@kwadrat2).ToString() AS STIntersection
STIntersects – zwraca 1, jeśli podana figura przecina się z drugą figurą. W przeciwnym wypadku zwracana jest wartość 0.
Przykład 30. STIntersects
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))'
SELECT @kwadrat1.STIntersects(@kwadrat2) AS STIntersects
STIsClosed – zwraca 1, jeśli w figurze punkt początkowy jest jednocześnie punktem końcowym. W przeciwnym wypadku zwraca 0.
Przykład 31. STIsClosed
DECLARE @czworokat GEOMETRY ='POLYGON ((40 80, 40 40, 90 40,90 80, 40 80))'
SELECT @czworokat.STIsClosed() AS STIsClosed
STIsEmpty – zwraca 1, jeśli figura jest pusta (nie zawiera żadnego punktu). W przeciwnym wypadku zwraca 0.
Przykład 32. STIsEmpty
DECLARE @czworokat GEOMETRY ='POLYGON ((40 80, 40 40, 90 40,90 80, 40 80))'
SELECT @czworokat.STIsEmpty() AS STIsEmpty
IsNull – zwraca 'NULL', jeśli obiekt jest NULL . W przeciwnym przypadku zwraca 0.
Przykład 33. IsNull
DECLARE @c GEOMETRY =' LINESTRING (80 100, 40 100, 40 50, 100 50, 100 80)'
SELECT @c.IsNull AS 'IsNull'
STIsRing – zwraca 1, jeśli figura spełnia założenia STIsClosed i STIsSimple.
Przykład 34.STIsRing
DECLARE @c GEOMETRY =' LINESTRING (80 100, 40 100, 40 50, 100 50, 100 80)'
SELECT @c.STIsRing() AS STIsRing
STIsSimple – funkcja zwraca 1, gdy figura spełnia warunek, że idąc od punktu początkowego do punktu końcowego przechodzimy przez każdy punkt tylko jeden raz (wyjątkiem są figury, gdzie punkt końcowy jest jednocześnie punktem startowym). W przeciwnym wypadku zwracana jest wartość 0.
Przykład 35. STIsSimple
DECLARE @czworokat GEOMETRY ='POLYGON ((40 80, 40 40, 90 40,90 80, 40 80))'
SELECT @czworokat.STIsSimple() AS STIsSimple
STIsValid – zwraca 1, gdy w figurze linie nie nakładają się na siebie. Dopuszczalne są tylko przecięcia linii. W przeciwnym wypadku zwracana jest wartość 0.
Przykład 36. STIsValid
DECLARE @czworokat GEOMETRY ='POLYGON ((40 80, 40 40, 90 40,90 80, 40 80))'
SELECT @czworokat.STIsValid() AS STIsValid
STLength – zwraca długość linii bądź obwód figury.
Przykład 37. STLength
DECLARE @czworokat GEOMETRY ='POLYGON ((40 80, 40 40, 90 40,90 80, 40 80))'
SELECT @czworokat.STLength() AS STLength
M – zwraca wartość M danego punktu.
Przykład 38. M
DECLARE @g geometry='POINT(1 2 3 4)'
SELECT @g.M AS M
Make Valid – zwraca poprawnie skonstruowaną figurę na podstawie figury podanej przez użytkownika.
Przykład 39. Make Valid
DECLARE @g geometry='LINESTRING(0 2, 1 1, 1 0, 1 1, 2 2)'
SELECT @g.STIsValid()AS STIsValid
SET @g=@g.MakeValid()
SELECT @g.STIsValid()AS STIsValid, @g.ToString() AS g
STNumGeometries – zwraca liczbę figur znajdujących się w zbiorze figur.
Przykład 40. STNumGeometries
DECLARE @multi GEOMETRY
SET @multi ='MULTIPOLYGON (((40 80, 40 40, 90 40,90 80, 40 80)),((10 10, 20 10, 20 50, 10 10)))'
SELECT @multi.STNumGeometries() AS STNumGeometries
STNumInteriorRing– zwraca liczbę wewnętrznych pierścieni w obiektach typu Polygon.
Przykład 41. STNumInteriorRing
DECLARE @multi GEOMETRY
SET @multi ='POLYGON ((20 20, 50 20, 50 50, 20 50, 20 20), (40 40, 40 30, 30 30, 30 40, 40 40))'
SELECT @multi.STNumInteriorRing() AS STNumInteriorRing
STNumPoints – zwraca liczbę punktów charakterystycznych z danej figury.
Przykład 42. STNumPoints
DECLARE @c GEOMETRY =' LINESTRING (80 100, 40 100, 40 50, 100 50, 100 80)'
SELECT @c.STNumPoints() AS STNumPoints
STOverlaps – zwraca 1, jeśli dana figura nakłada się na inną figurę.
Przykład 43. STOverlaps
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))'
SELECT @kwadrat1.STOverlaps(@kwadrat2) AS STOverlaps
STPointN – zwraca konkretny punkt z danej figury.
Przykład 44. STPointN
DECLARE @c GEOMETRY =' LINESTRING (80 100, 40 100, 40 50, 100 50, 100 80)'
SELECT @c.STPointN(2).ToString() AS STPointN
STPointOnSurface – zwraca dowolny punkt znajdujący się wewnątrz podanej figury.
Przykład 45. STPointOnSurface
DECLARE @czworokat GEOMETRY ='POLYGON ((40 80, 40 40, 90 40,90 80, 40 80))'
SELECT @czworokat.STPointOnSurface().ToString() AS PointOnSurface
Reduce – zwraca figurę zbliżoną do tej podanej przez użytkownika, z tym że prostszą, składającą się z mniejszej liczby punktów. Wykorzystywany jest przy tym algorytm Douglas-Peucker'a.
Przykład 46. Reduce
Tworzymy niebanalną figurę:
DECLARE @r GEOMETRY
SET @r ='LINESTRING (150 310, 140 310, 130 310, 120 310, 110 300, 100 300, 90 290, 80 280, 80 270, 80 260, 80 250, 80 240, 80 230, 90 230, 90 220, 100 220, 110 220, 120 220, 130 220, 160 220, 170 230, 180 230, 180 240, 190 250, 190 260, 190 270, 200 280, 200 290, 190 300, 180 300, 180 310, 170 310, 170 320, 160 320, 150 320, 150 310)'
a następnie za pomocą metody Reduce otrzymujemy figurę podobną do naszej, ale znacznie uproszczoną.
SELECT @r.Reduce(10).ToString() AS Reduce
STSrid – ustawia wartość Spatial Reference ID. Domyślnie wartość ta wynosi 0.
Przykład 47.STSrid
DECLARE @czworokat GEOMETRY ='POLYGON ((40 80, 40 40, 90 40,90 80, 40 80))'
SET @czworokat.STSrid = 43
STStartPoint – zwraca punkt początkowy z danej figury.
Przykład 48. STStartPoint
DECLARE @c GEOMETRY =' LINESTRING (80 100, 40 100, 40 50, 100 50, 100 80)'
SELECT @c.STStartPoint().ToString() AS STStartPoint
STSymDifference – zwraca figurę zawierającą punkty znajdujące się jednocześnie w jednej i w drugiej figurze, ale nie zawiera ich współdzielonych punktów.
Przykład 49. STSymDifference
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))'
SELECT @kwadrat1.STSymDifference(@kwadrat2).ToString() AS STSymDifference
ToString – zwraca ciąg znaków reprezentujący daną figurę w postaci OGC WKT.
Przykład 50. ToString
DECLARE @g geometry='LINESTRING(0 2, 1 1, 1 0, 1 1, 2 2)'
SELECT @g.ToString() AS g
STTouches – zwraca 1, jeśli podana figura styka się z inną figurą.
Przykład 51. STTouches
DECLARE @l geometry;
DECLARE @p geometry;
SET @l = 'LINESTRING(0 0,0 2)';
SET @p = 'LINESTRING(0 2,0 4)';
SELECT @l.STTouches(@p) AS STTouches
STUnion – zwraca figurę zawierającą punkty należące do jednej i do drugiej figury.
Przykład 52. STUnion
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))'
SELECT @kwadrat1.STUnion(@kwadrat2).ToString() AS STUnion
STWithin – zwraca 1, jeśli figura, na której wykonywana jest funkcja, znajduje się wewnątrz figury podanej jako argument funkcji. W przeciwnym wypadku zwracane jest 0.
Przykład 53. STWithin
DECLARE @czworokat GEOMETRY
DECLARE @punkt GEOMETRY
SET @czworokat ='POLYGON ((40 80, 40 40, 90 40,90 80, 40 80))'
SET @punkt='POINT(50 50)'
SELECT @czworokat.STWithin(@punkt) AS STWithin1 , @punkt.STWithin(@czworokat) AS STWithin2
STX – zwraca położenie punktu na osi X.
Przykład 54. STX
DECLARE @point geometry = 'POINT(3 2)'
SELECT @point.STX AS X, @point.STY AS Y
STY – zwraca położenie punktu na osi Y.
Przykład 55. STY
DECLARE @point geometry = 'POINT(3 2)'
SELECT @point.STX AS X, @point.STY AS Y
Z – zwraca wartość Z danego punktu.
Przykład 56. Z
DECLARE @g geometry='POINT(1 2 3 4)'
SELECT @g.Z AS Z
Dla danych typu geography dostępnych jest wiele tych samych funkcji, co dla danych typu geometry. Należy jednak pamiętać, że mimo iż funkcje te pełnią dla obu typów podobną rolę, to jednak ich działanie odbywa się w zupełnie inny sposób. Jako przykład weźmy funkcję STDistance, liczącą odległość między dwiema figurami. Odległość ta jest liczona zupełnie inaczej dla danych typu geometry (gdzie jest długością linii prostej łączącej obie figury), a inaczej dla geography (gdzie jest długością łuku ze względu na krzywiznę powierzchni).
Funkcje dla typu geography znane nam już z funkcji geometry to:
-STArea
-STAsBinary
-STAsText
-STBuffer
-STDimension
-STDisjoint
-STDistance
-STEndpoint
-STGeometryN
-STGeometryType
-STIntersection
-STIntersects
-STIsClosed
-STIsEmpty
-STLength
-STNumGeometries
-STNumPoints
-STPointN
-STSrid
-STStartPoint
-STUnion
-AsGml
-AsTextZM
-BufferWithTolerance
-InstanceOf
-IsNull
-M
-ToString
-Z
Dochodzą również cztery nowe funkcje niedostępne dla typu geometry:
Lat – zwraca szerokość geograficzną podanego punktu.
Przykład 57. Lat
DECLARE @point GEOGRAPHY = 'POINT(-5.67890 10.12345)'
SELECT @point.Lat AS Lat
Long – zwraca długość geograficzną podanego punktu.
Przykład 58. Long
DECLARE @point GEOGRAPHY = 'POINT(-5.67890 10.12345)'
SELECT @point.Long AS Long
NumRing – zwraca liczbę pierścieni w obiekcie typu Polygon.
Przykład 59. NumRing
DECLARE @polygon geography;
SET @polygon = geography::STGeomFromText('POLYGON((52.150 21.000, 48.080 11.340, 50.060 08.410, 52.150 21.000))',4326)
SELECT @polygon.NumRings() AS NumRings
RingN – zwraca wybrany pierścień z podanej figury.
Przykład 60. RingN
DECLARE @polygon geography;
SET @polygon = geography::STGeomFromText('POLYGON((52.150 21.000, 48.080 11.340, 50.060 08.410, 52.150 21.000))',4326)
SELECT @polygon.RingN(1).ToString() AS RingN
Wprowadzenie typów przestrzennych w SQL Server 2008 było z pewnością dobrym pomysłem. Otrzymaliśmy dzięki temu dwa nowe typy danych do przechowywania informacji o obiektach w dowolnym, dwuwymiarowym układzie współrzędnych. Szeroka gama dostarczonych funkcji pozwala nam na wykonanie wszelkich potrzebnych operacji podczas pracy z tego typu danymi.