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 data sources, like shapefiles, may be very large. If you find that LayerMapping is using too much memory, set DEBUG to False in your settings. When DEBUG is set to True, Django automatically logs every SQL query – and when SQL statements contain geometries, this may consume more memory than is typical.

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

Here, LayerMapping transformed the three geometries from the shapefile in their original spatial reference system (WGS84) to the spatial reference system of the GeoDjango model (NAD83). If no spatial reference system is defined for the layer, use the source_srs keyword with a SpatialReference object to specify one.

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

The path to the OGR-supported data source file (e.g., a shapefile). Also accepts django.contrib.gis.gdal.DataSource instances.

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

Use this to specify the source SRS manually (for example, some shapefiles don’t come with a '.prj' file). An integer SRID, WKT or PROJ strings, and django.contrib.gis.gdal.SpatialReference objects are accepted.

kodning

Specifies the character set encoding of the strings in the OGR data source. For example, 'latin-1', 'utf-8', and 'cp437' are all valid encoding parameters.

transaktionsläge

Kan vara 'commit_on_success (standard) eller 'autocommit.

transform

Setting this to False will disable coordinate transformations. In other words, geometries will be inserted into the database unmodified from their original state in the data source.

unique

Setting this to the name, or a tuple of names, from the given model will create models unique only to the given name(s). Geometries from each feature will be added into the collection associated with the unique model. Forces the transaction mode to be '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]

The save() method also accepts keywords. These keywords are used for controlling output logging, error handling, and for importing specific feature ranges.

Spara sökordsargument

Beskrivning

fid_range

May be set with a slice or tuple of (begin, end) feature ID’s to map from the data source. In other words, this keyword enables the user to selectively import a subset range of features in the geographic data source.

framsteg

When this keyword is set, status information will be printed giving the number of features processed and successfully saved. By default, progress information will be printed every 1000 features processed, however, this default may be overridden by setting this keyword with an integer for the desired interval.

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

Status information will be written to this file handle. Defaults to using sys.stdout, but any object with a write method is supported.

strikt

Execution of the model mapping will cease upon the first error encountered. The default value (False) behavior is to attempt to continue.

verbose

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

Felsökning

Minnet tar slut

As noted in the warning at the top of this section, Django stores all SQL queries when DEBUG=True. Set DEBUG=False in your settings, and this should stop excessive memory use when running LayerMapping scripts.

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

Then the solution is to increase the value of the max_allowed_packet setting in your MySQL configuration. For example, the default value may be something low like one megabyte – the setting may be modified in MySQL’s configuration file (my.cnf) in the [mysqld] section:

max_allowed_packet = 10M