Author: julien Date: 2011-09-28 07:00:43 -0700 (Wed, 28 Sep 2011) New Revision: 16911
Modified: django/trunk/docs/ref/contrib/gis/tutorial.txt Log: Fixed #16949 -- Fixed a small typo in the GIS tutorial and also made some minor PEP8 fixes and added some code-block directives while I was at it. Thanks to jgomo3 for the report. Modified: django/trunk/docs/ref/contrib/gis/tutorial.txt =================================================================== --- django/trunk/docs/ref/contrib/gis/tutorial.txt 2011-09-28 02:26:12 UTC (rev 16910) +++ django/trunk/docs/ref/contrib/gis/tutorial.txt 2011-09-28 14:00:43 UTC (rev 16911) @@ -7,7 +7,8 @@ GeoDjango is an add-on for Django that turns it into a world-class geographic Web framework. GeoDjango strives to make it as simple as possible to create -geographic Web applications, like location-based services. Some features include: +geographic Web applications, like location-based services. Some features +include: * Django model fields for `OGC`_ geometries. * Extensions to Django's ORM for the querying and manipulation of spatial data. @@ -16,8 +17,8 @@ * Editing of geometry fields inside the admin. This tutorial assumes a familiarity with Django; thus, if you're brand new to -Django please read through the :doc:`regular tutorial </intro/tutorial01>` to introduce -yourself with basic Django concepts. +Django please read through the :doc:`regular tutorial </intro/tutorial01>` to +introduce yourself with basic Django concepts. .. note:: @@ -52,16 +53,21 @@ First, a spatial database needs to be created for our project. If using PostgreSQL and PostGIS, then the following commands will -create the database from a :ref:`spatial database template <spatialdb_template>`:: +create the database from a :ref:`spatial database template +<spatialdb_template>`: +.. code-block:: bash + $ createdb -T template_postgis geodjango .. note:: This command must be issued by a database user that has permissions to create a database. Here is an example set of commands to create such - a user:: + a user: + .. code-block:: bash + $ sudo su - postgres $ createuser --createdb geo $ exit @@ -76,20 +82,25 @@ Create GeoDjango Project ------------------------ -Use the ``django-admin.py`` script like normal to create a ``geodjango`` project:: +Use the ``django-admin.py`` script like normal to create a ``geodjango`` +project: +.. code-block:: bash + $ django-admin.py startproject geodjango With the project initialized, now create a ``world`` Django application within -the ``geodjango`` project:: +the ``geodjango`` project: +.. code-block:: bash + $ cd geodjango $ python manage.py startapp world Configure ``settings.py`` ------------------------- -The ``geodjango`` project settings are stored in the ``settings.py`` file. Edit +The ``geodjango`` project settings are stored in the ``settings.py`` file. Edit the database connection settings appropriately:: DATABASES = { @@ -126,10 +137,12 @@ World Borders ------------- -The world borders data is available in this `zip file`__. Create a data directory -in the ``world`` application, download the world borders data, and unzip. -On GNU/Linux platforms the following commands should do it:: +The world borders data is available in this `zip file`__. Create a data +directory in the ``world`` application, download the world borders data, and +unzip. On GNU/Linux platforms the following commands should do it: +.. code-block:: bash + $ mkdir world/data $ cd world/data $ wget http://thematicmapping.org/downloads/TM_WORLD_BORDERS-0.3.zip @@ -138,7 +151,8 @@ The world borders ZIP file contains a set of data files collectively known as an `ESRI Shapefile`__, one of the most popular geospatial data formats. When -unzipped the world borders data set includes files with the following extensions: +unzipped the world borders data set includes files with the following +extensions: * ``.shp``: Holds the vector data for the world borders geometries. * ``.shx``: Spatial index file for geometries stored in the ``.shp``. @@ -154,8 +168,10 @@ --------------------------------------- The GDAL ``ogrinfo`` utility is excellent for examining metadata about -shapefiles (or other vector data sources):: +shapefiles (or other vector data sources): +.. code-block:: bash + $ ogrinfo world/data/TM_WORLD_BORDERS-0.3.shp INFO: Open of `world/data/TM_WORLD_BORDERS-0.3.shp' using driver `ESRI Shapefile' successful. @@ -163,8 +179,10 @@ Here ``ogrinfo`` is telling us that the shapefile has one layer, and that layer contains polygon data. To find out more we'll specify the layer name -and use the ``-so`` option to get only important summary information:: +and use the ``-so`` option to get only important summary information: +.. code-block:: bash + $ ogrinfo -so world/data/TM_WORLD_BORDERS-0.3.shp TM_WORLD_BORDERS-0.3 INFO: Open of `world/data/TM_WORLD_BORDERS-0.3.shp' using driver `ESRI Shapefile' successful. @@ -197,8 +215,8 @@ ``FIPS: String (2.0)`` indicates that there's a ``FIPS`` character field with a maximum length of 2; similarly, ``LON: Real (8.3)`` is a floating-point field that holds a maximum of 8 digits up to three decimal places. Although -this information may be found right on the `world borders`_ Web site, this shows -you how to determine this information yourself when such metadata is not +this information may be found right on the `world borders`_ Web site, this +shows you how to determine this information yourself when such metadata is not provided. Geographic Models @@ -243,25 +261,28 @@ :class:`~django.contrib.gis.db.models.GeoManager`; this is *required* to perform spatial queries. -When declaring a geometry field on your model the default spatial reference system -is WGS84 (meaning the `SRID`__ is 4326) -- in other words, the field coordinates are in -longitude/latitude pairs in units of degrees. If you want the coordinate system to be -different, then SRID of the geometry field may be customized by setting the ``srid`` -with an integer corresponding to the coordinate system of your choice. +When declaring a geometry field on your model the default spatial reference +system is WGS84 (meaning the `SRID`__ is 4326) -- in other words, the field +coordinates are in longitude/latitude pairs in units of degrees. If you want +the coordinate system to be different, then SRID of the geometry field may be +customized by setting the ``srid`` with an integer corresponding to the +coordinate system of your choice. __ http://en.wikipedia.org/wiki/SRID Run ``syncdb`` -------------- -After you've defined your model, it needs to be synced with the spatial database. -First, let's look at the SQL that will generate the table for the ``WorldBorder`` -model:: +After you've defined your model, it needs to be synced with the spatial +database. First, let's look at the SQL that will generate the table for the +``WorldBorder`` model:: $ python manage.py sqlall world -This management command should produce the following output:: +This management command should produce the following output: +.. code-block:: sql + BEGIN; CREATE TABLE "world_worldborders" ( "id" serial NOT NULL PRIMARY KEY, @@ -290,18 +311,19 @@ Creating table world_worldborders Installing custom SQL for world.WorldBorder model -The ``syncdb`` command may also prompt you to create an admin user; go ahead and -do so (not required now, may be done at any point in the future using the +The ``syncdb`` command may also prompt you to create an admin user; go ahead +and do so (not required now, may be done at any point in the future using the ``createsuperuser`` management command). Importing Spatial Data ====================== This section will show you how to take the data from the world borders -shapefile and import it into GeoDjango models using the :ref:`ref-layermapping`. -There are many different different ways to import data in to a -spatial database -- besides the tools included within GeoDjango, you -may also use the following to populate your spatial database: +shapefile and import it into GeoDjango models using the +:ref:`ref-layermapping`. +There are many different ways to import data in to a spatial database -- +besides the tools included within GeoDjango, you may also use the following to +populate your spatial database: * `ogr2ogr`_: Command-line utility, included with GDAL, that supports loading a multitude of vector data formats into @@ -322,8 +344,10 @@ library -- in other words, you'll be able explore all the vector data sources that OGR supports via a Pythonic API. -First, invoke the Django shell:: +First, invoke the Django shell: +.. code-block:: bash + $ python manage.py shell If the :ref:`worldborders` data was downloaded like earlier in the @@ -385,7 +409,8 @@ '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs ' Here we've noticed that the shapefile is in the popular WGS84 spatial reference -system -- in other words, the data uses units of degrees longitude and latitude. +system -- in other words, the data uses units of degrees longitude and +latitude. In addition, shapefiles also support attribute fields that may contain additional data. Here are the fields on the World Borders layer: @@ -484,8 +509,10 @@ the shapefile. This ensures that string values are read and saved correctly from their original encoding system. -Afterwards, invoke the Django shell from the ``geodjango`` project directory:: +Afterwards, invoke the Django shell from the ``geodjango`` project directory: +.. code-block:: bash + $ python manage.py shell Next, import the ``load`` module, call the ``run`` routine, and watch ``LayerMapping`` @@ -502,11 +529,13 @@ Now that you've seen how to define geographic models and import data with the :ref:`ref-layermapping`, it's possible to further automate this process with use of the :djadmin:`ogrinspect` management command. The :djadmin:`ogrinspect` -command introspects a GDAL-supported vector data source (e.g., a shapefile) and -generates a model definition and ``LayerMapping`` dictionary automatically. +command introspects a GDAL-supported vector data source (e.g., a shapefile) +and generates a model definition and ``LayerMapping`` dictionary automatically. -The general usage of the command goes as follows:: +The general usage of the command goes as follows: +.. code-block:: bash + $ python manage.py ogrinspect [options] <data_source> <model_name> [options] Where ``data_source`` is the path to the GDAL-supported data source and @@ -514,15 +543,18 @@ be used to further define how the model is generated. For example, the following command nearly reproduces the ``WorldBorder`` model -and mapping dictionary created above, automatically:: +and mapping dictionary created above, automatically: +.. code-block:: bash + $ python manage.py ogrinspect world/data/TM_WORLD_BORDERS-0.3.shp WorldBorder --srid=4326 --mapping --multi A few notes about the command-line options given above: * The ``--srid=4326`` option sets the SRID for the geographic field. * The ``--mapping`` option tells ``ogrinspect`` to also generate a - mapping dictionary for use with :class:`~django.contrib.gis.utils.LayerMapping`. + mapping dictionary for use with + :class:`~django.contrib.gis.utils.LayerMapping`. * The ``--multi`` option is specified so that the geographic field is a :class:`~django.contrib.gis.db.models.MultiPolygonField` instead of just a :class:`~django.contrib.gis.db.models.PolygonField`. @@ -571,8 +603,10 @@ --------------- GeoDjango extends the Django ORM and allows the use of spatial lookups. Let's do an example where we find the ``WorldBorder`` model that contains -a point. First, fire up the management shell:: +a point. First, fire up the management shell: +.. code-block:: bash + $ python manage.py shell Now, define a point of interest [#]_:: @@ -592,8 +626,8 @@ Here we retrieved a ``GeoQuerySet`` that has only one model: the one for the United States (which is what we would expect). Similarly, -a :ref:`GEOS geometry object <ref-geos>` may also be used -- here the ``intersects`` -spatial lookup is combined with the ``get`` method to retrieve +a :ref:`GEOS geometry object <ref-geos>` may also be used -- here the +``intersects`` spatial lookup is combined with the ``get`` method to retrieve only the ``WorldBorder`` instance for San Marino instead of a queryset:: >>> from django.contrib.gis.geos import Point @@ -641,9 +675,9 @@ Lazy Geometries --------------- Geometries come to GeoDjango in a standardized textual representation. Upon -access of the geometry field, GeoDjango creates a `GEOS geometry object <ref-geos>`, -exposing powerful functionality, such as serialization properties for -popular geospatial formats:: +access of the geometry field, GeoDjango creates a `GEOS geometry object +<ref-geos>`, exposing powerful functionality, such as serialization properties +for popular geospatial formats:: >>> sm = WorldBorder.objects.get(name='San Marino') >>> sm.mpoly @@ -706,8 +740,10 @@ (r'^admin/', include(admin.site.urls)), ) -Start up the Django development server:: +Start up the Django development server: +.. code-block:: bash + $ python manage.py runserver Finally, browse to ``http://localhost:8000/admin/``, and log in with the admin -- You received this message because you are subscribed to the Google Groups "Django updates" group. To post to this group, send email to django-updates@googlegroups.com. To unsubscribe from this group, send email to django-updates+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-updates?hl=en.