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:

Code
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:

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:

Code
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