Zakodowany format algorytmu poliline

Kodowanie Polyline to stratny algorytm kompresji, który umożliwia przechowywanie serii współrzędnych w postaci jednego ciągu znaków. Współrzędne punktu są kodowane z użyciem wartości ze znakiem. Jeśli masz tylko kilka punktów statycznych, możesz też użyć interaktywnego narzędzia do kodowania łamanymi.

Proces kodowania konwertuje wartość binarną na serię kodów znaków ASCII przy użyciu znanego schematu kodowania base64. Aby zapewnić prawidłowe wyświetlanie tych znaków, zakodowane wartości są sumowane przez 63 (znak ASCII „?”), zanim zostaną one przekształcone w ASCII. Algorytm sprawdza też dodatkowe kody znaków dla danego punktu, sprawdzając najmniej istotny bit w każdej grupie bajtów. Jeśli ten bit ma wartość 1, punkt nie jest jeszcze w pełni uformowany i muszą zawierać dodatkowe dane.

Aby zaoszczędzić miejsce, punkty zawierają tylko przesunięcie od poprzedniego punktu (z wyjątkiem pierwszego punktu). Wszystkie punkty są kodowane w Base64 jako liczby całkowite ze znakiem, ponieważ szerokości i długości geograficzne są wartościami ze znakiem. Format kodowania w linii łamanej musi odzwierciedlać 2 współrzędne reprezentujące szerokość i długość geograficzną z odpowiednią precyzją. Przy maksymalnej długości geograficznej od +/- 180 stopni z dokładnością do 5 miejsc po przecinku (180,00 000 do -180,00 000), wymaga to użycia 32-bitowej binarnej liczby całkowitej ze znakiem.

Pamiętaj, że ukośnik lewy jest interpretowany jako znak zmiany znaczenia w literałach ciągu znaków. Wszystkie dane wyjściowe tego narzędzia powinny zmienić ukośnik lewy na podwójne ukośnik lewy w literałach ciągu znaków.

Procedura kodowania takiej wartości podpisanej opisano poniżej.

  1. Wybierz początkową wartość ze znakiem:
    -179.9832104
  2. Pomnóż wartość dziesiętną przez 1e5, zaokrąglając wynik:
    -17998321
  3. Konwertuj wartość dziesiętną na binarną. Pamiętaj, że wartość ujemną należy obliczyć przy użyciu dopełnienia do dwóch, odwracając wartość binarną i dodając do wyniku jeden:
    00000001 00010010 10100001 11110001
    11111110 11101101 01011110 00001110
    11111110 11101101 01011110 00001111
    
  4. Przesuń wartość binarną o 1 bit w lewo:
    11111101 11011010 10111100 00011110
  5. Jeśli pierwotna wartość dziesiętna jest ujemna, odwróć to kodowanie:
    00000010 00100101 01000011 11100001
  6. Podziel wartość binarną na 5-bitowe fragmenty (zaczynając od prawej strony):
    00001 00010 01010 10000 11111 00001
  7. Ułóż fragmenty 5-bitowe w odwrotnej kolejności:
    00001 11111 10000 01010 00010 00001
  8. LUB każda wartość z wartością 0 x 20, jeśli występuje kolejny fragment:
    100001 111111 110000 101010 100010 000001
  9. Konwertuj każdą wartość na ułamek dziesiętny:
    33 63 48 42 34 1
  10. Dodaj 63 do każdej wartości:
    96 126 111 105 97 64
  11. Konwertuj każdą wartość na jej odpowiednik ASCII:
    `~oia@

W tabeli poniżej znajdziesz kilka przykładów zakodowanych punktów, które przedstawiają kodowanie jako serię przesunięć względem poprzednich punktów.

Przykład

Punkty: (38.5; -120,2); (40.7; -120,95); (43.252; -126.453)

Szerokość geograficzna Długość geograficzna Szerokość geograficzna w E5 Długość geograficzna w E5 Zmiana szerokości geograficznej Zmiana długości geograficznej Zakodowana szerokość geograficzna Zakodowana długość geograficzna Punkt zakodowany
38,5 -120,2 3850000 -12020000 +3850000 -12020000 _p~iF ~ps|U _p~iF~ps|U
40,7 -120,95 4070000 -12095000 +220000 -75000 _ulL nnqC _ulLnnqC
43,252 -126,453 4325200 -12645300 +255200 -550300 _mqN vxq`@ _mqNvxq`@

Zakodowana linia łamana: _p~iF~ps|U_ulLnnqC_mqNvxq`@