Stavo seguendo il tutorial su https://docs.djangoproject.com/en/1.8/ref/contrib/gis/tutorial/#importing-spatial-data per l'installazione di GeoDjango sulla mia macchina. Ma sembra che ci sia qualche problema lì. Durante l'importazione dei dati utilizzando LayerMapping eseguendo load.run()
, ottengo il seguente errore:Errore nell'importazione di dati spaziali in GeoDjango - KeyError per mpoly field
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/ubuntu/src/django/world/load.py", line 23, in run
lm = LayerMapping(WorldBorder, world_shp, world_mapping, transform=False, encoding='iso-8859-1')
File "/home/ubuntu/Envs/vir-env/local/lib/python2.7/site-packages/django/contrib/gis/utils/layermapping.py", line 105, in __init__
self.check_layer()
File "/home/ubuntu/Envs/vir-env/local/lib/python2.7/site-packages/django/contrib/gis/utils/layermapping.py", line 178, in check_layer
ogr_field_types = self.layer.field_types
File "/home/ubuntu/Envs/vir-env/local/lib/python2.7/site-packages/django/contrib/gis/gdal/layer.py", line 153, in field_types
for i in range(self.num_fields)]
KeyError: 12
Poi ho scoperto che, non v'è campo no 'MULTIPOLYGON' nel file .shp
:
>>> from django.contrib.gis.gdal import DataSource
>>> ds = DataSource('world/data/TM_WORLD_BORDERS-0.3.shp')
>>> layer = ds[0]
>>> layer.fields
[u'FIPS', u'ISO2', u'ISO3', u'UN', u'NAME', u'AREA', u'POP2005', u'REGION', u'SUBREGION', u'LON', u'LAT']
Ma è lì nel modello WorldBorder
, come tipo MultiPolygonField
. Quindi, sicuramente nel file world_mapping, l'importazione non riuscirà per il mapping 'mpoly': 'MULTIPOLYGON'
. Qualcun altro ha affrontato questo problema? Lo spero, visto che ho seguito passo passo il tutorial. Ma non dice nulla su questo problema. Che effetto avrà se caricherò i dati rimuovendo la mappatura mpoly
?
Ecco il mio file load.py:
1 import os
2 from django.contrib.gis.utils import LayerMapping
3 from models import WorldBorder
4
5 world_mapping = {
6 'fips' : 'FIPS',
7 'iso2' : 'ISO2',
8 'iso3' : 'ISO3',
9 'un' : 'UN',
10 'name' : 'NAME',
11 'area' : 'AREA',
12 'pop2005' : 'POP2005',
13 'region' : 'REGION',
14 'subregion' : 'SUBREGION',
15 'lon' : 'LON',
16 'lat' : 'LAT',
17 'mpoly' : 'MULTIPOLYGON',
18 }
19
20 world_shp = os.path.abspath(os.path.join(os.path.dirname(__file__), 'data/TM_WORLD_BORDERS-0.3.shp'))
21
22 def run(verbose=True):
23 lm = LayerMapping(WorldBorder, world_shp, world_mapping, transform=False, encoding='iso-8859-1')
24
25 lm.save(strict=True, verbose=verbose)
Solo un aggiornamento: Dopo aver attraversato il codice sorgente, tramite analisi dello stack, ho pensato che io sono in grado di accedere field_types
propery del modulo layer
. Così, da shell Python, quando accedo che la proprietà, ottengo lo stesso errore:
>>> from django.contrib.gis.gdal import DataSource
>>> ds = DataSource(wshp)
>>> layer = ds[0]
>>> layer.fields
[u'FIPS', u'ISO2', u'ISO3', u'UN', u'NAME', u'AREA', u'POP2005', u'REGION', u'SUBREGION', u'LON', u'LAT']
>>> layer.field_types
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/ubuntu/Envs/rj-venv/local/lib/python2.7/site-packages/django/contrib/gis/gdal/layer.py", line 153, in field_types
for i in range(self.num_fields)]
KeyError: 12
Ora, questo è strano, perché ora ho anche rimosso mpoly
campo dalla WorldBorder
modello.
Aggiornamento 2:
Dopo scavare attraverso il codice sorgente, ho scoperto che, OGDFieldTypes
nella mia versione di GDAL, potrebbe non avere la chiave 12, come nel codice sorgente qui: https://github.com/django/django/blob/master/django/contrib/gis/gdal/field.py. Ma dice che i tasti 12 e 13 saranno disponibili per GDAL 2
, e questo è quello che ho installato. Sembra davvero che ci sia qualche conflitto tra le biblioteche ora.
Ho installato le seguenti librerie:
- GEOS-3.4.2.tar.bz2
- proj-datumgrid-1.5.tar.gz
- prog-4.8.0.tar. gz
- gdal-2.0.0.tar.gz
E PostGIS versione 2.1.5 è installato in caso Amazon RDS.
Grazie così tanto @JRichard .. Ha funzionato perfettamente con GDAL versione 1.9.2 –
Grazie per la taglia @RohitJain - una bella sorpresa e molto apprezzata :) –
Ti ho sicuramente dovuto questo per gli sforzi che hai messo in .. Grazie ancora :) –