2010-02-10

Global Temperature Change Map

My first project with Google App Engine was a Google Map that displayed temperature data for a given date. I used monthly grid data provided by NOAA. With this data the Earth is divided up into 5x5 degree grids for a total of 2592 grids. I wrote a simple Perl script to parse the NOAA data, find the min and max temperatures, generalize each temperature point into a scale of 1 (min) to 9 (max), calculate the latitude and longitude for each corner of the grid, and write a CSV file suitable for upload to the datastore.

For the backend I wrote a Python script that created a kml of the data for the requested date. In the kml, each temperature range is a separate Placemark, and within each Placemark are GPolygons representing the grid data.

The frontend used JavaScript and jQuery to load the kml as a GGeoXml. There was also a play button that steps through all the available dates.

Unfortunately only 1 GPolygon for each Placemark would load. So I re-wrote the Perl script to output encoded polylines instead of latitude, longitude coordinates. I also wrote a Perl modulino (ISC License) to convert a set of coordinates to an encoded polyline string.

The backend was rewritten to output the data in JSON instead of a kml.

The frontend was rewritten to create GPolygons using the encoded polylines.

This time all the polygons were created correctly. The first date I tested was 1880-01 with around 200 temperature grids. With this many grids, the tab running my map consumed over 300MB of memory. Therefore, I didn't even try loading the most recent date, as it probably had over 2000 temperature grids. My conclusion from this project is that only a few polygons can be created on a Google Map. Here is a screenshot of the application. Note that the date range is only from 1880-01 to 1880-11 so the temperature range is quite small.

No comments:

PreferenceKey Quirks

PreferenceKey has a few quirks that have tripped me up. One is the reduce(value:nextValue:) implementation. The other is that a PreferenceKe...