GeoDjango modell-APILink to this heading
Detta dokument utforskar detaljerna i GeoDjango Model API. I detta avsnitt kommer vi att använda följande geografiska modell av en ”ZIP-kod” och en ”digital höjdmodell” som exempel:
from django.contrib.gis.db import models
class Zipcode(models.Model):
code = models.CharField(max_length=5)
poly = models.PolygonField()
class Elevation(models.Model):
name = models.CharField(max_length=100)
rast = models.RasterField()
Spatiala fälttyperLink to this heading
Spatiala fält består av en serie geometriska fälttyper och en rasterfälttyp. Var och en av geometrifälttyperna motsvarar OpenGIS Simple Features-specifikationen [1]. Det finns ingen sådan standard för rasterdata.
GeometryFieldLink to this heading
- class GeometryFieldLink to this definition
Basklass för geometriska fält.
PointFieldLink to this heading
- class PointFieldLink to this definition
Lagrar en Point.
LineStringFieldLink to this heading
- class LineStringFieldLink to this definition
Lagrar en LineString.
PolygonFieldLink to this heading
- class PolygonFieldLink to this definition
Lagrar en Polygon.
MultiPointFieldLink to this heading
- class MultiPointFieldLink to this definition
Lagrar en MultiPoint.
MultiLineStringFieldLink to this heading
- class MultiLineStringFieldLink to this definition
Lagrar en MultiLineString.
MultiPolygonFieldLink to this heading
- class MultiPolygonFieldLink to this definition
Lagrar en MultiPolygon.
GeometryCollectionFieldLink to this heading
- class GeometryCollectionFieldLink to this definition
Lagrar en GeometryCollection.
RasterFieldLink to this heading
- class RasterFieldLink to this definition
Lagrar en GDALRaster.
RasterField är för närvarande endast implementerat för PostGIS backend.
Alternativ för rumslig fältindelningLink to this heading
Förutom de vanliga Alternativ för fält som finns tillgängliga för Django-modellfält, har spatiala fält följande ytterligare alternativ. Alla är valfria.
sridLink to this heading
- BaseSpatialField.sridLink to this definition
Ställer in SRID [2] (Spatial Reference System Identity) för geometrifältet till det angivna värdet. Standardvärdet är 4326 (även känt som `WGS84`__, enheterna är i grader av longitud och latitud).
Välja en SRIDLink to this heading
Att välja en lämplig SRID för din modell är ett viktigt beslut som utvecklaren bör överväga noga. SRID är en heltalsspecifikation som motsvarar det projektionssystem som kommer att användas för att tolka data i den rumsliga databasen. [Projektionssystem ger sammanhang åt de koordinater som anger en plats. Även om detaljerna i `geodesi`__ ligger utanför ramen för denna dokumentation, är det allmänna problemet att jorden är sfärisk och att representationer av jorden (t.ex. papperskartor, webbkartor) inte är det.
De flesta känner till hur man använder latitud och longitud för att referera till en plats på jordens yta. Latitud och longitud är dock vinklar, inte avstånd. Med andra ord, medan den kortaste vägen mellan två punkter på en plan yta är en rak linje, är den kortaste vägen mellan två punkter på en krökt yta (som jorden) en båge i en stor cirkel. [4] Det krävs alltså ytterligare beräkningar för att få fram avstånd i plana enheter (t.ex. kilometer och miles). Att använda ett geografiskt koordinatsystem kan medföra komplikationer för utvecklaren i ett senare skede. SpatiaLite har t.ex. inte möjlighet att utföra avståndsberäkningar mellan geometrier som använder geografiska koordinatsystem, t.ex. att konstruera en fråga för att hitta alla punkter inom 8 km från en länsgräns som lagrats som WGS84. [5]
Delar av jordens yta kan projiceras på ett tvådimensionellt, eller kartesiskt, plan. Projicerade koordinatsystem är särskilt lämpliga för regionspecifika tillämpningar, t.ex. om du vet att din databas endast kommer att omfatta geometrier i ”Norra Kansas”, kan du överväga att använda ett projektionssystem som är specifikt för den regionen. Dessutom definieras projicerade koordinatsystem i kartesiska enheter (t.ex. meter eller fot), vilket underlättar avståndsberäkningar.
Mer om detta:
`spatialreference.org`__: En Django-driven databas med rumsliga referenssystem.
”Koordinatsystemet för det statliga planet”: En webbplats som täcker de olika projektionssystem som används i USA. En stor del av de amerikanska rumsliga data som påträffas kommer att vara i ett av dessa koordinatsystem snarare än i ett geografiskt koordinatsystem som WGS84.
rumsligt_indexLink to this heading
- BaseSpatialField.spatial_indexLink to this definition
Standardvärdet är True. Skapar ett spatialt index för det angivna geometriska fältet.
Alternativ för geometrifältLink to this heading
Det finns ytterligare alternativ tillgängliga för Geometry-fält. Alla följande alternativ är valfria.
dimLink to this heading
- GeometryField.dimLink to this definition
Detta alternativ kan användas för att anpassa koordinatdimensionen i geometrifältet. Som standard är den inställd på 2, för att representera tvådimensionella geometrier. För spatiala backends som stöder detta kan den sättas till 3 för tredimensionellt stöd.
geografiLink to this heading
- GeometryField.geographyLink to this definition
Om detta alternativ är inställt på True skapas en databaskolumn av typen geography i stället för geometry. Se avsnittet geography type nedan för mer information.
max_geom_collectionsLink to this heading
- GeometryField.max_geom_collectionsLink to this definition
This option is forwarded to the form field generated for this model
field, bounding how many geometry collections may be contained in submitted
WKB/WKT inputs before raising ValueError. Since spatial field
assignments are lazy, it is also checked when values are accessed, e.g. when
saving an instance, but not when read from a database. It defaults to 198.
Geography-typLink to this heading
Geografitypen ger inbyggt stöd för rumsliga egenskaper som representeras med geografiska koordinater (t.ex. WGS84-längdgrad/latitud). [6] Till skillnad från planet som används av en geometrityp, använder geografin en sfärisk representation av sina data. Avstånds- och mätoperationer som utförs på en geografikolumn använder automatiskt beräkningar av storcirkelbågar och returnerar linjära enheter. Med andra ord, när ST_Distance anropas på två geografier returneras ett värde i meter (i motsats till grader om det anropas på en geometrikolumn i WGS84).
Eftersom geografiska beräkningar kräver mer matematik är endast en delmängd av PostGIS rumsliga uppslagsord tillgängliga för den geografiska typen. I praktiken innebär detta att utöver distance lookups är endast följande ytterligare spatial lookups tillgängliga för geografiska kolumner:
täckt avtäcken
Om du behöver använda en spatial lookup eller aggregat som inte stöder geografin som indata kan du använda databasfunktionen Cast för att konvertera geografikolumnen till en geometrityp i frågan:
from django.contrib.gis.db.models import PointField
from django.db.models.functions import Cast
Zipcode.objects.annotate(geom=Cast("geography_field", PointField())).filter(
geom__within=poly
)
För mer information, PostGIS-dokumentationen innehåller ett användbart avsnitt om att avgöra ”när man ska använda geografisk datatyp över geometrisk datatyp <https://postgis.net/docs/using_postgis_dbmanagement.html#PostGIS_GeographyVSGeometry>`_.
Fotnoter