As promised in my recent post “Experiments with Conway’s Game of Life”, I have been been looking into how to improve my first implementation. The new version which you can now find on Github is fully contained in one Python script which runs in the QGIS console. Additionally, the repository contains a CSV with the grid definition for a Gosper glider gun and the layer style QML.
Rather than creating a new Shapefile for each iteration like in the first implementation, this script uses memory layers to save the game status.
You can see it all in action in the following video:
(video available in HD)
Thanks a lot to Nathan Woodrow for the support in getting the animation running!
Sometimes there are still hick-ups causing steps to be skipped but overall it is running nicely now. Another approach would be to change the layer attributes rather than creating more and more layers but I like to be able to go through all the resulting layers after they have been computed.
This experiment is motivated by a discussion I had with Dr. Claus Rinner about introducing students to GIS concepts using Conway’s Game of Life. Conway’s Game of Life is a popular example to demonstrate cellular automata. Based on an input grid of “alive” and “dead” cells, new cell values are computed on each iteration based on four simple rules for the cell and its 8 neighbors:
- Any live cell with fewer than two live neighbours dies, as if caused by under-population.
Any live cell with two or three live neighbours lives on to the next generation.
Any live cell with more than three live neighbours dies, as if by overcrowding.
Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction.
(Source: Wikipedia – Conway’s Game of Life)
Based on these simple rules, effects like the following “glider gun” can be achieved:
“Gospers glider gun” by Kieff – Own work. Licensed under CC BY-SA 3.0 via Wikimedia Commons.
There are some Game of Life implementations for GIS out there, e.g. scripts for ArcGIS or a module for SAGA. Both of these examples are raster-based. Since I couldn’t find any examples of raster manipulation like this in pyQGIS, I decided to instead implement a vector version: a Processing script which receives an input grid of cells and outputs the next iteration based on the rules of Game of Life. In the following screencast, you can see the Processing script being called repeatedly by a script from the Python console:
So far, it’s a quick and dirty first implementation. To make it more smooth, I’m considering adding spatial indexing and using memory layers instead of having Processing create a bunch of Shapefiles.
It would also be interesting to see a raster version done in PyQGIS. Please leave a comment if you have any ideas how this could be achieved.
Did you know that there is a network analysis library in QGIS core? It’s well hidden so far, but at least it’s documented in the PyQGIS Cookbook. The code samples from the cookbook can be used in the QGIS Python console and you can play around to get a grip of what the different steps are doing.
As a first exercise, I’ve decided to write a Processing script which will use the network analysis library to create a network-based route layer from a point layer input. You can find the result on Github.
You can get a Spatialite file with testdata from Github as well. It contains a network and a routepoints1 layer:
The interface of the points_to_route tool is very simple. All it needs as an input is information about which layer should be used as a network and which layer contains the route points:
The input points are considered to be ordered. The tool always routes between consecutive points.
The result is a line layer with one line feature for each point pair:
The network analysis library is a really great new feature and I hope we will see a lot of tools built on top of it.
This post summarizes how to install sphinx on Windows to contribute to PyQGIS Cookbook. I’m writing this as I go, so this most likely won’t be perfect.
I used my Python 2.6 stand-alone installation (not the one in OSGeo4W).
- Get the Sphinx egg from http://pypi.python.org/pypi/Sphinx
- If you don’t have it, install setuptools to get the easy_install script http://pypi.python.org/pypi/setuptools
- In C:\Python26\Scripts run
easy_install -U sphinx
- Get the PyQGIS source from https://github.com/qgis/QGIS-Developer-Cookbook
- Create a build folder inside the QGIS-Developer-Cookbook
- Now you can build the Cookbook:
sphinx-build "C:\Users\Anita\QGIS\QGIS-Developer-Cookbook\source" "C:\Users\Anita\QGIS\QGIS-Developer-Cookbook\build"
The build folder should now contain the Cookbook .html files.
In his post “Layer list widget for PyQGIS applications”, German Carrillo describes how to add a legend to your own PyQGIS application. You get to download the source code for the legend widget to include into your project.