GeoDjango 表單 API

GeoDjango 提供一些專門的表單欄位和小工具,以便在地圖上視覺化顯示和編輯地理定位資料。預設情況下,它們使用由 OpenLayers 驅動的地圖,並由 NASA 提供基礎 WMS 圖層。

欄位參數

除了常規的 表單欄位參數 外,GeoDjango 表單欄位還接受以下可選參數。

srid

Field.srid

這是欄位值應轉換成的 SRID 代碼。例如,如果地圖小工具的 SRID 與您的應用程式或資料庫更常用的一般 SRID 不同,則該欄位會自動將輸入值轉換為該 SRID。

geom_type

Field.geom_type

您通常不必設定或變更該屬性,該屬性應根據欄位類別設定。它符合 OpenGIS 標準幾何圖形名稱。

表單欄位類別

GeometryField

class GeometryField[原始碼]

PointField

class PointField[原始碼]

LineStringField

class LineStringField[原始碼]

PolygonField

class PolygonField[原始碼]

MultiPointField

class MultiPointField[原始碼]

MultiLineStringField

class MultiLineStringField[原始碼]

MultiPolygonField

class MultiPolygonField[原始碼]

GeometryCollectionField

class GeometryCollectionField[原始碼]

表單小工具

GeoDjango 表單小工具可讓您在視覺地圖上顯示和編輯地理資料。請注意,目前沒有任何可用的小工具支援 3D 幾何圖形,因此幾何圖形欄位將會針對這類資料使用 Textarea 小工具作為後備。

小工具屬性

GeoDjango 小工具是基於樣板的,因此它們的屬性與其他 Django 小工具屬性大多不同。

BaseGeometryWidget.geom_type

OpenGIS 幾何圖形類型,通常由表單欄位設定。

BaseGeometryWidget.map_srid

地圖使用的 SRID 代碼 (預設為 4326)。

BaseGeometryWidget.display_raw

布林值,指定是否顯示顯示目前幾何圖形序列化表示的 textarea 輸入,主要用於偵錯用途 (預設為 False)。

BaseGeometryWidget.supports_3d

指出小工具是否支援編輯 3D 資料 (預設為 False)。

BaseGeometryWidget.template_name

用於呈現地圖小工具的樣板。

您可以像對待任何其他 Django 小工具一樣傳遞小工具屬性。例如

from django.contrib.gis import forms


class MyGeoForm(forms.Form):
    point = forms.PointField(widget=forms.OSMWidget(attrs={"display_raw": True}))

小工具類別

BaseGeometryWidget

class BaseGeometryWidget[原始碼]

這是一個抽象基礎小工具,包含子類別所需的邏輯。您不能直接將此小工具用於幾何圖形欄位。請注意,GeoDjango 小工具的呈現基於樣板,由 template_name 類別屬性識別。

OpenLayersWidget

class OpenLayersWidget[原始碼]

這是所有 GeoDjango 表單欄位使用的預設小工具。template_namegis/openlayers.html

OpenLayersWidgetOSMWidget 使用託管在 cdn.jsdelivr.net 內容傳遞網路上的 ol.js 檔案。您可以對這些小工具進行子類別化,以便在內部 Media 類別的 js 屬性中指定您自己的 ol.js 檔案版本 (請參閱 以靜態定義的資產)。

OSMWidget

class OSMWidget[原始碼]

此小工具使用 OpenStreetMap 基礎圖層來顯示地理物件。屬性為

template_name

gis/openlayers-osm.html

default_lat
default_lon

預設中心緯度和經度分別為 475,這是法國東部的一個地點。

default_zoom

預設地圖縮放為 12

關於 JavaScript 檔案託管的 OpenLayersWidget 注意事項也適用於此。另請參閱關於以 https 存取地圖圖磚的 FAQ 回答

返回頂部