[英]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 只提供了一种将整个形状文件保存到数据库的方法,而不是单个条目,在我的情况下这会导致重复。
因此,我的问题是:如何在保存图层映射对象之前过滤它的条目?
到现在为止,我想到了两种可能的解决方案:
过滤图层映射对象中的条目并使用提供的 .save() 方法保存整个对象。 但我不知道如何从图层映射对象中删除单个条目。
遍历图层映射对象中的所有条目,并检查每个条目是否已存在于数据库中,如果不存在则仅保存它。 但是,我没有找到将单个条目保存到数据库的图层映射方法。 可以只读取属性并自己创建对象,但是我将无法访问坐标转换,这是使用图层映射模块的最初原因。
所以问题保持不变:如何在保存此图层映射对象之前对其进行过滤?
一个值得尝试使用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.