LayerMapping
数据导入工具¶
LayerMapping
类提供了一种将矢量空间数据文件(例如 shapefile)的内容映射到 GeoDjango 模型的方法。
此工具源于作者的个人需求,旨在消除从矢量图层中提取几何图形和字段、转换为其他坐标系(例如 WGS84)然后插入 GeoDjango 模型的代码重复。
注意
使用 LayerMapping
需要 GDAL。
警告
GIS 数据源(如 shapefile)可能非常大。如果您发现 LayerMapping
使用的内存过多,请在您的设置中将 DEBUG
设置为 False
。当 DEBUG
设置为 True
时,Django 会 自动记录每个 SQL 查询——当 SQL 语句包含几何图形时,这可能会消耗比典型情况更多的内存。
示例¶
您需要一个 GDAL 支持的数据源,例如 shapefile(这里我们使用一个简单的多边形 shapefile,
test_poly.shp
,包含三个要素)
>>> from django.contrib.gis.gdal import DataSource
>>> ds = DataSource("test_poly.shp")
>>> layer = ds[0]
>>> print(layer.fields) # Exploring the fields in the layer, we only want the 'str' field.
['float', 'int', 'str']
>>> print(len(layer)) # getting the number of features in the layer (should be 3)
3
>>> print(layer.geom_type) # Should be 'Polygon'
Polygon
>>> print(layer.srs) # WGS84 in WKT
GEOGCS["GCS_WGS_1984",
DATUM["WGS_1984",
SPHEROID["WGS_1984",6378137,298.257223563]],
PRIMEM["Greenwich",0],
UNIT["Degree",0.017453292519943295]]
现在我们定义相应的 Django 模型(确保使用
migrate
)from django.contrib.gis.db import models class TestGeo(models.Model): name = models.CharField(max_length=25) # corresponds to the 'str' field poly = models.PolygonField(srid=4269) # we want our model in a different SRID def __str__(self): return "Name: %s" % self.name
使用
LayerMapping
提取所有要素并将它们放入数据库
>>> from django.contrib.gis.utils import LayerMapping
>>> from geoapp.models import TestGeo
>>> mapping = {
... "name": "str", # The 'name' model field maps to the 'str' layer field.
... "poly": "POLYGON", # For geometry fields use OGC name.
... } # The mapping is a dictionary
>>> lm = LayerMapping(TestGeo, "test_poly.shp", mapping)
>>> lm.save(verbose=True) # Save the layermap, imports the data.
Saved: Name: 1
Saved: Name: 2
Saved: Name: 3
这里,LayerMapping
将 shapefile 中的三个几何图形从其原始空间参考系统 (WGS84) 转换为 GeoDjango 模型的空间参考系统 (NAD83)。如果未为图层定义空间参考系统,请使用 source_srs
关键字和 SpatialReference
对象来指定一个。
LayerMapping
API¶
- class LayerMapping(model, data_source, mapping, layer=0, source_srs=None, encoding=None, transaction_mode='commit_on_success', transform=True, unique=True, using='default')[source]¶
以下是可在实例化 LayerMapping
对象期间使用的参数和关键字。
参数 |
描述 |
---|---|
|
地理模型,不是实例。 |
|
OGR 支持的数据源文件的路径(例如,shapefile)。也接受 |
|
字典:键是与模型字段对应的字符串,值对应于 OGR 特征的字符串字段名,或者如果模型字段是地理字段,则它应该对应于 OGR 几何类型,例如, |
关键字参数 |
|
---|---|
|
要从数据源中使用的图层索引(默认为 0) |
|
使用此参数手动指定源 SRS(例如,某些 shapefile 没有带 |
|
指定 OGR 数据源中字符串的字符集编码。例如, |
|
可以是 |
|
将其设置为 False 将禁用坐标转换。换句话说,几何图形将以数据源中的原始状态插入数据库中,不会进行修改。 |
|
将其设置为给定模型中的名称或名称元组将创建仅对给定名称唯一的模型。每个要素的几何图形都将添加到与唯一模型关联的集合中。强制事务模式为 |
|
设置导入空间数据时要使用的数据库。默认为 |
save()
关键字参数¶
- LayerMapping.save(verbose=False, fid_range=False, step=False, progress=False, silent=False, stream=sys.stdout, strict=False)[source]¶
save()
方法也接受关键字。这些关键字用于控制输出日志记录、错误处理以及导入特定要素范围。
保存关键字参数 |
描述 |
---|---|
|
可以使用切片或 (begin, end) 特征 ID 的元组来设置,以从数据源中映射。换句话说,此关键字使用户能够选择性地导入地理数据源中要素的子集范围。 |
|
当设置此关键字时,将打印状态信息,给出已处理和成功保存的要素数量。默认情况下,每处理 1000 个要素就会打印进度信息,但是,可以通过使用整数设置此关键字来覆盖此默认值,以获取所需的间隔。 |
|
默认情况下,非致命错误通知会打印到 |
|
如果使用整数设置,则事务将在每个步骤间隔发生。例如,如果 |
|
状态信息将写入此文件句柄。默认为使用 |
|
遇到第一个错误时,模型映射的执行将停止。默认值 ( |
|
如果设置,则将在数据库上执行的每个模型保存之后打印信息。 |
故障排除¶
内存不足¶
如本节顶部的警告中所述,当 DEBUG=True
时,Django 会存储所有 SQL 查询。在您的设置中将 DEBUG
设置为 False
,这应该可以停止在运行 LayerMapping
脚本时过度使用内存。
MySQL:max_allowed_packet
错误¶
如果您在使用 LayerMapping
和 MySQL 时遇到以下错误
OperationalError: (1153, "Got a packet bigger than 'max_allowed_packet' bytes")
那么解决方法是在 MySQL 配置中增加 max_allowed_packet
设置的值。例如,默认值可能很低,例如 1 MB——可以在 MySQL 的配置文件 (my.cnf
) 中的 [mysqld]
部分修改此设置
max_allowed_packet = 10M