GDAL API¶
GDAL 代表 **地理空间数据抽象库**,是 GIS 数据功能的真正“瑞士军刀”。GDAL 的一个子集是 OGR 简单要素库,专门用于读取和写入各种标准格式的矢量地理数据。
GeoDjango 为 OGR 的一些功能提供了高级 Python 接口,包括矢量空间数据的读取和坐标转换,以及对 GDAL 光栅(图像)数据功能的最低限度支持。
注意
尽管模块名为 gdal
,但 GeoDjango 目前仅支持 OGR 的部分功能和 GDAL 的光栅功能。
概述¶
示例数据¶
此处描述的 GDAL/OGR 工具旨在帮助您读取地理空间数据,为了使其中大部分工具有用,您必须有一些数据可以使用。如果您是初学者并且还没有自己的数据可以使用,GeoDjango 测试包含许多您可以用于测试的数据集。您可以从此处下载它们
$ wget https://raw.githubusercontent.com/django/django/main/tests/gis_tests/data/cities/cities.{shp,prj,shx,dbf}
$ wget https://raw.githubusercontent.com/django/django/main/tests/gis_tests/data/rasters/raster.tif
矢量数据源对象¶
DataSource
¶
DataSource
是 OGR 数据源对象的包装器,它使用一致的接口支持从各种 OGR 支持的地理空间文件格式和数据源读取数据。每个数据源都由一个 DataSource
对象表示,该对象包含一个或多个数据层。每个层都由一个 Layer
对象表示,包含一定数量的地理要素 (Feature
),有关该层中包含的要素类型的信息(例如点、多边形等),以及任何附加字段 (Field
) 的名称和类型,这些数据可能与该层中每个要素相关联。
- class DataSource(ds_input, encoding='utf-8')[source]¶
DataSource
的构造函数只需要一个参数:您要读取的文件的路径。但是,OGR 还支持各种更复杂的数据源,包括数据库,可以通过传递特殊名称字符串而不是路径来访问这些数据源。有关更多信息,请参阅 OGR 矢量格式 文档。name
属性DataSource
实例提供它正在使用的底层数据源的 OGR 名称。可选的
encoding
参数允许您指定源中字符串的非标准编码。当您在读取字段值时获得DjangoUnicodeDecodeError
异常时,这通常很有用。创建
DataSource
后,您可以通过访问layer_count
属性或(等效地)使用len()
函数来了解它包含多少层数据。有关访问数据层本身的信息,请参阅下一节>>> from django.contrib.gis.gdal import DataSource >>> ds = DataSource("/path/to/your/cities.shp") >>> ds.name '/path/to/your/cities.shp' >>> ds.layer_count # This file only contains one layer 1
返回数据源中层的数量。
返回数据源的名称。
Layer
¶
- class Layer¶
Layer
是DataSource
对象中数据层的包装器。您永远不会直接创建Layer
对象。相反,您是从DataSource
对象中检索它们,它本质上是Layer
对象的标准 Python 容器。例如,您可以按其索引访问特定层(例如ds[0]
访问第一层),或者您可以在for
循环中迭代容器中的所有层。Layer
本身充当几何要素的容器。通常,给定层中的所有要素都具有相同的几何类型。
geom_type
层的属性是OGRGeomType
,用于识别要素类型。我们可以用它来打印出DataSource
中每个层的一些基本信息>>> for layer in ds: ... print('Layer "%s": %i %ss' % (layer.name, len(layer), layer.geom_type.name)) ... Layer "cities": 3 Points
示例输出来自上面加载的 cities 数据源,显然包含一层,名为
"cities"
,其中包含三个点要素。为简单起见,以下示例假设您已将该层存储在变量layer
中>>> layer = ds[0]
- name¶
返回此层在数据源中的名称。
>>> layer.name 'cities'
- num_feat¶
返回层中要素的数量。与
len(layer)
相同>>> layer.num_feat 3
- geom_type¶
返回层的几何类型,作为
OGRGeomType
对象>>> layer.geom_type.name 'Point'
- num_fields¶
返回层中字段的数量,即与层中每个要素关联的数据字段的数量
>>> layer.num_fields 4
- fields¶
返回此层中每个字段的名称列表
>>> layer.fields ['Name', 'Population', 'Density', 'Created']
返回此层中每个字段的数据类型列表。这些是
Field
的子类,下面将讨论>>> [ft.__name__ for ft in layer.field_types] ['OFTString', 'OFTReal', 'OFTReal', 'OFTDate']
- field_widths¶
返回此层中每个字段的最大字段宽度列表
>>> layer.field_widths [80, 11, 24, 10]
- field_precisions¶
返回此层中每个字段的数字精度列表。对于非数字字段,此值无意义(且设置为零)
>>> layer.field_precisions [0, 0, 15, 0]
- extent¶
返回此层的空间范围,作为
Envelope
对象>>> layer.extent.tuple (-104.609252, 29.763374, -95.23506, 38.971823)
- srs¶
返回与该层关联的
SpatialReference
的属性>>> print(layer.srs) GEOGCS["GCS_WGS_1984", DATUM["WGS_1984", SPHEROID["WGS_1984",6378137,298.257223563]], PRIMEM["Greenwich",0], UNIT["Degree",0.017453292519943295]]
如果
Layer
没有与其关联的空间参考信息,则返回None
。- spatial_filter¶
可用于检索或设置此图层空间过滤器的属性。空间过滤器只能使用
OGRGeometry
实例、4元组范围或None
设置。当使用除None
之外的值进行设置时,在迭代图层时,只会返回与过滤器相交的要素。>>> print(layer.spatial_filter) None >>> print(len(layer)) 3 >>> [feat.get("Name") for feat in layer] ['Pueblo', 'Lawrence', 'Houston'] >>> ks_extent = (-102.051, 36.99, -94.59, 40.00) # Extent for state of Kansas >>> layer.spatial_filter = ks_extent >>> len(layer) 1 >>> [feat.get("Name") for feat in layer] ['Lawrence'] >>> layer.spatial_filter = None >>> len(layer) 3
- get_fields()¶
返回图层中每个要素给定字段的值列表的方法。
>>> layer.get_fields("Name") ['Pueblo', 'Lawrence', 'Houston']
- get_geoms(geos=False)¶
返回包含图层中每个要素几何图形的列表的方法。如果可选参数
geos
设置为True
,则几何图形将转换为GEOSGeometry
对象。否则,它们将作为OGRGeometry
对象返回。>>> [pt.tuple for pt in layer.get_geoms()] [(-104.609252, 38.255001), (-95.23506, 38.971823), (-95.363151, 29.763374)]
- test_capability(capability)¶
返回一个布尔值,指示此图层是否支持给定的功能(字符串)。有效功能字符串的示例包括:
'RandomRead'
、'SequentialWrite'
、'RandomWrite'
、'FastSpatialFilter'
、'FastFeatureCount'
、'FastGetExtent'
、'CreateField'
、'Transactions'
、'DeleteFeature'
和'FastSetNextByIndex'
。
Feature
¶
- class Feature¶
Feature
封装了一个OGR要素。您永远不会直接创建Feature
对象。相反,您是从Layer
对象中检索它们。每个要素都包含一个几何图形和一组包含其他属性的字段。字段的几何图形可以通过其geom
属性访问,该属性返回一个OGRGeometry
对象。Feature
的行为类似于其字段的标准Python容器,它将其作为Field
对象返回:您可以通过其索引或名称直接访问字段,或者可以在要素的字段上进行迭代,例如在for
循环中。- geom¶
返回此要素的几何图形,作为
OGRGeometry
对象。>>> city.geom.tuple (-104.609252, 38.255001)
- get¶
返回此要素给定字段(由名称指定)的值的方法,**不是**
Field
包装器对象。>>> city.get("Population") 102121
- geom_type¶
返回此要素的几何图形类型,作为
OGRGeomType
对象。对于给定图层中的所有要素,这将是相同的,并且等效于要素来源的Layer
对象的Layer.geom_type
属性。- num_fields¶
返回与要素关联的数据字段数。对于给定图层中的所有要素,这将是相同的,并且等效于要素来源的
Layer
对象的Layer.num_fields
属性。- fields¶
返回与要素关联的数据字段名称列表。对于给定图层中的所有要素,这将是相同的,并且等效于要素来源的
Layer
对象的Layer.fields
属性。- fid¶
返回图层中的要素标识符。
>>> city.fid 0
- layer_name¶
返回要素来源的
Layer
的名称。对于给定图层中的所有要素,这将是相同的。>>> city.layer_name 'cities'
- index¶
返回给定字段名称索引的方法。对于给定图层中的所有要素,这将是相同的。
>>> city.index("Population") 1
Field
¶
- class Field¶
- name¶
返回此字段的名称。
>>> city["Name"].name 'Name'
- type¶
返回此字段的OGR类型,作为整数。
FIELD_CLASSES
字典将这些值映射到Field
的子类。>>> city["Density"].type 2
- type_name¶
返回包含此字段数据类型名称的字符串。
>>> city["Name"].type_name 'String'
- value¶
返回此字段的值。
Field
类本身将值作为字符串返回,但每个子类都以最合适的形式返回值。>>> city["Population"].value 102121
- width¶
返回此字段的宽度。
>>> city["Name"].width 80
- precision¶
返回此字段的数值精度。对于非数值字段,此值无意义(且设置为零)。
>>> city["Density"].precision 15
- as_double()¶
将字段的值作为双精度浮点数(float)返回。
>>> city["Density"].as_double() 874.7
- as_int()¶
将字段的值作为整数返回。
>>> city["Population"].as_int() 102121
- as_string()¶
将字段的值作为字符串返回。
>>> city["Name"].as_string() 'Pueblo'
- as_datetime()¶
将字段的值作为日期和时间组件的元组返回。
>>> city["Created"].as_datetime() (c_long(1999), c_long(5), c_long(23), c_long(0), c_long(0), c_long(0), c_long(0))
Driver
¶
- class Driver(dr_input)[source]¶
Driver
类在内部用于包装OGRDataSource
驱动程序。返回当前注册的OGR矢量驱动程序的数量。
OGR几何图形¶
OGRGeometry
¶
OGRGeometry
对象与GEOSGeometry
对象具有类似的功能,并且是OGR内部几何表示的薄包装器。因此,在使用DataSource
时,它们允许更有效地访问数据。与它的GEOS对应物不同,OGRGeometry
支持空间参考系统和坐标转换。
>>> from django.contrib.gis.gdal import OGRGeometry
>>> polygon = OGRGeometry("POLYGON((0 0, 5 0, 5 5, 0 5))")
- class OGRGeometry(geom_input, srs=None)[source]¶
此对象是 OGR Geometry 类的包装器。这些对象直接从给定的
geom_input
参数实例化,该参数可以是包含 WKT、HEX、GeoJSON 的字符串,包含 WKB 数据的buffer
,或OGRGeomType
对象。这些对象也从Feature.geom
属性返回,当从Layer
(它是DataSource
的一部分)读取矢量数据时。从给定的 GML 字符串构造一个
OGRGeometry
。从给定的边界框(一个 4 元组)构造一个
Polygon
。- __len__()¶
返回
LineString
中的点数、Polygon
中的环数或GeometryCollection
中的几何图形数。不适用于其他几何类型。- __iter__()¶
迭代
LineString
中的点、Polygon
中的环或GeometryCollection
中的几何图形。不适用于其他几何类型。- __getitem__()¶
返回
LineString
中指定索引处的点、Polygon
中指定索引处的内部环或GeometryCollection
中指定索引处的几何图形。不适用于其他几何类型。返回几何图形的坐标维数,例如,点为 0,线为 1,依此类推。
>>> polygon.dimension 2
返回此几何图形的坐标维数。例如,二维几何图形的值将为 2。
自版本 5.1 起已弃用:
coord_dim
设置器已弃用。请改用set_3d()
。Django 5.1 中的新功能。一个布尔值,指示此几何图形是否具有 Z 坐标。
Django 5.1 中的新功能。一个添加或删除 Z 坐标维数的方法。
>>> p = OGRGeometry("POINT (1 2 3)") >>> p.is_3d True >>> p.set_3d(False) >>> p.wkt "POINT (1 2)"
Django 5.1 中的新功能。一个布尔值,指示此几何图形是否具有 M 坐标。
Django 5.1 中的新功能。一个添加或删除 M 坐标维数的方法。
>>> p = OGRGeometry("POINT (1 2)") >>> p.is_measured False >>> p.set_measured(True) >>> p.wkt "POINT M (1 2 0)"
返回此几何图形中的元素数量。
>>> polygon.geom_count 1
返回描述此几何图形所使用的点数。
>>> polygon.point_count 4
point_count
的别名。point_count
的别名。返回此几何图形的类型,作为
OGRGeomType
对象。返回此几何图形类型的名称。
>>> polygon.geom_name 'POLYGON'
返回此几何图形的面积,对于不包含面积的几何图形,返回 0。
>>> polygon.area 25.0
返回此几何图形的包络线,作为
Envelope
对象。返回此几何图形的包络线作为 4 元组,而不是
Envelope
对象。>>> point.extent (0.0, 0.0, 5.0, 5.0)
- srs¶
此属性控制此几何图形的空间参考,如果未为其分配空间参考系统,则为
None
。如果已分配,则访问此属性会返回一个SpatialReference
对象。可以使用另一个SpatialReference
对象或SpatialReference
接受的任何输入来设置它。示例>>> city.geom.srs.name 'GCS_WGS_1984'
- srid¶
返回或设置与此几何图形的
SpatialReference
对应的空间参考标识符。如果与此几何图形没有关联的空间参考信息,或者无法确定 SRID,则返回None
。返回与该几何图形对应的
GEOSGeometry
对象。以 GML 格式返回该几何图形的字符串表示形式。
>>> OGRGeometry("POINT(1 2)").gml '<gml:Point><gml:coordinates>1,2</gml:coordinates></gml:Point>'
以 HEX WKB 格式返回该几何图形的字符串表示形式。
>>> OGRGeometry("POINT(1 2)").hex '0101000000000000000000F03F0000000000000040'
以 JSON 格式返回该几何图形的字符串表示形式。
>>> OGRGeometry("POINT(1 2)").json '{ "type": "Point", "coordinates": [ 1.000000, 2.000000 ] }'
以 KML 格式返回该几何图形的字符串表示形式。
返回保存该几何图形的 WKB 表示形式所需的 WKB 缓冲区的大小。
>>> OGRGeometry("POINT(1 2)").wkb_size 21
返回包含该几何图形的 WKB 表示形式的
buffer
。以 WKT 格式返回该几何图形的字符串表示形式。
返回该几何图形的 EWKT 表示形式。
返回该几何图形对象的新的
OGRGeometry
克隆。如果该几何图形中存在任何未闭合的环,则此例程将通过在末尾添加起始点来闭合它们。
>>> triangle = OGRGeometry("LINEARRING (0 0,0 1,1 0)") >>> triangle.close_rings() >>> triangle.wkt 'LINEARRING (0 0,0 1,1 0,0 0)'
将该几何图形转换到不同的空间参考系统。可以接受
CoordTransform
对象、SpatialReference
对象,或SpatialReference
接受的任何其他输入(包括空间参考 WKT 和 PROJ 字符串,或整数 SRID)。默认情况下,不返回任何内容,并且几何图形在原位转换。但是,如果
clone
关键字设置为True
,则改为返回该几何图形的已转换克隆。如果该几何图形与另一个几何图形相交,则返回
True
,否则返回False
。如果该几何图形等效于另一个几何图形,则返回
True
,否则返回False
。如果该几何图形在空间上与另一个几何图形分离(即不相交),则返回
True
,否则返回False
。如果该几何图形与另一个几何图形相切,则返回
True
,否则返回False
。如果该几何图形与另一个几何图形交叉,则返回
True
,否则返回False
。如果该几何图形包含在另一个几何图形内,则返回
True
,否则返回False
。如果该几何图形包含另一个几何图形,则返回
True
,否则返回False
。如果该几何图形与另一个几何图形重叠,则返回
True
,否则返回False
。该几何图形的边界,作为新的
OGRGeometry
对象。包含该几何图形的最小凸多边形,作为新的
OGRGeometry
对象。返回由该几何图形与另一个几何图形的差组成的区域,作为新的
OGRGeometry
对象。返回由该几何图形与另一个几何图形的交集组成的区域,作为新的
OGRGeometry
对象。返回此几何图形与另一个几何图形的对称差分区域,作为一个新的
OGRGeometry
对象。返回此几何图形与另一个几何图形的并集区域,作为一个新的
OGRGeometry
对象。返回一个表示此几何图形质心的
Point
对象。Django 5.1 中的更改centroid
从仅适用于Polygon
的属性升级为所有几何类型都可用。- tuple¶
将点几何图形的坐标作为元组返回,将线几何图形的坐标作为元组的元组返回,依此类推。
>>> OGRGeometry("POINT (1 2)").tuple (1.0, 2.0) >>> OGRGeometry("LINESTRING (1 2,3 4)").tuple ((1.0, 2.0), (3.0, 4.0))
- coords¶
是
tuple
的别名。
- class Point¶
- x¶
返回此点的 X 坐标。
>>> OGRGeometry("POINT (1 2)").x 1.0
- y¶
返回此点的 Y 坐标。
>>> OGRGeometry("POINT (1 2)").y 2.0
- z¶
返回此点的 Z 坐标,如果点没有 Z 坐标,则返回
None
。>>> OGRGeometry("POINT (1 2 3)").z 3.0
- m¶
Django 5.1 中的新功能。返回此点的 M 坐标,如果 Point 没有 M 坐标,则返回
None
。>>> OGRGeometry("POINT ZM (1 2 3 4)").m 4.0
- class LineString¶
- x¶
返回此线中的 X 坐标列表。
>>> OGRGeometry("LINESTRING (1 2,3 4)").x [1.0, 3.0]
- y¶
返回此线中的 Y 坐标列表。
>>> OGRGeometry("LINESTRING (1 2,3 4)").y [2.0, 4.0]
- z¶
返回此线中的 Z 坐标列表,如果线没有 Z 坐标,则返回
None
。>>> OGRGeometry("LINESTRING (1 2 3,4 5 6)").z [3.0, 6.0]
- m¶
Django 5.1 中的新功能。返回此线中的 M 坐标列表,如果线没有 M 坐标,则返回
None
。>>> OGRGeometry("LINESTRING(0 1 2 10, 1 2 3 11, 2 3 4 12)").m [10.0, 11.0, 12.0]
OGRGeomType
¶
- class OGRGeomType(type_input)[source]¶
此类允许以多种方式表示 OGR 几何图形类型。
>>> from django.contrib.gis.gdal import OGRGeomType >>> gt1 = OGRGeomType(3) # Using an integer for the type >>> gt2 = OGRGeomType("Polygon") # Using a string >>> gt3 = OGRGeomType("POLYGON") # It's case-insensitive >>> print(gt1 == 3, gt1 == "Polygon") # Equivalence works w/non-OGRGeomType objects True True
返回 OGR 几何图形类型的简写字符串形式。
>>> gt1.name 'Polygon'
- num¶
返回与 OGR 几何图形类型相对应的数字。
>>> gt1.num 3
返回用于存储此 OGR 类型的 Django 字段类型(GeometryField 的子类),如果不存在合适的 Django 类型,则返回
None
。>>> gt1.django 'PolygonField'
Envelope
¶
坐标系统对象¶
SpatialReference
¶
- class SpatialReference(srs_input)[source]¶
空间参考对象根据给定的
srs_input
初始化,它可以是以下之一:OGC 标准的 WKT(字符串)
EPSG 代码(整数或字符串)
PROJ 字符串
常用标准的简写字符串(
'WGS84'
、'WGS72'
、'NAD27'
、'NAD83'
)
示例
>>> wgs84 = SpatialReference("WGS84") # shorthand string >>> wgs84 = SpatialReference(4326) # EPSG code >>> wgs84 = SpatialReference("EPSG:4326") # EPSG string >>> proj = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs " >>> wgs84 = SpatialReference(proj) # PROJ string >>> wgs84 = SpatialReference( ... """GEOGCS["WGS 84", ... DATUM["WGS_1984", ... SPHEROID["WGS 84",6378137,298.257223563, ... AUTHORITY["EPSG","7030"]], ... AUTHORITY["EPSG","6326"]], ... PRIMEM["Greenwich",0, ... AUTHORITY["EPSG","8901"]], ... UNIT["degree",0.01745329251994328, ... AUTHORITY["EPSG","9122"]], ... AUTHORITY["EPSG","4326"]]""" ... ) # OGC WKT
返回给定字符串属性节点的值,如果节点不存在则返回
None
。也可以接受一个元组作为参数,(target, child),其中 child 是 WKT 中属性的索引。例如:>>> wkt = 'GEOGCS["WGS 84", DATUM["WGS_1984, ... AUTHORITY["EPSG","4326"]]' >>> srs = SpatialReference(wkt) # could also use 'WGS84', or 4326 >>> print(srs["GEOGCS"]) WGS 84 >>> print(srs["DATUM"]) WGS_1984 >>> print(srs["AUTHORITY"]) EPSG >>> print(srs["AUTHORITY", 1]) # The authority value 4326 >>> print(srs["TOWGS84", 4]) # the fourth value in this wkt 0 >>> print(srs["UNIT|AUTHORITY"]) # For the units authority, have to use the pipe symbol. EPSG >>> print(srs["UNIT|AUTHORITY", 1]) # The authority value for the units 9122
给定目标节点(例如
'PROJCS'
)的属性值。index 关键字指定要返回的子节点的索引。返回给定字符串目标节点的授权名称。
返回给定字符串目标节点的授权代码。
返回此空间参考对象的克隆。
此方法检查此
SpatialReference
的 WKT,并在适用时添加 EPSG 授权节点。将此 SpatialReference 从 ESRI 格式转换为 EPSG 格式。
将此 SpatialReference 转换为 ESRI 格式。
检查给定的空间参考是否有效,如果无效则会引发异常。
从 EPSG 代码导入空间参考。
从 PROJ 字符串导入空间参考。
从 WKT 导入空间参考。
从 XML 导入空间参考。
返回此空间参考的名称。
返回顶层授权的 SRID,如果未定义则返回
None
。返回线性单位的名称。
返回线性单位的值。
返回角单位的名称。
返回角单位的值。
返回单位值和单位名称的 2 元组,并自动确定是返回线性单位还是角单位。
返回此空间参考的椭球体参数元组:(长半轴、短半轴和扁率倒数)。
返回此空间参考的椭球体长半轴。
返回此空间参考的椭球体短半轴。
返回此空间参考的椭球体扁率倒数。
如果此空间参考是地理空间参考(根节点为
GEOGCS
),则返回True
。如果此空间参考是本地空间参考(根节点为
LOCAL_CS
),则返回True
。如果此空间参考是投影坐标系(根节点为
PROJCS
),则返回True
。返回此空间参考的 WKT 表示形式。
返回 WKT 的“漂亮”表示形式。
返回此空间参考的 PROJ 表示形式。
返回此空间参考的 XML 表示形式。
CoordTransform
¶
表示坐标系转换。它使用两个 SpatialReference
初始化,分别表示源坐标系和目标坐标系。当对不同的几何图形重复执行相同的坐标转换时,应使用这些对象。
>>> ct = CoordTransform(SpatialReference("WGS84"), SpatialReference("NAD83"))
>>> for feat in layer:
... geom = feat.geom # getting clone of feature geometry
... geom.transform(ct) # transforming
...
栅格数据对象¶
GDALRaster
¶
GDALRaster
是 GDAL 栅格源对象的包装器,支持使用一致的接口从各种 GDAL 支持的地理空间文件格式和数据源读取数据。每个数据源都由一个 GDALRaster
对象表示,该对象包含一个或多个名为波段的数据层。每个波段(由 GDALBand
对象表示)包含地理配准的图像数据。例如,RGB 图像表示为三个波段:一个用于红色,一个用于绿色,一个用于蓝色。
注意
对于栅格数据,栅格实例与其数据源之间没有区别。与几何对象不同,GDALRaster
对象始终是数据源。可以使用相应的驱动程序在内存中实例化临时栅格,但它们将与基于文件的栅格源属于同一类。
- class GDALRaster(ds_input, write=False)[source]¶
GDALRaster
的构造函数接受两个参数。第一个参数定义栅格源,第二个参数定义是否应以写入模式打开栅格。对于新创建的栅格,第二个参数被忽略,新栅格始终以写入模式创建。第一个参数可以采用三种形式:表示文件路径(文件系统或 GDAL 虚拟文件系统)的字符串或
Path
、包含定义新栅格的值的字典或表示栅格文件的字节对象。如果输入是文件路径,则从该路径打开栅格。如果输入是字典中的原始数据,则需要
width
、height
和srid
参数。如果输入是字节对象,则将使用 GDAL 虚拟文件系统打开它。有关如何使用字典输入创建栅格的详细说明,请参阅 从数据创建栅格。有关如何在虚拟文件系统中创建栅格的详细说明,请参阅 使用 GDAL 的虚拟文件系统。
以下示例显示了如何从不同的输入源创建栅格(使用 GeoDjango 测试中的示例数据;另请参阅 示例数据 部分)。
>>> from django.contrib.gis.gdal import GDALRaster >>> rst = GDALRaster("/path/to/your/raster.tif", write=False) >>> rst.name '/path/to/your/raster.tif' >>> rst.width, rst.height # This file has 163 x 174 pixels (163, 174) >>> rst = GDALRaster( ... { # Creates an in-memory raster ... "srid": 4326, ... "width": 4, ... "height": 4, ... "datatype": 1, ... "bands": [ ... { ... "data": (2, 3), ... "offset": (1, 1), ... "size": (2, 2), ... "shape": (2, 1), ... "nodata_value": 5, ... } ... ], ... } ... ) >>> rst.srs.srid 4326 >>> rst.width, rst.height (4, 4) >>> rst.bands[0].data() array([[5, 5, 5, 5], [5, 2, 3, 5], [5, 2, 3, 5], [5, 5, 5, 5]], dtype=uint8) >>> rst_file = open("/path/to/your/raster.tif", "rb") >>> rst_bytes = rst_file.read() >>> rst = GDALRaster(rst_bytes) >>> rst.is_vsi_based True >>> rst.name # Stored in a random path in the vsimem filesystem. '/vsimem/da300bdb-129d-49a8-b336-e410a9428dad'
- name[source]¶
源的名称,等效于输入文件路径或在实例化时提供的名称。
>>> GDALRaster({"width": 10, "height": 10, "name": "myraster", "srid": 4326}).name 'myraster'
- driver[source]¶
用于处理输入文件的 GDAL 驱动程序的名称。对于从文件创建的
GDALRaster
,会自动检测驱动程序类型。从头开始创建栅格默认为内存中栅格 ('MEM'
),但可以根据需要进行更改。例如,对于GeoTiff
文件,请使用GTiff
。有关文件类型的列表,另请参阅 GDAL 栅格格式 列表。通过以下示例创建内存中栅格
>>> GDALRaster({"width": 10, "height": 10, "srid": 4326}).driver.name 'MEM'
通过以下示例创建基于文件的 GeoTiff 栅格
>>> import tempfile >>> rstfile = tempfile.NamedTemporaryFile(suffix=".tif") >>> rst = GDALRaster( ... { ... "driver": "GTiff", ... "name": rstfile.name, ... "srid": 4326, ... "width": 255, ... "height": 255, ... "nr_of_bands": 1, ... } ... ) >>> rst.name '/tmp/tmp7x9H4J.tif' # The exact filename will be different on your computer >>> rst.driver.name 'GTiff'
- width[source]¶
源的宽度(以像素为单位)(X 轴)。
>>> GDALRaster({"width": 10, "height": 20, "srid": 4326}).width 10
- height[source]¶
源的高度(以像素为单位)(Y 轴)。
>>> GDALRaster({"width": 10, "height": 20, "srid": 4326}).height 20
- srs[source]¶
栅格的空间参考系统,作为
SpatialReference
实例。可以通过将其设置为另一个SpatialReference
或提供SpatialReference
构造函数接受的任何输入来更改 SRS。>>> rst = GDALRaster({"width": 10, "height": 20, "srid": 4326}) >>> rst.srs.srid 4326 >>> rst.srs = 3086 >>> rst.srs.srid 3086
- srid[source]¶
栅格的空间参考系统标识符 (SRID)。此属性是通过
srs
属性获取或设置 SRID 的快捷方式。>>> rst = GDALRaster({"width": 10, "height": 20, "srid": 4326}) >>> rst.srid 4326 >>> rst.srid = 3086 >>> rst.srid 3086 >>> rst.srs.srid # This is equivalent 3086
- geotransform[source]¶
用于对源进行地理配准的仿射变换矩阵,作为一个包含六个系数的元组,使用以下关系将像素/行坐标映射到地理配准空间
Xgeo = GT(0) + Xpixel * GT(1) + Yline * GT(2) Ygeo = GT(3) + Xpixel * GT(4) + Yline * GT(5)
可以通过访问
origin
(索引 0 和 3)、scale
(索引 1 和 5)和skew
(索引 2 和 4)属性来检索相同的值。默认值为
[0.0, 1.0, 0.0, 0.0, 0.0, -1.0]
。>>> rst = GDALRaster({"width": 10, "height": 20, "srid": 4326}) >>> rst.geotransform [0.0, 1.0, 0.0, 0.0, 0.0, -1.0]
- origin[source]¶
栅格左上角原点在源空间参考系统中的坐标,作为具有
x
和y
成员的点对象。>>> rst = GDALRaster({"width": 10, "height": 20, "srid": 4326}) >>> rst.origin [0.0, 0.0] >>> rst.origin.x = 1 >>> rst.origin [1.0, 0.0]
- scale[source]¶
用于对栅格进行地理配准的像素宽度和高度,作为具有
x
和y
成员的点对象。有关更多信息,请参见geotransform
。>>> rst = GDALRaster({"width": 10, "height": 20, "srid": 4326}) >>> rst.scale [1.0, -1.0] >>> rst.scale.x = 2 >>> rst.scale [2.0, -1.0]
- skew[source]¶
用于对栅格进行地理配准的倾斜系数,作为具有
x
和y
成员的点对象。对于正北向上的图像,这两个系数均为0
。>>> rst = GDALRaster({"width": 10, "height": 20, "srid": 4326}) >>> rst.skew [0.0, 0.0] >>> rst.skew.x = 3 >>> rst.skew [3.0, 0.0]
- extent[source]¶
栅格源的范围(边界值),作为源空间参考系统中的 4 元组
(xmin, ymin, xmax, ymax)
。>>> rst = GDALRaster({"width": 10, "height": 20, "srid": 4326}) >>> rst.extent (0.0, -20.0, 10.0, 0.0) >>> rst.origin.x = 100 >>> rst.extent (100.0, -20.0, 110.0, 0.0)
- bands[source]¶
源的所有波段的列表,作为
GDALBand
实例。>>> rst = GDALRaster( ... { ... "width": 1, ... "height": 2, ... "srid": 4326, ... "bands": [{"data": [0, 1]}, {"data": [2, 3]}], ... } ... ) >>> len(rst.bands) 2 >>> rst.bands[1].data() array([[ 2., 3.]], dtype=float32)
- warp(ds_input, resampling='NearestNeighbour', max_error=0.0)[source]¶
返回此栅格的扭曲版本。
可以通过
ds_input
参数指定扭曲参数。ds_input
的使用类似于类构造函数的相应参数。它是一个包含目标栅格特征的字典。允许的字典键值包括 width、height、SRID、origin、scale、skew、datatype、driver 和 name(文件名)。默认情况下,warp 函数使大多数参数等于原始源栅格的值,因此只需要指定应更改的参数。请注意,这包括驱动程序,因此对于基于文件的栅格,warp 函数将在磁盘上创建一个新的栅格。
与源栅格设置不同的唯一参数是名称。栅格名称的默认值为源栅格的名称,后跟
'_copy' + source_driver_name
。对于基于文件的栅格,建议提供目标栅格的文件路径。用于扭曲的重采样算法可以通过
resampling
参数指定。默认为NearestNeighbor
,其他允许的值为Bilinear
、Cubic
、CubicSpline
、Lanczos
、Average
和Mode
。max_error
参数可用于指定在逼近变换时允许的以输入像素测量的最大误差。默认值为 0.0,用于精确计算。对于熟悉
GDAL
的用户,此函数的功能类似于gdalwarp
命令行实用程序。例如,warp 函数可用于将栅格聚合到其原始像素比例的两倍
>>> rst = GDALRaster( ... { ... "width": 6, ... "height": 6, ... "srid": 3086, ... "origin": [500000, 400000], ... "scale": [100, -100], ... "bands": [{"data": range(36), "nodata_value": 99}], ... } ... ) >>> target = rst.warp({"scale": [200, -200], "width": 3, "height": 3}) >>> target.bands[0].data() array([[ 7., 9., 11.], [ 19., 21., 23.], [ 31., 33., 35.]], dtype=float32)
- transform(srs, driver=None, name=None, resampling='NearestNeighbour', max_error=0.0)[source]¶
将此栅格转换为不同的空间参考系统(
srs
),它可以是SpatialReference
对象,也可以是SpatialReference
接受的任何其他输入(包括空间参考 WKT 和 PROJ 字符串,或整数 SRID)。它计算新空间参考系统中当前栅格的范围和比例,并使用
warp
函数扭曲栅格。默认情况下,使用源栅格的驱动程序,栅格的名称为原始名称后跟
'_copy' + source_driver_name
。可以使用driver
和name
参数指定不同的驱动程序或名称。默认的重采样算法为
NearestNeighbour
,但可以使用resampling
参数更改。重采样的默认最大允许误差为 0.0,可以使用max_error
参数更改。有关这些参数的详细信息,请参阅warp
文档。>>> rst = GDALRaster( ... { ... "width": 6, ... "height": 6, ... "srid": 3086, ... "origin": [500000, 400000], ... "scale": [100, -100], ... "bands": [{"data": range(36), "nodata_value": 99}], ... } ... ) >>> target_srs = SpatialReference(4326) >>> target = rst.transform(target_srs) >>> target.origin [-82.98492744885776, 27.601924753080144]
- metadata¶
此栅格的元数据,表示为嵌套字典。第一级键是元数据域。第二级包含每个域的元数据项名称和值。
要设置或更新元数据项,请使用上面描述的嵌套结构将相应的元数据项传递给方法。仅更新指定字典中的键;其余元数据保持不变。
要移除元数据项,请使用
None
作为元数据值。>>> rst = GDALRaster({"width": 10, "height": 20, "srid": 4326}) >>> rst.metadata {} >>> rst.metadata = {"DEFAULT": {"OWNER": "Django", "VERSION": "1.0"}} >>> rst.metadata {'DEFAULT': {'OWNER': 'Django', 'VERSION': '1.0'}} >>> rst.metadata = {"DEFAULT": {"OWNER": None, "VERSION": "2.0"}} >>> rst.metadata {'DEFAULT': {'VERSION': '2.0'}}
GDALBand
¶
- class GDALBand¶
GDALBand
实例不是显式创建的,而是从GDALRaster
对象(通过其bands
属性)获取的。GDALBands包含栅格的实际像素值。- description¶
波段的名称或描述(如果有)。
- width¶
波段的宽度(以像素为单位)(X轴)。
- height¶
波段的高度(以像素为单位)(Y轴)。
- pixel_count¶
此波段中像素的总数。等于
width * height
。
- statistics(refresh=False, approximate=False)¶
计算此波段像素值的统计信息。返回值是一个元组,其结构如下:
(minimum, maximum, mean, standard deviation)
。如果
approximate
参数设置为True
,则统计信息可能是基于概览或图像图块的子集计算的。如果
refresh
参数设置为True
,则统计信息将直接从数据中计算,并且缓存将更新为结果。如果找到持久缓存值,则返回该值。对于使用持久辅助元数据 (PAM) 服务的栅格格式,统计信息可能缓存在辅助文件中。在某些情况下,此元数据可能与像素值不同步,或者导致返回先前调用的值,这些值不反映
approximate
参数的值。在这种情况下,使用refresh
参数获取更新的值并将其存储在缓存中。对于空波段(其中所有像素值都是“无数据”),所有统计信息都返回为
None
。
- min¶
波段的最小像素值(不包括“无数据”值)。
- max¶
波段的最大像素值(不包括“无数据”值)。
- mean¶
波段所有像素值的平均值(不包括“无数据”值)。
- std¶
波段所有像素值的标准差(不包括“无数据”值)。
- nodata_value¶
波段的“无数据”值通常是一个特殊的标记值,用于标记无效数据的像素。此类像素通常不应显示,也不应参与分析操作。
要删除现有的“无数据”值,请将此属性设置为
None
。
- datatype(as_string=False)¶
波段中包含的数据类型,作为 0(未知)到 14 之间的整数常量。如果
as_string
为True
,则数据类型将作为字符串返回。请查看数据类型值表中的“GDAL像素类型”列以获取可能的值。
- color_interp(as_string=False)¶
波段的颜色解释,作为 0 到 16 之间的整数。如果
as_string
为True
,则数据类型将作为字符串返回,其可能值为:GCI_Undefined
、GCI_GrayIndex
、GCI_PaletteIndex
、GCI_RedBand
、GCI_GreenBand
、GCI_BlueBand
、GCI_AlphaBand
、GCI_HueBand
、GCI_SaturationBand
、GCI_LightnessBand
、GCI_CyanBand
、GCI_MagentaBand
、GCI_YellowBand
、GCI_BlackBand
、GCI_YCbCr_YBand
、GCI_YCbCr_CbBand
和GCI_YCbCr_CrBand
。GCI_YCbCr_CrBand
也代表GCI_Max
,因为两者都对应于整数 16,但只有GCI_YCbCr_CrBand
作为字符串返回。
- data(data=None, offset=None, size=None, shape=None)¶
GDALBand
像素值的访问器。如果未提供任何参数,则返回完整的数据数组。可以通过将偏移量和块大小指定为元组来请求像素数组的子集。如果 NumPy 可用,则数据将作为 NumPy 数组返回。出于性能原因,强烈建议使用 NumPy。
如果提供了
data
参数,则数据将写入GDALBand
。输入可以是以下类型之一 - 打包字符串、缓冲区、列表、数组和 NumPy 数组。输入中的项目数量通常应与波段中的像素总数相对应,或者如果提供了offset
和size
参数,则应与特定像素值块的像素数量相对应。如果输入中的项目数量与目标像素块不同,则必须指定
shape
参数。形状是一个元组,指定输入数据中像素的宽度和高度。然后复制数据以更新所选块的像素值。例如,这对于用单个值填充整个波段很有用。例如
>>> rst = GDALRaster( ... {"width": 4, "height": 4, "srid": 4326, "datatype": 1, "nr_of_bands": 1} ... ) >>> bnd = rst.bands[0] >>> bnd.data(range(16)) >>> bnd.data() array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]], dtype=int8) >>> bnd.data(offset=(1, 1), size=(2, 2)) array([[ 5, 6], [ 9, 10]], dtype=int8) >>> bnd.data(data=[-1, -2, -3, -4], offset=(1, 1), size=(2, 2)) >>> bnd.data() array([[ 0, 1, 2, 3], [ 4, -1, -2, 7], [ 8, -3, -4, 11], [12, 13, 14, 15]], dtype=int8) >>> bnd.data(data="\x9d\xa8\xb3\xbe", offset=(1, 1), size=(2, 2)) >>> bnd.data() array([[ 0, 1, 2, 3], [ 4, -99, -88, 7], [ 8, -77, -66, 11], [ 12, 13, 14, 15]], dtype=int8) >>> bnd.data([1], shape=(1, 1)) >>> bnd.data() array([[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]], dtype=uint8) >>> bnd.data(range(4), shape=(1, 4)) array([[0, 0, 0, 0], [1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]], dtype=uint8)
- metadata¶
此波段的元数据。功能与
GDALRaster.metadata
相同。
从数据创建栅格¶
本节介绍如何使用ds_input
参数从头开始创建栅格。
当将dict
传递给GDALRaster
构造函数时,将创建一个新的栅格。字典包含新栅格的定义参数,例如原点、大小或空间参考系统。字典还可以包含像素数据以及有关新栅格格式的信息。因此,根据指定的驱动程序,生成的栅格可以是基于文件的或基于内存的。
目前还没有标准来描述字典或 JSON 格式的光栅数据。因此,传递给GDALRaster
类的字典输入的定义是特定于 Django 的。它受到geojson格式的启发,但geojson
标准目前仅限于矢量格式。
有关在创建光栅时使用不同键的示例,请参阅GDALRaster
和GDALBand
类的相应属性和方法的文档。
ds_input
字典¶
创建光栅只需要在ds_input
字典中设置几个键:width
、height
和srid
。所有其他参数都具有默认值(请参见下表)。可以在ds_input
字典中传递的键列表与GDALRaster
属性密切相关,但并不完全相同。许多参数直接映射到这些属性;其他参数将在下面描述。
下表描述了可以在ds_input
字典中设置的所有键。
键 |
默认值 |
用途 |
---|---|---|
|
必填 |
映射到 |
|
必填 |
映射到 |
|
必填 |
映射到 |
|
|
映射到 |
|
|
见下文 |
|
|
映射到 |
|
|
映射到 |
|
|
映射到 |
|
|
见下文 |
|
|
见下文 |
|
|
见下文 |
|
|
见下文 |
- name
表示光栅名称的字符串。当创建基于文件的栅格时,此参数必须是新栅格的文件路径。如果名称以
/vsimem/
开头,则在 GDAL 的虚拟文件系统中创建栅格。
- datatype
表示所有波段数据类型的整数。默认为
6
(Float32)。新光栅的所有波段都必须具有相同的数据类型。值映射如下:值
GDAL 像素类型
描述
1
GDT_Byte
8 位无符号整数
2
GDT_UInt16
16 位无符号整数
3
GDT_Int16
16 位有符号整数
4
GDT_UInt32
32 位无符号整数
5
GDT_Int32
32 位有符号整数
6
GDT_Float32
32 位浮点数
7
GDT_Float64
64 位浮点数
12
GDT_UInt64
64 位无符号整数 (GDAL 3.5+)
13
GDT_Int64
64 位有符号整数 (GDAL 3.5+)
14
GDT_Int8
8 位有符号整数 (GDAL 3.7+)
- nr_of_bands
表示光栅波段数量的整数。可以在创建时不提供波段数据来创建光栅。如果未指定波段数量,则会根据
bands
输入的长度自动计算。创建后无法更改波段数量。
- bands
包含波段输入数据的
band_input
字典列表。生成的波段索引与提供的列表中的索引相同。波段输入字典的定义如下。如果未提供波段数据,则光栅波段值将实例化为零数组,并且“无数据”值设置为None
。
- papsz_options
包含光栅创建选项的字典。输入字典的键值对在创建光栅时传递给驱动程序。
可用选项是特定于驱动程序的,并在每个驱动程序的文档中进行了描述。
字典中的值不区分大小写,并在创建时自动转换为正确的字符串格式。
以下示例使用GTiff 驱动程序提供的一些选项。结果是具有内部平铺方案的压缩光栅。内部图块的块大小为 23x23。
>>> GDALRaster( ... { ... "driver": "GTiff", ... "name": "/path/to/new/file.tif", ... "srid": 4326, ... "width": 255, ... "height": 255, ... "nr_of_bands": 1, ... "papsz_options": { ... "compress": "packbits", ... "tiled": "yes", ... "blockxsize": 23, ... "blockysize": 23, ... }, ... } ... )
band_input
字典¶
ds_input
字典中的bands
键是band_input
字典的列表。每个band_input
字典可以包含像素值和要在新光栅的波段上设置的“无数据”值。数据数组可以具有新光栅的完整大小,也可以更小。对于小于完整光栅的数组,size
、shape
和offset
键控制像素值。相应的键传递给data()
方法。它们的功能与使用该方法设置波段数据相同。下表描述了可以使用的键。
键 |
默认值 |
用途 |
---|---|---|
|
|
映射到 |
|
与 |
传递给 |
|
光栅的 |
传递给 |
|
与 size 相同 |
传递给 |
|
|
传递给 |
使用 GDAL 的虚拟文件系统¶
GDAL 可以访问存储在文件系统中的文件,但也支持虚拟文件系统来抽象访问其他类型的文件,例如压缩文件、加密文件或远程文件。
使用基于内存的虚拟文件系统¶
GDAL 具有内部基于内存的文件系统,允许将内存块视为文件。它可以用于在GDALRaster
对象和二进制文件缓冲区之间进行读写。
这在 Web 上下文中非常有用,在 Web 上下文中,光栅可能作为缓冲区从远程存储获取或从视图返回,而无需写入磁盘。
当提供bytes
对象作为输入或文件路径以/vsimem/
开头时,会在虚拟文件系统中创建GDALRaster
对象。
作为bytes
提供的输入必须是文件的完整二进制表示。例如:
# Read a raster as a file object from a remote source.
>>> from urllib.request import urlopen
>>> dat = urlopen("https://example.com/raster.tif").read()
# Instantiate a raster from the bytes object.
>>> rst = GDALRaster(dat)
# The name starts with /vsimem/, indicating that the raster lives in the
# virtual filesystem.
>>> rst.name
'/vsimem/da300bdb-129d-49a8-b336-e410a9428dad'
要从头开始创建新的基于虚拟文件的栅格,请使用ds_input
字典表示法并提供以/vsimem/
开头的name
参数(有关字典表示法的详细信息,请参见从数据创建光栅)。对于基于虚拟文件的栅格,vsi_buffer
属性返回光栅的bytes
表示形式。
以下是如何创建光栅并将其作为文件返回到HttpResponse
中的示例:
>>> from django.http import HttpResponse
>>> rst = GDALRaster(
... {
... "name": "/vsimem/temporarymemfile",
... "driver": "tif",
... "width": 6,
... "height": 6,
... "srid": 3086,
... "origin": [500000, 400000],
... "scale": [100, -100],
... "bands": [{"data": range(36), "nodata_value": 99}],
... }
... )
>>> HttpResponse(rast.vsi_buffer, "image/tiff")
使用其他虚拟文件系统¶
根据 GDAL 的本地构建,可能支持其他虚拟文件系统。您可以通过在提供的路径前加上适当的/vsi*/
前缀来使用它们。有关详细信息,请参阅GDAL 虚拟文件系统文档。
压缩栅格数据¶
GDAL 可以直接访问压缩文件,而无需解压缩文件并实例化生成的栅格数据,可以使用 /vsizip/
、/vsigzip/
或 /vsitar/
虚拟文件系统。
>>> from django.contrib.gis.gdal import GDALRaster
>>> rst = GDALRaster("/vsizip/path/to/your/file.zip/path/to/raster.tif")
>>> rst = GDALRaster("/vsigzip/path/to/your/file.gz")
>>> rst = GDALRaster("/vsitar/path/to/your/file.tar/path/to/raster.tif")
网络栅格数据¶
GDAL 可以透明地支持在线资源和存储提供商。只要它构建了这些功能。
要访问无需身份验证的公共栅格文件,可以使用 /vsicurl/
>>> from django.contrib.gis.gdal import GDALRaster
>>> rst = GDALRaster("/vsicurl/https://example.com/raster.tif")
>>> rst.name
'/vsicurl/https://example.com/raster.tif'
对于商业存储提供商(例如 /vsis3/
),系统应事先配置身份验证和其他设置(有关可用选项,请参阅 GDAL 虚拟文件系统文档)。
设置¶
GDAL_LIBRARY_PATH
¶
一个指定 GDAL 库位置的字符串。通常,仅当 GDAL 库位于非标准位置时(例如 /home/john/lib/libgdal.so
)才使用此设置。