Zakodowany format algorytmu poliline

Kodowanie łamane to stratny algorytm kompresji, który umożliwia przechowywanie serii jako pojedynczy ciąg. Współrzędne punktu są kodowane za pomocą podpisanych wartości. Jeśli masz tylko kilka punktów statycznych, możesz też skorzystać narzędzie do kodowania łamanego.

Proces kodowania konwertuje wartość binarną na serię kodów znaków dla Znaki ASCII w znanym schemacie kodowania base64: w celu zapewnienia prawidłowego wyświetlania z tych znaków, zakodowane wartości są sumowane przez sumę 63 (znak ASCII „?”) przed przekształceniem ich na kod ASCII. Algorytm szuka też dodatkowych dla danego punktu, sprawdzając najmniej istotne bity każdego z nich grupa bajtów; jeśli ten bit ma wartość 1, punkt nie jest jeszcze w pełni uformowany i muszą potem wystąpić dodatkowe dane.

Dodatkowo, aby oszczędzać przestrzeń, punkty uwzględniają tylko odsunię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ć dwie współrzędne reprezentują szerokość i długość geograficzną z uzasadnioną precyzją. Maksymalna długość geograficzna to +/- 180 stopni z dokładnością do 5 cyfr po przecinku (180,00000–-180,00000), co wymaga 32-bitowej wartości całkowitej binarnej ze znakiem.

Ukośnik lewy jest interpretowany jako znak zmiany znaczenia. w literałach łańcuchowych. Wszystkie dane wyjściowe tego narzędzia powinny przekonwertować ukośnik lewy na podwójne ukośniki lewe w literałach łańcuchowych.

Czynności niezbędne do kodowania wartości ze znakiem podpisane są poniżej.

  1. Przyjmij początkową podpisaną wartość:
    -179.9832104
  2. Oblicz wartość dziesiętną i pomnóż ją przez 1e5, zaokrąglając wynik:
    -17998321
  3. Przekształć wartość dziesiętną na binarną. Pamiętaj, że wartość ujemna musi być obliczony za pomocą funkcji dopełnienie dwóch przez odwrócenie wartości binarnej i dodanie jej do wyniku:
    00000001 00010010 10100001 11110001
    11111110 11101101 01011110 00001110
    11111110 11101101 01011110 00001111
    
  4. Przesuń wartość binarną w lewo o 1 bit:
    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łóż 5-bitowe fragmenty w odwrotnej kolejności:
    00001 11111 10000 01010 00010 00001
  8. LUB każdą wartość z parametrem 0x20, jeśli występuje inny fragment bitowy:
    100001 111111 110000 101010 100010 000001
  9. Przekonwertuj każdą wartość na format dziesiętny:
    33 63 48 42 34 1
  10. Dodaj 63 do każdej wartości:
    96 126 111 105 97 64
  11. Przekonwertuj każdą wartość na jej odpowiednik ASCII:
    `~oia@

W tabeli poniżej znajdziesz kilka przykładów zakodowanych punktów, które pokazują jako serię przesunięcia od 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 E5 Zmień we współrzędnych Zmiana długości geograficznej Szerokość geograficzna zakodowana 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`@