- Tabela wiąże dowolny rekord systemu z parą współrzędnych — przez numer referencyjny
REFNO. - Indeks unikalny na tej kolumnie gwarantuje, że jednemu rekordowi odpowiada dokładnie jedno położenie.
- Poza samą lokalizacją zapisywane są ustawienia prezentacji: przybliżenie, grupowanie znaczników i etykiety.
- Współrzędne zapisano jako liczby zmiennoprzecinkowe, a nie w typie przestrzennym — przy obliczeniach odległości ma to znaczenie.
Do czego służy tabela [dbo].[_maps]
Adres kontrahenta zapisany tekstem wystarcza do wydrukowania listu przewozowego, ale nie pozwala pokazać punktu na mapie ani policzyć odległości. Tabela [dbo].[_maps] uzupełnia tę lukę: przechowuje współrzędne geograficzne przypisane do rekordów systemu.
Powiązanie jest celowo ogólne. Kolumna REFNO odwołuje się do numeru referencyjnego dowolnego rekordu — może to być kontrahent, magazyn, punkt odbioru albo zlecenie transportowe. Dzięki temu jedna struktura obsługuje wszystkie te przypadki, a indeks unikalny pilnuje, żeby jeden rekord nie miał dwóch sprzecznych położeń.
Trzy kolumny opisują nie lokalizację, lecz sposób jej pokazania. Przybliżenie decyduje o skali mapy otwieranej dla danego rekordu, grupowanie steruje łączeniem sąsiadujących znaczników w jeden, a etykiety — wyświetlaniem podpisów. Ustawienia zapisane przy rekordzie pozwalają otworzyć mapę magazynu w innej skali niż mapę trasy międzynarodowej.
Ta sama struktura obsługuje kontrahentów, magazyny i punkty odbioru — rozróżnia je wyłącznie rekord wskazany numerem referencyjnym.
Budowa tabeli — wykaz kolumn
Osiem kolumn dzieli się na dwie grupy: dane położenia oraz ustawienia prezentacji mapy.
| Kolumna | Typ | Wymagana | Znaczenie |
|---|---|---|---|
ETYKIETY | bit wartość logiczna 0/1 | nie | Znacznik decydujący, czy przy punktach mają być wyświetlane podpisy |
GRUPOWANIE | bit wartość logiczna 0/1 | nie | Znacznik włączający łączenie sąsiadujących znaczników w jeden przy oddaleniu widoku |
ID_MAPS | int liczba całkowita | tak | Identyfikator wiersza tabeli |
LATITUDE | float liczba zmiennoprzecinkowa | tak | Szerokość geograficzna |
LONGITUDE | float liczba zmiennoprzecinkowa | tak | Długość geograficzna |
REFNO | bigint liczba całkowita 64-bitowa | tak | Numer referencyjny dla którego zapisywane są współrzędne geograficzne |
SELECT_POI | varchar(max) tekst bez limitu długości | nie | Definicja zapytania wybierającego punkty dodatkowe prezentowane razem z lokalizacją |
ZOOM | float liczba zmiennoprzecinkowa | nie | Poziom przybliżenia mapy otwieranej dla tego rekordu |
Współrzędne mają typ float. Jest to wystarczające do prezentacji na mapie, ale przy obliczeniach odległości i kontroli stref wymaga własnych wzorów — SQL Server oferuje do tego osobny typ przestrzenny geography.
Indeksy i wydajność zapytań
Odczyt odbywa się zawsze po numerze referencyjnym rekordu, dla którego otwierana jest mapa.
| Indeks | Kolumny | Rodzaj |
|---|---|---|
PK__maps | ID_MAPS | klucz główny |
REFNO | REFNO | unikalny |
Indeks na kolumnie REFNO jest unikalny i pełni podwójną rolę. Przyspiesza odczyt, a jednocześnie wyklucza sytuację, w której jeden rekord ma dwa zapisane położenia — błąd tego rodzaju objawiałby się znacznikiem skaczącym po mapie między odświeżeniami.
Współrzędne jako liczby a typ przestrzenny — co z tego wynika
Zapis współrzędnych w dwóch kolumnach zmiennoprzecinkowych jest rozwiązaniem prostym i przenośnym. Ma jednak konsekwencje, które ujawniają się przy pytaniach wykraczających poza „pokaż punkt na mapie”.
| Zagadnienie | Dwie kolumny float | Typ geography |
|---|---|---|
| Pokazanie punktu na mapie | Wystarcza w zupełności | Wystarcza |
| Obliczenie odległości | Wymaga własnego wzoru uwzględniającego krzywiznę Ziemi | Metoda wbudowana zwraca wynik w metrach |
| Sprawdzenie, czy punkt jest w strefie | Konieczne porównanie zakresów i własna logika | Gotowa metoda sprawdzająca zawieranie się w obszarze |
| Wyszukanie najbliższych punktów | Przeszukanie zakresu współrzędnych, potem sortowanie | Indeks przestrzenny obsługuje zapytanie bezpośrednio |
| Przenośność między bazami | Pełna — to zwykłe liczby | Ograniczona do serwerów obsługujących ten typ |
Przy kilkuset punktach różnica jest niezauważalna. Rośnie wraz z liczbą rekordów i złożonością pytań geograficznych.
W praktyce oznacza to prosty podział. Jeżeli mapa służy do pokazania, gdzie znajduje się kontrahent, obecne rozwiązanie w zupełności wystarcza. Jeżeli system ma planować trasy, kontrolować wjazd do strefy albo dobierać najbliższy magazyn, warto rozważyć kolumnę wyliczaną typu geography obok istniejących — nie wymaga to zmiany struktury, a otwiera dostęp do gotowych metod i indeksu przestrzennego.
Jak korzystać z tabeli w praktyce
Przy pracy z danymi lokalizacyjnymi sprawdzają się poniższe zasady:
- Sprawdzaj zakres wartości przy imporcie — szerokość geograficzna mieści się w przedziale od −90 do 90, długość od −180 do 180.
- Uważaj na zamianę kolumn miejscami; współrzędne Polski to szerokość około 52 i długość około 19, więc odwrócenie umieszcza punkt w Sudanie.
- Nie przechowuj tu adresu tekstowego — jego miejsce jest w kartotece kontrahenta, a tabela mapowa ma odpowiadać wyłącznie za położenie.
- Przy geokodowaniu adresów zapisuj datę operacji poza tą tabelą; adresy się zmieniają, a nieaktualne współrzędne wyglądają na poprawne.
- Ustawiaj przybliżenie stosownie do zasięgu — mapa magazynu i mapa trasy krajowej wymagają różnych wartości.
- Włączaj grupowanie znaczników tam, gdzie punktów jest wiele; kilkaset nachodzących na siebie znaczników czyni mapę nieczytelną.
Wyszukanie rekordów położonych w zadanym prostokącie współrzędnych — typowe zapytanie przy ograniczaniu widoku mapy do jednego regionu:
SELECT m.REFNO,
m.LATITUDE,
m.LONGITUDE,
m.ZOOM
FROM dbo._maps AS m
WHERE m.LATITUDE BETWEEN @lat_min AND @lat_max
AND m.LONGITUDE BETWEEN @lon_min AND @lon_max
ORDER BY m.LATITUDE DESC, m.LONGITUDE;
Prostokąt współrzędnych jest tanim przybliżeniem obszaru. Do zapytania „punkty w promieniu X kilometrów” potrzebny jest już wzór uwzględniający krzywiznę Ziemi albo typ przestrzenny.
Dane lokalizacyjne mają jedną cechę odróżniającą je od reszty kartoteki: nie da się na oko sprawdzić, czy są poprawne. Błędna nazwa ulicy rzuca się w oczy, przestawione współrzędne — nie. Dlatego kontrola zakresów przy imporcie jest tu ważniejsza niż w większości innych struktur.
Powiązane tabele i dokumentacja
Dane mapowe uzupełniają punkty szczegółowe oraz struktury opisujące kontrahentów i dokumenty transportowe: