GeoDjango modell-API¶
Det här dokumentet undersöker detaljerna i GeoDjango Model API. I hela detta avsnitt används följande geografiska modell av ett postnummer 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älttyper¶
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.
GeometryField¶
Basklass för geometriska fält.
PointField¶
Lagrar en Point.
LineStringField¶
Lagrar en LineString.
PolygonField¶
Lagrar en Polygon.
MultiPointField¶
Lagrar en MultiPoint.
MultiLineStringField¶
Lagrar en MultiLineString.
MultiPolygonField¶
Lagrar en MultiPolygon.
GeometryCollectionField¶
Lagrar en GeometryCollection.
RasterField¶
Lagrar en GDALRaster.
RasterField är för närvarande endast implementerat för PostGIS backend.
Alternativ för rumslig fältindelning¶
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.
srid¶
- BaseSpatialField.srid¶
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 SRID¶
Att välja ett lämpligt SRID för modellen är ett viktigt beslut som utvecklaren bör överväga noggrant. SRID är en heltalsspecifikation som motsvarar det projektionssystem som används för att tolka data i den spatiala databasen. [3] Projektionssystem ger ett sammanhang åt koordinaterna som anger en plats. Detaljerna i geodesi ligger utanför denna dokumentations räckvidd, men det grundläggande problemet är att jorden är sfärisk medan representationer av jorden (t.ex. papperskartor och webbkartor) inte är det.
De flesta känner till att använda latitud och longitud för att ange en plats på jordytan. Latitud och longitud är dock vinklar, inte avstånd. Med andra ord är den kortaste vägen mellan två punkter på en plan yta en rak linje, medan den kortaste vägen mellan två punkter på en krökt yta (som jorden) är en båge av en storcirkel. [4]
Därför krävs ytterligare beräkningar för att få avstånd i plana enheter (t.ex. kilometer och engelska mil). Att använda ett geografiskt koordinatsystem kan medföra komplikationer för utvecklaren senare. SpatiaLite kan till exempel inte utföra avståndsberäkningar mellan geometrier som använder geografiska koordinatsystem, såsom att konstruera en fråga för att hitta alla punkter inom 5 engelska mil från en länsgräns lagrad som WGS84. [5]
Delar av jordytan kan projiceras på ett tvådimensionellt, eller kartesiskt, plan. Projekterade koordinatsystem är särskilt praktiska för regionspecifika tillämpningar. Om du till exempel vet att databasen endast täcker geometrier i North Kansas kan du överväga att använda ett projektionssystem som är specifikt för den regionen. Dessutom definieras projekterade koordinatsystem i kartesiska enheter (som meter eller fot), vilket underlättar avståndsberäkningar.
Observera
Om du vill utföra godtyckliga avståndsfrågor med hjälp av icke-punktgeometrier i WGS84 i PostGIS och du vill ha anständig prestanda, aktivera nyckelordet GeometryField.geography så att geography database type används istället.
Mer om detta:
spatialreference.org: En databas med spatiala referenssystem.
The State Plane Coordinate System: En webbplats som beskriver de olika projektionssystem som används i USA. Mycket av de spatiala data från USA som du möter kommer att använda något av dessa koordinatsystem i stället för ett geografiskt koordinatsystem som WGS84.
rumsligt_index¶
- BaseSpatialField.spatial_index¶
Standardvärdet är True. Skapar ett spatialt index för det angivna geometrifältet.
Observera
Detta skiljer sig från fältalternativet db_index eftersom spatiala index skapas på ett annat sätt än vanliga databasindex. I synnerhet skapas spatiala index vanligen med en variant av R-trädet, medan vanliga databasindex vanligen använder B-träd.
Alternativ för geometrifält¶
Det finns ytterligare alternativ tillgängliga för Geometry-fält. Alla följande alternativ är valfria.
dim¶
- GeometryField.dim¶
Detta alternativ kan användas för att anpassa koordinatdimensionen för geometrifältet. Som standard är det satt till 2 för att representera tvådimensionella geometrier. För spatiala backendar som stöder det kan det sättas till 3 för tredimensionellt stöd.
Observera
För närvarande är 3D-stödet begränsat till PostGIS- och SpatiaLite-backends.
geografi¶
- GeometryField.geography¶
Om värdet är True skapar detta alternativ en databaskolumn av typen geography i stället för geometry. Mer information finns i avsnittet geography-typen nedan.
Observera
Geografistödet är begränsat till PostGIS och tvingar SRID att vara 4326.
max_geom_collections¶
- GeometryField.max_geom_collections¶
Detta alternativ vidarebefordras till formulärfältet som genereras för detta modellfält och begränsar hur många geometrisamlingar som kan ingå i inskickad WKB/WKT-indata innan ValueError utlöses. Eftersom tilldelningar till spatiala fält är lata kontrolleras det även när värden används, t.ex. när en instans sparas, men inte när de läses från en databas. Standardvärdet är 198.
Geography-typ¶
Geography-typen ger inbyggt stöd för spatiala objekt som representeras med geografiska koordinater (t.ex. WGS84-longitud/latitud). [6] Till skillnad från det plan som används av en geometry-typ använder geography-typen en sfärisk representation av sina data. Avstånds- och mätoperationer som utförs på en geography-kolumn använder automatiskt beräkningar med storcirkelbågar och returnerar linjära enheter. Med andra ord returneras ett värde i meter när ST_Distance anropas för två geography-objekt (i stället för grader om det anropas för en geometry-kolumn 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
)
Mer information finns i PostGIS-dokumentationens användbara avsnitt om att avgöra när datatypen geography ska användas i stället för geometry.
Fotnoter