{"title":"GeoDjango 教程","version":"4.1","locale":"zh-hans","docname":"ref/contrib/gis/tutorial","url":"/zh-hans/4.1/ref/contrib/gis/tutorial/","canonical":"https://djangodocs.dev/zh-hans/4.1/ref/contrib/gis/tutorial/","summary":"GeoDjango is an included contrib module for Django that turns it into a world-class geographic web framework.","html":"<h1>GeoDjango 教程<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>介绍<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><a class=\"reference external\" href=\"https://www.ogc.org/\">OGC</a> 几何图形和光栅数据的 Django 模型字段。</p></li>\n<li><p>Django ORM 的扩展，用于查询和操作空间数据。</p></li>\n<li><p>松散耦合的高级 Python 接口，用于 GIS 几何和栅格操作以及不同格式的数据处理。</p></li>\n<li><p>从管理界面编辑几何字段。</p></li>\n</ul>\n<p>本教程假设你对 Django 很熟悉，因此，如果你是一个全新的 Django 新手，请先阅读 <a class=\"reference internal\" href=\"/zh-hans/4.1/intro/tutorial01/\"><span class=\"doc\">常规教程</span></a> 来熟悉 Django。</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>GeoDjango 有一些额外的要求，超出了 Django 的要求——请查阅 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/gis/install/\"><span class=\"doc\">安装文档</span></a> 了解更多细节。</p>\n</aside>\n<p>本教程将指导你创建一个用于查看 <a class=\"reference internal\" href=\"#id3\">世界边界</a> 的地理网络应用。<a class=\"footnote-reference brackets\" href=\"#id11\" id=\"id1\" role=\"doc-noteref\"><span class=\"fn-bracket\">[</span>1<span class=\"fn-bracket\">]</span></a> 本教程中使用的一些代码来自于“GeoDjango 基本应用”项目，或者说是受其启发。<a class=\"footnote-reference brackets\" href=\"#id12\" 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\">Note</p>\n<p>依次进行教程部分的步骤说明。</p>\n</aside>\n</section>\n<section id=\"setting-up\">\n<h2>设置<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>创建一个空间数据库<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>通常情况下，不需要特殊的设置，因此你可以像创建其他项目一样创建数据库。我们为选定的数据库提供一些提示：</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/gis/install/postgis/\"><span class=\"doc\">安装 PostGIS</span></a></p></li>\n<li><p><a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/gis/install/spatialite/\"><span class=\"doc\">安装 SpatiaLite</span></a></p></li>\n</ul>\n</section>\n<section id=\"create-a-new-project\">\n<h3>创建一个新项目<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>使用标准的 <code class=\"docutils literal notranslate\">django-admin</code> 脚本创建一个名为 <code class=\"docutils literal notranslate\">geodjango</code> 的项目：</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-0-unix-label\">Linux / macOS</p><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 startproject geodjango\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-0-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> django-admin startproject geodjango\n</code></pre></div></div></div>\n<p>这将初始化一个新项目。现在，在 <code class=\"docutils literal notranslate\">geodjango</code> 项目中创建一个 <code class=\"docutils literal notranslate\">world</code> Django 应用程序：</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-1-unix-label\">Linux / macOS</p><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> geodjango\n<span class=\"gp\">$ </span>python manage.py startapp world\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-1-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> <span class=\"k\">cd</span> geodjango\n<span class=\"gp\">...\\&gt;</span> py manage.py startapp world\n</code></pre></div></div></div>\n</section>\n<section id=\"configure-settings-py\">\n<h3>设置 <code class=\"docutils literal notranslate\">settings.py</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><code class=\"docutils literal notranslate\">geodjango</code> 项目配置存储在 <code class=\"docutils literal notranslate\">geodjango/settings.py</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>DATABASES <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>此外，修改 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a> 设置，将 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/admin/#module-django.contrib.admin\" title=\"django.contrib.admin: Django's admin site.\"><code class=\"xref py py-mod docutils literal notranslate\">django.contrib.admin</code></a>、 <a class=\"reference internal\" href=\"/zh-hans/4.1/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\">django.contrib.gis</code></a> 和 <code class=\"docutils literal notranslate\">world</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>INSTALLED_APPS <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>地理数据<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>世界边界<a class=\"heading-anchor\" href=\"#worldborders\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>世界边界数据就在这个 <a href=\"#id15\"><span class=\"problematic\" id=\"id16\">`zip file`__</span></a> 中。 在 <code class=\"docutils literal notranslate\">world</code> 应用程序中创建一个 <code class=\"docutils literal notranslate\">data</code> 目录，下载世界边界数据，然后解压。在 GNU/Linux 平台上，使用以下命令：</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-2-unix-label\">Linux / macOS</p><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 world/data\n<span class=\"gp\">$ </span><span class=\"nb\">cd</span> world/data\n<span class=\"gp\">$ </span>wget https://thematicmapping.org/downloads/TM_WORLD_BORDERS-0.3.zip\n<span class=\"gp\">$ </span>unzip TM_WORLD_BORDERS-0.3.zip\n<span class=\"gp\">$ </span><span class=\"nb\">cd</span> ../..\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-2-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> <span class=\"k\">mkdir</span> world\\data\n<span class=\"gp\">...\\&gt;</span> <span class=\"k\">cd</span> world\\data\n<span class=\"gp\">...\\&gt;</span> wget https://thematicmapping.org/downloads/TM_WORLD_BORDERS-0.3.zip\n<span class=\"gp\">...\\&gt;</span> unzip TM_WORLD_BORDERS-0.3.zip\n<span class=\"gp\">...\\&gt;</span> <span class=\"k\">cd</span> ..\\..\n</code></pre></div></div></div>\n<p>世界边界 ZIP 文件包含一组数据文件，统称为“ESRI Shapefile”，是最流行的地理空间数据格式之一。 解压后，世界边界数据集包括以下扩展名的文件：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">.shp</code>：保存世界边界几何图形的向量数据。</p></li>\n<li><p><code class=\"docutils literal notranslate\">.shx</code>：<code class=\"docutils literal notranslate\">.shp</code> 中存储的几何体空间索引文件。</p></li>\n<li><p><code class=\"docutils literal notranslate\">.dbf</code>：用于存放非几何属性数据（如整数和字符字段）的数据库文件。</p></li>\n<li><p><code class=\"docutils literal notranslate\">.prj</code>：包含形状文件中存储的地理数据的空间参考信息。</p></li>\n</ul>\n</section>\n<section id=\"use-ogrinfo-to-examine-spatial-data\">\n<h3>使用 <code class=\"docutils literal notranslate\">ogrinfo</code> 检查空间数据<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>GDAL <code class=\"docutils literal notranslate\">ogrinfo</code> 实用程序允许检查形状文件或其他矢量数据源的元数据：</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-3-unix-label\">Linux / macOS</p><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 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</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-3-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> ogrinfo 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></div></div>\n<p><code class=\"docutils literal notranslate\">ogrinfo</code> 告诉我们形状文件有一个图层，这个图层包含多边形数据。 为了了解更多信息，我们将指定图层名称，并使用 <code class=\"docutils literal notranslate\">so</code> 选项只获取重要的摘要信息：</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-4-unix-label\">Linux / macOS</p><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 -so world/data/TM_WORLD_BORDERS-0.3.shp 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</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-4-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> ogrinfo -so world\\data\\TM_WORLD_BORDERS-0.3.shp 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></div></div>\n<p>这种详细的摘要信息告诉我们图层中特征的数量（246）、数据的地理界限、空间参考系统（“SRS WKT”）以及每个属性字段的类型信息。例如，<code class=\"docutils literal notranslate\">FIPS: String (2.0)</code> 表示 <code class=\"docutils literal notranslate\">FIPS</code> 字符域的最大长度为 2。同样，<code class=\"docutils literal notranslate\">LON: Real (8.3)</code> 是一个浮点字段，最多可容纳 8 位数字，最多可容纳 3 位小数。</p>\n</section>\n</section>\n<section id=\"geographic-models\">\n<h2>地理模型<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>定义地理模型<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>现在你已经用 <code class=\"docutils literal notranslate\">ogrinfo</code> 检查了你的数据集，创建一个 GeoDjango 模型来表示这个数据：</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=\"nn\">django.contrib.gis.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">WorldBorder</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<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    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    area <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n    pop2005 <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">(</span><span class=\"s1\">&#39;Population 2005&#39;</span><span class=\"p\">)</span>\n    fips <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span><span class=\"s1\">&#39;FIPS Code&#39;</span><span class=\"p\">,</span> max_length<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">,</span> null<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">)</span>\n    iso2 <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span><span class=\"s1\">&#39;2 Digit ISO&#39;</span><span class=\"p\">,</span> max_length<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n    iso3 <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span><span class=\"s1\">&#39;3 Digit ISO&#39;</span><span class=\"p\">,</span> max_length<span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n    un <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">(</span><span class=\"s1\">&#39;United Nations Code&#39;</span><span class=\"p\">)</span>\n    region <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">(</span><span class=\"s1\">&#39;Region Code&#39;</span><span class=\"p\">)</span>\n    subregion <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">(</span><span class=\"s1\">&#39;Sub-Region Code&#39;</span><span class=\"p\">)</span>\n    lon <span class=\"o\">=</span> models<span class=\"o\">.</span>FloatField<span class=\"p\">()</span>\n    lat <span class=\"o\">=</span> models<span class=\"o\">.</span>FloatField<span class=\"p\">()</span>\n\n    <span class=\"c1\"># GeoDjango-specific: a geometry field (MultiPolygonField)</span>\n    mpoly <span class=\"o\">=</span> models<span class=\"o\">.</span>MultiPolygonField<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=\"fm\">__str__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span>name\n</code></pre></div>\n<p>请注意，<code class=\"docutils literal notranslate\">models</code> 模块是从 <code class=\"docutils literal notranslate\">django.contrib.gis.db</code> 导入的。</p>\n<p>几何场的默认空间参考系统是 WGS84（意味着 <a href=\"#id15\"><span class=\"problematic\" id=\"id17\">`SRID`__</span></a> 是 4326）——换句话说，场的坐标是以经度和纬度对为单位的。 要使用不同的坐标系，可以用 <code class=\"docutils literal notranslate\">srid</code> 参数设置几何字段的 SRID。使用一个整数代表坐标系的 EPSG 代码。</p>\n</section>\n<section id=\"run-migrate\">\n<h3>运行 <code class=\"docutils literal notranslate\">migrate</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>定义完模型后，你需要将其与数据库同步。首先，创建一个数据库迁移：</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-5-unix-label\">Linux / macOS</p><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 manage.py 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</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-5-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py 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></div></div>\n<p>让我们看看将为 <code class=\"docutils literal notranslate\">WorldBorder</code> 模型生成表的 SQL：</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-6-unix-label\">Linux / macOS</p><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 manage.py sqlmigrate world <span class=\"m\">0001</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-6-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py sqlmigrate world 0001\n</code></pre></div></div></div>\n<p>该命令应产生以下输出：</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=\"go\">BEGIN;</span>\n<span class=\"go\">--</span>\n<span class=\"go\">-- Create model WorldBorder</span>\n<span class=\"go\">--</span>\n<span class=\"go\">CREATE TABLE &quot;world_worldborder&quot; (</span>\n<span class=\"go\">    &quot;id&quot; bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,</span>\n<span class=\"go\">    &quot;name&quot; varchar(50) NOT NULL,</span>\n<span class=\"go\">    &quot;area&quot; integer NOT NULL,</span>\n<span class=\"go\">    &quot;pop2005&quot; integer NOT NULL,</span>\n<span class=\"go\">    &quot;fips&quot; varchar(2) NOT NULL,</span>\n<span class=\"go\">    &quot;iso2&quot; varchar(2) NOT NULL,</span>\n<span class=\"go\">    &quot;iso3&quot; varchar(3) NOT NULL,</span>\n<span class=\"go\">    &quot;un&quot; integer NOT NULL,</span>\n<span class=\"go\">    &quot;region&quot; integer NOT NULL,</span>\n<span class=\"go\">    &quot;subregion&quot; integer NOT NULL,</span>\n<span class=\"go\">    &quot;lon&quot; double precision NOT NULL,</span>\n<span class=\"go\">    &quot;lat&quot; double precision NOT NULL</span>\n<span class=\"go\">    &quot;mpoly&quot; geometry(MULTIPOLYGON,4326) NOT NULL</span>\n<span class=\"go\">)</span>\n<span class=\"go\">;</span>\n<span class=\"go\">CREATE INDEX &quot;world_worldborder_mpoly_id&quot; ON &quot;world_worldborder&quot; USING GIST (&quot;mpoly&quot;);</span>\n<span class=\"go\">COMMIT;</span>\n</code></pre></div>\n<p>如果这个看起来是正确的，运行 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/django-admin/#django-admin-migrate\"><code class=\"xref std std-djadmin docutils literal notranslate\">migrate</code></a> 在数据库中创建这个表：</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-8-unix-label\">Linux / macOS</p><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 manage.py 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</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-8-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py 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></div></div>\n</section>\n</section>\n<section id=\"importing-spatial-data\">\n<h2>导入空间数据<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>本节将展示如何通过 GeoDjango 模型使用 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/gis/layermapping/\"><span class=\"doc\">LayerMapping data import utility</span></a> 将世界边界形状文件导入数据库。</p>\n<p>有许多不同的方法可以将数据导入空间数据库——除了 GeoDjango 中包含的工具外，你还可以使用以下方法：</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference external\" href=\"https://gdal.org/programs/ogr2ogr.html\">ogr2ogr</a> ：GDAL 包含的一个命令行实用程序，可将许多矢量数据格式导入 PostGIS、MySQL 和 Oracle 数据库。</p></li>\n<li><p><a class=\"reference external\" href=\"https://postgis.net/docs/using_postgis_dbmanagement.html#shp2pgsql_usage\">shp2pgsql</a> ：PostGIS 所包含的这一工具将 ESRI 形状文件导入 PostGIS。</p></li>\n</ul>\n<section id=\"gdal-interface\">\n<span id=\"gdalinterface\"></span><h3>GDAL 接口<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>之前，你使用 <code class=\"docutils literal notranslate\">ogrinfo</code> 来检查世界边界形状文件的内容。 GeoDjango 还包含了一个 Pythonic 接口，用于 GDAL 强大的 OGR 库，它可以与 OGR 支持的所有矢量数据源一起工作。</p>\n<p>首先，调用 Django 命令行：</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-9-unix-label\">Linux / macOS</p><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 manage.py shell\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-9-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py shell\n</code></pre></div></div></div>\n<p>如果你在教程前面下载了 <a class=\"reference internal\" href=\"#worldborders\"><span class=\"std std-ref\">世界边界</span></a> 数据，那么你可以使用 Python 的 <a class=\"reference external\" href=\"https://docs.python.org/3/library/pathlib.html#pathlib.Path\" title=\"(in Python v3.14)\"><code class=\"xref py py-class docutils literal notranslate\">pathlib.Path</code></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=\"kn\">from</span> <span class=\"nn\">pathlib</span> <span class=\"kn\">import</span> Path\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span> <span class=\"nn\">world</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>world_shp <span class=\"o\">=</span> Path<span class=\"p\">(</span>world<span class=\"o\">.</span><span class=\"vm\">__file__</span><span class=\"p\">)</span><span class=\"o\">.</span>resolve<span class=\"p\">()</span><span class=\"o\">.</span>parent <span class=\"o\">/</span> <span class=\"s1\">&#39;data&#39;</span> <span class=\"o\">/</span> <span class=\"s1\">&#39;TM_WORLD_BORDERS-0.3.shp&#39;</span>\n</code></pre></div>\n<p>现在，用 GeoDjango 的 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/gis/gdal/#django.contrib.gis.gdal.DataSource\" title=\"django.contrib.gis.gdal.DataSource\"><code class=\"xref py py-class docutils literal notranslate\">DataSource</code></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=\"kn\">from</span> <span class=\"nn\">django.contrib.gis.gdal</span> <span class=\"kn\">import</span> DataSource\n<span class=\"gp\">&gt;&gt;&gt; </span>ds <span class=\"o\">=</span> DataSource<span class=\"p\">(</span>world_shp<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>ds<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>数据源对象可以有不同层的地理空间特征；但是，形状文件只允许有一层：</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>ds<span class=\"p\">))</span>\n<span class=\"go\">1</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>lyr <span class=\"o\">=</span> ds<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>lyr<span class=\"p\">)</span>\n<span class=\"go\">TM_WORLD_BORDERS-0.3</span>\n</code></pre></div>\n<p>你可以看到图层的几何体类型和它包含的特征数量：</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>lyr<span class=\"o\">.</span>geom_type<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>lyr<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\">Note</p>\n<p>遗憾的是，形状文件数据格式不允许在几何体类型方面有更大的特殊性。 这个形状文件，和其他的形状一样，实际上包含了 <code class=\"docutils literal notranslate\">MultiPolygon</code> 的几何体，而不是多边形。在模型中使用更通用的字段类型是很重要的：GeoDjango 的 <code class=\"docutils literal notranslate\">MultiPolygonField</code> 将接受 <code class=\"docutils literal notranslate\">Polygon</code> 几何体，但 <code class=\"docutils literal notranslate\">PolygonField</code> 将不接受 <code class=\"docutils literal notranslate\">MultiPolygon</code> 类型的几何体。 这就是为什么上面定义的 <code class=\"docutils literal notranslate\">WorldBorder</code> 模型使用 <code class=\"docutils literal notranslate\">MultiPolygonField</code>。</p>\n</aside>\n<p><a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/gis/gdal/#django.contrib.gis.gdal.Layer\" title=\"django.contrib.gis.gdal.Layer\"><code class=\"xref py py-class docutils literal notranslate\">Layer</code></a> 也可以有一个与之相关的空间参考系统。 如果有，<code class=\"docutils literal notranslate\">srs</code> 属性将返回一个 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/gis/gdal/#django.contrib.gis.gdal.SpatialReference\" title=\"django.contrib.gis.gdal.SpatialReference\"><code class=\"xref py py-class docutils literal notranslate\">SpatialReference</code></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>srs <span class=\"o\">=</span> lyr<span class=\"o\">.</span>srs\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>srs<span class=\"p\">)</span>\n<span class=\"go\">GEOGCS[&quot;WGS 84&quot;,</span>\n<span class=\"go\">DATUM[&quot;WGS_1984&quot;,</span>\n<span class=\"go\">    SPHEROID[&quot;WGS 84&quot;,6378137,298.257223563,</span>\n<span class=\"go\">        AUTHORITY[&quot;EPSG&quot;,&quot;7030&quot;]],</span>\n<span class=\"go\">    AUTHORITY[&quot;EPSG&quot;,&quot;6326&quot;]],</span>\n<span class=\"go\">PRIMEM[&quot;Greenwich&quot;,0,</span>\n<span class=\"go\">    AUTHORITY[&quot;EPSG&quot;,&quot;8901&quot;]],</span>\n<span class=\"go\">UNIT[&quot;degree&quot;,0.0174532925199433,</span>\n<span class=\"go\">    AUTHORITY[&quot;EPSG&quot;,&quot;9122&quot;]],</span>\n<span class=\"go\">AXIS[&quot;Latitude&quot;,NORTH],</span>\n<span class=\"go\">AXIS[&quot;Longitude&quot;,EAST],</span>\n<span class=\"go\">AUTHORITY[&quot;EPSG&quot;,&quot;4326&quot;]]</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>srs<span class=\"o\">.</span>proj <span class=\"c1\"># PROJ representation</span>\n<span class=\"go\">&#39;+proj=longlat +datum=WGS84 +no_defs&#39;</span>\n</code></pre></div>\n<p>这个形状文件采用流行的 WGS84 空间参考系统——换句话说，数据使用经度、纬度对，单位是度。</p>\n<p>此外，空间文件还支持可能包含附加数据的属性字段。 以下是世界边界图层上的字段：</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>lyr<span class=\"o\">.</span>fields<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>下面的代码将让你检查与每个字段相关联的 OGR 类型（如整数或字符串）：</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>fld<span class=\"o\">.</span><span class=\"vm\">__name__</span> <span class=\"k\">for</span> fld <span class=\"ow\">in</span> lyr<span class=\"o\">.</span>field_types<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;OFTInteger64&#39;, &#39;OFTInteger&#39;, &#39;OFTInteger&#39;, &#39;OFTReal&#39;, &#39;OFTReal&#39;]</span>\n</code></pre></div>\n<p>你可以遍历图层中的每个特征，并从特征的几何体（通过 <code class=\"docutils literal notranslate\">geom</code> 属性访问）以及特征的属性字段（其 <strong>值</strong> 通过 <code class=\"docutils literal notranslate\">get()</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=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">for</span> feat <span class=\"ow\">in</span> lyr<span class=\"p\">:</span>\n<span class=\"gp\">... </span>   <span class=\"nb\">print</span><span class=\"p\">(</span>feat<span class=\"o\">.</span>get<span class=\"p\">(</span><span class=\"s1\">&#39;NAME&#39;</span><span class=\"p\">),</span> feat<span class=\"o\">.</span>geom<span class=\"o\">.</span>num_points<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=\"/zh-hans/4.1/ref/contrib/gis/gdal/#django.contrib.gis.gdal.Layer\" title=\"django.contrib.gis.gdal.Layer\"><code class=\"xref py py-class docutils literal notranslate\">Layer</code></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>lyr<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>而单个特征可以通过其特征 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>feat <span class=\"o\">=</span> lyr<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>feat<span class=\"o\">.</span>get<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>边界几何图形可导出为 WKT 和 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>geom <span class=\"o\">=</span> feat<span class=\"o\">.</span>geom\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>geom<span class=\"o\">.</span>wkt<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>geom<span class=\"o\">.</span>json<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\">LayerMapping</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 <code class=\"docutils literal notranslate\">LayerMapping</code> in a Python script.\nCreate a file called <code class=\"docutils literal notranslate\">load.py</code> inside the <code class=\"docutils literal notranslate\">world</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\">from</span> <span class=\"nn\">pathlib</span> <span class=\"kn\">import</span> Path\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.gis.utils</span> <span class=\"kn\">import</span> LayerMapping\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> WorldBorder\n\nworld_mapping <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\nworld_shp <span class=\"o\">=</span> Path<span class=\"p\">(</span><span class=\"vm\">__file__</span><span class=\"p\">)</span><span class=\"o\">.</span>resolve<span class=\"p\">()</span><span class=\"o\">.</span>parent <span class=\"o\">/</span> <span class=\"s1\">&#39;data&#39;</span> <span class=\"o\">/</span> <span class=\"s1\">&#39;TM_WORLD_BORDERS-0.3.shp&#39;</span>\n\n<span class=\"k\">def</span> <span class=\"nf\">run</span><span class=\"p\">(</span>verbose<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">):</span>\n    lm <span class=\"o\">=</span> LayerMapping<span class=\"p\">(</span>WorldBorder<span class=\"p\">,</span> world_shp<span class=\"p\">,</span> world_mapping<span class=\"p\">,</span> transform<span class=\"o\">=</span><span class=\"kc\">False</span><span class=\"p\">)</span>\n    lm<span class=\"o\">.</span>save<span class=\"p\">(</span>strict<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span> verbose<span class=\"o\">=</span>verbose<span class=\"p\">)</span>\n</code></pre></div>\n<p>说说现在的情况：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">world_mapping</code> 字典中的每个键对应 <code class=\"docutils literal notranslate\">WorldBorder</code> 模型中的一个字段。 其值是数据将被载入的形状文件字段的名称。</p></li>\n<li><p>几何字段的关键 <code class=\"docutils literal notranslate\">mpoly</code> 是 <code class=\"docutils literal notranslate\">MULTIPOLYGON</code>，即 GeoDjango 将导入字段的几何类型。 即使是形状文件中的简单多边形，也会在插入数据库之前自动转换为集合。</p></li>\n<li><p>形状文件的路径不是绝对的——换句话说，如果你把 <code class=\"docutils literal notranslate\">world</code> 应用程序（带 <code class=\"docutils literal notranslate\">data</code> 子目录）移到不同的位置，脚本仍然会工作。</p></li>\n<li><p><code class=\"docutils literal notranslate\">transform</code> 关键字设置为 <code class=\"docutils literal notranslate\">False</code>，因为形状文件中的数据不需要转换——它已经是 WGS84 的数据（SRID=4326）。</p></li>\n</ul>\n<p>Afterward, invoke the Django shell from the <code class=\"docutils literal notranslate\">geodjango</code> project directory:</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-10-unix-label\">Linux / macOS</p><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 manage.py shell\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-10-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py shell\n</code></pre></div></div></div>\n<p>接下来，导入 <code class=\"docutils literal notranslate\">load</code> 模块，调用 <code class=\"docutils literal notranslate\">run</code> 例程，看 着``LayerMapping`` 做的工作：</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=\"nn\">world</span> <span class=\"kn\">import</span> load\n<span class=\"gp\">&gt;&gt;&gt; </span>load<span class=\"o\">.</span>run<span class=\"p\">()</span>\n</code></pre></div>\n</section>\n<section id=\"try-ogrinspect\">\n<span id=\"ogrinspect-intro\"></span><h3>试试 <code class=\"docutils literal notranslate\">ogrinspect</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>现在你已经看到了如何使用 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/gis/layermapping/\"><span class=\"doc\">LayerMapping data import utility</span></a> 定义地理模型和导入数据，可以使用 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/gis/commands/#django-admin-ogrinspect\"><code class=\"xref std std-djadmin docutils literal notranslate\">ogrinspect</code></a> 管理命令进一步自动化这一过程。 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/gis/commands/#django-admin-ogrinspect\"><code class=\"xref std std-djadmin docutils literal notranslate\">ogrinspect</code></a> 命令对 GDAL 支持的矢量数据源（如形状文件）进行内省，并自动生成模型定义和 <code class=\"docutils literal notranslate\">LayerMapping</code> 字典。</p>\n<p>该命令的一般用法如下：</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-11-unix-label\">Linux / macOS</p><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 manage.py ogrinspect <span class=\"o\">[</span>options<span class=\"o\">]</span> &lt;data_source&gt; &lt;model_name&gt; <span class=\"o\">[</span>options<span class=\"o\">]</span>\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-11-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py ogrinspect [options] <span class=\"p\">&lt;</span>data_source<span class=\"p\">&gt;</span> &lt;model_name<span class=\"p\">&gt;</span> [options]\n</code></pre></div></div></div>\n<p><code class=\"docutils literal notranslate\">data_source</code> 是通往 GDAL 支持的数据源的路径，<code class=\"docutils literal notranslate\">model_name</code> 是用于模型的名称。 命令行选项可用于进一步定义模型的生成方式。</p>\n<p>例如，下面的命令几乎自动复制了上面创建的 <code class=\"docutils literal notranslate\">WorldBorder</code> 模型和映射字典：</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-12-unix-label\">Linux / macOS</p><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 manage.py ogrinspect world/data/TM_WORLD_BORDERS-0.3.shp WorldBorder <span class=\"se\">\\</span>\n    --srid<span class=\"o\">=</span><span class=\"m\">4326</span> --mapping --multi\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-12-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py ogrinspect world\\data\\TM_WORLD_BORDERS-0.3.shp WorldBorder \\\n    --srid=4326 --mapping --multi\n</code></pre></div></div></div>\n<p>关于上面给出的命令行选项的一些说明：</p>\n<ul class=\"simple\">\n<li><p><code class=\"docutils literal notranslate\">--srid=4326</code> 选项设置地理区域的 SRID。</p></li>\n<li><p><code class=\"docutils literal notranslate\">--mapping</code> 选项告诉 <code class=\"docutils literal notranslate\">ogrinspect</code> 也要生成一个映射字典，供 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/gis/layermapping/#django.contrib.gis.utils.LayerMapping\" title=\"django.contrib.gis.utils.LayerMapping\"><code class=\"xref py py-class docutils literal notranslate\">LayerMapping</code></a> 使用。</p></li>\n<li><p>指定了 <code class=\"docutils literal notranslate\">--multi</code> 选项，这样地理区域就是一个 <a class=\"reference internal\" href=\"/zh-hans/4.1/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\">MultiPolygonField</code></a> 而不是一个 <a class=\"reference internal\" href=\"/zh-hans/4.1/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\">PolygonField</code></a>。</p></li>\n</ul>\n<p>该命令产生以下输出，可以直接复制到 GeoDjango 应用程序的 <code class=\"docutils literal notranslate\">models.py</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=\"c1\"># This is an auto-generated Django model module created by ogrinspect.</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django.contrib.gis.db</span> <span class=\"kn\">import</span> models\n\n<span class=\"k\">class</span> <span class=\"nc\">WorldBorder</span><span class=\"p\">(</span>models<span class=\"o\">.</span>Model<span class=\"p\">):</span>\n    fips <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n    iso2 <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n    iso3 <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n    un <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n    name <span class=\"o\">=</span> models<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    area <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n    pop2005 <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n    region <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n    subregion <span class=\"o\">=</span> models<span class=\"o\">.</span>IntegerField<span class=\"p\">()</span>\n    lon <span class=\"o\">=</span> models<span class=\"o\">.</span>FloatField<span class=\"p\">()</span>\n    lat <span class=\"o\">=</span> models<span class=\"o\">.</span>FloatField<span class=\"p\">()</span>\n    geom <span class=\"o\">=</span> models<span class=\"o\">.</span>MultiPolygonField<span class=\"p\">(</span>srid<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>\nworldborders_mapping <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>空间查询<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>空间查找<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 在 Django ORM 中增加了空间查询功能。 例如，你可以在 <code class=\"docutils literal notranslate\">WorldBorder</code> 表中找到包含某个点的国家。 首先，启动管理 shell：</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-13-unix-label\">Linux / macOS</p><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 manage.py shell\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-13-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py shell\n</code></pre></div></div></div>\n<p>现在，定义一个感兴趣的点 <a class=\"footnote-reference brackets\" href=\"#id13\" 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>pnt_wkt <span class=\"o\">=</span> <span class=\"s1\">&#39;POINT(-95.3385 29.7245)&#39;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">pnt_wkt</code> 字符串表示位于经度 -95.3385 度，纬度 29.7245 度的点。 几何图形的格式是已知文本（WKT），是开放地理空间联盟（OGC）发布的标准。<a class=\"footnote-reference brackets\" href=\"#id14\" id=\"id8\" role=\"doc-noteref\"><span class=\"fn-bracket\">[</span>4<span class=\"fn-bracket\">]</span></a> 导入 <code class=\"docutils literal notranslate\">WorldBorder</code> 模型，并使用 <code class=\"docutils literal notranslate\">pnt_wkt</code> 作为参数进行 <code class=\"docutils literal notranslate\">contains</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=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">world.models</span> <span class=\"kn\">import</span> WorldBorder\n<span class=\"gp\">&gt;&gt;&gt; </span>WorldBorder<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>mpoly__contains<span class=\"o\">=</span>pnt_wkt<span class=\"p\">)</span>\n<span class=\"go\">&lt;QuerySet [&lt;WorldBorder: United States&gt;]&gt;</span>\n</code></pre></div>\n<p>在这里，你检索到的 <code class=\"docutils literal notranslate\">QuerySet</code> 只有一个模型：美国的边界（正是你所期望的）。</p>\n<p>同样，你也可以使用 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/gis/geos/\"><span class=\"doc\">GEOS 几何对象</span></a>。在这里，你可以将 <code class=\"docutils literal notranslate\">intersects</code> 空间查询与 <code class=\"docutils literal notranslate\">get</code> 方法结合起来，只检索圣马力诺的 <code class=\"docutils literal notranslate\">WorldBorder</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=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span> <span class=\"nn\">django.contrib.gis.geos</span> <span class=\"kn\">import</span> Point\n<span class=\"gp\">&gt;&gt;&gt; </span>pnt <span class=\"o\">=</span> Point<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>WorldBorder<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>mpoly__intersects<span class=\"o\">=</span>pnt<span class=\"p\">)</span>\n<span class=\"go\">&lt;WorldBorder: San Marino&gt;</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">contains</code> 和 <code class=\"docutils literal notranslate\">intersects</code> 查询只是可用查询的一个子集 —— <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/gis/db-api/\"><span class=\"doc\">GeoDjango 数据库 API</span></a> 文档中有更多的内容。</p>\n</section>\n<section id=\"automatic-spatial-transformations\">\n<span id=\"id9\"></span><h3>自动空间变换<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>在进行空间查询时，如果几何图形在不同的坐标系中，GeoDjango 会自动进行转换。 在下面的例子中，坐标将用 <a href=\"#id15\"><span class=\"problematic\" id=\"id18\">`EPSG SRID 32140`__</span></a> 来表示，这是德州南部 <strong>特有</strong> 的一个坐标系，单位是 <strong>米</strong>，而不是度数：</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=\"nn\">django.contrib.gis.geos</span> <span class=\"kn\">import</span> GEOSGeometry<span class=\"p\">,</span> Point\n<span class=\"gp\">&gt;&gt;&gt; </span>pnt <span class=\"o\">=</span> Point<span class=\"p\">(</span><span class=\"mf\">954158.1</span><span class=\"p\">,</span> <span class=\"mf\">4215137.1</span><span class=\"p\">,</span> srid<span class=\"o\">=</span><span class=\"mi\">32140</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>请注意，<code class=\"docutils literal notranslate\">pnt</code> 也可以用 EWKT 构建，EWKT 是 WKT 的一种“扩展”形式，包括 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>pnt <span class=\"o\">=</span> GEOSGeometry<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 的 ORM 会自动将几何值包裹在变换 SQL 中，允许开发者在更高的抽象层次上工作：</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>qs <span class=\"o\">=</span> WorldBorder<span class=\"o\">.</span>objects<span class=\"o\">.</span>filter<span class=\"p\">(</span>mpoly__intersects<span class=\"o\">=</span>pnt<span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"nb\">print</span><span class=\"p\">(</span>qs<span class=\"o\">.</span>query<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>qs <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\" id=\"gis-raw-sql\" role=\"note\">\n<p class=\"admonition-title\">原始查询</p>\n<p>当使用 <a class=\"reference internal\" href=\"/zh-hans/4.1/topics/db/sql/\"><span class=\"doc\">原始查询</span></a> 时，你必须包装你的几何字段，以便字段值能被 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=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> connection\n<span class=\"c1\"># or if you&#39;re querying a non-default database:</span>\n<span class=\"kn\">from</span> <span class=\"nn\">django.db</span> <span class=\"kn\">import</span> connections\nconnection <span class=\"o\">=</span> connections<span class=\"p\">[</span><span class=\"s1\">&#39;your_gis_db_alias&#39;</span><span class=\"p\">]</span>\n\nCity<span class=\"o\">.</span>objects<span class=\"o\">.</span>raw<span class=\"p\">(</span><span class=\"s1\">&#39;SELECT id, name, </span><span class=\"si\">%s</span><span class=\"s1\"> as point from myapp_city&#39;</span> <span class=\"o\">%</span> <span class=\"p\">(</span>connection<span class=\"o\">.</span>ops<span class=\"o\">.</span>select <span class=\"o\">%</span> <span class=\"s1\">&#39;point&#39;</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>只有当你确切知道自己在做什么的时候，你才应该使用原始查询。</p>\n</aside>\n</section>\n<section id=\"lazy-geometries\">\n<h3>惰性几何<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 以标准化的文本表示方式加载几何体。 当第一次访问几何字段时，GeoDjango 会创建一个 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/gis/geos/#django.contrib.gis.geos.GEOSGeometry\" title=\"django.contrib.gis.geos.GEOSGeometry\"><code class=\"xref py py-class docutils literal notranslate\">GEOSGeometry</code></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>sm <span class=\"o\">=</span> WorldBorder<span class=\"o\">.</span>objects<span class=\"o\">.</span>get<span class=\"p\">(</span>name<span class=\"o\">=</span><span class=\"s1\">&#39;San Marino&#39;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>sm<span class=\"o\">.</span>mpoly\n<span class=\"go\">&lt;MultiPolygon object at 0x24c6798&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>sm<span class=\"o\">.</span>mpoly<span class=\"o\">.</span>wkt <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>sm<span class=\"o\">.</span>mpoly<span class=\"o\">.</span>wkb <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>sm<span class=\"o\">.</span>mpoly<span class=\"o\">.</span>geojson <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>这包括访问 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=\"gp\">&gt;&gt;&gt; </span>pnt <span class=\"o\">=</span> Point<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>sm<span class=\"o\">.</span>mpoly<span class=\"o\">.</span>contains<span class=\"p\">(</span>pnt<span class=\"p\">)</span>\n<span class=\"go\">True</span>\n<span class=\"gp\">&gt;&gt;&gt; </span>pnt<span class=\"o\">.</span>contains<span class=\"p\">(</span>sm<span class=\"o\">.</span>mpoly<span class=\"p\">)</span>\n<span class=\"go\">False</span>\n</code></pre></div>\n</section>\n<section id=\"geographic-annotations\">\n<h3>地理注解<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 还提供了一组地理注解来计算距离和其他一些操作（交点、差值等）。参见 <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/gis/functions/\"><span class=\"doc\">地理数据库函数</span></a> 文档。</p>\n</section>\n</section>\n<section id=\"putting-your-data-on-the-map\">\n<h2>将你的数据放在地图上<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>地理管理<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><a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/admin/\"><span class=\"doc\">Django's admin application</span></a> supports editing\ngeometry fields.</p>\n<section id=\"basics\">\n<h4>基础<a class=\"heading-anchor\" href=\"#basics\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h4>\n<p>The Django admin allows users to create and modify geometries on a JavaScript\nslippy map (powered by <a class=\"reference external\" href=\"https://openlayers.org/\">OpenLayers</a>).</p>\n<p>Let's dive right in. Create a file called <code class=\"docutils literal notranslate\">admin.py</code> inside the <code class=\"docutils literal notranslate\">world</code>\napplication 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=\"nn\">django.contrib.gis</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> WorldBorder\n\nadmin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>WorldBorder<span class=\"p\">,</span> admin<span class=\"o\">.</span>ModelAdmin<span class=\"p\">)</span>\n</code></pre></div>\n<p>接下来，在 <code class=\"docutils literal notranslate\">geodjango</code> 应用程序文件夹中编辑 <code class=\"docutils literal notranslate\">urls.py</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=\"nn\">django.contrib</span> <span class=\"kn\">import</span> admin\n<span class=\"kn\">from</span> <span class=\"nn\">django.urls</span> <span class=\"kn\">import</span> include<span class=\"p\">,</span> path\n\nurlpatterns <span class=\"o\">=</span> <span class=\"p\">[</span>\n    path<span class=\"p\">(</span><span class=\"s1\">&#39;admin/&#39;</span><span class=\"p\">,</span> admin<span class=\"o\">.</span>site<span class=\"o\">.</span>urls<span class=\"p\">),</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p>创建一个管理用户：</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-14-unix-label\">Linux / macOS</p><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 manage.py createsuperuser\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-14-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py createsuperuser\n</code></pre></div></div></div>\n<p>接下来，启动 Django 开发服务器：</p>\n<div class=\"console\" data-console><div class=\"console-panel\" data-platform=\"unix\"><p class=\"console-label\" id=\"console-15-unix-label\">Linux / macOS</p><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 manage.py runserver\n</code></pre></div>\n</div><div class=\"console-panel\" data-platform=\"windows\"><p class=\"console-label\" id=\"console-15-windows-label\">Windows</p><div class=\"code-block\" data-language=\"doscon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Windows</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=\"Windows shell\"><code><span class=\"gp\">...\\&gt;</span> py manage.py runserver\n</code></pre></div></div></div>\n<p>最后，浏览 <code class=\"docutils literal notranslate\">http://localhost:8000/admin/</code>，用你刚刚创建的用户登录。浏览到任何一个 <code class=\"docutils literal notranslate\">WorldBorder</code> 条目——通过点击多边形并将顶点拖到所需位置，可以编辑边界。</p>\n</section>\n<section id=\"gismodeladmin\">\n<h4><code class=\"docutils literal notranslate\">GISModelAdmin</code><a class=\"heading-anchor\" href=\"#gismodeladmin\"><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=\"/zh-hans/4.1/ref/contrib/gis/admin/#django.contrib.gis.admin.GISModelAdmin\" title=\"django.contrib.gis.admin.GISModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">GISModelAdmin</code></a>, GeoDjango uses an\n<a class=\"reference external\" href=\"https://www.openstreetmap.org/\">OpenStreetMap</a> layer in the admin.\nThis provides more context (including street and thoroughfare details) than\navailable with the <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/admin/#django.contrib.admin.ModelAdmin\" title=\"django.contrib.admin.ModelAdmin\"><code class=\"xref py py-class docutils literal notranslate\">ModelAdmin</code></a> (which uses the\n<a class=\"reference external\" href=\"http://web.archive.org/web/20201024202709/https://earth-info.nga.mil/publications/vmap0.html\">Vector Map Level 0</a> WMS dataset hosted at <a class=\"reference external\" href=\"https://www.osgeo.org/\">OSGeo</a>).</p>\n<p>The PROJ datum shifting files must be installed (see the <a class=\"reference internal\" href=\"/zh-hans/4.1/ref/contrib/gis/install/geolibs/#proj4\"><span class=\"std std-ref\">PROJ\ninstallation instructions</span></a> for more details).</p>\n<p>If you meet this requirement, then use the <code class=\"docutils literal notranslate\">GISModelAdmin</code> option class\nin your <code class=\"docutils literal notranslate\">admin.py</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>admin<span class=\"o\">.</span>site<span class=\"o\">.</span>register<span class=\"p\">(</span>WorldBorder<span class=\"p\">,</span> admin<span class=\"o\">.</span>GISModelAdmin<span class=\"p\">)</span>\n</code></pre></div>\n<p class=\"rubric\">脚注</p>\n<aside class=\"footnote-list brackets\">\n<aside class=\"footnote brackets\" id=\"id11\" 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>特别感谢 <a class=\"reference external\" href=\"https://thematicmapping.org/\">thematicmapping.org</a> 的Bjørn Sandvik 提供和维护这一数据集。</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=\"#id2\">2</a><span class=\"fn-bracket\">]</span></span>\n<p>GeoDjango 基本应用由 Dane Springmeyer、Josh Livni 和 Christopher Schmidt 编写。</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=\"#id7\">3</a><span class=\"fn-bracket\">]</span></span>\n<p>这一点是 <a class=\"reference external\" href=\"https://www.law.uh.edu/\">休斯顿大学法律中心</a> 。</p>\n</aside>\n<aside class=\"footnote brackets\" id=\"id14\" 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=\"https://www.ogc.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":"介绍","anchor":"introduction","children":[]},{"title":"设置","anchor":"setting-up","children":[{"title":"创建一个空间数据库","anchor":"create-a-spatial-database","children":[]},{"title":"创建一个新项目","anchor":"create-a-new-project","children":[]},{"title":"设置 settings.py","anchor":"configure-settings-py","children":[]}]},{"title":"地理数据","anchor":"geographic-data","children":[{"title":"世界边界","anchor":"worldborders","children":[]},{"title":"使用 ogrinfo 检查空间数据","anchor":"use-ogrinfo-to-examine-spatial-data","children":[]}]},{"title":"地理模型","anchor":"geographic-models","children":[{"title":"定义地理模型","anchor":"defining-a-geographic-model","children":[]},{"title":"运行 migrate","anchor":"run-migrate","children":[]}]},{"title":"导入空间数据","anchor":"importing-spatial-data","children":[{"title":"GDAL 接口","anchor":"gdal-interface","children":[]},{"title":"LayerMapping","anchor":"layermapping","children":[]},{"title":"试试 ogrinspect","anchor":"try-ogrinspect","children":[]}]},{"title":"空间查询","anchor":"spatial-queries","children":[{"title":"空间查找","anchor":"spatial-lookups","children":[]},{"title":"自动空间变换","anchor":"automatic-spatial-transformations","children":[]},{"title":"惰性几何","anchor":"lazy-geometries","children":[]},{"title":"地理注解","anchor":"geographic-annotations","children":[]}]},{"title":"将你的数据放在地图上","anchor":"putting-your-data-on-the-map","children":[{"title":"地理管理","anchor":"geographic-admin","children":[{"title":"基础","anchor":"basics","children":[]},{"title":"GISModelAdmin","anchor":"gismodeladmin","children":[]}]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/4.1/ref/"},{"docname":"ref/contrib/index","title":"contrib 包","url":"/zh-hans/4.1/ref/contrib/"},{"docname":"ref/contrib/gis/index","title":"GeoDjango","url":"/zh-hans/4.1/ref/contrib/gis/"}],"prev":{"docname":"ref/contrib/gis/index","title":"GeoDjango","url":"/zh-hans/4.1/ref/contrib/gis/"},"next":{"docname":"ref/contrib/gis/install/index","title":"GeoDjango 安装","url":"/zh-hans/4.1/ref/contrib/gis/install/"},"formats":{"html":"/zh-hans/4.1/ref/contrib/gis/tutorial/","markdown":"/zh-hans/4.1/ref/contrib/gis/tutorial.md","json":"/zh-hans/4.1/ref/contrib/gis/tutorial.json"},"source":"https://github.com/django/django/blob/stable/4.1.x/docs/ref/contrib/gis/tutorial.txt","official":"https://docs.djangoproject.com/zh-hans/4.1/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"],"inLocales":["en","zh-hans","fr","ja","id","it","pt-br","ko","es","el","pl"]}