繁体   English   中英

Django LayerMapping:如何在保存到数据库之前过滤形状文件

[英]Django LayerMapping: How to filter shape-file before saving to database

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

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

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

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

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

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

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

所以问题保持不变:如何在保存此图层映射对象之前对其进行过滤?

一个值得尝试使用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'
)

如果以上不适合您项目的需要,那么您提到的选项将正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM