Version 34 (modified by jbronn, 12 years ago) (diff)


The gis branch intends to add a contrib app implementing geographic support.

What's GIS?

  • Series of blog posts giving intro to GIS; choice quote from an early post: "If you feel like ending a conversation with a developer then simply bring up the topic of character encodings ... [o]r ... coordinate systems. ... So in the spirit of Tim Bray's and Joel Spolsky's wonderful writeups of character encodings, I thought I'd put together a basic survival guide to coordinate systems over my next few posts and then tie it back to Google Maps."
  • More on map projections, including why people can't agree on just one (utf-8).
  • geodesy the field of science for this stuff.

Useful code

  • PostGIS, the OpenGIS SQL Types (pdf) implementation for Postgresql
  • GEOS, low-level C++ port of Jave Topology Suite, used by PostGIS
  • GeoTypes is a type (and conversion) library for PostGIS via psycopg.
  • Geopy
    • Calculates distances using (very accurate) Vincenty, and uses the WGS 84 datum by default.
    • Has utility functions for unit of measurement (UOM) conversions (e.g. meters -> kilometers, kilometers -> miles, etc.)
    • Excellent GeoCoding capabilites. Has interfaces for Google, Yahoo, Microsoft Live, MediaWiki, and
  • GDAL/OGR, a library for fiddling with raster geo images.
    • Has a Python interface. A SWIG interface is in development, but not yet stable (no access to full API).
  • Geo::Coder::US An excellent Perl library for GeoCoding that powers Users can create their own Geographic databases using the Census Bureau's TIGER/Line data (see below).
  • GeoRosetta, CC-BY-SA licensed, quality-controlled, collection of geocoding data. Not yet released to public(?).
  • MapServer: University of Minnesota (UMN) "open source development environment for building spatially-enabled internet applications."
  • MapNik: C++ and Python toolkit for developing mapping applications. Claimed benefits over MapServer: "It uses the AGG library and offers world class anti-aliasing rendering with subpixel accuracy for geographic data. It is written from scratch in modern C++ and doesn't suffer from design decisions made a decade ago." See MapNik FAQ.
  • Ruby on Rails
    • IvyGIS: Google-maps type displays with RoR and UMN's MapServer
    • Spatial Adapter for Rails: A plugin for Rails which manages the MySql Spatial and PostGIS geometric columns in a transparent way (that is like the other base data type columns). This might have some useful techniques for when we try to support other spatial extensions other than PostGIS.

Useful Data

  • TIGER/Line: "The TIGER/Line files are extracts of selected geographic and cartographic information from the Census Bureau's TIGER® (Topologically Integrated Geographic Encoding and Referencing) database." This data is useful in creating your own geocoding database service. Currently 2006 First Edition is the latest, but second edition should be coming soon. Note: The Census Bureau will be providing SHP files in Fall, 2007.


  • When dealing with points (say, degrees) from, do they need to be converted to be useful on the back-end data, assuming -that- data is in degrees? Is it enough to have the same datum and origin? (Reading the intro above is likely to answer the question.)
    • My (JDunck) reading indicates yes. Given the same coordinate system (i.e. datum, origin, and axes), degrees are useful without conversion.


Phase 1

  • Create Geometry-enabled fields and manager. Status: complete (not yet in SVN).
  • Allow for Geometry-enabled queries. Status: complete (not yet in SVN).
  • Here is an example of how the model API currently works (assume this example is in geo_app/
    from django.contrib.gis.db import models
    class District(models.Model):
        name = models.CharField(maxlength=35)
        num  = models.IntegerField()
        poly = models.MultiPolygonField()
        objects = models.GeoManager()
    class School(models.Model):
        name  = models.CharField(maxlength=35)
        point = models.PointField()
        objects = models.GeoManager()
  • Use the just like you normally would:
    $ python sqlall geo_app
    CREATE TABLE "geo_app_school" (
        "id" serial NOT NULL PRIMARY KEY,
        "name" varchar(35) NOT NULL
    CREATE TABLE "geo_app_district" (
        "id" serial NOT NULL PRIMARY KEY,
        "name" varchar(35) NOT NULL,
        "num" integer NOT NULL
    SELECT AddGeometryColumn('geo_app_school', 'point', 4326, 'POINT', 2);
    SELECT AddGeometryColumn('geo_app_district', 'poly', 4326, 'MULTIPOLYGON', 2);
    $ python syncdb geo_app
  • PostGIS additions to the API may now be used:
    >>> from geo_app.models import District, School
    >>> qs1 = District.objects.filter(poly__bbcontains='POINT(-95.362293 29.756539)') # Same as PostGIS '&&' operator
    >>> qs2 = District.objects.filter(poly__intersects='POINT(-95.362293 29.756539)') # Same as PostGIS Intersects() (from GEOS)

Phase 2

  • Add as much from the PostGIS as possible.
  • Add geometry-enabled routines to the fields that call directly on GEOS routines -- like area(), centroid(), etc.
  • Contemplate a JS framework for mapping. I know Django community is against including any type of JS/AJAX framework, but having a way to generate maps would be a great addition. Also, any type of framework would be limited to the contrib package only.


Installation of the GeoDjango module will also require the installation of existing open source geographic libraries and a spatial database (currently only PostGIS). This section will describe the installation process for these libraries. Initially, these instructions will pertain only to a Linux platform (particularly Debian or Ubuntu). Mac & Windows support will be considered later; however, these instructions will most likely work through the Mac shell. Don't hold your breath for Windows support.


  • Required


  • Required


  • Required


  • Optional, but useful for coordinate transformations.
Back to Top