Zakodowany format algorytmu poliline

Kodowanie liniowe to stratny algorytm kompresji, który umożliwia przechowywanie serii współrzędnych jako pojedynczego ciągu. Współrzędne punktów są kodowane z wykorzystaniem podpisanych wartości. Jeśli masz tylko kilka punktów statycznych, możesz też użyć interaktywnego narzędzia do kodowania linii łamanych.

Proces kodowania przekształca wartość binarną w serię kodów znaków ASCII zgodnie ze znanym schematem kodowania base64. Aby zapewnić prawidłowe wyświetlanie tych znaków, zakodowane wartości są sumowane z 63 (znak ASCII '\">#39;) przed przekształceniem ich w kod ASCII. Algorytm sprawdza również dodatkowe kody znaków dla danego punktu, sprawdzając najmniejszą część każdej grupy bajtów. Jeśli ta wartość wynosi 1, punkt nie jest jeszcze w pełni uformowany i trzeba uwzględnić dodatkowe dane.

Aby zaoszczędzić miejsce, punkty uwzględniają tylko przesunięcie z poprzedniego punktu (z wyjątkiem pierwszego punktu). Wszystkie punkty są kodowane w Base64 jako liczby całkowite, ponieważ szerokość i długość geograficzna są wartościami podpisanymi. Format kodowania na linii łamanej musi reprezentować dwie współrzędne reprezentujące szerokość i długość geograficzną z rozsądną dokładnością. Biorąc pod uwagę maksymalną długość geograficzną od +/- 180 stopni do precyzji 5 miejsc po przecinku, (180.00000 do -180.00000) powoduje to wygenerowanie 32-bitowej wartości binarnej, która jest liczbą całkowitą.

Pamiętaj, że ukośnik lewy jest interpretowany jako znak zmiany znaczenia w literalskich ciągach znaków. Wszystkie dane wyjściowe tego narzędzia powinny zamienić znaki ukośnika lewego na podwójny ukośnik lewy w ciągu literałów łańcuchowych.

Poniżej znajdują się instrukcje dotyczące kodowania takiej podpisanej wartości.

  1. Wpisz początkową wartość podpisu:
    -179.9832104
  2. Wybierz wartość dziesiętną i pomnóż ją przez 1e5, zaokrąglając wynik:
    -17998321
  3. Konwertuj wartość dziesiętną na binarną. Pamiętaj, że wartość ujemna musi zostać obliczona za pomocą jej uzupełnienia przez odwrócenie wartości binarnej i dodanie jej do wyniku:
    00000001 00010010 10100001 11110001
    11110101010101010101010101010101010101010101010101010101010101
  4. Zmień wartość binarną w lewo na lewo:
    11111100 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. Umieść 5-bitowe fragmenty w odwrotnej kolejności:
    00001 11111 10000 01010 00010 00001
  8. LUB każda wartość z rozmiarem 0 x 20, jeśli występuje inny fragment:
    100001 111111 110000 101010 100010 000001
  9. Przekonwertuj każdą wartość na wartość dziesiętną:
    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 odpowiedni kod ASCII:
    `~oia@

W tabeli poniżej znajdziesz przykłady zakodowanych punktów. Są one widoczne jako seria przesunięcia w stosunku do 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 Zmiana długości Szerokość zakodowana Długość geograficzna zakodowana Zakodowany punkt
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`@