Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在GeoDjango中导入空间数据时出错-mpoly字段的KeyError_Python_Django_Python 2.7_Geodjango - Fatal编程技术网

Python 在GeoDjango中导入空间数据时出错-mpoly字段的KeyError

Python 在GeoDjango中导入空间数据时出错-mpoly字段的KeyError,python,django,python-2.7,geodjango,Python,Django,Python 2.7,Geodjango,我正在按照关于在我的机器上设置GeoDjango的教程进行操作。但似乎有一些问题。通过运行load.run(),使用LayerMapping导入数据时,出现以下错误: Traceback (most recent call last): File "<console>", line 1, in <module> File "/home/ubuntu/src/django/world/load.py", line 23, in run lm = LayerM

我正在按照关于在我的机器上设置GeoDjango的教程进行操作。但似乎有一些问题。通过运行
load.run()
,使用LayerMapping导入数据时,出现以下错误:

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
但是它在
WorldBorder
模型中,作为类型
MultiPolygonField
。 因此,在world_映射文件中,导入
'mpoly':'MULTIPOLYGON'
映射肯定会失败。还有其他人面临过这个问题吗?我希望如此,因为我已经一步一步地学习了教程。但它没有说任何关于这个问题的话。如果通过删除
mpoly
映射来加载数据,会产生什么影响

这是我的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)

只是更新一下: 在查看源代码之后,通过堆栈跟踪,我发现我无法访问
模块的
字段类型
属性。因此,在python shell中,当我访问该属性时,我得到了相同的错误:

>>> 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
来自django.contrib.gis.gdal导入数据源的
>>
>>>ds=数据源(wshp)
>>>层=ds[0]
>>>图层字段
[u'FIPS',u'ISO2',u'ISO3',u'UN',u'NAME',u'AREA',u'POP2005',u'REGION',u'Subsection',u'LON',u'LAT']
>>>图层字段类型
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/home/ubuntu/Envs/rj-venv/local/lib/python2.7/site-packages/django/contrib/gis/gdal/layer.py”,第153行,字段类型
对于范围内的i(self.num_字段)]
关键错误:12
现在,这很奇怪,因为现在我还从
WorldBorder
模型中删除了
mpoly
字段


更新2:

在深入研究源代码之后,我发现,在我的gdal版本中,
OGDFieldTypes
可能没有键12,如这里的源代码所示:。 但上面说键12和13将可用于
gdal2
,这就是我安装的。现在图书馆之间似乎真的存在一些冲突

我已安装以下库:

  • geos-3.4.2.tar.bz2
  • proj-datumgrid-1.5.tar.gz
  • 项目-4.8.0.tar.gz
  • gdal-2.0.0.tar.gz

Amazon RDS实例中安装了PostGIS 2.1.5版。

这里的问题是Django(撰写本文时的最新版本)的不支持GDAL 2.0.0字段类型。Django主代码分支对此进行了修复,但尚未发布版本

在撰写本文时,您有两个选择—从Github上的最新源代码构建Django(即升级),或降级GDAL,以便本机代码不能将值
12
作为字段类型返回

由于GDAL 2.0,使用Django 1.8.2代码可以看到的
KeyError
查找到失败,
dict
包含GDAL 2.0的正确字段-由修复(编写时仅9天!)


为了完整性-在SOPython聊天室中进行讨论后诊断此故障-指向书签对话的链接


N.B.从聊天中如果您安装了多个GDAL版本,您可能需要在django设置文件中添加
GDAL\u LIBRARY\u路径
,以指向正确版本的
libgdal.so
(或者如果您在Windows上,我猜是相应的
.dll

非常感谢@JRichard。。GDAL版本1.9.2对赏金@RohitJain的感谢非常好-一个惊喜,非常感谢:)我绝对应该感谢你付出的努力。。再次感谢:)
>>> 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