【问题标题】:Geodjango Import Shapefile with LayerMapping and OGRGeodjango 使用 LayerMapping 和 OGR 导入 Shapefile
【发布时间】:2019-11-13 08:48:58
【问题描述】:

我正在尝试将 shapefile 加载到 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 shell 运行我的代码时:

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"

是我的代码有问题还是我的 shapefile 有问题?我附上了文件here

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/

【问题讨论】:

  • 您确定这条路径正确吗: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 次。
  • 谢谢...应该睁大眼睛!谢谢乌斯曼!

标签: python django geodjango ogr


【解决方案1】:

正如我们从 cmets 中发现的,问题在于 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//BA/B/A/./BA/foo/../B 都变为 A/B。这种字符串操作可能会改变包含符号链接的路径的含义。 在 Windows 上,它将正斜杠转换为反斜杠。要规范大小写,请使用 normcase()。

因此您可以将abspath 替换为normpath,但这是可选的。

【讨论】:

  • 感谢@John Moutafis 的提示!会记得;)
  • @SimonGIS 乐于助人:)
猜你喜欢
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 2010-09-25
  • 2018-06-11
相关资源
最近更新 更多