Tôi đã làm theo hướng dẫn trên https://docs.djangoproject.com/en/1.8/ref/contrib/gis/tutorial/#importing-spatial-data để thiết lập GeoDjango trên máy của tôi. Nhưng có vẻ như có một số vấn đề ở đó. Trong khi nhập dữ liệu sử dụng LayerMapping bằng cách chạy load.run()
, tôi nhận được lỗi sau:Lỗi khi nhập dữ liệu không gian trong GeoDjango - KeyError cho trường mpoly
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
Sau đó, tôi phát hiện ra rằng, có lĩnh vực không 'MULTIPOLYGON' trong .shp
file:
>>> 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']
Nhưng nó ở đó trong mô hình WorldBorder
, dưới dạng MultiPolygonField
. Vì vậy, chắc chắn trong tệp world_mapping, quá trình nhập sẽ không thành công đối với ánh xạ 'mpoly': 'MULTIPOLYGON'
. Có ai khác phải đối mặt với vấn đề này không? Tôi hy vọng như vậy, như tôi đã làm theo hướng dẫn từng bước một. Nhưng nó không nói bất cứ điều gì về vấn đề như vậy. Sẽ có tác dụng gì nếu tôi tải dữ liệu bằng cách xóa mpoly
ánh xạ?
Dưới đây là tập tin của tôi 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)
Chỉ cần một bản cập nhật: Sau khi đi qua mã nguồn, thông qua vết đống, tôi hình dung rằng tôi không thể truy cập field_types
propery của layer
mô-đun . Vì vậy, từ vỏ trăn, khi tôi truy cập vào tài sản đó, tôi nhận được lỗi tương tự:
>>> 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
Bây giờ, đây là kỳ lạ, bởi vì bây giờ tôi cũng đã gỡ bỏ mpoly
trường từ WorldBorder
mô hình.
Cập nhật 2:
Sau khi đào bới trong mã nguồn, tôi phát hiện ra rằng, OGDFieldTypes
trong phiên bản của tôi về GDAL, có thể không có chìa khóa 12, như trong mã nguồn ở đây: https://github.com/django/django/blob/master/django/contrib/gis/gdal/field.py. Nhưng nó nói rằng các phím 12 và 13 sẽ có sẵn cho GDAL 2
và đó là những gì tôi đã cài đặt. Thực sự có vẻ là xung đột giữa các thư viện.
Tôi đã cài đặt các thư viện sau:
- GEOS-3.4.2.tar.bz2
- Proj-datumgrid-1.5.tar.gz
- Proj-4.8.0.tar. gz
- GDAL-2.0.0.tar.gz
Và PostGIS phiên bản 2.1.5 được cài đặt trong Amazon RDS dụ.
Cảm ơn bạn rất nhiều @JRichard .. Nó làm việc hoàn toàn tốt với GDAL phiên bản 1.9.2 –
Cảm ơn bạn đã có tiền thưởng @RohitJain - một bất ngờ tốt đẹp và rất nhiều đánh giá cao :) –
Tôi chắc chắn nợ bạn này cho những nỗ lực bạn đưa vào .. Cảm ơn một lần nữa :) –