2015-06-28 19 views
7

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ụ.

Trả lời

7

Vấn đề ở đây là version 1.8.2 của Django (phiên bản phát hành mới nhất tại thời điểm viết) không hỗ trợ các loại trường GDAL 2.0.0. Sửa chữa cho điều này là trong chi nhánh mã Django master - nhưng chưa có trong một phiên bản phát hành.

Tại thời điểm viết, bạn có hai tùy chọn - xây dựng Django từ nguồn mới nhất trên Github (tức là nâng cấp) hoặc hạ cấp GDAL sao cho mã gốc called by this line không thể trả về giá trị 12 làm loại trường.

Vì GDAL 2.0 can return 12 as a field type, tra cứu thành this dictionary không thành công với số KeyError bạn thấy bằng cách sử dụng mã Django 1.8.2. On master, các dict chứa các trường phù hợp cho GDAL 2.0 - cố định bởi this commit (chỉ 9 ngày tuổi tại thời điểm viết!).


Đối với đầy đủ - chẩn đoán lỗi này sau một cuộc thảo luận trong phòng chat SOPython - một liên kết đến chuyện đánh dấu is here

N.B. từ trò chuyện Nếu bạn có nhiều phiên bản GDAL cài đặt, bạn có thể phải thêm GDAL_LIBRARY_PATH trong tập tin cài đặt django để trỏ đến các phiên bản đúng của libgdal.so (hoặc tôi đoán .dll tương ứng nếu bạn đang ở trên Windows)

+1

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 –

+0

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 :) –

+0

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 :) –

Các vấn đề liên quan