Топойсон: квантование VS упрощение

В чем разница между quantization и simplification? Является ли квантование еще одним способом упрощения? Лучше ли использовать квантование в определенных ситуациях? Или я должен использовать комбинацию обоих?


person dance    schedule 19.09.2013    source источник


Ответы (2)


Общий размер вашей геометрии зависит от двух факторов: количество точек и количество цифр (точность) каждой координаты.

Скажем, у вас есть большая геометрическая фигура с 1 000 000 точек, где каждая двумерная точка представлена ​​как долгота в ±180° и широта в ±90°:

[-90.07231180399987,29.501753271000098],[-90.06635619599979,29.499494248000133],…

Вещественные числа могут иметь произвольную точность (в JSON; в JavaScript они ограничены точностью IEEE 754) и, таким образом, бесконечны. количество цифр. Но на практике приведенное выше довольно типично, поэтому, скажем, каждая координата имеет 18 цифр. Включая дополнительные символы ([, ] и ,), каждая точка занимает не более 1 + 18 + 1 + 18 + 1 = 39 байтов для кодирования в JSON, а вся геометрия составляет около 39 * 1 000 000 ≈ 39 МБ.

Теперь предположим, что мы конвертируем эти действительные числа в целые числа: и долгота, и широта сводятся к целым числам x и y, где 0 ≤ x ≤ 99 и 0 ≤ y ≤ 99. Простое отображение между точками с действительными числами ⟨λ,φ⟩ и целыми координатами ⟨x,y⟩:

x = floor((λ + 180) / 360 * 100);
y = floor((φ + 90) / 180 * 100);

Поскольку теперь для кодирования каждой координаты требуется не более 2 цифр, каждая точка занимает не более 1 + 2 + 1 + 2 + 1 = 7 байт для кодирования в JSON, а вся геометрия занимает около 7 МБ; мы уменьшили общий размер на 82%.

Конечно, ничего не бывает бесплатно: если вы удалите слишком много информации, вы больше не сможете точно отображать геометрию. Эмпирическое правило заключается в том, что размер вашей сетки должен быть как минимум в два раза больше максимального ожидаемого размера отображения всей карты. Например, если вы отображаете карту мира в пространстве размером 960 × 500 пикселей, разумным выбором будет значение по умолчанию 10 000 × 10 000 (-q 1e4).

Таким образом, квантование удаляет информацию, уменьшая точность каждой координаты, эффективно привязывая каждую точку к регулярной сетке. Это уменьшает размер создаваемого файла TopoJSON, поскольку каждая координата представляется целым числом (например, от 0 до 9999) с меньшим количеством цифр.

Напротив, упрощение удаляет информацию, удаляя точки, применяя эвристику, которая пытается измерить визуальную значимость каждой точки и удаляя наименее заметные точки. Существует множество различных методов упрощения, но метод Visvalingam, используемый эталонной реализацией TopoJSON, описан в моей статье Line Simplify. поэтому я не буду повторяться здесь.

В то время как квантование и упрощение обращаются к этим двум разным типам информации в основном независимо друг от друга, существует дополнительная сложность: квантование применяется до строится топология, тогда как упрощение обязательно применяется после для сохранения топологии. Поскольку квантование часто вводит совпадающие точки ([24,62],[24,62],[24,62]…), а совпадающие точки удаляются, квантование также может удалять точки.

Причина, по которой квантование применяется до построения топологии, заключается в том, что геометрические входные данные часто не являются топологически достоверными. Например, если взять шейп-файл округов Невады и объединить его с шейп-файлом границы штата Невада, координаты в одном шейп-файле могут не совпадать точно с координатами в другом шейп-файле. Квантуя координаты перед построением топологии, вы привязываете координаты к регулярной сетке и можете получить более чистую топологию с меньшим количеством дуг, надеюсь, правильно определяя все общие дуги. (Конечно, если вы переквантуете, то вы можете получить слишком много совпадающих точек и получить самопересекающиеся дуги, что вызывает другие проблемы.)

В будущем выпуске, возможно, 1.5.0, TopoJSON позволит вам управлять квантованием до того, как топология будет построена независимо от квантования выходного файла TopoJSON. Таким образом, вы можете использовать более мелкую сетку (или вообще не использовать сетку!) для вычисления топологии, затем упростить, а затем использовать более грубую сетку, подходящую для экрана с низким разрешением. На данный момент они связаны друг с другом, поэтому я рекомендую использовать более мелкую сетку (например, -q 1e6), которая создает чистую топологию за счет немного большего размера файла. Поскольку TopoJSON также использует дельта-кодированные координаты, вы все равно редко платите полную цену за все цифры!

person mbostock    schedule 20.09.2013
comment
Практическое правило заключается в том, что размер вашей сетки должен быть как минимум вдвое больше максимального ожидаемого размера отображения всей карты. Например, если вы отображаете карту мира в пространстве 960 × 500 пикселей, разумным выбором будет значение по умолчанию 10 000 × 10 000 (-q 1e4).< /i> Здесь я бы ожидал простого двойного коэффициента на 960×500 пикселей, поэтому 1820×1000 должно быть достаточно, и я бы выбрал -q 1820. Что я делаю не так? - person Hugolpz; 20.09.2013
comment
Поскольку числа JSON основаны на 10, вы должны использовать размер сетки, равный десятой степени, чтобы наиболее эффективно использовать кодировку. Также см. последний абзац; если известно, что ваш ввод топологически корректен, вы можете использовать -q 1e5 или 1e6 для получения более чистой топологии. И, наконец, поскольку ваш браузер использует сглаживание при рендеринге, он может использовать субпиксельные позиции, поэтому полезно использовать размер сетки, который (несколько) тоньше, чем пиксельная сетка. - person mbostock; 20.09.2013
comment
@mbostock, какие настройки вы рекомендуете для A) мира, B) формы размером с 48 штатов США, C) формы Калифорнии? Вы где-то давали рекомендации? Способ найти правильную настройку для упрощения кажется методом проб и ошибок. - person Hugo LOPEZ; 06.04.2018

Они связаны, но имеют разные цели и результаты.

Я считаю, что квантование сворачивает близлежащие точки на основе параметра (который вы настраиваете на ожидаемое разрешение представления) — нет смысла иметь разрешение выше, чем пиксели, которые будут рисовать карту. Но не мешает проанализировать путь, чтобы определить оптимальное количество точек, необходимых для представления формы.

Упрощение — это алгоритм, который анализирует многоугольник и оптимальным образом уменьшает количество точек, чтобы свести к минимуму общую деформацию многоугольника. По сути, его можно использовать для значительного уменьшения количества точек (и, следовательно, размера файла) без заметного влияния на качество пути.

В качестве параллельного примера рассмотрим прямую линию, состоящую из 10 точек. Квантование уменьшит количество точек (схлопывая соседние или совпадающие точки) в зависимости от используемого вами значения. Упрощение проанализирует линию и поймет, что 8 из десяти точек могут быть удалены без существенного изменения общей формы многоугольника, и уменьшит линию до двух точек (поскольку нет деформации пути при удалении точек на линии).

См. также:

И то, и другое следует использовать в сочетании: квантизация для уменьшения карты до сетки нужного размера, упрощение для оптимизации путей.

person reblace    schedule 19.09.2013
comment
Должен любить, когда тебя бьет мастер :) - person reblace; 05.03.2015