---
title: "Kegunaan impor data LayerMapping"
version: 6.1
locale: id
source: https://docs.djangoproject.com/id/6.1/ref/contrib/gis/layermapping/
canonical: https://djangodocs.dev/id/6.1/ref/contrib/gis/layermapping/
---
# Kegunaan impor data `LayerMapping`

Kelas [`LayerMapping`](#django.contrib.gis.utils.LayerMapping) menyediakan sebuah cara untuk memetakan isi dari berkas-berkas data spasial vektor (misalnya, shapefiles) kedalam model GeoDjango.

Kegunaan ini tumbuh dari kebutuhan pribadi penulis untuk menhilangkan perulangan kode yang masuk menarik geometri dan bidang diluar lapisan vektor, merubah ke sistem kordinat lain (misalnya WGS84), dan kemudian memasukkan kedalam model GeoDjango.

> **Note**
>
> Penggunaan [`LayerMapping`](#django.contrib.gis.utils.LayerMapping) membutuhkan GDAL.

> **Warning**
>
> GIS data sources, like shapefiles, may be very large. If you find that
> [`LayerMapping`](#django.contrib.gis.utils.LayerMapping) is using too much memory, set [`DEBUG`](/id/6.1/ref/settings/#std-setting-DEBUG) to
> `False` in your settings. When [`DEBUG`](/id/6.1/ref/settings/#std-setting-DEBUG) is set to `True`,
> Django [automatically logs](/id/6.1/faq/models/#faq-see-raw-sql-queries) *every* SQL
> query -- and when SQL statements contain geometries, this may consume more
> memory than is typical.

## Contoh

1. You need a GDAL-supported data source, like a shapefile (here we're using
   a simple polygon shapefile, `test_poly.shp`, with three features):

```pycon
>>> 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. Sekarang kami menentukan model Django yang sesuai (pastikan menggunakan [`migrate`](/id/6.1/ref/django-admin/#django-admin-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. Use [`LayerMapping`](#django.contrib.gis.utils.LayerMapping) to extract all the features and place them in the
   database:

```pycon
>>> 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`](#django.contrib.gis.utils.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`](/id/6.1/ref/contrib/gis/gdal/#django.contrib.gis.gdal.SpatialReference) object to specify one.

## API `LayerMapping`

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

Berikut adalah argumen dan kata kunci yang mungkin digunakan selama penginstansiasi dari obyek `LayerMapping`.

| Argument | Deskripsi |
| --- | --- |
| `model` | Model geografis, *bukan* sebuah instance. |
| `data_source` | The path to the OGR-supported data source file<br>(e.g., a shapefile). Also accepts<br>[`django.contrib.gis.gdal.DataSource`](/id/6.1/ref/contrib/gis/gdal/#django.contrib.gis.gdal.DataSource) instances. |
| `mapping` | Sebuah dictionary: kunci-kunci adalah string berhubungan pada bidang model, dan nilai-nilai sesuai pada nama-nama bidang string untuk fitur OGR, atau jika bidang model adalah sebuah geografik lalu itu harus sesuai pada jenis geometri OGR, misalnya, `'POINT'`, `'LINESTRING'`, `'POLYGON'`. |

| Argumen Katakunci |  |
| --- | --- |
| `layer` | Indeks dari lapisan untuk digunaan dari Data Source (awalan adalah 0) |
| `source_srs` | Use this to specify the source SRS manually (for<br>example, some shapefiles don't come with a `'.prj'`<br>file). An integer SRID, WKT or PROJ strings, and<br>[`django.contrib.gis.gdal.SpatialReference`](/id/6.1/ref/contrib/gis/gdal/#django.contrib.gis.gdal.SpatialReference)<br>objects are accepted. |
| `encoding` | Specifies the character set encoding of the strings<br>in the OGR data source. For example, `'latin-1'`,<br>`'utf-8'`, and `'cp437'` are all valid encoding<br>parameters. |
| `transaction_mode` | Mungkin `'commit_on_success'` (awalan) atau `'autocommit'`. |
| `transform` | Setting this to False will disable coordinate<br>transformations. In other words, geometries will<br>be inserted into the database unmodified from their<br>original state in the data source. |
| `unik` | Setting this to the name, or a tuple of names,<br>from the given  model will create models unique<br>only to the given name(s). Geometries from<br>each feature will be added into the collection<br>associated with the unique model. Forces<br>the transaction mode to be `'autocommit'`. |
| `menggunakan` | Setel basisdata yang digunakan ketika mengimpor data spasial. Awalan adalah `'default'`. |

### Argumen Kata Kunci `save()`

#### `LayerMapping.save(verbose=False, fid_range=False, step=False, progress=False, silent=False, stream=sys.stdout, strict=False)`

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

| Simpan Argumen Kata Kunci | Deskripsi |
| --- | --- |
| `fid_range` | May be set with a slice or tuple of<br>(begin, end) feature ID's to map from<br>the data source. In other words, this<br>keyword enables the user to selectively<br>import a subset range of features in the<br>geographic data source. |
| `progress` | When this keyword is set, status information<br>will be printed giving the number of features<br>processed and successfully saved. By default,<br>progress information will be printed every 1000<br>features processed, however, this default may<br>be overridden by setting this keyword with an<br>integer for the desired interval. |
| `silent` | Secara awalan, pemberitahuan kesalahan bukan-penting dicetak pada `sys.stdout`, tetapi kata kunci ini mungkin disetel untuk meniadakan pemberitahuan ini. |
| `step` | Jika disetel dengan integer, transaksi akan muncul pada setiap jangka waktu langkah. Sebagai contoh, jika `step=1000`, commit akan muncul setelah fitur ke 1000, fitur ke 2000 dll. |
| `stream` | Status information will be written to this file<br>handle. Defaults to using `sys.stdout`, but<br>any object with a `write` method is supported. |
| `strict` | Execution of the model mapping will cease upon<br>the first error encountered. The default value<br>(`False`)<br>behavior is to attempt to continue. |
| `verbose` | Jika disetel, informasi akan dicetak selanjutnya pada setiap model simpan dijalankan pada basisdata. |

## Menyelesaikan masalah

### Kehabisan memori

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: kesalahan `max_allowed_packet`

If you encounter the following error when using `LayerMapping` and MySQL:

```pytb
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:

```ini
max_allowed_packet = 10M
```
