GeoDjango 教學¶
簡介¶
GeoDjango 是 Django 中包含的 contrib 模組,它將 Django 變成世界級的地理網路框架。GeoDjango 致力於盡可能簡化地理網路應用程式(如基於位置的服務)的建立。其功能包括:
適用於 OGC 幾何圖形和柵格資料的 Django 模型欄位。
擴充 Django 的 ORM,用於查詢和操作空間資料。
鬆散耦合、高階 Python 介面,用於不同格式的 GIS 幾何圖形和柵格操作以及資料操作。
從管理介面編輯幾何圖形欄位。
本教學假設您熟悉 Django;因此,如果您是 Django 的新手,請先閱讀一般教學,以熟悉 Django。
注意
GeoDjango 除了 Django 的需求之外,還有其他要求 – 請參閱安裝文件以了解更多詳細資訊。
本教學將引導您建立一個地理網路應用程式,用於檢視世界邊界。[1] 本教學中使用的一些程式碼取自和/或啟發自GeoDjango basic apps 專案。[2]
注意
請依序執行教學章節,以取得逐步說明。
設定¶
建立空間資料庫¶
通常不需要特殊設定,因此您可以像其他任何專案一樣建立資料庫。我們提供一些選定資料庫的提示
建立新專案¶
使用標準的 django-admin
指令碼建立一個名為 geodjango
的專案
$ django-admin startproject geodjango
...\> django-admin startproject geodjango
這將初始化一個新專案。現在,在 geodjango
專案中建立一個 world
Django 應用程式
$ cd geodjango
$ python manage.py startapp world
...\> cd geodjango
...\> py manage.py startapp world
設定 settings.py
¶
geodjango
專案設定儲存在 geodjango/settings.py
檔案中。編輯資料庫連線設定以符合您的設定
DATABASES = {
"default": {
"ENGINE": "django.contrib.gis.db.backends.postgis",
"NAME": "geodjango",
"USER": "geo",
},
}
此外,修改 INSTALLED_APPS
設定,使其包含 django.contrib.admin
、django.contrib.gis
和 world
(您新建立的應用程式)
INSTALLED_APPS = [
"django.contrib.admin",
"django.contrib.auth",
"django.contrib.contenttypes",
"django.contrib.sessions",
"django.contrib.messages",
"django.contrib.staticfiles",
"django.contrib.gis",
"world",
]
地理資料¶
世界邊界¶
世界邊界資料可在此zip 檔案中取得。在 world
應用程式中建立一個 data
目錄,下載世界邊界資料,並解壓縮。在 GNU/Linux 平台上,請使用以下命令
$ mkdir world/data
$ cd world/data
$ wget https://web.archive.org/web/20231220150759/https://thematicmapping.org/downloads/TM_WORLD_BORDERS-0.3.zip
$ unzip TM_WORLD_BORDERS-0.3.zip
$ cd ../..
...\> mkdir world\data
...\> cd world\data
...\> wget https://web.archive.org/web/20231220150759/https://thematicmapping.org/downloads/TM_WORLD_BORDERS-0.3.zip
...\> unzip TM_WORLD_BORDERS-0.3.zip
...\> cd ..\..
世界邊界 ZIP 檔案包含一組統稱為 ESRI Shapefile 的資料檔案,這是最流行的地理空間資料格式之一。解壓縮後,世界邊界資料集包括具有以下擴展名的檔案
.shp
:保存世界邊界幾何圖形的向量資料。.shx
:儲存在.shp
中的幾何圖形的空間索引檔案。.dbf
:用於保存非幾何屬性資料 (例如,整數和字元欄位) 的資料庫檔案。.prj
:包含儲存在 shapefile 中的地理資料的空間參考資訊。
使用 ogrinfo
檢查空間資料¶
GDAL ogrinfo
公用程式允許檢查 shapefile 或其他向量資料來源的中繼資料
$ ogrinfo world/data/TM_WORLD_BORDERS-0.3.shp
INFO: Open of `world/data/TM_WORLD_BORDERS-0.3.shp'
using driver `ESRI Shapefile' successful.
1: TM_WORLD_BORDERS-0.3 (Polygon)
...\> ogrinfo world\data\TM_WORLD_BORDERS-0.3.shp
INFO: Open of `world/data/TM_WORLD_BORDERS-0.3.shp'
using driver `ESRI Shapefile' successful.
1: TM_WORLD_BORDERS-0.3 (Polygon)
ogrinfo
告訴我們 shapefile 有一個圖層,而該圖層包含多邊形資料。為了找到更多資訊,我們將指定圖層名稱並使用 -so
選項,僅取得重要的摘要資訊
$ ogrinfo -so world/data/TM_WORLD_BORDERS-0.3.shp TM_WORLD_BORDERS-0.3
INFO: Open of `world/data/TM_WORLD_BORDERS-0.3.shp'
using driver `ESRI Shapefile' successful.
Layer name: TM_WORLD_BORDERS-0.3
Geometry: Polygon
Feature Count: 246
Extent: (-180.000000, -90.000000) - (180.000000, 83.623596)
Layer SRS WKT:
GEOGCS["GCS_WGS_1984",
DATUM["WGS_1984",
SPHEROID["WGS_1984",6378137.0,298.257223563]],
PRIMEM["Greenwich",0.0],
UNIT["Degree",0.0174532925199433]]
FIPS: String (2.0)
ISO2: String (2.0)
ISO3: String (3.0)
UN: Integer (3.0)
NAME: String (50.0)
AREA: Integer (7.0)
POP2005: Integer (10.0)
REGION: Integer (3.0)
SUBREGION: Integer (3.0)
LON: Real (8.3)
LAT: Real (7.3)
...\> ogrinfo -so world\data\TM_WORLD_BORDERS-0.3.shp TM_WORLD_BORDERS-0.3
INFO: Open of `world/data/TM_WORLD_BORDERS-0.3.shp'
using driver `ESRI Shapefile' successful.
Layer name: TM_WORLD_BORDERS-0.3
Geometry: Polygon
Feature Count: 246
Extent: (-180.000000, -90.000000) - (180.000000, 83.623596)
Layer SRS WKT:
GEOGCS["GCS_WGS_1984",
DATUM["WGS_1984",
SPHEROID["WGS_1984",6378137.0,298.257223563]],
PRIMEM["Greenwich",0.0],
UNIT["Degree",0.0174532925199433]]
FIPS: String (2.0)
ISO2: String (2.0)
ISO3: String (3.0)
UN: Integer (3.0)
NAME: String (50.0)
AREA: Integer (7.0)
POP2005: Integer (10.0)
REGION: Integer (3.0)
SUBREGION: Integer (3.0)
LON: Real (8.3)
LAT: Real (7.3)
此詳細的摘要資訊告訴我們圖層中的特徵數量 (246)、資料的地理邊界、空間參考系統 (“SRS WKT”),以及每個屬性欄位的類型資訊。例如,FIPS: String (2.0)
表示 FIPS
字元欄位的最大長度為 2。同樣地,LON: Real (8.3)
是一個浮點數欄位,最多可保存 8 位數字,最多可保留三位小數。
地理模型¶
定義地理模型¶
現在您已經使用 ogrinfo
檢查了資料集,請建立一個 GeoDjango 模型來表示此資料
from django.contrib.gis.db import models
class WorldBorder(models.Model):
# Regular Django fields corresponding to the attributes in the
# world borders shapefile.
name = models.CharField(max_length=50)
area = models.IntegerField()
pop2005 = models.IntegerField("Population 2005")
fips = models.CharField("FIPS Code", max_length=2, null=True)
iso2 = models.CharField("2 Digit ISO", max_length=2)
iso3 = models.CharField("3 Digit ISO", max_length=3)
un = models.IntegerField("United Nations Code")
region = models.IntegerField("Region Code")
subregion = models.IntegerField("Sub-Region Code")
lon = models.FloatField()
lat = models.FloatField()
# GeoDjango-specific: a geometry field (MultiPolygonField)
mpoly = models.MultiPolygonField()
# Returns the string representation of the model.
def __str__(self):
return self.name
請注意,models
模組是從 django.contrib.gis.db
匯入的。
幾何圖形欄位的預設空間參考系統是 WGS84 (表示 SRID 為 4326) – 換句話說,欄位坐標是以經度、緯度對的形式呈現,單位為度。若要使用不同的坐標系統,請使用 srid
引數設定幾何圖形欄位的 SRID。使用代表坐標系統 EPSG 代碼的整數。
執行 migrate
¶
定義模型後,您需要將其與資料庫同步。首先,建立一個資料庫遷移
$ python manage.py makemigrations
Migrations for 'world':
world/migrations/0001_initial.py:
+ Create model WorldBorder
...\> py manage.py makemigrations
Migrations for 'world':
world/migrations/0001_initial.py:
+ Create model WorldBorder
讓我們看看將為 WorldBorder
模型產生表格的 SQL
$ python manage.py sqlmigrate world 0001
...\> py manage.py sqlmigrate world 0001
此命令應產生以下輸出
BEGIN;
--
-- Create model WorldBorder
--
CREATE TABLE "world_worldborder" (
"id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
"name" varchar(50) NOT NULL,
"area" integer NOT NULL,
"pop2005" integer NOT NULL,
"fips" varchar(2) NOT NULL,
"iso2" varchar(2) NOT NULL,
"iso3" varchar(3) NOT NULL,
"un" integer NOT NULL,
"region" integer NOT NULL,
"subregion" integer NOT NULL,
"lon" double precision NOT NULL,
"lat" double precision NOT NULL
"mpoly" geometry(MULTIPOLYGON,4326) NOT NULL
)
;
CREATE INDEX "world_worldborder_mpoly_id" ON "world_worldborder" USING GIST ("mpoly");
COMMIT;
如果看起來正確,請執行 migrate
以在資料庫中建立此表格
$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, world
Running migrations:
...
Applying world.0001_initial... OK
...\> py manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, world
Running migrations:
...
Applying world.0001_initial... OK
匯入空間資料¶
本節將示範如何使用 LayerMapping 資料匯入公用程式,透過 GeoDjango 模型將世界邊界 shapefile 匯入資料庫。
將資料匯入空間資料庫的方式有很多種 – 除了 GeoDjango 中包含的工具之外,您也可以使用以下工具
ogr2ogr:GDAL 隨附的命令列公用程式,可將多種向量資料格式匯入 PostGIS、MySQL 和 Oracle 資料庫。
shp2pgsql:PostGIS 隨附的公用程式,可將 ESRI shapefile 匯入 PostGIS。
GDAL 介面¶
先前,您使用 ogrinfo
來檢查世界邊界 shapefile 的內容。GeoDjango 也包含 GDAL 強大 OGR 程式庫的 Pythonic 介面,該介面可以使用 OGR 支援的所有向量資料來源。
首先,叫用 Django shell
$ python manage.py shell
...\> py manage.py shell
如果您在教學中稍早下載了世界邊界資料,則可以使用 Python 的 pathlib.Path
來判斷其路徑
>>> from pathlib import Path
>>> import world
>>> world_shp = Path(world.__file__).resolve().parent / "data" / "TM_WORLD_BORDERS-0.3.shp"
現在,使用 GeoDjango 的 DataSource
介面開啟世界邊界 shapefile
>>> from django.contrib.gis.gdal import DataSource
>>> ds = DataSource(world_shp)
>>> print(ds)
/ ... /geodjango/world/data/TM_WORLD_BORDERS-0.3.shp (ESRI Shapefile)
資料來源物件可以具有不同的地理空間特徵圖層;但是,shapefile 僅允許有一個圖層
>>> print(len(ds))
1
>>> lyr = ds[0]
>>> print(lyr)
TM_WORLD_BORDERS-0.3
您可以看到圖層的幾何圖形類型以及其中包含的特徵數量
>>> print(lyr.geom_type)
Polygon
>>> print(len(lyr))
246
注意
很遺憾,shapefile 資料格式在幾何類型方面不允許更精確的指定。這個 shapefile 和許多其他檔案一樣,實際上包含了 MultiPolygon
幾何圖形,而不是 Polygon。在模型中使用更通用的欄位類型非常重要:GeoDjango 的 MultiPolygonField
會接受 Polygon
幾何圖形,但 PolygonField
不會接受 MultiPolygon
類型的幾何圖形。這就是為什麼上面定義的 WorldBorder
模型使用 MultiPolygonField
的原因。
Layer
也可能具有相關的空間參考系統。如果有的話,srs
屬性將返回一個 SpatialReference
物件
>>> srs = lyr.srs
>>> print(srs)
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS 84",6378137,298.257223563,
AUTHORITY["EPSG","7030"]],
AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.0174532925199433,
AUTHORITY["EPSG","9122"]],
AXIS["Latitude",NORTH],
AXIS["Longitude",EAST],
AUTHORITY["EPSG","4326"]]
>>> srs.proj # PROJ representation
'+proj=longlat +datum=WGS84 +no_defs'
這個 shapefile 使用的是流行的 WGS84 空間參考系統 – 換句話說,資料使用經度、緯度對,單位為度。
此外,shapefile 也支援可能包含額外資料的屬性欄位。以下是世界邊界圖層上的欄位
>>> print(lyr.fields)
['FIPS', 'ISO2', 'ISO3', 'UN', 'NAME', 'AREA', 'POP2005', 'REGION', 'SUBREGION', 'LON', 'LAT']
以下程式碼可讓您檢查與每個欄位相關聯的 OGR 類型(例如,整數或字串)
>>> [fld.__name__ for fld in lyr.field_types]
['OFTString', 'OFTString', 'OFTString', 'OFTInteger', 'OFTString', 'OFTInteger', 'OFTInteger64', 'OFTInteger', 'OFTInteger', 'OFTReal', 'OFTReal']
您可以遍歷圖層中的每個要素,並從要素的幾何圖形(透過 geom
屬性存取)以及要素的屬性欄位(其值透過 get()
方法存取)中提取資訊
>>> for feat in lyr:
... print(feat.get("NAME"), feat.geom.num_points)
...
Guernsey 18
Jersey 26
South Georgia South Sandwich Islands 338
Taiwan 363
Layer
物件可以被切片
>>> lyr[0:2]
[<django.contrib.gis.gdal.feature.Feature object at 0x2f47690>, <django.contrib.gis.gdal.feature.Feature object at 0x2f47650>]
並且可以通過其要素 ID 檢索單個要素
>>> feat = lyr[234]
>>> print(feat.get("NAME"))
San Marino
邊界幾何圖形可以匯出為 WKT 和 GeoJSON
>>> geom = feat.geom
>>> print(geom.wkt)
POLYGON ((12.415798 43.957954,12.450554 ...
>>> print(geom.json)
{ "type": "Polygon", "coordinates": [ [ [ 12.415798, 43.957954 ], [ 12.450554, 43.979721 ], ...
LayerMapping
¶
要匯入資料,請在 Python 腳本中使用 LayerMapping
。在 world
應用程式內建立一個名為 load.py
的檔案,並使用以下程式碼
from pathlib import Path
from django.contrib.gis.utils import LayerMapping
from .models import WorldBorder
world_mapping = {
"fips": "FIPS",
"iso2": "ISO2",
"iso3": "ISO3",
"un": "UN",
"name": "NAME",
"area": "AREA",
"pop2005": "POP2005",
"region": "REGION",
"subregion": "SUBREGION",
"lon": "LON",
"lat": "LAT",
"mpoly": "MULTIPOLYGON",
}
world_shp = Path(__file__).resolve().parent / "data" / "TM_WORLD_BORDERS-0.3.shp"
def run(verbose=True):
lm = LayerMapping(WorldBorder, world_shp, world_mapping, transform=False)
lm.save(strict=True, verbose=verbose)
關於正在發生的事情的一些注意事項
world_mapping
字典中的每個鍵都對應於WorldBorder
模型中的一個欄位。該值是將從中載入資料的 shapefile 欄位的名稱。幾何欄位的鍵
mpoly
是MULTIPOLYGON
,GeoDjango 將欄位匯入為此幾何類型。shapefile 中的即使是簡單的多邊形,也會在插入資料庫之前自動轉換為集合。shapefile 的路徑不是絕對的 – 換句話說,如果您將
world
應用程式(帶有data
子目錄)移動到不同的位置,腳本仍然可以運作。transform
關鍵字設定為False
,因為 shapefile 中的資料不需要轉換 – 它已經是 WGS84 (SRID=4326)。
之後,從 geodjango
專案目錄中叫用 Django shell
$ python manage.py shell
...\> py manage.py shell
接下來,匯入 load
模組,呼叫 run
常式,並觀察 LayerMapping
完成工作
>>> from world import load
>>> load.run()
試試 ogrinspect
¶
既然您已經了解如何定義地理模型以及如何使用 LayerMapping 資料匯入工具 匯入資料,就可以使用 ogrinspect
管理命令進一步自動化此過程。ogrinspect
命令會內省 GDAL 支援的向量資料來源(例如,shapefile),並自動產生模型定義和 LayerMapping
字典。
該命令的一般用法如下
$ python manage.py ogrinspect [options] <data_source> <model_name> [options]
...\> py manage.py ogrinspect [options] <data_source> <model_name> [options]
data_source
是 GDAL 支援的資料來源的路徑,而 model_name
是要用於模型的名稱。可以使用命令列選項來進一步定義如何產生模型。
例如,以下命令幾乎會自動重現上面建立的 WorldBorder
模型和對應字典
$ python manage.py ogrinspect world/data/TM_WORLD_BORDERS-0.3.shp WorldBorder \
--srid=4326 --mapping --multi
...\> py manage.py ogrinspect world\data\TM_WORLD_BORDERS-0.3.shp WorldBorder \
--srid=4326 --mapping --multi
關於上面給出的命令列選項的一些注意事項
--srid=4326
選項設定地理欄位的 SRID。--mapping
選項告訴ogrinspect
也產生一個對應字典,以與LayerMapping
一起使用。指定
--multi
選項,以便將地理欄位設為MultiPolygonField
,而不僅僅是PolygonField
。
該命令會產生以下輸出,這些輸出可以直接複製到 GeoDjango 應用程式的 models.py
中
# This is an auto-generated Django model module created by ogrinspect.
from django.contrib.gis.db import models
class WorldBorder(models.Model):
fips = models.CharField(max_length=2)
iso2 = models.CharField(max_length=2)
iso3 = models.CharField(max_length=3)
un = models.IntegerField()
name = models.CharField(max_length=50)
area = models.IntegerField()
pop2005 = models.IntegerField()
region = models.IntegerField()
subregion = models.IntegerField()
lon = models.FloatField()
lat = models.FloatField()
geom = models.MultiPolygonField(srid=4326)
# Auto-generated `LayerMapping` dictionary for WorldBorder model
worldborders_mapping = {
"fips": "FIPS",
"iso2": "ISO2",
"iso3": "ISO3",
"un": "UN",
"name": "NAME",
"area": "AREA",
"pop2005": "POP2005",
"region": "REGION",
"subregion": "SUBREGION",
"lon": "LON",
"lat": "LAT",
"geom": "MULTIPOLYGON",
}
空間查詢¶
空間查詢條件¶
GeoDjango 將空間查詢條件新增至 Django ORM。例如,您可以在 WorldBorder
表格中找到包含特定點的國家/地區。首先,啟動管理 shell
$ python manage.py shell
...\> py manage.py shell
現在,定義一個關注點 [3]
>>> pnt_wkt = "POINT(-95.3385 29.7245)"
pnt_wkt
字串表示位於經度 -95.3385 度、緯度 29.7245 度的點。此幾何圖形的格式稱為 Well Known Text (WKT),這是開放地理空間協會 (OGC) 發布的標準。[4] 匯入 WorldBorder
模型,並使用 pnt_wkt
作為參數來執行 contains
查詢條件
>>> from world.models import WorldBorder
>>> WorldBorder.objects.filter(mpoly__contains=pnt_wkt)
<QuerySet [<WorldBorder: United States>]>
在這裡,您檢索到一個只包含一個模型的 QuerySet
:美國的邊界(完全符合您的預期)。
同樣地,您也可以使用 GEOS 幾何物件。在這裡,您可以將 intersects
空間查詢條件與 get
方法結合使用,以僅檢索聖馬利諾的 WorldBorder
實例,而不是 queryset
>>> from django.contrib.gis.geos import Point
>>> pnt = Point(12.4604, 43.9420)
>>> WorldBorder.objects.get(mpoly__intersects=pnt)
<WorldBorder: San Marino>
contains
和 intersects
查詢條件只是可用查詢的一個子集 – GeoDjango 資料庫 API 文件中有更多說明。
自動空間轉換¶
在執行空間查詢時,如果幾何圖形位於不同的坐標系統中,GeoDjango 會自動轉換幾何圖形。在以下範例中,坐標將以 EPSG SRID 32140 表示,這是一種僅特定於南德克薩斯州的坐標系統,並且單位是公尺,而不是度。
>>> from django.contrib.gis.geos import GEOSGeometry, Point
>>> pnt = Point(954158.1, 4215137.1, srid=32140)
請注意,pnt
也可以使用 EWKT 建立,EWKT 是 WKT 的「擴充」形式,包含 SRID
>>> pnt = GEOSGeometry("SRID=32140;POINT(954158.1 4215137.1)")
GeoDjango 的 ORM 會自動將幾何值包裝在轉換 SQL 中,讓開發人員可以在更高的抽象層次上工作
>>> qs = WorldBorder.objects.filter(mpoly__intersects=pnt)
>>> print(qs.query) # Generating the SQL
SELECT "world_worldborder"."id", "world_worldborder"."name", "world_worldborder"."area",
"world_worldborder"."pop2005", "world_worldborder"."fips", "world_worldborder"."iso2",
"world_worldborder"."iso3", "world_worldborder"."un", "world_worldborder"."region",
"world_worldborder"."subregion", "world_worldborder"."lon", "world_worldborder"."lat",
"world_worldborder"."mpoly" FROM "world_worldborder"
WHERE ST_Intersects("world_worldborder"."mpoly", ST_Transform(%s, 4326))
>>> qs # printing evaluates the queryset
<QuerySet [<WorldBorder: United States>]>
原始查詢
當使用原始查詢時,您必須包裝幾何欄位,以便 GEOS 可以識別欄位值
>>> from django.db import connection
>>> # or if you're querying a non-default database:
>>> from django.db import connections
>>> connection = connections["your_gis_db_alias"]
>>> City.objects.raw(
... "SELECT id, name, %s as point from myapp_city" % (connection.ops.select % "point")
... )
您應該僅在確切知道自己在做什麼時才使用原始查詢。
惰性幾何圖形¶
GeoDjango 以標準化文字表示形式載入幾何圖形。當第一次存取幾何欄位時,GeoDjango 會建立一個 GEOSGeometry
物件,公開強大的功能,例如熱門地理空間格式的序列化屬性
>>> sm = WorldBorder.objects.get(name="San Marino")
>>> sm.mpoly
<MultiPolygon object at 0x24c6798>
>>> sm.mpoly.wkt # WKT
MULTIPOLYGON (((12.4157980000000006 43.9579540000000009, 12.4505540000000003 43.9797209999999978, ...
>>> sm.mpoly.wkb # WKB (as Python binary buffer)
<read-only buffer for 0x1fe2c70, size -1, offset 0 at 0x2564c40>
>>> sm.mpoly.geojson # GeoJSON
'{ "type": "MultiPolygon", "coordinates": [ [ [ [ 12.415798, 43.957954 ], [ 12.450554, 43.979721 ], ...
這包括存取 GEOS 程式庫提供的所有進階幾何運算
>>> pnt = Point(12.4604, 43.9420)
>>> sm.mpoly.contains(pnt)
True
>>> pnt.contains(sm.mpoly)
False
地理註解¶
GeoDjango 還提供一組地理註解,用於計算距離和其他幾個運算(交集、差集等)。請參閱 地理資料庫函數 文件。
將您的資料放置在地圖上¶
地理管理¶
Django 的管理應用程式 支援編輯幾何欄位。
基本概念¶
Django 管理介面允許使用者在 JavaScript 滑動地圖(由 OpenLayers 支援)上建立和修改幾何圖形。
讓我們直接開始。在 world
應用程式內建立一個名為 admin.py
的檔案,並使用以下程式碼
from django.contrib.gis import admin
from .models import WorldBorder
admin.site.register(WorldBorder, admin.ModelAdmin)
接下來,編輯 geodjango
應用程式資料夾中的 urls.py
,如下所示
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path("admin/", admin.site.urls),
]
建立一個管理使用者
$ python manage.py createsuperuser
...\> py manage.py createsuperuser
接下來,啟動 Django 開發伺服器
$ python manage.py runserver
...\> py manage.py runserver
最後,瀏覽至 http://localhost:8000/admin/
,並使用您剛建立的使用者登入。瀏覽至任何 WorldBorder
項目 – 可以透過按一下多邊形並將頂點拖曳到所需位置來編輯邊界。
GISModelAdmin
¶
透過 GISModelAdmin
,GeoDjango 在管理介面中使用 OpenStreetMap 圖層。這提供了比 ModelAdmin
(使用託管於 OSGeo 的 Vector Map Level 0 WMS 資料集) 更豐富的上下文資訊(包括街道和幹道細節)。
必須安裝 PROJ 基準轉換檔案(詳情請參閱 PROJ 安裝說明)。
如果您滿足此要求,請在您的 admin.py
檔案中使用 GISModelAdmin
選項類別。
admin.site.register(WorldBorder, admin.GISModelAdmin)
註腳