2010-03-27 04:14:53 +08:00
===================
GeoDjango Model API
===================
.. module:: django.contrib.gis.db.models
:synopsis: GeoDjango model and field API.
This document explores the details of the GeoDjango Model API. Throughout this
2010-08-20 03:27:44 +08:00
section, we'll be using the following geographic model of a `ZIP code`__ as our
2010-03-27 04:14:53 +08:00
example::
from django.contrib.gis.db import models
2010-08-20 03:27:44 +08:00
2010-03-27 04:14:53 +08:00
class Zipcode(models.Model):
code = models.CharField(max_length=5)
poly = models.PolygonField()
objects = models.GeoManager()
__ http://en.wikipedia.org/wiki/ZIP_code
Geometry Field Types
====================
2010-08-20 03:27:44 +08:00
Each of the following geometry field types correspond with the
2010-03-27 04:14:53 +08:00
OpenGIS Simple Features specification [#fnogc]_.
``GeometryField``
-----------------
.. class:: GeometryField
``PointField``
--------------
.. class:: PointField
``LineStringField``
-------------------
.. class:: LineStringField
``PolygonField``
----------------
.. class:: PolygonField
``MultiPointField``
-------------------
.. class:: MultiPointField
``MultiLineStringField``
------------------------
.. class:: MultiLineStringField
``MultiPolygonField``
---------------------
.. class:: MultiPolygonField
``GeometryCollectionField``
---------------------------
.. class:: GeometryCollectionField
.. _geometry-field-options:
Geometry Field Options
======================
In addition to the regular :ref:`common-model-field-options` available for
Django model fields, geometry fields have the following additional options.
All are optional.
``srid``
--------
.. attribute:: GeometryField.srid
Sets the SRID [#fnogcsrid]_ (Spatial Reference System Identity) of the geometry field to
the given value. Defaults to 4326 (also known as `WGS84`__, units are in degrees
of longitude and latitude).
__ http://en.wikipedia.org/wiki/WGS84
.. _selecting-an-srid:
Selecting an SRID
^^^^^^^^^^^^^^^^^
Choosing an appropriate SRID for your model is an important decision that the
2010-08-20 03:27:44 +08:00
developer should consider carefully. The SRID is an integer specifier that
2010-03-27 04:14:53 +08:00
corresponds to the projection system that will be used to interpret the data
in the spatial database. [#fnsrid]_ Projection systems give the context to the
coordinates that specify a location. Although the details of `geodesy`__ are
beyond the scope of this documentation, the general problem is that the earth
2010-10-09 16:12:50 +08:00
is spherical and representations of the earth (e.g., paper maps, Web maps)
2010-03-27 04:14:53 +08:00
are not.
Most people are familiar with using latitude and longitude to reference a
location on the earth's surface. However, latitude and longitude are angles,
not distances. [#fnharvard]_ In other words, while the shortest path between two points on
a flat surface is a straight line, the shortest path between two points on a curved
surface (such as the earth) is an *arc* of a `great circle`__. [#fnthematic]_ Thus,
2010-08-20 03:27:44 +08:00
additional computation is required to obtain distances in planar units (e.g.,
2010-03-27 04:14:53 +08:00
kilometers and miles). Using a geographic coordinate system may introduce
2014-11-13 21:38:19 +08:00
complications for the developer later on. For example, Spatialite does not have
the capability to perform distance calculations between geometries using
geographic coordinate systems, e.g. constructing a query to find all points
within 5 miles of a county boundary stored as WGS84.
2010-03-31 07:15:43 +08:00
[#fndist]_
2010-03-27 04:14:53 +08:00
2010-08-20 03:27:44 +08:00
Portions of the earth's surface may projected onto a two-dimensional, or
2010-03-27 04:14:53 +08:00
Cartesian, plane. Projected coordinate systems are especially convenient
for region-specific applications, e.g., if you know that your database will
2010-08-20 03:27:44 +08:00
only cover geometries in `North Kansas`__, then you may consider using projection
system specific to that region. Moreover, projected coordinate systems are
defined in Cartesian units (such as meters or feet), easing distance
2010-03-27 04:14:53 +08:00
calculations.
.. note::
2014-02-23 01:30:28 +08:00
If you wish to perform arbitrary distance queries using non-point
2014-11-13 21:38:19 +08:00
geometries in WGS84 in PostGIS and you want decent performance, enable the
:attr:`GeometryField.geography` keyword so that :ref:`geography database
type <geography-type>` is used instead.
2010-03-27 04:14:53 +08:00
Additional Resources:
2010-08-20 03:27:44 +08:00
* `spatialreference.org`__: A Django-powered database of spatial reference
2010-03-27 04:14:53 +08:00
systems.
2010-10-09 16:12:50 +08:00
* `The State Plane Coordinate System`__: A Web site covering the various
2010-03-27 04:14:53 +08:00
projection systems used in the United States. Much of the U.S. spatial
data encountered will be in one of these coordinate systems rather than
in a geographic coordinate system such as WGS84.
__ http://en.wikipedia.org/wiki/Geodesy
__ http://en.wikipedia.org/wiki/Great_circle
__ http://www.spatialreference.org/ref/epsg/2796/
__ http://spatialreference.org/
2012-06-28 16:49:07 +08:00
__ http://web.archive.org/web/20080302095452/http://welcome.warnercnr.colostate.edu/class_info/nr502/lg3/datums_coordinates/spcs.html
2010-03-27 04:14:53 +08:00
``spatial_index``
-----------------
.. attribute:: GeometryField.spatial_index
Defaults to ``True``. Creates a spatial index for the given geometry
2010-08-20 03:27:44 +08:00
field.
2010-03-27 04:14:53 +08:00
.. note::
This is different from the ``db_index`` field option because spatial
indexes are created in a different manner than regular database
indexes. Specifically, spatial indexes are typically created using
a variant of the R-Tree, while regular database indexes typically
use B-Trees.
``dim``
-------
.. attribute:: GeometryField.dim
This option may be used for customizing the coordinate dimension of the
geometry field. By default, it is set to 2, for representing two-dimensional
geometries. For spatial backends that support it, it may be set to 3 for
2014-02-15 18:36:53 +08:00
three-dimensional support.
2010-03-27 04:14:53 +08:00
.. note::
2013-12-24 22:57:13 +08:00
At this time 3D support is limited to the PostGIS spatial backend.
2010-03-27 04:14:53 +08:00
``geography``
-------------
.. attribute:: GeometryField.geography
2010-03-31 07:15:43 +08:00
If set to ``True``, this option will create a database column of
2010-08-20 03:27:44 +08:00
type geography, rather than geometry. Please refer to the
2010-03-27 04:14:53 +08:00
:ref:`geography type <geography-type>` section below for more
details.
.. note::
Geography support is limited only to PostGIS 1.5+, and will
force the SRID to be 4326.
.. _geography-type:
Geography Type
^^^^^^^^^^^^^^
2012-12-25 06:10:40 +08:00
In PostGIS 1.5, the geography type was introduced -- it provides
2011-12-17 10:00:20 +08:00
native support for spatial features represented with geographic
2010-03-27 04:14:53 +08:00
coordinates (e.g., WGS84 longitude/latitude). [#fngeography]_
Unlike the plane used by a geometry type, the geography type uses a spherical
representation of its data. Distance and measurement operations
performed on a geography column automatically employ great circle arc
calculations and return linear units. In other words, when ``ST_Distance``
is called on two geographies, a value in meters is returned (as opposed
to degrees if called on a geometry column in WGS84).
Because geography calculations involve more mathematics, only a subset of the
PostGIS spatial lookups are available for the geography type. Practically,
this means that in addition to the :ref:`distance lookups <distance-lookups>`
2010-08-20 03:27:44 +08:00
only the following additional :ref:`spatial lookups <spatial-lookups>` are
2010-03-27 04:14:53 +08:00
available for geography columns:
* :lookup:`bboverlaps`
* :lookup:`coveredby`
* :lookup:`covers`
* :lookup:`intersects`
For more information, the PostGIS documentation contains a helpful section on
determining `when to use geography data type over geometry data type
2014-12-20 01:07:03 +08:00
<http://postgis.net/docs/manual-1.5/ch04.html#PostGIS_GeographyVSGeometry>`_.
2010-03-27 04:14:53 +08:00
``GeoManager``
==============
.. currentmodule:: django.contrib.gis.db.models
.. class:: GeoManager
2010-08-20 03:27:44 +08:00
In order to conduct geographic queries, each geographic model requires
2010-03-27 04:14:53 +08:00
a ``GeoManager`` model manager. This manager allows for the proper SQL
2010-08-20 03:27:44 +08:00
construction for geographic queries; thus, without it, all geographic filters
2010-03-27 04:14:53 +08:00
will fail. It should also be noted that ``GeoManager`` is required even if the
2010-08-20 03:27:44 +08:00
model does not have a geographic field itself, e.g., in the case of a
``ForeignKey`` relation to a model with a geographic field. For example,
if we had an ``Address`` model with a ``ForeignKey`` to our ``Zipcode``
2010-03-27 04:14:53 +08:00
model::
from django.contrib.gis.db import models
class Address(models.Model):
num = models.IntegerField()
street = models.CharField(max_length=100)
city = models.CharField(max_length=100)
2012-12-25 06:10:40 +08:00
state = models.CharField(max_length=2)
2010-03-27 04:14:53 +08:00
zipcode = models.ForeignKey(Zipcode)
objects = models.GeoManager()
2010-08-20 03:27:44 +08:00
The geographic manager is needed to do spatial queries on related ``Zipcode`` objects,
2010-03-27 04:14:53 +08:00
for example::
qs = Address.objects.filter(zipcode__poly__contains='POINT(-104.590948 38.319914)')
.. rubric:: Footnotes
2012-06-28 16:49:07 +08:00
.. [#fnogc] OpenGIS Consortium, Inc., `Simple Feature Specification For SQL <http://www.opengeospatial.org/standards/sfs>`_.
2010-03-27 04:14:53 +08:00
.. [#fnogcsrid] *See id.* at Ch. 2.3.8, p. 39 (Geometry Values and Spatial Reference Systems).
.. [#fnsrid] Typically, SRID integer corresponds to an EPSG (`European Petroleum Survey Group <http://www.epsg.org>`_) identifier. However, it may also be associated with custom projections defined in spatial database's spatial reference systems table.
2010-08-20 03:27:44 +08:00
.. [#fnharvard] Harvard Graduate School of Design, `An Overview of Geodesy and Geographic Referencing Systems <http://www.gsd.harvard.edu/gis/manual/projections/fundamentals/>`_. This is an excellent resource for an overview of principles relating to geographic and Cartesian coordinate systems.
2010-03-27 04:14:53 +08:00
.. [#fnthematic] Terry A. Slocum, Robert B. McMaster, Fritz C. Kessler, & Hugh H. Howard, *Thematic Cartography and Geographic Visualization* (Prentice Hall, 2nd edition), at Ch. 7.1.3.
2010-03-31 07:15:43 +08:00
.. [#fndist] This limitation does not apply to PostGIS 1.5. It should be noted that even in previous versions of PostGIS, this isn't impossible using GeoDjango; you could for example, take a known point in a projected coordinate system, buffer it to the appropriate radius, and then perform an intersection operation with the buffer transformed to the geographic coordinate system.
2014-12-20 01:07:03 +08:00
.. [#fngeography] Please refer to the `PostGIS Geography Type <http://postgis.net/docs/manual-1.5/ch04.html#PostGIS_Geography>`_ documentation for more details.