LayerMapping verktyg för dataimportLink to this heading

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.

ExempelLink to this heading

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

Python console
>>> 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):

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

Python console
>>> 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 transformerade LayerMapping de tre geometrierna från shapefilen i deras ursprungliga spatiala referenssystem (WGS84) till det spatiala referenssystemet för GeoDjango-modellen (NAD83). Om inget spatialt referenssystem är definierat för lagret använder du nyckelordet source_srs med ett SpatialReference-objekt för att ange ett.

aPI LayerMapping APILink to this heading

class LayerMapping(model, data_source, mapping, layer=0, source_srs=None, encoding=None, transaction_mode='commit_on_success', transform=True, unique=True, using='default')Link to this definition

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 instanser av django.contrib.gis.gdal.DataSource.

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ällans SRS manuellt (vissa shapefiler levereras till exempel utan filen '.prj'). Ett heltals-SRID, WKT- eller PROJ-strängar och django.contrib.gis.gdal.SpatialReference-objekt accepteras.

kodning

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

transaktionsläge

Kan vara 'commit_on_success (standard) eller 'autocommit.

transform

Om detta anges till False inaktiveras koordinattransformationer. Med andra ord infogas geometrier i databasen utan ändringar från deras ursprungliga tillstånd i datakällan.

unique

Om detta anges till namnet, eller en tuppel med namn, från den angivna modellen skapas modeller som är unika endast för det angivna namnet eller de angivna namnen. Geometrier från varje objekt läggs till i samlingen som är kopplad till den unika modellen. Tvingar transaktionsläget till 'autocommit'.

använder

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

save() Nyckelord ArgumentLink to this heading

LayerMapping.save(verbose=False, fid_range=False, step=False, progress=False, silent=False, stream=sys.stdout, strict=False)Link to this definition

Metoden save() accepterar även nyckelord. Dessa nyckelord används för att styra utdata-loggning, felhantering och import av specifika intervall av objekt.

Spara sökordsargument

Beskrivning

fid_range

Kan anges med ett snitt eller en tuppel av objekt-ID:n (begin, end) som ska mappas från datakällan. Med andra ord låter detta nyckelord användaren selektivt importera ett delintervall av objekt i den geografiska datakällan.

framsteg

När detta nyckelord anges skrivs statusinformation ut med antalet objekt som behandlats och sparats. Som standard skrivs förloppsinformation ut för var 1 000:e bearbetat objekt, men detta standardvärde kan åsidosättas genom att ange 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 skrivs till detta filhandtag. Standardvärdet är sys.stdout, men alla objekt med en metod write stöds.

strikt

Körningen av modellmappningen avbryts vid det första fel som påträffas. Standardvärdet (False) försöker fortsätta.

verbose

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

FelsökningLink to this heading

Minnet tar slutLink to this heading

Som anges i varningen i början av detta avsnitt lagrar Django alla SQL-frågor när DEBUG=True. Sätt DEBUG=False i inställningarna så bör den stora minnesanvändningen upphöra när LayerMapping-skript körs.

MySQL: max_allowed_packet felLink to this heading

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

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

Lösningen är då att öka värdet för inställningen max_allowed_packet i MySQL-konfigurationen. Standardvärdet kan till exempel vara så lågt som en megabyte – inställningen kan ändras i MySQL-konfigurationsfilen (my.cnf), i avsnittet [mysqld]:

Ini
max_allowed_packet = 10M