【发布时间】:2015-09-14 18:41:13
【问题描述】:
我正在按照https://docs.djangoproject.com/en/1.8/ref/contrib/gis/tutorial/#importing-spatial-data 上的教程在我的机器上设置 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
然后我发现.shp文件中没有'MULTIPOLYGON'字段:
>>> 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']
但它存在于WorldBorder 模型中,类型为MultiPolygonField。
因此,在 world_mapping 文件中,'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)
只是一个更新:
通过堆栈跟踪查看源代码后,我发现我无法访问layer 模块的field_types 属性。因此,从 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
现在,这很奇怪,因为现在我还从 WorldBorder 模型中删除了 mpoly 字段。
更新 2:
在挖掘源代码后,我发现,在我的 gdal 版本中,OGDFieldTypes 可能没有密钥 12,如这里的源代码:https://github.com/django/django/blob/master/django/contrib/gis/gdal/field.py。
但它说密钥 12 和 13 将可用于GDAL 2,这就是我安装的。现在图书馆之间似乎真的有些冲突。
我已经安装了以下库:
- geos-3.4.2.tar.bz2
- proj-datumgrid-1.5.tar.gz
- proj-4.8.0.tar.gz
- gdal-2.0.0.tar.gz
并且在 Amazon RDS 实例中安装了 PostGIS 2.1.5 版。
【问题讨论】:
标签: python django python-2.7 geodjango