{"title":"GeoDjango Tutorial","version":"1.11","locale":"es","docname":"ref/contrib/gis/tutorial","url":"/es/1.11/ref/contrib/gis/tutorial/","canonical":"https://djangodocs.dev/es/1.11/ref/contrib/gis/tutorial/","summary":"Introduction Link to this heading # GeoDjango is an included contrib module for Django that turns it into a world-class geographic Web framework. GeoDjango strives…","html":"<h1>GeoDjango Tutorial<a class=\"heading-anchor\" href=\"#geodjango-tutorial\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"introduction\">\n<h2>Introduction<a class=\"heading-anchor\" href=\"#introduction\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>GeoDjango is an included contrib module for Django that turns it into a\nworld-class geographic Web framework.  GeoDjango strives to make it as simple\nas possible to create geographic Web applications, like location-based services.\nIts features include:</p>\n<ul class=\"simple\">\n<li><p>Django model fields for <a class=\"reference external\" href=\"http://www.opengeospatial.org/\">OGC</a> geometries and raster data.</p></li>\n<li><p>Extensions to Django’s ORM for querying and manipulating spatial data.</p></li>\n<li><p>Loosely-coupled, high-level Python interfaces for GIS geometry and raster\noperations and data manipulation in different formats.</p></li>\n<li><p>Editing geometry fields from the admin.</p></li>\n</ul>\n<p>This tutorial assumes familiarity with Django; thus, if you’re brand new to\nDjango, please read through the <a class=\"reference internal\" href=\"/es/1.11/intro/tutorial01/\"><span class=\"doc\">regular tutorial</span></a> to\nfamiliarize yourself with Django first.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>GeoDjango has additional requirements beyond what Django requires –\nplease consult the <a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/install/\"><span class=\"doc\">installation documentation</span></a>\nfor more details.</p>\n</aside>\n<p>This tutorial will guide you through the creation of a geographic web\napplication for viewing the <a class=\"reference external\" href=\"http://thematicmapping.org/downloads/world_borders.php\">world borders</a>. <a class=\"footnote-reference brackets\" href=\"#id10\" id=\"id1\" role=\"doc-noteref\"><span class=\"fn-bracket\">[</span>1<span class=\"fn-bracket\">]</span></a> Some of the code\nused in this tutorial is taken from and/or inspired by the <a class=\"reference external\" href=\"https://code.google.com/p/geodjango-basic-apps/\">GeoDjango\nbasic apps</a> project. <a class=\"footnote-reference brackets\" href=\"#id11\" id=\"id2\" role=\"doc-noteref\"><span class=\"fn-bracket\">[</span>2<span class=\"fn-bracket\">]</span></a></p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>Proceed through the tutorial sections sequentially for step-by-step\ninstructions.</p>\n</aside>\n</section>\n<section id=\"setting-up\">\n<h2>Setting Up<a class=\"heading-anchor\" href=\"#setting-up\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"create-a-spatial-database\">\n<h3>Create a Spatial Database<a class=\"heading-anchor\" href=\"#create-a-spatial-database\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Typically no special setup is required, so you can create a database as you\nwould for any other project. We provide some tips for selected databases:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/install/postgis/\"><span class=\"doc\">Installing PostGIS</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/install/spatialite/\"><span class=\"doc\">Installing SpatiaLite</span></a></p></li>\n</ul>\n</section>\n<section id=\"create-a-new-project\">\n<h3>Create a New Project<a class=\"heading-anchor\" href=\"#create-a-new-project\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Use the standard <code class=\"docutils literal notranslate\"><span class=\"pre\">django-admin</span></code> script to create a project called\n<code class=\"docutils literal notranslate\"><span class=\"pre\">geodjango</span></code>:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>django-admin<span class=\"w\"> </span>startproject<span class=\"w\"> </span>geodjango\n</code></pre></div>\n<p>This will initialize a new project. Now, create a <code class=\"docutils literal notranslate\"><span class=\"pre\">world</span></code> Django application\nwithin the <code class=\"docutils literal notranslate\"><span class=\"pre\">geodjango</span></code> project:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span><span class=\"nb\">cd</span><span class=\"w\"> </span>geodjango\n<span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>startapp<span class=\"w\"> </span>world\n</code></pre></div>\n</section>\n<section id=\"configure-settings-py\">\n<h3>Configure <code class=\"docutils literal notranslate\"><span class=\"pre\">settings.py</span></code><a class=\"heading-anchor\" href=\"#configure-settings-py\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">geodjango</span></code> project settings are stored in the <code class=\"docutils literal notranslate\"><span class=\"pre\">geodjango/settings.py</span></code>\nfile. Edit the database connection settings to match your setup:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">DATABASES</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;default&#39;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n         <span class=\"s1\">&#39;ENGINE&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;django.contrib.gis.db.backends.postgis&#39;</span><span class=\"p\">,</span>\n         <span class=\"s1\">&#39;NAME&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;geodjango&#39;</span><span class=\"p\">,</span>\n         <span class=\"s1\">&#39;USER&#39;</span><span class=\"p\">:</span> <span class=\"s1\">&#39;geo&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">},</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n<p>In addition, modify the <a class=\"reference internal\" href=\"/es/1.11/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a> setting to include\n<a class=\"reference internal\" href=\"/es/1.11/ref/contrib/admin/#module-django.contrib.admin\" title=\"django.contrib.admin: Django's admin site.\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.admin</span></code></a>, <a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/#module-django.contrib.gis\" title=\"django.contrib.gis: Geographic Information System (GIS) extensions for Django\"><code class=\"xref py py-mod docutils literal notranslate\"><span class=\"pre\">django.contrib.gis</span></code></a>,\nand <code class=\"docutils literal notranslate\"><span class=\"pre\">world</span></code> (your newly created application):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">INSTALLED_APPS</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"s1\">&#39;django.contrib.admin&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.auth&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.contenttypes&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.sessions&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.messages&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.staticfiles&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;django.contrib.gis&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;world&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"geographic-data\">\n<h2>Geographic Data<a class=\"heading-anchor\" href=\"#geographic-data\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"worldborders\">\n<span id=\"id3\"></span><h3>World Borders<a class=\"heading-anchor\" href=\"#worldborders\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The world borders data is available in this <a class=\"reference external\" href=\"http://thematicmapping.org/downloads/TM_WORLD_BORDERS-0.3.zip\">zip file</a>.  Create a <code class=\"docutils literal notranslate\"><span class=\"pre\">data</span></code>\ndirectory in the <code class=\"docutils literal notranslate\"><span class=\"pre\">world</span></code> application, download the world borders data, and\nunzip. On GNU/Linux platforms, use the following commands:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>mkdir<span class=\"w\"> </span>world/data\n<span class=\"gp\">$ </span><span class=\"nb\">cd</span><span class=\"w\"> </span>world/data\n<span class=\"gp\">$ </span>wget<span class=\"w\"> </span>http://thematicmapping.org/downloads/TM_WORLD_BORDERS-0.3.zip\n<span class=\"gp\">$ </span>unzip<span class=\"w\"> </span>TM_WORLD_BORDERS-0.3.zip\n<span class=\"gp\">$ </span><span class=\"nb\">cd</span><span class=\"w\"> </span>../..\n</code></pre></div>\n<p>The world borders ZIP file contains a set of data files collectively known as\nan <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Shapefile\">ESRI Shapefile</a>, one of the most popular geospatial data formats.  When\nunzipped, the world borders dataset includes files with the following\nextensions:</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">.shp</span></code>: Holds the vector data for the world borders geometries.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">.shx</span></code>: Spatial index file for geometries stored in the <code class=\"docutils literal notranslate\"><span class=\"pre\">.shp</span></code>.</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">.dbf</span></code>: Database file for holding non-geometric attribute data\n(e.g., integer and character fields).</p></li>\n<li><p><code class=\"docutils literal notranslate\"><span class=\"pre\">.prj</span></code>: Contains the spatial reference information for the geographic\ndata stored in the shapefile.</p></li>\n</ul>\n</section>\n<section id=\"use-ogrinfo-to-examine-spatial-data\">\n<h3>Use <code class=\"docutils literal notranslate\"><span class=\"pre\">ogrinfo</span></code> to examine spatial data<a class=\"heading-anchor\" href=\"#use-ogrinfo-to-examine-spatial-data\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>The GDAL <code class=\"docutils literal notranslate\"><span class=\"pre\">ogrinfo</span></code> utility allows examining the metadata of shapefiles or\nother vector data sources:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>ogrinfo<span class=\"w\"> </span>world/data/TM_WORLD_BORDERS-0.3.shp\n<span class=\"go\">INFO: Open of `world/data/TM_WORLD_BORDERS-0.3.shp&#39;</span>\n<span class=\"go\">      using driver `ESRI Shapefile&#39; successful.</span>\n<span class=\"go\">1: TM_WORLD_BORDERS-0.3 (Polygon)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">ogrinfo</span></code> tells us that the shapefile has one layer, and that this\nlayer contains polygon data.  To find out more, we’ll specify the layer name\nand use the <code class=\"docutils literal notranslate\"><span class=\"pre\">-so</span></code> option to get only the important summary information:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>ogrinfo<span class=\"w\"> </span>-so<span class=\"w\"> </span>world/data/TM_WORLD_BORDERS-0.3.shp<span class=\"w\"> </span>TM_WORLD_BORDERS-0.3\n<span class=\"go\">INFO: Open of `world/data/TM_WORLD_BORDERS-0.3.shp&#39;</span>\n<span class=\"go\">      using driver `ESRI Shapefile&#39; successful.</span>\n\n<span class=\"go\">Layer name: TM_WORLD_BORDERS-0.3</span>\n<span class=\"go\">Geometry: Polygon</span>\n<span class=\"go\">Feature Count: 246</span>\n<span class=\"go\">Extent: (-180.000000, -90.000000) - (180.000000, 83.623596)</span>\n<span class=\"go\">Layer SRS WKT:</span>\n<span class=\"go\">GEOGCS[&quot;GCS_WGS_1984&quot;,</span>\n<span class=\"go\">    DATUM[&quot;WGS_1984&quot;,</span>\n<span class=\"go\">        SPHEROID[&quot;WGS_1984&quot;,6378137.0,298.257223563]],</span>\n<span class=\"go\">    PRIMEM[&quot;Greenwich&quot;,0.0],</span>\n<span class=\"go\">    UNIT[&quot;Degree&quot;,0.0174532925199433]]</span>\n<span class=\"go\">FIPS: String (2.0)</span>\n<span class=\"go\">ISO2: String (2.0)</span>\n<span class=\"go\">ISO3: String (3.0)</span>\n<span class=\"go\">UN: Integer (3.0)</span>\n<span class=\"go\">NAME: String (50.0)</span>\n<span class=\"go\">AREA: Integer (7.0)</span>\n<span class=\"go\">POP2005: Integer (10.0)</span>\n<span class=\"go\">REGION: Integer (3.0)</span>\n<span class=\"go\">SUBREGION: Integer (3.0)</span>\n<span class=\"go\">LON: Real (8.3)</span>\n<span class=\"go\">LAT: Real (7.3)</span>\n</code></pre></div>\n<p>This detailed summary information tells us the number of features in the layer\n(246), the geographic bounds of the data, the spatial reference system\n(«SRS WKT»), as well as type information for each attribute field. For example,\n<code class=\"docutils literal notranslate\"><span class=\"pre\">FIPS:</span> <span class=\"pre\">String</span> <span class=\"pre\">(2.0)</span></code> indicates that the <code class=\"docutils literal notranslate\"><span class=\"pre\">FIPS</span></code> character field has\na maximum length of 2.  Similarly, <code class=\"docutils literal notranslate\"><span class=\"pre\">LON:</span> <span class=\"pre\">Real</span> <span class=\"pre\">(8.3)</span></code> is a floating-point\nfield that holds a maximum of 8 digits up to three decimal places.</p>\n</section>\n</section>\n<section id=\"geographic-models\">\n<h2>Geographic Models<a class=\"heading-anchor\" href=\"#geographic-models\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"defining-a-geographic-model\">\n<h3>Defining a Geographic Model<a class=\"heading-anchor\" href=\"#defining-a-geographic-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Now that you’ve examined your dataset using <code class=\"docutils literal notranslate\"><span class=\"pre\">ogrinfo</span></code>, create a GeoDjango\nmodel to represent this data:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.gis.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">WorldBorder</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"c1\"># Regular Django fields corresponding to the attributes in the</span>\n    <span class=\"c1\"># world borders shapefile.</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">area</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span>\n    <span class=\"n\">pop2005</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">(</span><span class=\"s1\">&#39;Population 2005&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">fips</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"s1\">&#39;FIPS Code&#39;</span><span class=\"p\">,</span> <span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n    <span class=\"n\">iso2</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"s1\">&#39;2 Digit ISO&#39;</span><span class=\"p\">,</span> <span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n    <span class=\"n\">iso3</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"s1\">&#39;3 Digit ISO&#39;</span><span class=\"p\">,</span> <span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n    <span class=\"n\">un</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">(</span><span class=\"s1\">&#39;United Nations Code&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">region</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">(</span><span class=\"s1\">&#39;Region Code&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">subregion</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">(</span><span class=\"s1\">&#39;Sub-Region Code&#39;</span><span class=\"p\">)</span>\n    <span class=\"n\">lon</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">FloatField</span><span class=\"p\">()</span>\n    <span class=\"n\">lat</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">FloatField</span><span class=\"p\">()</span>\n\n    <span class=\"c1\"># GeoDjango-specific: a geometry field (MultiPolygonField)</span>\n    <span class=\"n\">mpoly</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">MultiPolygonField</span><span class=\"p\">()</span>\n\n    <span class=\"c1\"># Returns the string representation of the model.</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>              <span class=\"c1\"># __unicode__ on Python 2</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">name</span>\n</code></pre></div>\n<p>Note that the <code class=\"docutils literal notranslate\"><span class=\"pre\">models</span></code> module is imported from <code class=\"docutils literal notranslate\"><span class=\"pre\">django.contrib.gis.db</span></code>.</p>\n<p>The default spatial reference system for geometry fields is WGS84 (meaning\nthe <a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/SRID\">SRID</a> is 4326) – in other words, the field coordinates are in\nlongitude, latitude pairs in units of degrees.  To use a different\ncoordinate system, set the SRID of the geometry field with the <code class=\"docutils literal notranslate\"><span class=\"pre\">srid</span></code>\nargument. Use an integer representing the coordinate system’s EPSG code.</p>\n</section>\n<section id=\"run-migrate\">\n<h3>Run <code class=\"docutils literal notranslate\"><span class=\"pre\">migrate</span></code><a class=\"heading-anchor\" href=\"#run-migrate\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>After defining your model, you need to sync it with the database. First,\ncreate a database migration:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>makemigrations\n<span class=\"go\">Migrations for &#39;world&#39;:</span>\n<span class=\"go\">  world/migrations/0001_initial.py:</span>\n<span class=\"go\">    - Create model WorldBorder</span>\n</code></pre></div>\n<p>Let’s look at the SQL that will generate the table for the <code class=\"docutils literal notranslate\"><span class=\"pre\">WorldBorder</span></code>\nmodel:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>sqlmigrate<span class=\"w\"> </span>world<span class=\"w\"> </span><span class=\"m\">0001</span>\n</code></pre></div>\n<p>This command should produce the following output:</p>\n<div class=\"code-block\" data-language=\"sql\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">SQL</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"SQL code\"><code><span class=\"k\">BEGIN</span><span class=\"p\">;</span>\n<span class=\"c1\">--</span>\n<span class=\"c1\">-- Create model WorldBorder</span>\n<span class=\"c1\">--</span>\n<span class=\"k\">CREATE</span><span class=\"w\"> </span><span class=\"k\">TABLE</span><span class=\"w\"> </span><span class=\"ss\">&quot;world_worldborder&quot;</span><span class=\"w\"> </span><span class=\"p\">(</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;id&quot;</span><span class=\"w\"> </span><span class=\"nb\">serial</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"w\"> </span><span class=\"k\">PRIMARY</span><span class=\"w\"> </span><span class=\"k\">KEY</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;name&quot;</span><span class=\"w\"> </span><span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">50</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;area&quot;</span><span class=\"w\"> </span><span class=\"nb\">integer</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;pop2005&quot;</span><span class=\"w\"> </span><span class=\"nb\">integer</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;fips&quot;</span><span class=\"w\"> </span><span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;iso2&quot;</span><span class=\"w\"> </span><span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">2</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;iso3&quot;</span><span class=\"w\"> </span><span class=\"nb\">varchar</span><span class=\"p\">(</span><span class=\"mi\">3</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;un&quot;</span><span class=\"w\"> </span><span class=\"nb\">integer</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;region&quot;</span><span class=\"w\"> </span><span class=\"nb\">integer</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;subregion&quot;</span><span class=\"w\"> </span><span class=\"nb\">integer</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;lon&quot;</span><span class=\"w\"> </span><span class=\"n\">double</span><span class=\"w\"> </span><span class=\"k\">precision</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span><span class=\"p\">,</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;lat&quot;</span><span class=\"w\"> </span><span class=\"n\">double</span><span class=\"w\"> </span><span class=\"k\">precision</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span>\n<span class=\"w\">    </span><span class=\"ss\">&quot;mpoly&quot;</span><span class=\"w\"> </span><span class=\"n\">geometry</span><span class=\"p\">(</span><span class=\"n\">MULTIPOLYGON</span><span class=\"p\">,</span><span class=\"mi\">4326</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"k\">NOT</span><span class=\"w\"> </span><span class=\"k\">NULL</span>\n<span class=\"p\">)</span>\n<span class=\"p\">;</span>\n<span class=\"k\">CREATE</span><span class=\"w\"> </span><span class=\"k\">INDEX</span><span class=\"w\"> </span><span class=\"ss\">&quot;world_worldborder_mpoly_id&quot;</span><span class=\"w\"> </span><span class=\"k\">ON</span><span class=\"w\"> </span><span class=\"ss\">&quot;world_worldborder&quot;</span><span class=\"w\"> </span><span class=\"k\">USING</span><span class=\"w\"> </span><span class=\"n\">GIST</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"w\"> </span><span class=\"ss\">&quot;mpoly&quot;</span><span class=\"w\"> </span><span class=\"p\">);</span>\n<span class=\"k\">COMMIT</span><span class=\"p\">;</span>\n</code></pre></div>\n<p>If this looks correct, run <a class=\"reference internal\" href=\"/es/1.11/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">migrate</span></code></a> to create this table in the\ndatabase:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>migrate\n<span class=\"go\">Operations to perform:</span>\n<span class=\"go\">  Apply all migrations: admin, auth, contenttypes, sessions, world</span>\n<span class=\"go\">Running migrations:</span>\n<span class=\"go\">  ...</span>\n<span class=\"go\">  Applying world.0001_initial... OK</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"importing-spatial-data\">\n<h2>Importing Spatial Data<a class=\"heading-anchor\" href=\"#importing-spatial-data\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>This section will show you how to import the world borders shapefile into the\ndatabase via GeoDjango models using the <a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/layermapping/\"><span class=\"doc\">LayerMapping data import utility</span></a>.</p>\n<p>There are many different ways to import data into a spatial database –\nbesides the tools included within GeoDjango, you may also use the following:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference external\" href=\"http://www.gdal.org/ogr2ogr.html\">ogr2ogr</a>: A command-line utility included with GDAL that\ncan import many vector data formats into PostGIS, MySQL, and Oracle databases.</p></li>\n<li><p><a class=\"reference external\" href=\"https://postgis.net/docs/using_postgis_dbmanagement.html#shp2pgsql_usage\">shp2pgsql</a>: This utility included with PostGIS imports ESRI shapefiles into\nPostGIS.</p></li>\n</ul>\n<section id=\"gdal-interface\">\n<span id=\"gdalinterface\"></span><h3>GDAL Interface<a class=\"heading-anchor\" href=\"#gdal-interface\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Earlier, you used <code class=\"docutils literal notranslate\"><span class=\"pre\">ogrinfo</span></code> to examine the contents of the world borders\nshapefile.  GeoDjango also includes a Pythonic interface to GDAL’s powerful OGR\nlibrary that can work with all the vector data sources that OGR supports.</p>\n<p>First, invoke the Django shell:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>shell\n</code></pre></div>\n<p>If you downloaded the <a class=\"reference internal\" href=\"#worldborders\"><span class=\"std std-ref\">World Borders</span></a> data earlier in the\ntutorial, then you can determine its path using Python’s built-in\n<code class=\"docutils literal notranslate\"><span class=\"pre\">os</span></code> module:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">os</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">world</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">world_shp</span> <span class=\"o\">=</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">abspath</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">dirname</span><span class=\"p\">(</span><span class=\"n\">world</span><span class=\"o\">.</span><span class=\"vm\">__file__</span><span class=\"p\">),</span>\n<span class=\"gp\">... </span>                            <span class=\"s1\">&#39;data&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;TM_WORLD_BORDERS-0.3.shp&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Now, open the world borders shapefile using GeoDjango’s\n<a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/gdal/#django.contrib.gis.gdal.DataSource\" title=\"django.contrib.gis.gdal.DataSource\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">DataSource</span></code></a> interface:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.gis.gdal</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">DataSource</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">ds</span> <span class=\"o\">=</span> <span class=\"n\">DataSource</span><span class=\"p\">(</span><span class=\"n\">world_shp</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">ds</span><span class=\"p\">)</span>\n<span class=\"go\">/ ... /geodjango/world/data/TM_WORLD_BORDERS-0.3.shp (ESRI Shapefile)</span>\n</code></pre></div>\n<p>Data source objects can have different layers of geospatial features; however,\nshapefiles are only allowed to have one layer:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">ds</span><span class=\"p\">))</span>\n<span class=\"go\">1</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">lyr</span> <span class=\"o\">=</span> <span class=\"n\">ds</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">lyr</span><span class=\"p\">)</span>\n<span class=\"go\">TM_WORLD_BORDERS-0.3</span>\n</code></pre></div>\n<p>You can see the layer’s geometry type and how many features it contains:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">lyr</span><span class=\"o\">.</span><span class=\"n\">geom_type</span><span class=\"p\">)</span>\n<span class=\"go\">Polygon</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"nb\">len</span><span class=\"p\">(</span><span class=\"n\">lyr</span><span class=\"p\">))</span>\n<span class=\"go\">246</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>Unfortunately, the shapefile data format does not allow for greater\nspecificity with regards to geometry types.  This shapefile, like\nmany others, actually includes <code class=\"docutils literal notranslate\"><span class=\"pre\">MultiPolygon</span></code> geometries, not Polygons.\nIt’s important to use a more general field type in models: a\nGeoDjango <code class=\"docutils literal notranslate\"><span class=\"pre\">MultiPolygonField</span></code> will accept a <code class=\"docutils literal notranslate\"><span class=\"pre\">Polygon</span></code> geometry, but a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">PolygonField</span></code> will not accept a <code class=\"docutils literal notranslate\"><span class=\"pre\">MultiPolygon</span></code> type geometry.  This\nis why the <code class=\"docutils literal notranslate\"><span class=\"pre\">WorldBorder</span></code> model defined above uses a <code class=\"docutils literal notranslate\"><span class=\"pre\">MultiPolygonField</span></code>.</p>\n</aside>\n<p>The <a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/gdal/#django.contrib.gis.gdal.Layer\" title=\"django.contrib.gis.gdal.Layer\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Layer</span></code></a> may also have a spatial reference\nsystem associated with it.  If it does, the <code class=\"docutils literal notranslate\"><span class=\"pre\">srs</span></code> attribute will return a\n<a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/gdal/#django.contrib.gis.gdal.SpatialReference\" title=\"django.contrib.gis.gdal.SpatialReference\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">SpatialReference</span></code></a> object:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">srs</span> <span class=\"o\">=</span> <span class=\"n\">lyr</span><span class=\"o\">.</span><span class=\"n\">srs</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">srs</span><span class=\"p\">)</span>\n<span class=\"go\">GEOGCS[&quot;GCS_WGS_1984&quot;,</span>\n<span class=\"go\">    DATUM[&quot;WGS_1984&quot;,</span>\n<span class=\"go\">        SPHEROID[&quot;WGS_1984&quot;,6378137.0,298.257223563]],</span>\n<span class=\"go\">    PRIMEM[&quot;Greenwich&quot;,0.0],</span>\n<span class=\"go\">    UNIT[&quot;Degree&quot;,0.0174532925199433]]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">srs</span><span class=\"o\">.</span><span class=\"n\">proj4</span> <span class=\"c1\"># PROJ.4 representation</span>\n<span class=\"go\">&#39;+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs &#39;</span>\n</code></pre></div>\n<p>This shapefile is in the popular WGS84 spatial reference\nsystem – in other words, the data uses longitude, latitude pairs in\nunits of degrees.</p>\n<p>In addition, shapefiles also support attribute fields that may contain\nadditional data.  Here are the fields on the World Borders layer:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">lyr</span><span class=\"o\">.</span><span class=\"n\">fields</span><span class=\"p\">)</span>\n<span class=\"go\">[&#39;FIPS&#39;, &#39;ISO2&#39;, &#39;ISO3&#39;, &#39;UN&#39;, &#39;NAME&#39;, &#39;AREA&#39;, &#39;POP2005&#39;, &#39;REGION&#39;, &#39;SUBREGION&#39;, &#39;LON&#39;, &#39;LAT&#39;]</span>\n</code></pre></div>\n<p>The following code will let you examine the OGR types (e.g. integer or\nstring) associated with each of the fields:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"p\">[</span><span class=\"n\">fld</span><span class=\"o\">.</span><span class=\"vm\">__name__</span> <span class=\"k\">for</span> <span class=\"n\">fld</span> <span class=\"ow\">in</span> <span class=\"n\">lyr</span><span class=\"o\">.</span><span class=\"n\">field_types</span><span class=\"p\">]</span>\n<span class=\"go\">[&#39;OFTString&#39;, &#39;OFTString&#39;, &#39;OFTString&#39;, &#39;OFTInteger&#39;, &#39;OFTString&#39;, &#39;OFTInteger&#39;, &#39;OFTInteger&#39;, &#39;OFTInteger&#39;, &#39;OFTInteger&#39;, &#39;OFTReal&#39;, &#39;OFTReal&#39;]</span>\n</code></pre></div>\n<p>You can iterate over each feature in the layer and extract information from both\nthe feature’s geometry (accessed via the <code class=\"docutils literal notranslate\"><span class=\"pre\">geom</span></code> attribute) as well as the\nfeature’s attribute fields (whose <strong>values</strong> are accessed via <code class=\"docutils literal notranslate\"><span class=\"pre\">get()</span></code>\nmethod):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> <span class=\"n\">feat</span> <span class=\"ow\">in</span> <span class=\"n\">lyr</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>   <span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">feat</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s1\">&#39;NAME&#39;</span><span class=\"p\">),</span> <span class=\"n\">feat</span><span class=\"o\">.</span><span class=\"n\">geom</span><span class=\"o\">.</span><span class=\"n\">num_points</span><span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"go\">Guernsey 18</span>\n<span class=\"go\">Jersey 26</span>\n<span class=\"go\">South Georgia South Sandwich Islands 338</span>\n<span class=\"go\">Taiwan 363</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/gdal/#django.contrib.gis.gdal.Layer\" title=\"django.contrib.gis.gdal.Layer\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Layer</span></code></a> objects may be sliced:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">lyr</span><span class=\"p\">[</span><span class=\"mi\">0</span><span class=\"p\">:</span><span class=\"mi\">2</span><span class=\"p\">]</span>\n<span class=\"go\">[&lt;django.contrib.gis.gdal.feature.Feature object at 0x2f47690&gt;, &lt;django.contrib.gis.gdal.feature.Feature object at 0x2f47650&gt;]</span>\n</code></pre></div>\n<p>And individual features may be retrieved by their feature ID:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">feat</span> <span class=\"o\">=</span> <span class=\"n\">lyr</span><span class=\"p\">[</span><span class=\"mi\">234</span><span class=\"p\">]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">feat</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"s1\">&#39;NAME&#39;</span><span class=\"p\">))</span>\n<span class=\"go\">San Marino</span>\n</code></pre></div>\n<p>Boundary geometries may be exported as WKT and GeoJSON:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">geom</span> <span class=\"o\">=</span> <span class=\"n\">feat</span><span class=\"o\">.</span><span class=\"n\">geom</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">geom</span><span class=\"o\">.</span><span class=\"n\">wkt</span><span class=\"p\">)</span>\n<span class=\"go\">POLYGON ((12.415798 43.957954,12.450554 ...</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">geom</span><span class=\"o\">.</span><span class=\"n\">json</span><span class=\"p\">)</span>\n<span class=\"go\">{ &quot;type&quot;: &quot;Polygon&quot;, &quot;coordinates&quot;: [ [ [ 12.415798, 43.957954 ], [ 12.450554, 43.979721 ], ...</span>\n</code></pre></div>\n</section>\n<section id=\"layermapping\">\n<h3><code class=\"docutils literal notranslate\"><span class=\"pre\">LayerMapping</span></code><a class=\"heading-anchor\" href=\"#layermapping\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>To import the data, use a LayerMapping in a Python script.\nCreate a file called <code class=\"docutils literal notranslate\"><span class=\"pre\">load.py</span></code> inside the <code class=\"docutils literal notranslate\"><span class=\"pre\">world</span></code> application,\nwith the following code:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">os</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.gis.utils</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">LayerMapping</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">WorldBorder</span>\n\n<span class=\"n\">world_mapping</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;fips&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;FIPS&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;iso2&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;ISO2&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;iso3&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;ISO3&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;un&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;UN&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;name&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;NAME&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;area&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;AREA&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;pop2005&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;POP2005&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;region&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;REGION&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;subregion&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;SUBREGION&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;lon&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;LON&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;lat&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;LAT&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;mpoly&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;MULTIPOLYGON&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n\n<span class=\"n\">world_shp</span> <span class=\"o\">=</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">abspath</span><span class=\"p\">(</span>\n    <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">dirname</span><span class=\"p\">(</span><span class=\"vm\">__file__</span><span class=\"p\">),</span> <span class=\"s1\">&#39;data&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;TM_WORLD_BORDERS-0.3.shp&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">)</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">run</span><span class=\"p\">(</span><span class=\"n\">verbose</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">):</span>\n    <span class=\"n\">lm</span> <span class=\"o\">=</span> <span class=\"n\">LayerMapping</span><span class=\"p\">(</span>\n        <span class=\"n\">WorldBorder</span><span class=\"p\">,</span> <span class=\"n\">world_shp</span><span class=\"p\">,</span> <span class=\"n\">world_mapping</span><span class=\"p\">,</span>\n        <span class=\"n\">transform</span><span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">,</span> <span class=\"n\">encoding</span><span class=\"o\">=</span><span class=\"s1\">&#39;iso-8859-1&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">)</span>\n    <span class=\"n\">lm</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"n\">strict</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> <span class=\"n\">verbose</span><span class=\"o\">=</span><span class=\"n\">verbose</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>A few notes about what’s going on:</p>\n<ul class=\"simple\">\n<li><p>Each key in the <code class=\"docutils literal notranslate\"><span class=\"pre\">world_mapping</span></code> dictionary corresponds to a field in the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">WorldBorder</span></code> model.  The value is the name of the shapefile field\nthat data will be loaded from.</p></li>\n<li><p>The key <code class=\"docutils literal notranslate\"><span class=\"pre\">mpoly</span></code> for the geometry field is <code class=\"docutils literal notranslate\"><span class=\"pre\">MULTIPOLYGON</span></code>, the\ngeometry type GeoDjango will import the field as.  Even simple polygons in\nthe shapefile will automatically be converted into collections prior to\ninsertion into the database.</p></li>\n<li><p>The path to the shapefile is not absolute – in other words, if you move the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">world</span></code> application (with <code class=\"docutils literal notranslate\"><span class=\"pre\">data</span></code> subdirectory) to a different location,\nthe script will still work.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">transform</span></code> keyword is set to <code class=\"docutils literal notranslate\"><span class=\"pre\">False</span></code> because the data in the\nshapefile does not need to be converted – it’s already in WGS84 (SRID=4326).</p></li>\n<li><p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">encoding</span></code> keyword is set to the character encoding of the string\nvalues in the shapefile. This ensures that string values are read and saved\ncorrectly from their original encoding system.</p></li>\n</ul>\n<p>Afterwards, invoke the Django shell from the <code class=\"docutils literal notranslate\"><span class=\"pre\">geodjango</span></code> project directory:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>shell\n</code></pre></div>\n<p>Next, import the <code class=\"docutils literal notranslate\"><span class=\"pre\">load</span></code> module, call the <code class=\"docutils literal notranslate\"><span class=\"pre\">run</span></code> routine, and watch\n<code class=\"docutils literal notranslate\"><span class=\"pre\">LayerMapping</span></code> do the work:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">world</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">load</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">load</span><span class=\"o\">.</span><span class=\"n\">run</span><span class=\"p\">()</span>\n</code></pre></div>\n</section>\n<section id=\"try-ogrinspect\">\n<span id=\"ogrinspect-intro\"></span><h3>Try <code class=\"docutils literal notranslate\"><span class=\"pre\">ogrinspect</span></code><a class=\"heading-anchor\" href=\"#try-ogrinspect\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Now that you’ve seen how to define geographic models and import data with the\n<a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/layermapping/\"><span class=\"doc\">LayerMapping data import utility</span></a>, it’s possible to further automate this process with\nuse of the <a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/commands/#django-admin-ogrinspect\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">ogrinspect</span></code></a> management command.  The <a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/commands/#django-admin-ogrinspect\"><code class=\"xref std std-djadmin docutils literal notranslate\"><span class=\"pre\">ogrinspect</span></code></a>\ncommand  introspects a GDAL-supported vector data source (e.g., a shapefile)\nand generates a model definition and <code class=\"docutils literal notranslate\"><span class=\"pre\">LayerMapping</span></code> dictionary automatically.</p>\n<p>The general usage of the command goes as follows:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>ogrinspect<span class=\"w\"> </span><span class=\"o\">[</span>options<span class=\"o\">]</span><span class=\"w\"> </span>&lt;data_source&gt;<span class=\"w\"> </span>&lt;model_name&gt;<span class=\"w\"> </span><span class=\"o\">[</span>options<span class=\"o\">]</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">data_source</span></code> is the path to the GDAL-supported data source and\n<code class=\"docutils literal notranslate\"><span class=\"pre\">model_name</span></code> is the name to use for the model.  Command-line options may\nbe used to further define how the model is generated.</p>\n<p>For example, the following command nearly reproduces the <code class=\"docutils literal notranslate\"><span class=\"pre\">WorldBorder</span></code> model\nand mapping dictionary created above, automatically:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>ogrinspect<span class=\"w\"> </span>world/data/TM_WORLD_BORDERS-0.3.shp<span class=\"w\"> </span>WorldBorder<span class=\"w\"> </span><span class=\"se\">\\</span>\n<span class=\"w\">    </span>--srid<span class=\"o\">=</span><span class=\"m\">4326</span><span class=\"w\"> </span>--mapping<span class=\"w\"> </span>--multi\n</code></pre></div>\n<p>A few notes about the command-line options given above:</p>\n<ul class=\"simple\">\n<li><p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">--srid=4326</span></code> option sets the SRID for the geographic field.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">--mapping</span></code> option tells <code class=\"docutils literal notranslate\"><span class=\"pre\">ogrinspect</span></code> to also generate a\nmapping dictionary for use with\n<a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/layermapping/#django.contrib.gis.utils.LayerMapping\" title=\"django.contrib.gis.utils.LayerMapping\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">LayerMapping</span></code></a>.</p></li>\n<li><p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">--multi</span></code> option is specified so that the geographic field is a\n<a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/model-api/#django.contrib.gis.db.models.MultiPolygonField\" title=\"django.contrib.gis.db.models.MultiPolygonField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">MultiPolygonField</span></code></a> instead of just a\n<a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/model-api/#django.contrib.gis.db.models.PolygonField\" title=\"django.contrib.gis.db.models.PolygonField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">PolygonField</span></code></a>.</p></li>\n</ul>\n<p>The command produces the following output, which may be copied\ndirectly into the <code class=\"docutils literal notranslate\"><span class=\"pre\">models.py</span></code> of a GeoDjango application:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"c1\"># This is an auto-generated Django model module created by ogrinspect.</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.gis.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">WorldBorder</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">fips</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n    <span class=\"n\">iso2</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n    <span class=\"n\">iso3</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n    <span class=\"n\">un</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">area</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span>\n    <span class=\"n\">pop2005</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span>\n    <span class=\"n\">region</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span>\n    <span class=\"n\">subregion</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">IntegerField</span><span class=\"p\">()</span>\n    <span class=\"n\">lon</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">FloatField</span><span class=\"p\">()</span>\n    <span class=\"n\">lat</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">FloatField</span><span class=\"p\">()</span>\n    <span class=\"n\">geom</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">MultiPolygonField</span><span class=\"p\">(</span><span class=\"n\">srid</span><span class=\"o\">=</span><span class=\"mi\">4326</span><span class=\"p\">)</span>\n\n<span class=\"c1\"># Auto-generated `LayerMapping` dictionary for WorldBorder model</span>\n<span class=\"n\">worldborders_mapping</span> <span class=\"o\">=</span> <span class=\"p\">{</span>\n    <span class=\"s1\">&#39;fips&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;FIPS&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;iso2&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;ISO2&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;iso3&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;ISO3&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;un&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;UN&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;name&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;NAME&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;area&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;AREA&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;pop2005&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;POP2005&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;region&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;REGION&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;subregion&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;SUBREGION&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;lon&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;LON&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;lat&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;LAT&#39;</span><span class=\"p\">,</span>\n    <span class=\"s1\">&#39;geom&#39;</span> <span class=\"p\">:</span> <span class=\"s1\">&#39;MULTIPOLYGON&#39;</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n</code></pre></div>\n</section>\n</section>\n<section id=\"spatial-queries\">\n<h2>Spatial Queries<a class=\"heading-anchor\" href=\"#spatial-queries\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"spatial-lookups\">\n<h3>Spatial Lookups<a class=\"heading-anchor\" href=\"#spatial-lookups\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>GeoDjango adds spatial lookups to the Django ORM.  For example, you\ncan find the country in the <code class=\"docutils literal notranslate\"><span class=\"pre\">WorldBorder</span></code> table that contains\na particular point.  First, fire up the management shell:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>shell\n</code></pre></div>\n<p>Now, define a point of interest <a class=\"footnote-reference brackets\" href=\"#id12\" id=\"id7\" role=\"doc-noteref\"><span class=\"fn-bracket\">[</span>3<span class=\"fn-bracket\">]</span></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">pnt_wkt</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;POINT(-95.3385 29.7245)&#39;</span>\n</code></pre></div>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">pnt_wkt</span></code> string represents the point at -95.3385 degrees longitude,\n29.7245 degrees latitude.  The geometry is in a format known as\nWell Known Text (WKT), a standard issued by the Open Geospatial\nConsortium (OGC). <a class=\"footnote-reference brackets\" href=\"#id13\" id=\"id8\" role=\"doc-noteref\"><span class=\"fn-bracket\">[</span>4<span class=\"fn-bracket\">]</span></a>  Import the <code class=\"docutils literal notranslate\"><span class=\"pre\">WorldBorder</span></code> model, and perform\na <code class=\"docutils literal notranslate\"><span class=\"pre\">contains</span></code> lookup using the <code class=\"docutils literal notranslate\"><span class=\"pre\">pnt_wkt</span></code> as the parameter:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">world.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">WorldBorder</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">WorldBorder</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">mpoly__contains</span><span class=\"o\">=</span><span class=\"n\">pnt_wkt</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;WorldBorder: United States&gt;]&gt;</span>\n</code></pre></div>\n<p>Here, you retrieved a <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> with only one model: the border of the\nUnited States (exactly what you would expect).</p>\n<p>Similarly, you may also use a <a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/geos/\"><span class=\"doc\">GEOS geometry object</span></a>.\nHere, you can combine the <code class=\"docutils literal notranslate\"><span class=\"pre\">intersects</span></code> spatial lookup with the <code class=\"docutils literal notranslate\"><span class=\"pre\">get</span></code>\nmethod to retrieve only the <code class=\"docutils literal notranslate\"><span class=\"pre\">WorldBorder</span></code> instance for San Marino instead\nof a queryset:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.gis.geos</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Point</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">pnt</span> <span class=\"o\">=</span> <span class=\"n\">Point</span><span class=\"p\">(</span><span class=\"mf\">12.4604</span><span class=\"p\">,</span> <span class=\"mf\">43.9420</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">WorldBorder</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">mpoly__intersects</span><span class=\"o\">=</span><span class=\"n\">pnt</span><span class=\"p\">)</span>\n<span class=\"go\">&lt;WorldBorder: San Marino&gt;</span>\n</code></pre></div>\n<p>The <code class=\"docutils literal notranslate\"><span class=\"pre\">contains</span></code> and <code class=\"docutils literal notranslate\"><span class=\"pre\">intersects</span></code> lookups are just a subset of the\navailable queries – the <a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/db-api/\"><span class=\"doc\">GeoDjango Database API</span></a> documentation has more.</p>\n</section>\n<section id=\"automatic-spatial-transformations\">\n<h3>Automatic Spatial Transformations<a class=\"heading-anchor\" href=\"#automatic-spatial-transformations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>When doing spatial queries, GeoDjango automatically transforms\ngeometries if they’re in a different coordinate system.  In the following\nexample, coordinates will be expressed in <a class=\"reference external\" href=\"http://spatialreference.org/ref/epsg/32140/\">EPSG SRID 32140</a>,\na coordinate system specific to south Texas <strong>only</strong> and in units of\n<strong>meters</strong>, not degrees:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.gis.geos</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Point</span><span class=\"p\">,</span> <span class=\"n\">GEOSGeometry</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">pnt</span> <span class=\"o\">=</span> <span class=\"n\">Point</span><span class=\"p\">(</span><span class=\"mf\">954158.1</span><span class=\"p\">,</span> <span class=\"mf\">4215137.1</span><span class=\"p\">,</span> <span class=\"n\">srid</span><span class=\"o\">=</span><span class=\"mi\">32140</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Note that <code class=\"docutils literal notranslate\"><span class=\"pre\">pnt</span></code> may also be constructed with EWKT, an «extended» form of\nWKT that includes the SRID:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">pnt</span> <span class=\"o\">=</span> <span class=\"n\">GEOSGeometry</span><span class=\"p\">(</span><span class=\"s1\">&#39;SRID=32140;POINT(954158.1 4215137.1)&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>GeoDjango’s ORM will automatically wrap geometry values\nin transformation SQL, allowing the developer to work at a higher level\nof abstraction:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs</span> <span class=\"o\">=</span> <span class=\"n\">WorldBorder</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">mpoly__intersects</span><span class=\"o\">=</span><span class=\"n\">pnt</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span><span class=\"n\">qs</span><span class=\"o\">.</span><span class=\"n\">query</span><span class=\"p\">)</span> <span class=\"c1\"># Generating the SQL</span>\n<span class=\"go\">SELECT &quot;world_worldborder&quot;.&quot;id&quot;, &quot;world_worldborder&quot;.&quot;name&quot;, &quot;world_worldborder&quot;.&quot;area&quot;,</span>\n<span class=\"go\">&quot;world_worldborder&quot;.&quot;pop2005&quot;, &quot;world_worldborder&quot;.&quot;fips&quot;, &quot;world_worldborder&quot;.&quot;iso2&quot;,</span>\n<span class=\"go\">&quot;world_worldborder&quot;.&quot;iso3&quot;, &quot;world_worldborder&quot;.&quot;un&quot;, &quot;world_worldborder&quot;.&quot;region&quot;,</span>\n<span class=\"go\">&quot;world_worldborder&quot;.&quot;subregion&quot;, &quot;world_worldborder&quot;.&quot;lon&quot;, &quot;world_worldborder&quot;.&quot;lat&quot;,</span>\n<span class=\"go\">&quot;world_worldborder&quot;.&quot;mpoly&quot; FROM &quot;world_worldborder&quot;</span>\n<span class=\"go\">WHERE ST_Intersects(&quot;world_worldborder&quot;.&quot;mpoly&quot;, ST_Transform(%s, 4326))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">qs</span> <span class=\"c1\"># printing evaluates the queryset</span>\n<span class=\"go\">&lt;QuerySet [&lt;WorldBorder: United States&gt;]&gt;</span>\n</code></pre></div>\n<aside class=\"admonition-raw-queries admonition\">\n<p class=\"admonition-title\">Raw queries</p>\n<p>When using <a class=\"reference internal\" href=\"/es/1.11/topics/db/sql/\"><span class=\"doc\">raw queries</span></a>, you should generally wrap\nyour geometry fields with the <code class=\"docutils literal notranslate\"><span class=\"pre\">asText()</span></code> SQL function (or <code class=\"docutils literal notranslate\"><span class=\"pre\">ST_AsText</span></code>\nfor PostGIS) so that the field value will be recognized by GEOS:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">City</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">raw</span><span class=\"p\">(</span><span class=\"s1\">&#39;SELECT id, name, asText(point) from myapp_city&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>This is not absolutely required by PostGIS, but generally you should only\nuse raw queries when you know exactly what you are doing.</p>\n</aside>\n</section>\n<section id=\"lazy-geometries\">\n<h3>Lazy Geometries<a class=\"heading-anchor\" href=\"#lazy-geometries\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>GeoDjango loads geometries in a standardized textual representation.  When the\ngeometry field is first accessed, GeoDjango creates a\n<a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/geos/#django.contrib.gis.geos.GEOSGeometry\" title=\"django.contrib.gis.geos.GEOSGeometry\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GEOSGeometry</span></code></a> object, exposing powerful\nfunctionality, such as serialization properties for popular geospatial\nformats:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">sm</span> <span class=\"o\">=</span> <span class=\"n\">WorldBorder</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;San Marino&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">sm</span><span class=\"o\">.</span><span class=\"n\">mpoly</span>\n<span class=\"go\">&lt;MultiPolygon object at 0x24c6798&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">sm</span><span class=\"o\">.</span><span class=\"n\">mpoly</span><span class=\"o\">.</span><span class=\"n\">wkt</span> <span class=\"c1\"># WKT</span>\n<span class=\"go\">MULTIPOLYGON (((12.4157980000000006 43.9579540000000009, 12.4505540000000003 43.9797209999999978, ...</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">sm</span><span class=\"o\">.</span><span class=\"n\">mpoly</span><span class=\"o\">.</span><span class=\"n\">wkb</span> <span class=\"c1\"># WKB (as Python binary buffer)</span>\n<span class=\"go\">&lt;read-only buffer for 0x1fe2c70, size -1, offset 0 at 0x2564c40&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">sm</span><span class=\"o\">.</span><span class=\"n\">mpoly</span><span class=\"o\">.</span><span class=\"n\">geojson</span> <span class=\"c1\"># GeoJSON</span>\n<span class=\"go\">&#39;{ &quot;type&quot;: &quot;MultiPolygon&quot;, &quot;coordinates&quot;: [ [ [ [ 12.415798, 43.957954 ], [ 12.450554, 43.979721 ], ...</span>\n</code></pre></div>\n<p>This includes access to all of the advanced geometric operations provided by\nthe GEOS library:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">pnt</span> <span class=\"o\">=</span> <span class=\"n\">Point</span><span class=\"p\">(</span><span class=\"mf\">12.4604</span><span class=\"p\">,</span> <span class=\"mf\">43.9420</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">sm</span><span class=\"o\">.</span><span class=\"n\">mpoly</span><span class=\"o\">.</span><span class=\"n\">contains</span><span class=\"p\">(</span><span class=\"n\">pnt</span><span class=\"p\">)</span>\n<span class=\"go\">True</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">pnt</span><span class=\"o\">.</span><span class=\"n\">contains</span><span class=\"p\">(</span><span class=\"n\">sm</span><span class=\"o\">.</span><span class=\"n\">mpoly</span><span class=\"p\">)</span>\n<span class=\"go\">False</span>\n</code></pre></div>\n</section>\n<section id=\"geographic-annotations\">\n<h3>Geographic annotations<a class=\"heading-anchor\" href=\"#geographic-annotations\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>GeoDjango also offers a set of geographic annotations to compute distances and\nseveral other operations (intersection, difference, etc.). See the\n<a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/functions/\"><span class=\"doc\">Geographic Database Functions</span></a> documentation.</p>\n</section>\n</section>\n<section id=\"putting-your-data-on-the-map\">\n<h2>Putting your data on the map<a class=\"heading-anchor\" href=\"#putting-your-data-on-the-map\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"geographic-admin\">\n<h3>Geographic Admin<a class=\"heading-anchor\" href=\"#geographic-admin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>GeoDjango extends <a class=\"reference internal\" href=\"/es/1.11/ref/contrib/admin/\"><span class=\"doc\">Django’s admin application</span></a>\nwith support for editing geometry fields.</p>\n<section id=\"basics\">\n<h4>Basics<a class=\"heading-anchor\" href=\"#basics\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>GeoDjango also supplements the Django admin by allowing users to create\nand modify geometries on a JavaScript slippy map (powered by <a class=\"reference external\" href=\"http://openlayers.org/\">OpenLayers</a>).</p>\n<p>Let’s dive right in.  Create a file called <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.py</span></code> inside the\n<code class=\"docutils literal notranslate\"><span class=\"pre\">world</span></code> application with the following code:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.gis</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">WorldBorder</span>\n\n<span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">WorldBorder</span><span class=\"p\">,</span> <span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">GeoModelAdmin</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Next, edit your <code class=\"docutils literal notranslate\"><span class=\"pre\">urls.py</span></code> in the <code class=\"docutils literal notranslate\"><span class=\"pre\">geodjango</span></code> application folder as follows:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf.urls</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">url</span><span class=\"p\">,</span> <span class=\"n\">include</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.contrib.gis</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">admin</span>\n\n<span class=\"n\">urlpatterns</span> <span class=\"o\">=</span> <span class=\"p\">[</span>\n    <span class=\"n\">url</span><span class=\"p\">(</span><span class=\"sa\">r</span><span class=\"s1\">&#39;^admin/&#39;</span><span class=\"p\">,</span> <span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">urls</span><span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>Create an admin user:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>createsuperuser\n</code></pre></div>\n<p>Next, start up the Django development server:</p>\n<div class=\"code-block\" data-language=\"console\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Shell</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Shell code\"><code><span class=\"gp\">$ </span>python<span class=\"w\"> </span>manage.py<span class=\"w\"> </span>runserver\n</code></pre></div>\n<p>Finally, browse to <code class=\"docutils literal notranslate\"><span class=\"pre\">http://localhost:8000/admin/</span></code>, and log in with the user\nyou just created. Browse to any of the <code class=\"docutils literal notranslate\"><span class=\"pre\">WorldBorder</span></code> entries – the borders\nmay be edited by clicking on a polygon and dragging the vertexes to the desired\nposition.</p>\n</section>\n<section id=\"osmgeoadmin\">\n<span id=\"osmgeoadmin-intro\"></span><h4><code class=\"docutils literal notranslate\"><span class=\"pre\">OSMGeoAdmin</span></code><a class=\"heading-anchor\" href=\"#osmgeoadmin\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>With the <a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/admin/#django.contrib.gis.admin.OSMGeoAdmin\" title=\"django.contrib.gis.admin.OSMGeoAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">OSMGeoAdmin</span></code></a>, GeoDjango uses\na <a class=\"reference external\" href=\"https://www.openstreetmap.org/\">Open Street Map</a> layer in the admin.\nThis provides more context (including street and thoroughfare details) than\navailable with the <a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/admin/#django.contrib.gis.admin.GeoModelAdmin\" title=\"django.contrib.gis.admin.GeoModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">GeoModelAdmin</span></code></a>\n(which uses the <a class=\"reference external\" href=\"http://earth-info.nga.mil/publications/vmap0.html\">Vector Map Level 0</a> WMS dataset hosted at <a class=\"reference external\" href=\"http://www.osgeo.org\">OSGeo</a>).</p>\n<p>The PROJ.4 datum shifting files must be installed (see the <a class=\"reference internal\" href=\"/es/1.11/ref/contrib/gis/install/geolibs/#proj4\"><span class=\"std std-ref\">PROJ.4\ninstallation instructions</span></a> for more details).</p>\n<p>If you meet this requirement, then just substitute the <code class=\"docutils literal notranslate\"><span class=\"pre\">OSMGeoAdmin</span></code>\noption class in your <code class=\"docutils literal notranslate\"><span class=\"pre\">admin.py</span></code> file:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">site</span><span class=\"o\">.</span><span class=\"n\">register</span><span class=\"p\">(</span><span class=\"n\">WorldBorder</span><span class=\"p\">,</span> <span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">OSMGeoAdmin</span><span class=\"p\">)</span>\n</code></pre></div>\n<p class=\"rubric\">Footnotes</p>\n<aside class=\"footnote-list brackets\">\n<aside class=\"footnote brackets\" id=\"id10\" role=\"doc-footnote\">\n<span class=\"label\"><span class=\"fn-bracket\">[</span><a role=\"doc-backlink\" href=\"#id1\">1</a><span class=\"fn-bracket\">]</span></span>\n<p>Special thanks to Bjørn Sandvik of <a class=\"reference external\" href=\"http://thematicmapping.org\">thematicmapping.org</a> for providing and maintaining this\ndataset.</p>\n</aside>\n<aside class=\"footnote brackets\" id=\"id11\" role=\"doc-footnote\">\n<span class=\"label\"><span class=\"fn-bracket\">[</span><a role=\"doc-backlink\" href=\"#id2\">2</a><span class=\"fn-bracket\">]</span></span>\n<p>GeoDjango basic apps was written by Dane Springmeyer, Josh Livni, and\nChristopher Schmidt.</p>\n</aside>\n<aside class=\"footnote brackets\" id=\"id12\" role=\"doc-footnote\">\n<span class=\"label\"><span class=\"fn-bracket\">[</span><a role=\"doc-backlink\" href=\"#id7\">3</a><span class=\"fn-bracket\">]</span></span>\n<p>This point is the <a class=\"reference external\" href=\"https://www.law.uh.edu/\">University of Houston Law Center</a>.</p>\n</aside>\n<aside class=\"footnote brackets\" id=\"id13\" role=\"doc-footnote\">\n<span class=\"label\"><span class=\"fn-bracket\">[</span><a role=\"doc-backlink\" href=\"#id8\">4</a><span class=\"fn-bracket\">]</span></span>\n<p>Open Geospatial Consortium, Inc., <a class=\"reference external\" href=\"http://www.opengeospatial.org/standards/sfs\">OpenGIS Simple Feature Specification\nFor SQL</a>.</p>\n</aside>\n</aside>\n</section>\n</section>\n</section>","rootId":"geodjango-tutorial","toc":[{"title":"Introduction","anchor":"introduction","children":[]},{"title":"Setting Up","anchor":"setting-up","children":[{"title":"Create a Spatial Database","anchor":"create-a-spatial-database","children":[]},{"title":"Create a New Project","anchor":"create-a-new-project","children":[]},{"title":"Configure settings.py","anchor":"configure-settings-py","children":[]}]},{"title":"Geographic Data","anchor":"geographic-data","children":[{"title":"World Borders","anchor":"worldborders","children":[]},{"title":"Use ogrinfo to examine spatial data","anchor":"use-ogrinfo-to-examine-spatial-data","children":[]}]},{"title":"Geographic Models","anchor":"geographic-models","children":[{"title":"Defining a Geographic Model","anchor":"defining-a-geographic-model","children":[]},{"title":"Run migrate","anchor":"run-migrate","children":[]}]},{"title":"Importing Spatial Data","anchor":"importing-spatial-data","children":[{"title":"GDAL Interface","anchor":"gdal-interface","children":[]},{"title":"LayerMapping","anchor":"layermapping","children":[]},{"title":"Try ogrinspect","anchor":"try-ogrinspect","children":[]}]},{"title":"Spatial Queries","anchor":"spatial-queries","children":[{"title":"Spatial Lookups","anchor":"spatial-lookups","children":[]},{"title":"Automatic Spatial Transformations","anchor":"automatic-spatial-transformations","children":[]},{"title":"Lazy Geometries","anchor":"lazy-geometries","children":[]},{"title":"Geographic annotations","anchor":"geographic-annotations","children":[]}]},{"title":"Putting your data on the map","anchor":"putting-your-data-on-the-map","children":[{"title":"Geographic Admin","anchor":"geographic-admin","children":[{"title":"Basics","anchor":"basics","children":[]},{"title":"OSMGeoAdmin","anchor":"osmgeoadmin","children":[]}]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API Reference","url":"/es/1.11/ref/"},{"docname":"ref/contrib/index","title":"contrib packages","url":"/es/1.11/ref/contrib/"},{"docname":"ref/contrib/gis/index","title":"GeoDjango","url":"/es/1.11/ref/contrib/gis/"}],"prev":{"docname":"ref/contrib/gis/index","title":"GeoDjango","url":"/es/1.11/ref/contrib/gis/"},"next":{"docname":"ref/contrib/gis/install/index","title":"GeoDjango Installation","url":"/es/1.11/ref/contrib/gis/install/"},"formats":{"html":"/es/1.11/ref/contrib/gis/tutorial/","markdown":"/es/1.11/ref/contrib/gis/tutorial.md","json":"/es/1.11/ref/contrib/gis/tutorial.json"},"source":"https://github.com/django/django/blob/stable/1.11.x/docs/ref/contrib/gis/tutorial.txt","official":"https://docs.djangoproject.com/es/1.11/ref/contrib/gis/tutorial/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","fr","ja","id","pt-br","ko","es","el","pl"]}