# dokumentasi Django 2.2.9.dev20191202104323

# Kegunaan impor data `LayerMapping`

Kelas `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.

Catatan

Penggunaan `LayerMapping` membutuhkan GDAL.

Peringatan

Sumber data GIS, seperti shapefile, mungkin sangat besar. Jika anda menemukan bahwa `LayerMapping` menggunakan memori terlalu banyak, setel `DEBUG` menjadi `False` dalam pengaturan anda. Ketika `DEBUG` disetel menjadi `True`, Django automatically logs setiap permintaan SQL -- jadi, ketika pernyataan SQL mengandung geometri, itu sangat mudah mengkonsumsi memori lebih daripada yang khas.

## Contoh

1. Anda butuh sumber data dudkung-GDAL, seperti shapefile (disini kami menggunakan shapefile poligon sederhana, `test_poly.shp`, dengan tiga fitur):

       >>> 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]]

2. Sekarang kami menentukan model Django yang sesuai (pastikan menggunakan `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

3. Gunakan `LayerMapping` untuk mengambil semua ditur-fitur dan menempatkan mereka dalam basisdata:

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

Disini, `LayerMapping` cukup merubah tiga geometri dari shapefile dalam sistem acuan spasial asli mereka (WGS84) ke sistem acuan spasial dari model GeoDjango (NAD83). Jika tidak ada sistem acuan spasial ditentukan untuk lapisan, gunakan katakunci `source_srs` dengan sebuah obyek `SpatialReference` untuk menentukan satu.

## 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` | Jalur pada berkas sumber data didukung-OGR (misalnya, shapefile). Juga menerima contoh `django.contrib.gis.gdal.DataSource`.
`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` | Gunakan ini untuk menentukan sumber SRS manual (sebagai contoh, beberapa shapefiles tidak datang dengan sebuah berkas `'.prj'`). Sebuah integer SRID, WKT atau stringPROJ.4, dan obyek-obyek `django.contrib.gis.gdal.SpatialReference` diterima.
`encoding` | Menentukan penyandian kumpulan karakter dari string dalam sumber data OGR. Sebagai contoh, `'latin-1'`, `'utf-8'`, dan `'cp437'` adalah semua parameter penyandian sah.
`transaction_mode` | Mungkin `'commit_on_success'` (awalan) atau `'autocommit'`.
`transform` | Atur ini menjadi False akan meniadakan perubahan kordinat. Dengan kata lain, geometri akan dimasukkan ke dalam basisdata tidak dirubah dari keadaan asli mereka dalam sumber data.
`unik` | Sete ini pada nama, atau tuple dari nama, dari model diberikan akan membuat hanya model unik pada nama dinerikan. Geometri dari setiap fitur akan ditambahkan kedalam kumpulan berkaitan dengan model unik. Memaksa suasana perubahan menjadi `'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)

Metode `save()` juga menerima kata kunci. Kata kunci ini digunakan untuk mengendalikan catatan keluaran, penanganan kesalahan, dan mengimpor jangkauan fitur khusus.

Simpan Argumen Kata Kunci | Deskripsi
--- | ---
`fid_range` | Mungkin disetel dengan potongan atau tuple dari ID fitur (mulai, akhir) pada peta dari sumber data. Dengan akta lain, kata kunci ini mengadakan pengguna untuk memilih impor jangkauan subset dari fitur-fitur dalam sumber data geografis.
`progress` | Ketika kata kunci ini disetel, informasu keadaan akan dicetak memberikan angka dari fitur-fitur diolah dan berhasil disimpan. Secara awalan, informasi kemajuan akan dicetak setiap 1000 fitur diolah, bagaimanapun, awalan ini mungkin ditimpa dengan mengatur kata kunci ini dengan sebuah integer untuk jarak waktu yang diharapkan.
`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` | Informasi keadaan akan ditulis ke penanganan berkas ini. Awalan menggunakan `sys.stdout`, tetapi obyek apapun dengan metode `write` didukung.
`strict` | Menjalankan pemetaan model akan menghentikan kesalahan pertama yang ditemui. Nilai awalan perilaku (`False`) adalah berusaha untuk melanjutkan.
`verbose` | Jika disetel, informasi akan dicetak selanjutnya pada setiap model simpan dijalankan pada basisdata.

## Menyelesaikan masalah

### Kehabisan memori

Seperti dicatat dalam peringatan pada atas bagian ini, Django menyimpan semua permintaan SQL ketika `DEBUG=True`. Setel `DEBUG=False` dalam pengaturan ini, dan ini harus menghentikan penggunaan memori berlebihan ketika menjalankan tulisan `LayerMapping`.

### MySQL: kesalahan `max_allowed_packet`

Jika anda menghadapi kesalahan berikut ketika menggunakan `LayerMapping` dan MySQL:

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

Lalu pemecahan adalah untuk meningkatkan nilai dari pengaturan `max_allowed_packet` dalam konfigurasi MySQL anda. Sebagai contoh, nilai awalan mungkin sesuatu rendah seperti satu megabyte -- pengaturan dapat dirubah dalam berkas konfigurasi MySQL (`my.cnf`) dalam bagian `[mysqld]`:

    max_allowed_packet = 10M