A small Python script that makes JSON smaller by removing space and reducing float precision.
#3 Compare This branch is 9 commits ahead of migurski:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Compressing GeoJSON

GeoJSON can get quite big when you need represent complex maps with lots of polygons. Even though it compresses well, being text, it can still be quite a hassle to store and upload to a website in uncompressed form.

Recently while working on a web app which requires the upload of maps in GeoJSON format, I stumbled upon Google App Engine's limitation of 32MB for POST requests. At that point I realized that I'd have to look for a way to compress it before uploading, but rather that just asking users to gzipping before uploading, I decided to look into ways to make a GeoJSON map lighter by eliminating redundancies and perhaps reducing the level of detail a little bit. You see, a single polygon (representing a state or a county), may be composed of thousands of points, each one represented by an array of two floating point numbers. That's a lot of bytes!

Soon my search took me to TopoJSON by Mike Bostok, which is great but is not compatible with GeoJSON, so it was not what I was looking for. But reading about TopoJSON, led me to LilJSON and this paper: www2.dcs.hull.ac.uk/CISRG/publications/DPs/DP10/DP10.html

After looking at those resources, it was time to get my fingers typing. So I forked LilJSON which already achieved some compression by reducing the precision of the floating points in the GeoJSON. After a while I had a mildly improved version of it, which contributed back via Pull Request. I then set out to implement Visvalingam's algorithm, which aimed a simplifying polygonal lines while trying not to alter too much the original area (and shape) of the polygon.

I was very surprised to find out that both techniques combined, the reduction of coordinate precision and the simplification of lines, yielded a very nice compression of my test GeoJSON: It went from 62MB to a mere 5.1MB!! And all of this could still be reduced by a factor of ten by Gzipping it.

Just to check how well my compressed version stood up to the original, I opened both in Quantum GIS and was blown away, the differences were tiny! only maginifying A LOT, I was able to see the the diferences. I am not including an image here to encourage you to try for yourself. ;-)