Импорт шейп-файла Geodjango с LayerMapping и OGR

Я пытаюсь загрузить шейп-файл в Django.

Моя папка

vnm_polbn_adm3_2014_pdc.dbf
vnm_polbn_adm3_2014_pdc.prj
vnm_polbn_adm3_2014_pdc.qpj
vnm_polbn_adm3_2014_pdc.shp
vnm_polbn_adm3_2014_pdc.shx

Когда я запускаю это:

simon@DESKTOP-V82N14G:/mnt/c/WINDOWS/system32/poc_dashboard/pocdash$  ogrinfo -ro -so  testdjango/data/vnm_polbn_adm3_2014_pdc.shp
INFO: Open of `testdjango/data/vnm_polbn_adm3_2014_pdc.shp'
      using driver `ESRI Shapefile' successful.
1: vnm_polbn_adm3_2014_pdc (Polygon)

Когда я использую оболочку python для запуска своего кода:

python manage.py shell
from testdjango import load_layer
load_layer.run()

Он возвращает меня:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/mnt/c/WINDOWS/system32/poc_dashboard/pocdash/testdjango/load_layer.py", line 27, in run
    lm = LayerMapping(Adm3_names, adm3_name_shp, adm3_name_mapping, transform= False, encoding='iso-8859-1')
  File "/mnt/c/WINDOWS/system32/poc_dashboard/poc/lib/python3.6/site-packages/django/contrib/gis/utils/layermapping.py", line 92, in __init__
    self.ds = DataSource(data, encoding=encoding)
  File "/mnt/c/WINDOWS/system32/poc_dashboard/poc/lib/python3.6/site-packages/django/contrib/gis/gdal/datasource.py", line 74, in __init__
    raise GDALException('Could not open the datasource at "%s"' % ds_input)
django.contrib.gis.gdal.error.GDALException: Could not open the datasource at "/mnt/c/WINDOWS/system32/poc_dashboard/pocdash/testdjango/testdjango/data/vnm_polbn_adm3_2014_pdc.shp"

Что-то не так с моим кодом или с моим шейп-файлом? Я прикрепил файл здесь

import os
from django.contrib.gis.utils import LayerMapping
from django.contrib.gis.db import models
from .models import Adm3_names

adm3_name_mapping = {
    'gid': 'gid',
    'adm1_code': 'adm1_code',
    'adm1_name': 'adm1_name',
    'adm2_code': 'adm2_code',
    'adm2_name': 'adm2_name',
    'adm3_code': 'adm3_code',
    'adm3_name': 'adm3_name',
    'adm3_statu': 'adm3_statu',
    'pop': 'pop',
    'pop_0to14': 'pop_0to14',
    'pop_65plus': 'pop_65plus',
    'hh': 'hh',
    'shape_leng': 'shape_leng',
    'shape_area': 'shape_area',
    'geom': 'MULTIPOLYGON',
}

adm3_name_shp = os.path. abspath(os.path.join(os.path.dirname(__file__),'testdjango/data/vnm_polbn_adm3_2014_pdc.shp'))

def run(verbose=True):
    lm = LayerMapping(Adm3_names, adm3_name_shp, adm3_name_mapping, transform= False, encoding='iso-8859-1')
    lm.save(strict=True,verbose=verbose)

https://docs.djangoproject.com/en/2.2/ref/contrib/gis/layermapping/


person Simon GIS    schedule 13.11.2019    source источник
comment
Вы уверены, что этот путь правильный: django.contrib.gis.gdal.error.GDALException: Could not open the datasource at "/mnt/c/WINDOWS/system32/poc_dashboard/pocdash/testdjango/testdjango/data/vnm_polbn_adm3_2014_pdc.shp? Потому что я вижу, что testdjango повторяется 2 раза.   -  person John Moutafis    schedule 13.11.2019
comment
Спасибо, да... надо было держать ухо востро! Спасибо Усман!   -  person Simon GIS    schedule 14.11.2019


Ответы (1)


Как мы узнали из комментариев, проблема заключалась в создании папки adm3_name_shp, которая добавляет в путь дополнительную папку testdjango:

Измените это:

adm3_name_shp = os.path.abspath(os.path.join(os.path.dirname(__file__),'testdjango/data/vnm_polbn_adm3_2014_pdc.shp'))

к этому:

adm3_name_shp = os.path.abspath(os.path.join(os.path.dirname(__file__),'data/vnm_polbn_adm3_2014_pdc.shp'))

Еще один совет, который вы должны учитывать, заключается в том, что os.path.abspath вызывает os.path.normpath в фоновом режиме, и именно это преобразует ваш путь в правильный путь ОС (либо с \ для Windows, либо с / для Linux и т. д.):

Нормализуйте имя пути, удалив лишние разделители и ссылки более высокого уровня, чтобы A//B, A/B/, A/./B и A/foo/../B стали A/B. Эта манипуляция со строкой может изменить значение пути, содержащего символические ссылки. В Windows он преобразует прямую косую черту в обратную. Чтобы нормализовать регистр, используйте normcase().

Таким образом, вы можете заменить abspath на normpath, но это необязательно.

person John Moutafis    schedule 14.11.2019
comment
Спасибо @John Moutafis за советы! Буду помнить ;) - person Simon GIS; 14.11.2019
comment
@SimonGIS Рад помочь :) - person John Moutafis; 14.11.2019