首页 > 解决方案 > Django LayerMapping:如何在保存到数据库之前过滤形状文件

问题描述

我有一个形状文件,我想使用 Django-LayerMapping 模块(Link to module)将其导入 django 数据库,因为它将空间数据转换为 GeoDjango 模型。根据教程将形状文件导入数据库的普通方法如下:

lm = LayerMapping(table, path, mapping, transform=True , encoding='utf-8') # load shape-file
lm.save(verbose=True) # save entire file to db

但在我的情况下,我想要导入 shape-file 数据的表不是空的。我只想将那些不存在的行(或形状文件术语中的特征)添加到数据库中。但是,LayerMapping 仅提供了一种将整个形状文件保存到数据库的方法,而不是单个条目,这在我的情况下会导致重复。

因此,我的问题是:如何在保存之前过滤图层映射对象的条目?

到目前为止,我想到了两种可能的解决方案:

  1. 过滤层映射对象中的条目并使用提供的 .save() 方法保存整个对象。但我不知道如何从图层映射对象中删除单个条目。

  2. 遍历图层映射对象中的所有条目并检查每个条目是否已存在于数据库中,如果不存在则仅保存它。但是,我没有找到将单个条目保存到数据库的层映射方法。可以只读取属性并自己创建对象,但是我将无法访问坐标转换,这是使用图层映射模块的最初原因。

所以问题还是一样:如何在保存之前过滤这个图层映射对象?

标签: pythondjangoimportshapefilegeodjango

解决方案


一个值得尝试的选择LayerMapping是以下unique论点:

将此设置为给定模型的名称或名称元组,将创建仅对给定名称唯一的模型。每个特征的几何图形将被添加到与唯一模型关联的集合中。强制事务模式为'autocommit'.

检查在存在名称的情况下执行的代码unique,我们可以看到它尝试将给定的几何图形附加到任何现有记录:

if self.unique:
    # If we want unique models on a particular field, handle the
    # geometry appropriately.
    try:
        # Getting the keyword arguments and retrieving
        # the unique model.
        u_kwargs = self.unique_kwargs(kwargs)
        m = self.model.objects.using(self.using).get(**u_kwargs)
        is_update = True

        # Getting the geometry (in OGR form), creating
        # one from the kwargs WKT, adding in additional
        # geometries, and update the attribute with the
        # just-updated geometry WKT.
        geom_value = getattr(m, self.geom_field)
        if geom_value is None:
            geom = OGRGeometry(kwargs[self.geom_field])
        else:
            geom = geom_value.ogr
            new = OGRGeometry(kwargs[self.geom_field])
            for g in new:
                geom.add(g)
            setattr(m, self.geom_field, geom.wkt)
    except ObjectDoesNotExist:
        # No unique model exists yet, create.
        m = self.model(**kwargs)

如果这符合您的功能需求,那么您可以尝试以下独特的选项:

lm = LayerMapping(
    table, 
    path, 
    mapping, 
    transform=True , 
    unique=('field_name_1', 'field_name_2', ...), 
    encoding='utf-8'
)

如果上述内容不符合您的项目需求,那么您提到的选项将正常工作。


推荐阅读