2015-06-28 11 views
7

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.

risposta

7

Il problema qui è che il version 1.8.2 di Django (versione più recente al momento della scrittura) non supporta i tipi di campo GDAL 2.0.0. La correzione per questo è nel ramo del codice master Django - ma non ancora in una versione di rilascio.

Al momento della scrittura sono disponibili due opzioni: creare Django dall'ultima sorgente su Github (ad esempio aggiornamento) o eseguire il downgrade di GDAL in modo che il codice nativo called by this line non possa restituire il valore 12 come tipo di campo.

Perché GDAL 2.0 can return 12 as a field type, la ricerca in this dictionary non riesce con il KeyError si vede utilizzando il codice Django 1.8.2. On master, il dict contiene i campi corretti per GDAL 2.0 - risolto da this commit (solo 9 giorni al momento della scrittura!).


Per completezza - la diagnosi di questo difetto seguita una discussione in chat room SOPython - un collegamento alla conversazione segnalibro is here

N.B. dalla chat Se si dispone di più versioni GDAL installati, potrebbe essere necessario aggiungere GDAL_LIBRARY_PATH nel file di impostazioni di Django per puntare alla versione corretta di libgdal.so (o immagino il corrispondente .dll se siete su Windows)

+1

Grazie così tanto @JRichard .. Ha funzionato perfettamente con GDAL versione 1.9.2 –

+0

Grazie per la taglia @RohitJain - una bella sorpresa e molto apprezzata :) –

+0

Ti ho sicuramente dovuto questo per gli sforzi che hai messo in .. Grazie ancora :) –