Różnica między GeoJSON i TopoJSON

89

Jaka jest różnica między GeoJSON i TopoJSON i kiedy powinienem używać jednego nad drugim?

Opis TopoJSON na GitHub implikuje pliki TopoJSON są 80% mniejsze. Dlaczego więc po prostu nie używać TopoJSON przez cały czas?

Łukasz
źródło

Odpowiedzi:

147

Jeśli zależy Ci na rozmiarze pliku lub topologii, użyj TopoJSON. Jeśli nie dbasz o to, użyj GeoJSON dla uproszczenia.

Podstawową zaletą TopoJSON jest rozmiar. Eliminując nadmiarowość i stosując bardziej wydajne kodowanie współrzędnych liczb całkowitych o stałej precyzji, pliki TopoJSON są często o rząd wielkości mniejsze niż pliki GeoJSON. Dodatkową zaletą plików TopoJSON jest to, że kodowanie topologii ma przydatne aplikacje, takie jak uproszczenie z zachowaniem topologii (podobne do MapShaper ) i automatyczne generowanie siatki (jak w przypadku granic stanu w tym przykładzie choropleth ).

Te zalety mają swoją cenę: bardziej złożony format plików. Na przykład w języku JavaScript typowo używasz biblioteki klienta TopoJSON do konwersji TopoJSON do GeoJSON w celu użycia ze standardowymi narzędziami, takimi jak d3.geoPath . (W Pythonie można użyć topojson.py ). Ponadto format liczb całkowitych TopoJSON wymaga kwantyzacji współrzędnych, co oznacza, że ​​może wprowadzić błąd zaokrąglania, jeśli nie będziesz ostrożny. (Zobacz dokumentację topojson -q).

W przypadku manipulacji geometriami po stronie serwera, które nie wymagają topologii, GeoJSON jest prawdopodobnie prostszym wyborem. W przeciwnym razie, jeśli potrzebujesz topologii lub chcesz wysłać geometrię do klienta, użyj TopoJSON.

mbostock
źródło
2
I chociaż pamiętałem, że czytałem o „wspólnych odcinkach linii”, nadal założyłem, że „topo” oznacza „topografię”, a tak nie jest. Oto miła lektura o różnicy między „topologią” a „topografią” (ta pierwsza jest źródłem „topo” w topojsonie) - i będę musiał przeczytać artykuł Mike'a o wnioskach o topologii
The Red Pea
Wolałbym korzystać z geobuf innego niż takie rozwiązania hybrydowe, jak toposjon, gdy przesyłane są przez internet.
Tibetty
9

TopoJSON jest idealny dla uporządkowanych funkcji, które „łączą się” ze sobą, na przykład regiony administracyjne, ale nie pomagają w przypadku bardziej niechlujnych lub organicznych danych. Jeśli Twoje dane to po prostu punkty, TopoJSON w ogóle nie pomoże.

sgillies
źródło
22
Nawet jeśli nie ma współdzielonej topologii, kodowanie liczb całkowitych o stałej precyzji TopoJSON może być znacznie bardziej wydajne niż zmiennoprzecinkowe GeoJSON.
mbostock,
16
Prawdziwe. Nie mam racji. Usunąłbym swoją odpowiedź, ale stracilibyśmy Twój cenny komentarz!
sgillies,
Ha, dzięki. :) Przesłałem osobną odpowiedź, która zawiera dodatkowe uwagi.
mbostock
3

To zależy od wielu czynników. Wśród nich są:

1) Charakter (model danych) funkcji lub funkcji, które chcesz przedstawić 2) Wszelkie atrybuty, które chcesz powiązać z tymi funkcjami 3) Jak chcesz, aby te funkcje zachowywały się na stronie (statyczne a dynamiczny)

Jednak odpowiedź na to pytanie jest abstrakcyjna. Jeśli chodzi o niektóre szczegóły, jeśli masz ciągłe pokrycie wieloboków lub inną sytuację, w której elementy dzielą granice, model topojsona pozwala wykorzystać nadmiarowość i uwzględnić to w modelu.

Przeczytaj dokumentację, przeanalizuj przykłady (np. Bl.ocks.org), a następnie pobierz trochę danych i przedstaw je zarówno w geojson, jak i topojson i utwórz własne wizualizacje.

wsvekla
źródło
Dzięki wsvekla. Robiłem to - w rzeczywistości znalazłem twoje punkty na bl.ocks.org ( bl.ocks.org/wsvekla/4533258 bl.ocks.org/4348435 ), ale nie jest to łatwe do wyszukania w Google. Jednak, jak zauważyłeś, istnieje wiele rozważań i staram się zbadać porównania obok siebie, aby się tego nauczyć.
Łukasz,
2
Te dwa bloki odnoszą się do tego samego oryginalnego pliku shapefile : bl.ocks.org/4485308 i bl.ocks.org/4348435 . TopoJSON naprawdę zaczął się zagłębiać, kiedy w końcu zrozumiałem, jak mogę przedstawić wiele obiektów (granice krajowe, wydziałowe i miejskie) z tymi samymi danymi w tym samym pliku (nie możesz tego zrobić z geojson). Jest to realizowane poprzez funkcję filtrującą: function (a, b) {return a.id! == b.id;}). Spróbuj to zrozumieć, a topojson zacznie mieć sens. Aby uzyskać lepsze odniesienie do kodu i czysty
wsvekla