Разница между GeoJSON и TopoJSON

89

В чем разница между GeoJSON и TopoJSON, и когда я могу использовать одно вместо другого?

Описание TopoJSON на GitHub подразумевает TopoJSON файлы 80% меньше. Так почему бы просто не использовать TopoJSON все время?

Люк
источник

Ответы:

147

Если вам важен размер файла или топология, используйте TopoJSON. Если вас это не волнует, для простоты используйте GeoJSON.

Основное преимущество TopoJSON - размер. За счет устранения избыточности и использования более эффективного целочисленного кодирования координат с фиксированной точностью файлы TopoJSON часто на порядок меньше файлов GeoJSON. Второстепенное преимущество файлов TopoJSON заключается в том, что кодирование топологии имеет полезные приложения, такие как упрощение с сохранением топологии (аналогично MapShaper ) и автоматическое создание сетки (как в границах состояния-состояний в этом примере choropleth ).

За эти преимущества приходится платить: более сложный формат файла. В JavaScript, например, вы обычно используете клиентскую библиотеку TopoJSON для преобразования TopoJSON в GeoJSON для использования со стандартными инструментами, такими как d3.geoPath . (В Python вы можете использовать topojson.py .) Кроме того, целочисленный формат TopoJSON требует квантования координат, что означает, что он может вызвать ошибку округления, если вы не будете осторожны. (См. Документацию для topojson -q.)

Для манипулирования геометрией на стороне сервера, не требующей топологии, GeoJSON, вероятно, является более простым выбором. В противном случае, если вам нужна топология или вы хотите отправить геометрию по сети клиенту, используйте TopoJSON.

mbostock
источник
2
И хотя я действительно помню, как читал о «общих линейных сегментах», я все же предполагал, что «топо» означает «топография», что не так. Вот хорошее прочтение о разнице между «топологией» и «топографией» (первая является источником слова «topo» в topojson) - и мне придется прочитать здесь
The Red Pea
Я бы предпочел использовать geobuf, а не такие гибридные решения, как toposjon, при подключении через Интернет.
tibetty
9

TopoJSON идеально подходит для аккуратных функций, которые «привязаны» друг к другу, например, административных регионов, но не помогает с более беспорядочными или органическими данными. Если ваши данные представляют собой просто точки, то TopoJSON совершенно не поможет.

sgillies
источник
22
Даже при отсутствии общей топологии целочисленное кодирование TopoJSON с фиксированной точностью может быть значительно более эффективным, чем кодирование с плавающей запятой GeoJSON.
mbostock 07
16
Правда. Я не прав. Я бы удалил свой ответ, но мы потеряем ваш ценный комментарий!
sgillies
Ха, спасибо. :) Я отправил отдельный ответ, который включает дополнительные соображения.
mbostock
3

Это зависит от многих соображений. Среди них следующие:

1) Характер (модель данных) функции или функций, которые вы хотите представить 2) Любые атрибуты, которые вы хотите связать с этими функциями 3) Как вы хотите, чтобы эти функции вели себя на странице (статические или динамический)

Однако на этот вопрос сложно ответить абстрактно. Что касается некоторых особенностей, если у вас есть непрерывное полигональное покрытие или другая ситуация, когда объекты разделяют границы, модель topojson позволяет вам использовать избыточность и учесть это в модели.

Прочтите документацию, проанализируйте примеры (например, bl.ocks.org), а затем получите некоторые данные и представьте их как в geojson, так и в topojson, и создайте свои собственные визуализации.

Wsvekla
источник
Спасибо wsvekla. Я делал это - я действительно нашел ваши материалы на bl.ocks.org ( bl.ocks.org/wsvekla/4533258 bl.ocks.org/4348435 ), но гуглить было непросто. Однако, как вы указываете, есть много соображений, и я пытаюсь изучить параллельные сравнения, чтобы понять это.
Люк,
2
Эти два блока ссылаются на один и тот же исходный шейп- файл : bl.ocks.org/4485308 и bl.ocks.org/4348435 . TopoJSON действительно начал осваиваться, когда я наконец понял, как я могу представлять несколько объектов (национальные, ведомственные и муниципальные границы) с одними и теми же данными в одном файле (вы не можете этого сделать с помощью geojson). Это достигается с помощью функции фильтра: function (a, b) {return a.id! == b.id;}). Попытайтесь понять это, и topojson обретет смысл. Для лучшей справки по коду и чистого
wsvekla