Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

GEOGRAPHY

Termin Definicja
GEOGRAPHY

GEOGRAPHY to typ danych SQL Server przechowujący współrzędne geograficzne oparte na modelu kuli ziemskiej.

Model danych GEOGRAPHY w SQL Server

GEOGRAPHY to przestrzenny typ danych programu Microsoft SQL Server przeznaczony do przechowywania obiektów opisanych na powierzchni Ziemi. W odróżnieniu od typu GEOMETRY, który stosuje płaski układ współrzędnych i obliczenia kartezjańskie, GEOGRAPHY uwzględnia model elipsoidalny reprezentujący kulisty charakter globu. Dzięki temu typ ten służy do zapisywania punktów, linii, wielokątów oraz kolekcji obiektów geograficznych, gdy współrzędne są wyrażone jako długość i szerokość geograficzna.

Kolumna GEOGRAPHY przechowuje nie tylko kształt, lecz także identyfikator układu odniesienia przestrzennego SRID. SQL Server wykorzystuje SRID do określenia znaczenia współrzędnych oraz sposobu wykonywania obliczeń. Często stosowany jest SRID 4326, odpowiadający układowi WGS 84 używanemu między innymi przez system GPS. Wartość SRID musi być zgodna dla obiektów biorących udział w operacji przestrzennej. Obiekty o różnych SRID mogą prowadzić do błędów albo do wyniku NULL, zależnie od wykonywanej metody.

Tworzenie punktów i interpretacja współrzędnych

Obiekt GEOGRAPHY można utworzyć za pomocą metod konstrukcyjnych, takich jak geography::Point. Metoda ta przyjmuje najpierw szerokość geograficzną, następnie długość geograficzną oraz SRID. Przykładowe wywołanie geography::Point(52.2297, 21.0122, 4326) opisuje punkt w pobliżu Warszawy, gdzie pierwsza liczba oznacza latitude, a druga longitude. Odwrócenie tych wartości jest częstym błędem integracyjnym, ponieważ wiele formatów mapowych lub bibliotek prezentuje współrzędne w kolejności longitude, latitude.

Wartości szerokości geograficznej muszą mieścić się w zakresie od -90 do 90 stopni, a długości geograficznej od -180 do 180 stopni. Dodatnia szerokość wskazuje półkulę północną, ujemna południową; analogicznie dodatnia długość oznacza kierunek wschodni, a ujemna zachodni. Do odczytu poszczególnych wartości służą właściwości Lat i Long, natomiast STSrid zwraca identyfikator układu odniesienia. Przy imporcie danych z plików CSV, GPS, GeoJSON lub zewnętrznych API należy sprawdzić zarówno kolejność współrzędnych, jak i używany układ odniesienia.

SQL Server udostępnia także metodę Parse, która może odczytywać tekst w formacie WKT, na przykład POINT (21.0122 52.2297). W zapisie WKT punkt jest przedstawiany zwykle jako X Y, czyli longitude latitude, dlatego kolejność tekstu różni się od kolejności argumentów metody geography::Point. Tę różnicę trzeba uwzględnić podczas konwersji danych, aby nie zapisać punktu w błędnej części świata.

Odległości, relacje przestrzenne i indeksowanie

Metody typu GEOGRAPHY wykonują obliczenia z uwzględnieniem położenia na globie. STDistance zwraca przybliżoną najkrótszą odległość między obiektami w metrach, o ile mają zgodny SRID. Dla dwóch punktów można więc wyszukiwać lokalizacje znajdujące się w promieniu określonej liczby metrów. Metoda STIntersects sprawdza, czy obiekty mają część wspólną, STContains pozwala ustalić, czy jeden obiekt zawiera drugi, a STWithin bada relację odwrotną. Wynik tych metod ma typ bitowy i może być używany w warunkach zapytań.

Przykładowe zapytanie może wybierać punkty znajdujące się w odległości do 5000 metrów od zadanego miejsca: WHERE Lokalizacja.STDistance(@Punkt) <= 5000. Taki warunek nie zastępuje jednak kontroli jakości danych. Punkt z nieprawidłowym SRID, błędną kolejnością współrzędnych albo literówką w długości geograficznej może dać formalnie poprawny, lecz praktycznie bezużyteczny wynik. Przy obiektach liniowych i powierzchniowych znaczenie ma także sposób reprezentacji granic oraz to, czy geometria jest poprawna topologicznie.

Dla większych tabel SQL Server może używać indeksów przestrzennych zakładanych na kolumnach GEOGRAPHY. Indeks nie zmienia danych ani zasad obliczania odległości, lecz pomaga ograniczyć liczbę obiektów analizowanych przez zapytanie. Skuteczność zależy między innymi od rodzaju predykatu, rozkładu danych, selektywności warunku i planu wykonania. Po utworzeniu indeksu warto sprawdzić plan zapytania oraz rzeczywisty czas wykonania, ponieważ samo istnienie indeksu nie gwarantuje jego użycia.

Kontrola danych i diagnostyka aplikacji korzystającej z SQL Server

Problemy z GEOGRAPHY często ujawniają się jako nieoczekiwane odległości, brak wyników wyszukiwania albo błędy podczas zapisu. Pierwszym krokiem jest sprawdzenie typu kolumny, wartości SRID oraz przykładowych współrzędnych. Do kontroli można wykorzystać metody STSrid, Lat, Long i STIsValid. Należy również porównać dane zapisane w bazie z wartościami źródłowymi oraz potwierdzić, czy aplikacja nie zamienia latitude z longitude podczas serializacji.

W przypadku wielokątów i bardziej złożonych obiektów przydatna jest metoda MakeValid, która próbuje utworzyć poprawną reprezentację obiektu. Nie należy jednak traktować jej jako bezwarunkowej naprawy semantycznej: wynik może różnić się strukturą od danych wejściowych, dlatego powinien zostać zweryfikowany na poziomie aplikacji. Trzeba też pamiętać, że metody przestrzenne zwracają NULL, gdy któryś z operandów ma wartość NULL. Różne SRID mogą uniemożliwić poprawne porównanie, nawet jeśli liczby współrzędnych wyglądają podobnie.

Podczas diagnozy warto rozdzielić błąd danych od błędu zapytania. Należy przeanalizować definicję parametru, konwersje tekstu WKT, jednostki używane przez aplikację oraz warunki filtrujące. Dla zapytań wyszukujących obiekty w promieniu powinno się sprawdzić, czy odległość jest interpretowana w metrach, a nie w kilometrach lub stopniach. Osobnej kontroli wymaga wydajność: plan wykonania, indeks przestrzenny, liczba zwracanych rekordów i ewentualne dodatkowe filtry relacyjne mogą decydować o czasie odpowiedzi.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę