LayerMapping verktyg för dataimport

Klassen LayerMapping ger ett sätt att mappa innehållet i vektorbaserade rumsliga datafiler (t.ex. shapefiler) till GeoDjango-modeller.

Detta verktyg växte fram ur författarens personliga behov av att eliminera kodupprepningen som gick ut på att dra ut geometrier och fält från ett vektorlager, konvertera till ett annat koordinatsystem (t.ex. WGS84) och sedan infoga i en GeoDjango-modell.

Observera

Användning av LayerMapping kräver GDAL.

Varning

GIS-datakällor, t.ex. shapefiler, kan vara mycket stora. Om du upptäcker att LayerMapping använder för mycket minne, sätt DEBUG till False i dina inställningar. När DEBUG är satt till True loggar Django automatiskt varje SQL-fråga – och när SQL-satser innehåller geometrier kan detta förbruka mer minne än vad som är normalt.

Exempel

  1. Du behöver en GDAL-stödd datakälla, t.ex. en shapefil (här använder vi en enkel polygon-shapefil, test_poly.shp, med tre funktioner):

>>> from django.contrib.gis.gdal import DataSource
>>> ds = DataSource("test_poly.shp")
>>> layer = ds[0]
>>> print(layer.fields)  # Exploring the fields in the layer, we only want the 'str' field.
['float', 'int', 'str']
>>> print(len(layer))  # getting the number of features in the layer (should be 3)
3
>>> print(layer.geom_type)  # Should be 'Polygon'
Polygon
>>> print(layer.srs)  # WGS84 in WKT
GEOGCS["GCS_WGS_1984",
    DATUM["WGS_1984",
        SPHEROID["WGS_1984",6378137,298.257223563]],
    PRIMEM["Greenwich",0],
    UNIT["Degree",0.017453292519943295]]
  1. Nu definierar vi vår motsvarande Django-modell (se till att använda migrate):

    from django.contrib.gis.db import models
    
    
    class TestGeo(models.Model):
        name = models.CharField(max_length=25)  # corresponds to the 'str' field
        poly = models.PolygonField(srid=4269)  # we want our model in a different SRID
    
        def __str__(self):
            return "Name: %s" % self.name
    
  2. Använd LayerMapping för att extrahera alla funktioner och placera dem i databasen:

>>> from django.contrib.gis.utils import LayerMapping
>>> from geoapp.models import TestGeo
>>> mapping = {
...     "name": "str",  # The 'name' model field maps to the 'str' layer field.
...     "poly": "POLYGON",  # For geometry fields use OGC name.
... }  # The mapping is a dictionary
>>> lm = LayerMapping(TestGeo, "test_poly.shp", mapping)
>>> lm.save(verbose=True)  # Save the layermap, imports the data.
Saved: Name: 1
Saved: Name: 2
Saved: Name: 3

Här har LayerMapping omvandlat de tre geometrierna från shapefilen i deras ursprungliga rumsliga referenssystem (WGS84) till GeoDjango-modellens rumsliga referenssystem (NAD83). Om inget rumsligt referenssystem har definierats för skiktet, använd nyckelordet source_srs med ett SpatialReference-objekt för att ange ett.

aPI LayerMapping API

class LayerMapping(model, data_source, mapping, layer=0, source_srs=None, encoding=None, transaction_mode='commit_on_success', transform=True, unique=True, using='default')[source]

Följande är de argument och nyckelord som kan användas vid instansiering av LayerMapping objekt.

Argument

Beskrivning

modell

Den geografiska modellen, inte en instans.

datakälla

Sökvägen till den OGR-stödda datakällfilen (t.ex. en shapefil). Accepterar även django.contrib.gis.gdal.DataSource-instanser.

mappning

En ordbok: nycklarna är strängar som motsvarar modellfältet och värdena motsvarar strängfältsnamn för OGR-objektet, eller om modellfältet är geografiskt bör det motsvara OGR:s geometrityp, t.ex. 'POINT', 'LINESTRING', 'POLYGON'.

Argument för nyckelord

lager

Indexet för det lager som ska användas från datakällan (standardvärde 0)

källa_srs

Använd detta för att ange källan SRS manuellt (till exempel, vissa shapefiler levereras inte med en '.prj-fil). Ett heltal SRID, WKT- eller PROJ-strängar och django.contrib.gis.gdal.SpatialReference-objekt accepteras.

kodning

Anger teckenuppsättningskodningen för strängarna i OGR-datakällan. Exempelvis är 'latin-1', 'utf-8' och 'cp437' alla giltiga kodningsparametrar.

transaktionsläge

Kan vara 'commit_on_success (standard) eller 'autocommit.

transform

Om du ställer in detta på False inaktiveras koordinattransformationer. Med andra ord kommer geometrier att infogas i databasen oförändrade från sitt ursprungliga tillstånd i datakällan.

unique

Om du ställer in detta till namnet, eller en tupel av namn, från den givna modellen skapas modeller som är unika endast för det eller de angivna namnen. Geometrier från varje funktion kommer att läggas till i den samling som är associerad med den unika modellen. Tvingar transaktionsläget att vara 'autocommit'.

använder

Anger den databas som ska användas vid import av rumsliga data. Standard är 'default'.

save() Nyckelord Argument

LayerMapping.save(verbose=False, fid_range=False, step=False, progress=False, silent=False, stream=sys.stdout, strict=False)[source]

Metoden save() accepterar även nyckelord. Dessa nyckelord används för att styra loggning av utdata, felhantering och för att importera specifika funktionsområden.

Spara sökordsargument

Beskrivning

fid_range

Kan anges med en del eller en tupel av (början, slut) funktions-ID:n som ska mappas från datakällan. Med andra ord gör detta nyckelord det möjligt för användaren att selektivt importera en delmängd av funktioner i den geografiska datakällan.

framsteg

När detta nyckelord är inställt skrivs statusinformation ut som anger antalet funktioner som har bearbetats och sparats. Som standard skrivs statusinformationen ut var 1000:e bearbetad funktion, men denna standard kan åsidosättas genom att ange detta nyckelord med ett heltal för önskat intervall.

silent

Som standard skrivs icke-fatala felmeddelanden ut till sys.stdout, men detta nyckelord kan anges för att inaktivera dessa meddelanden.

steg

Om det anges med ett heltal kommer transaktioner att ske vid varje stegintervall. Om t.ex. step=1000, kommer en transaktion att ske efter den 1 000:e funktionen, den 2 000:e funktionen osv.

ström

Statusinformation kommer att skrivas till detta filhandtag. Standard är att använda sys.stdout, men alla objekt med en write-metod stöds.

strikt

Exekveringen av modellmappningen kommer att avbrytas vid det första felet som påträffas. Standardvärdet (False) är att försöka fortsätta.

verbose

Om den är inställd kommer information att skrivas ut efter varje modellsparning som utförs i databasen.

Felsökning

Minnet tar slut

Som nämnts i varningen högst upp i detta avsnitt lagrar Django alla SQL-frågor när DEBUG=True. Ställ in DEBUG=False i dina inställningar, och detta bör stoppa överdriven minnesanvändning när du kör LayerMapping skript.

MySQL: max_allowed_packet fel

Om du stöter på följande fel när du använder LayerMapping och MySQL:

OperationalError: (1153, "Got a packet bigger than 'max_allowed_packet' bytes")

Då är lösningen att öka värdet på inställningen max_allowed_packet i din MySQL-konfiguration. Standardvärdet kan till exempel vara något så lågt som en megabyte – inställningen kan ändras i MySQL:s konfigurationsfil (my.cnf) i avsnittet [mysqld]:

max_allowed_packet = 10M