【问题标题】:GeoDjango / GDAL : Wrong data field being storedGeoDjango / GDAL:存储了错误的数据字段
【发布时间】:2020-08-04 18:33:37
【问题描述】:

我已经使用 GeoDjango 几个月了,没有任何问题,但是在导入新的形状文件时,将保存 id 编号而不是网格代码。 gridcode 字段有一个对我的项目很有价值的 int。

我知道 shapefile 中存在 gridcode 字段,因为我可以在 shell 中对其进行测试。

#shell
>>> print(lyr.fields)
['Id', 'gridcode']
>>> feat = lyr[234]
>>> print(feat.get('gridcode'))
90 #This is the desired value 

我以与往常相同的方式设置模型:

#models.py
class GeoModel(models.Model):
    idn = geomodels.BigIntegerField(null=True)
    grd = geomodels.BigIntegerField(null=True)
    geo = geomodels.MultiPolygonField(null=True, srid=4326)

    def __int__(self):
        return self.grd

path_shp = os.path.abspath(os.path.join(os.path.dirname(app.__file__), 'data', 'folder', 'map.shp'))

mapping = {
    'idn': 'Id',
    'grd': 'gridcode',
    'geo': 'MULTIPOLYGON',}

def run(verbose=True):
    lm = LayerMapping(GeoModel, path_shp, mapping, transform=False)  
    lm.save(strict=True, verbose=verbose) 

但是,当我尝试存储数据时,它存储的是 id 号而不是网格代码。例如,终端如下所示:

Saved: GeoModel object (1517)
Saved: GeoModel object (1518)
Saved: GeoModel object (1519)
Saved: GeoModel object (1520)
[ . . .]

任何帮助将不胜感激

【问题讨论】:

  • 是根本没有保存网格代码,还是在保存时它只是不显示?您可能只需要在模型上设置 str 方法
  • 我认为它根本没有被保存,除了为我的每个 Geodjango 函数保存为“self”的值之外,我无法提取任何值。我尝试在自定义定义中将 int 更改为 str,不出所料,它给了我一个类型错误:TypeError: str 返回了非字符串(int 类型)。 @leelum1

标签: django-models gdal shapefile geodjango ogr


【解决方案1】:

我找到了一个简单的解决方法。在“Lazy Geometries”下的 GeoDjango 文档中挖掘之后,我发现我可以查询“intersects”未返回的值。例如:当我跑步时

>>> q = GeoModel.objects.get(geo__intersects=point)
# and then I get a value I don't care for (i.e GeoModel object (1520))
# I can then run the following:
>>> q.grd
# and return the following:
90

虽然这并不能直接解决上述问题,但它使该问题与我无关,并且可能与将来面临同样问题的其他人无关。

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    相关资源
    最近更新 更多