GeoDjango modell-APILink to this heading
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ä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).
Setting the SRID to -1 disables automatic SRID transformations when saving
geometries. The assigned geometry’s SRID is set to -1, discarding any
explicit SRID it had.
Välja en SRIDLink to this heading
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.
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_indexLink to this heading
- BaseSpatialField.spatial_indexLink to this definition
Standardvärdet är True. Skapar ett spatialt index för det angivna geometrifä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 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.
geografiLink to this heading
- GeometryField.geographyLink to this definition
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.
max_geom_collectionsLink to this heading
- GeometryField.max_geom_collectionsLink to this definition
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-typLink to this heading
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