GDAL API

GDAL代表地理空间数据抽象库,是一个真正的“瑞士军刀”的GIS数据功能。 GDAL的子集是OGR简单特征库,其专门用于以各种标准格式读取和写入向量地理数据。

GeoDjango为OGR的一些功能提供了高级Python接口,包括矢量空间数据的读取和坐标转换,以及对于栅格(图像)数据的GDAL功能的最小支持。

虽然该模块名为gdal,但GeoDjango此时只支持OGR和GDAL的栅格功能的一些功能。

Overview

Sample Data

这里描述的GDAL / OGR工具旨在帮助您读取地理空间数据,为了使大多数工具有用,您必须拥有一些数据才能使用。 如果你刚开始,还没有自己的任何数据要使用,GeoDjango测试包含了许多可以用于测试的简单数据集。 您可以在这里下载:

$ wget https://raw.githubusercontent.com/django/django/master/tests/gis_tests/data/cities/cities.{shp,prj,shx,dbf}
$ wget https://raw.githubusercontent.com/django/django/master/tests/gis_tests/data/rasters/raster.tif

Vector Data Source Objects

DataSource

DataSource是OGR数据源对象的包装器,支持使用简单,一致的界面从各种支持OGR的地理空间文件格式和数据源读取数据。 每个数据源由包含一个或多个数据层的DataSource对象表示。 Layer对象表示的每个层包含一些地理要素(Feature),有关该层中包含的要素类型的信息(例如点,多边形等) 。),以及可以与该层中的每个特征相关联的数据的任何附加字段(Field)的名称和类型。

DataSourceds_inputencoding ='utf-8'

DataSource的构造函数只需要一个参数:要读取的文件的路径。 但是,OGR还支持各种更复杂的数据源,包括数据库,可以通过传递特殊的名称字符串而不是路径来访问。 有关详细信息,请参阅OGR矢量格式文档。 DataSource实例的name属性给出了它正在使用的基础数据源的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_count

返回数据源中的图层数。

name

返回数据源的名称。

Layer

层 T0> ¶ T1>

LayerDataSource对象中数据层的包装器。 您从不直接创建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"的图层,其中包含三个点要素。 为了简单起见,以下示例假设您已将该图层存储在变量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 T0>( GEOS =假 T1>)¶ T2>

返回包含图层中每个要素几何的列表的方法。 如果可选参数True设置为geos,那么几何将转换为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)

返回一个布尔值,指示此图层是否支持给定能力(字符串)。 有效能力字符串的示例包括:'DeleteFeature''FastSetNextByIndex''CreateField''FastFeatureCount''FastGetExtent''RandomWrite''SequentialWrite''Transactions''RandomRead''FastSpatialFilter'

Feature

功能 T0> ¶ T1>

Feature包装OGR功能。 您从不直接创建Feature对象。 而是从Layer对象检索它们。 每个要素由几何和一组包含其他属性的字段组成。 字段的几何可通过其geom属性访问,该属性返回OGRGeometry对象。 A Feature的行为类似于其字段的标准Python容器,它作为Field对象返回:您可以通过其索引或名称直接访问字段,也可以迭代功能的领域,例如在for循环。

geom

OGRGeometry对象的形式返回此要素的几何:

>>> city.geom.tuple
(-104.609252, 38.255001)
get

返回此功能的给定字段(由名称指定)的值的方法,而不是 a 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

字段 T0> ¶ T1>
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()

将字段的值作为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

驱动程序 T0>( dr_input T1>)¶ T2>

Driver类在内部用于包装OGR DataSource驱动程序。

driver_count

返回当前注册的OGR向量驱动程序的数量。

OGR Geometries

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))')
OGRGeometrygeom_inputsrs = None

此对象是OGR Geometry类的包装器。 这些对象直接从给定的buffer参数实例化,该参数可以是包含WKT,HEX,GeoJSON,包含WKB数据的geom_input,或OGRGeomType 当从Layer(其又是DataSource的一部分)读取向量数据时,这些对象也从Feature.geom属性返回。

类方法 from_gml T0>( gml_string T1>)¶ T2>
Django中的新功能1.11。

从给定的GML字符串构造一个OGRGeometry

类方法 from_bbox T0>( BBOX T1>)¶ T2>

从给定的边界框(4元组)构造Polygon

__len__()

返回LineString中的点数,Polygon中的环数或GeometryCollection中的几何数。 不适用于其他几何类型。

__iter__()

迭代LineString中的点,Polygon中的环或GeometryCollection中的几何。 不适用于其他几何类型。

__getitem__()

返回LineString的指定索引处的点,Polygon的指定索引处的内部环或GeometryCollection 不适用于其他几何类型。

dimension

返回几何的协调维数,即0为点数,1为行,等等:

>> polygon.dimension
2
coord_dim

返回或设置此几何的坐标尺寸。 例如,对于二维几何,值将为2。

geom_count

返回此几何中的元素数:

>>> polygon.geom_count
1
point_count

返回用于描述此几何的点数:

>>> polygon.point_count
4
num_points

point_count的别名。

num_coords

point_count的别名。

geom_type

返回此几何的类型,作为OGRGeomType对象。

geom_name

返回此几何类型的名称:

>>> polygon.geom_name
'POLYGON'
area

返回此几何的面积,对于不包含区域的几何,返回0:

>>> polygon.area
25.0
envelope

返回此几何的包络,作为Envelope对象。

extent

以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

geos

返回与此几何对应的GEOSGeometry对象。

gml

以GML格式返回此几何的字符串表示形式:

>>> OGRGeometry('POINT(1 2)').gml
'<gml:Point><gml:coordinates>1,2</gml:coordinates></gml:Point>'
hex

以HEX WKB格式返回此几何的字符串表示形式:

>>> OGRGeometry('POINT(1 2)').hex
'0101000000000000000000F03F0000000000000040'
json

以JSON格式返回此几何的字符串表示形式:

>>> OGRGeometry('POINT(1 2)').json
'{ "type": "Point", "coordinates": [ 1.000000, 2.000000 ] }'
kml

以KML格式返回此几何的字符串表示形式。

wkb_size

返回保存此几何的WKB表示所需的WKB缓冲区的大小:

>>> OGRGeometry('POINT(1 2)').wkb_size
21
wkb

返回包含此几何的WKB表示形式的buffer

wkt

以WKT格式返回此几何的字符串表示形式。

ewkt

返回此几何的EWKT表示。

clone()

返回此几何对象的新OGRGeometry克隆。

close_rings()

如果此几何中有任何尚未关闭的环,则此例程将通过将起点添加到结尾来执行此操作:

>>> triangle = OGRGeometry('LINEARRING (0 0,0 1,1 0)')
>>> triangle.close_rings()
>>> triangle.wkt
'LINEARRING (0 0,0 1,1 0,0 0)'
transform(coord_trans, clone=False)

将此几何体转换为不同的空间参考系。 可以采用CoordTransform对象,SpatialReference对象或SpatialReference接受的任何其他输入(包括空间参考WKT和PROJ.4字符串,整数SRID)。

默认情况下不返回任何内容,并且几何将原位转换。 但是,如果clone关键字设置为True,则会返回此几何的转换克隆。

intersects(other)

如果此几何与另一个相交,则返回True,否则返回False

equals(other)

如果此几何相当于另一个几何,则返回True,否则返回False

disjoint(other)

如果这个几何在空间上不相交(即不相交),则返回True,否则返回False

touches(other)

如果此几何图形接触另一个,则返回True,否则返回False

crosses(other)

如果此几何图形彼此交叉,则返回True,否则返回False

within(other)

如果此几何体包含在另一个中,则返回True,否则返回False

contains(other)

如果此几何包含另一个几何,则返回True,否则返回False

overlaps(other)

如果此几何图形与另一个重叠,则返回True,否则返回False

boundary()

此几何的边界,作为新的OGRGeometry对象。

convex_hull

包含此几何的最小凸多边形,作为新的OGRGeometry对象。

difference()

返回由该几何和其他几何的差异组成的区域作为新的OGRGeometry对象。

intersection()

返回由此几何与另一个的交集组成的区域作为新的OGRGeometry对象。

sym_difference()

返回由该几何的对称差异组成的区域,另一个作为新的OGRGeometry对象。

union()

返回由该几何和其他几何的联合组成的区域作为新的OGRGeometry对象。

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的别名。

点 T0> ¶ T1>
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
线段形式 T0> ¶ T1>
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]
多边形 T0> ¶ T1>
shell

返回此多边形的外壳或外环,作为LinearRing几何。

exterior_ring

shell的别名。

centroid

返回表示此多边形的质心的Point

的GeometryCollection T0> ¶ T1>
add(geom)

向此几何集合中添加几何。 不适用于其他几何类型。

OGRGeomType

OGRGeomType T0>( type_input T1>)¶ T2>

此类允许以多种方式中的任何一种表示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
name

返回OGR几何类型的短括号字符串形式:

>>> gt1.name
'Polygon'
num

返回与OGR几何类型对应的数字:

>>> gt1.num
3
django

返回用于存储此OGR类型的Django字段类型(GeometryField的子类),如果没有适当的Django类型,则返回None

>>> gt1.django
'PolygonField'

Envelope

封套 T0>( * ARGS T1>)¶ T2>

表示包含矩形边界框的最小和最大X,Y坐标的OGR包络结构。 变量的命名与OGR Envelope C结构兼容。

min_x

最小X坐标的值。

min_y

最大X坐标值。

max_x

最小Y坐标的值。

max_y

最大Y坐标的值。

ur

右上坐标,作为元组。

ll

左下坐标,作为元组。

tuple

表示包络的元组。

wkt

将此包络表示为WKT格式的多边形的字符串。

expand_to_include(*args)

Coordinate System Objects

SpatialReference

的SpatialReference T0>( srs_input T1>)¶ T2>

空间参考对象在给定的srs_input上初始化,它可能是以下之一:

  • OGC已知文本(WKT)(字符串)
  • EPSG代码(整数或字符串)
  • PROJ.4字符串
  • 已知标准('NAD27''WGS72''WGS84''NAD83'

例如:

>>> wgs84 = SpatialReference('WGS84') # shorthand string
>>> wgs84 = SpatialReference(4326) # EPSG code
>>> wgs84 = SpatialReference('EPSG:4326') # EPSG string
>>> proj4 = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs '
>>> wgs84 = SpatialReference(proj4) # PROJ.4 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
__getitem__(target)

返回给定字符串属性节点的值,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
attr_value(target, index=0)

给定目标节点的属性值(例如'PROJCS')。 index关键字指定要返回的子节点的索引。

auth_name(target)

返回给定字符串目标节点的权限名称。

auth_code(target)

返回给定字符串目标节点的权限代码。

clone()

返回此空间参考对象的克隆。

identify_epsg()

此方法检查此SpatialReference的WKT,并添加适用EPSG标识符的EPSG权限节点。

from_esri()

将此SpatialReference从ESRI格式转换为EPSG

to_esri()

将此SpatialReference变形为ESRI的格式。

validate()

检查以确定给定的空间参考是否有效,如果不是,将引发异常。

import_epsg(epsg)

从EPSG代码导入空间参考。

import_proj(proj)

从PROJ.4字符串导入空间参考。

import_user_input(user_input)
import_wkt(wkt)

从WKT导入空间参考。

import_xml(xml)

从XML导入空间参考。

name

返回此空间参考的名称。

srid

返回顶级权限的SRID,如果未定义,则返回None

linear_name

返回线性单位的名称。

linear_units

返回线性单位的值。

angular_name

返回角单位的名称。

angular_units

返回角单位的值。

units

返回单位值的2元组和单位名称,并自动确定是否返回线性或角度单位。

ellipsoid

返回该空间参考的椭圆参数的元组:(半长轴,半轴和反平面)。

semi_major

返回此空间参考的椭圆体的半长轴。

semi_minor

返回此空间参考的椭圆体的半短轴。

inverse_flattening

返回此空间参考的椭圆体的逆平展。

geographic

如果此空间参考为地理(根节点为True),则返回GEOGCS

local

如果此空间参考是本地(根节点是True),则返回LOCAL_CS

projected

如果此空间参考是投影坐标系(根节点为True),则返回PROJCS

wkt

返回此空间参考的WKT表示。

pretty_wkt

返回WKT的“漂亮”表示。

proj

返回此空间参考的PROJ.4表示形式。

proj4

SpatialReference.proj的别名。

xml

返回此空间参考的XML表示形式。

CoordTransform

CoordTransformsourcetarget

表示坐标系变换。 它由两个SpatialReference初始化,分别表示源坐标系统和目标坐标系统。 当对不同几何体重复执行相同的坐标变换时,应使用这些对象:

>>> ct = CoordTransform(SpatialReference('WGS84'), SpatialReference('NAD83'))
>>> for feat in layer:
...     geom = feat.geom # getting clone of feature geometry
...     geom.transform(ct) # transforming

Raster Data Objects

GDALRaster

GDALRaster是GDAL栅格源对象的包装器,支持使用简单,一致的界面从各种支持GDAL的地理空间文件格式和数据源读取数据。 每个数据源由GDALRaster对象表示,其包含一个或多个名为带的数据层。 GDALBand对象表示的每个带包含地理参考的图像数据。 例如,RGB图像被表示为三个波段:一个用于红色,一个用于绿色,一个用于蓝色。

对于栅格数据,栅格实例与其数据源之间没有区别。 与几何对象不同,GDALRaster对象始终是数据源。 临时光栅可以使用相应的驱动程序在内存中实例化,但它们将与基于文件的光栅源相同。

GDALRasterds_inputwrite = False

GDALRaster的构造函数接受两个参数。 第一个参数定义了光栅源,它是文件的路径或具有定义新栅格属性(如大小和名称)的值的空间数据。 如果输入是文件路径,则第二个参数指定是否应以写访问权限打开栅格。 如果输入是原始数据,则需要参数widthheightsrid 以下示例显示了如何从不同的输入源创建栅格(使用GeoDjango测试中的示例数据,另见Sample Data部分)。 有关如何使用字典输入创建栅格的详细说明,请参阅Creating rasters from data部分。

>>> 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)
在Django更改1.11:

添加了在创建GDALRaster对象时传递sizeshapeoffset参数的功能。 这些参数可以通过ds_input字典传递。 这允许精细地控制初始像素值。 功能类似于GDALBand.data()方法。

name

源的名称等同于输入文件路径或实例化时提供的名称。

>>> GDALRaster({'width': 10, 'height': 10, 'name': 'myraster', 'srid': 4326}).name
'myraster'
driver

用于处理输入文件的GDAL驱动程序的名称。 对于从文件创建的GDALRaster,将自动检测驱动程序类型。 默认情况下('MEM'),从头创建栅格是内存中的栅格,但可以根据需要进行更改。 例如,将GTiff用于GeoTiff文件。 有关文件类型的列表,另请参阅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

源像素的宽度(X轴)。

>>> GDALRaster({'width': 10, 'height': 20, 'srid': 4326}).width
10
height

源像素的高度(Y轴)。

>>> GDALRaster({'width': 10, 'height': 20, 'srid': 4326}).height
20
srs

光栅的空间参考系,作为SpatialReference实例。 可以通过将其设置为其他SpatialReference或提供由SpatialReference构造函数接受的任何输入来更改SRS。

>>> rst = GDALRaster({'width': 10, 'height': 20, 'srid': 4326})
>>> rst.srs.srid
4326
>>> rst.srs = 3086
>>> rst.srs.srid
3086
srid
Django中的新功能1.10。

光栅的空间参考系统标识符(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

用于对源进行地理参考的仿射变换矩阵,作为使用以下关系将像素/线坐标映射到地理参考空间中的六个系数的元组:

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和4)性质。

默认值为[0.0, 1.0, 0.0, 0.0, 0.0, t5> -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

作为具有xy成员的点对象,源的空间参考系中光栅的左上原点的坐标。

>>> 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

用于对栅格进行地理配准的像素宽度和高度,作为具有xy成员的点对象。 有关详细信息,请参阅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

用于对栅格进行地理参考的偏斜系数,作为具有xy成员的点对象。 在北向上图像的情况下,这些系数都是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

光栅源的范围(边界值)作为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

源的所有波段列表,如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)
warpds_inputresampling ='NearestNeighbour'max_error = 0.0

返回此光栅的翘曲版本。

翘曲参数可以通过ds_input参数来指定。 使用ds_input类似于类构造函数的相应参数。 它是具有目标光栅特征的字典。 允许的字典键值是width,height,SRID,origin,scale,skew,datatype,driver和name(filename)。

默认情况下,warp函数保留大多数参数等于原始源栅格的值,因此只需要指定需要更改的参数。 请注意,这包括驱动程序,因此对于基于文件的栅格,warp函数将在磁盘上创建一个新的栅格。

与源光栅不同的唯一参数是名称。 光栅名称的默认值是附加'_ copy' + source_driver_name的源光栅名称。 。 对于基于文件的栅格,建议提供目标栅格的文件路径。

用于翘曲的重采样算法可以使用resampling参数来指定。 The default is NearestNeighbor, and the other allowed values are Bilinear, Cubic, CubicSpline, Lanczos, Average, and 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)
转换sriddriver = Nonename = Noneresampling ='NearestNeighbour' t4>,max_error = 0.0

返回具有指定SRID的此栅格的转换版本。

此函数将当前栅格转换为可以使用srid指定的新空间参考系。 它计算新空间参考系统中当前栅格的边界和比例,并使用warp函数扭曲光栅。

默认情况下,使用源光栅的驱动程序,光栅的名称是附加'_ copy' + source_driver_name T3> T0>。 可以使用drivername参数指定不同的驱动程序或名称。

默认重采样算法为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 = rst.transform(4326)
>>> target.origin
[-82.98492744885776, 27.601924753080144]

GDALBand

GDALBand T0> ¶ T1>

GDALBand实例不是显式创建的,而是通过GDALRaster对象,通过其bands属性获取。 GDALBands包含栅格的实际像素值。

description

频带的名称或描述(如果有)。

width

带宽(以像素为单位)(X轴)。

height

带的高度(像素)(Y轴)。

pixel_count T0> ¶ T1>

该频带中的像素总数。 等于width * height

statisticsrefresh = Falseapproximate = False
Django中的新功能1.10。

计算该频带的像素值的统计。 返回值是具有以下结构的元组:(最小值 最大值 表示 标准 偏差) T5> T0>。

如果approximate参数设置为True,则可以基于概述或图像块子集计算统计信息。

如果refresh参数设置为True,则将直接从数据中计算统计信息,并使用结果更新缓存。

如果找到持久缓存值,则返回该值。 对于使用永久辅助元数据(PAM)服务的栅格格式,统计信息可能会缓存在辅助文件中。 在某些情况下,这些元数据可能与像素值不一致,或者导致来自先前调用的值不会反映approximate参数的值。 在这种情况下,请使用refresh参数获取更新值并将其存储在缓存中。

对于空波段(其中所有像素值为“无数据”),所有统计信息返回为None

也可以通过访问minmaxmeanstd属性直接检索统计信息。

min

带的最小像素值(不包括“无数据”值)。

max

带的最大像素值(不包括“无数据”值)。

意味着 T0> ¶ T1>
Django中的新功能1.10。

频带的所有像素值的平均值(不包括“无数据”值)。

STD T0> ¶ T1>
Django中的新功能1.10。

带的所有像素值的标准偏差(不包括“无数据”值)。

nodata_value

带的“无数据”值通常是用于标记不是有效数据的像素的特殊标记值。 这样的像素通常不应被显示,也不会有助于分析操作。

要删除现有的“无数据”值,请将此属性设置为None(需要GDAL≥2.1)。

在Django更改1.10:

现在可以通过将nodata_value属性设置为None来删除“无数据”值。

数据类型 T0>( as_string =假 T1>)¶ T2>

包含在频带中的数据类型,为0(未知)和11之间的整数常量。 如果GDT_UnknownTrue,则数据类型将作为字符串返回,并具有以下可能的值:GDT_Float64GDT_ByteGDT_Float32GDT_CInt16GDT_UInt32GDT_UInt16GDT_Int16GDT_CFloat32GDT_Int32as_stringGDT_CFloat64GDT_CInt32

datadata = Noneoffset = Nonesize = Noneshape = T4>)¶ T5>

访问GDALBand的像素值。 如果没有提供任何参数,则返回完整的数据数组。 可以通过将偏移量和块大小指定为元组来请求像素阵列的子集。

如果NumPy可用,数据将返回为NumPy数组。 出于性能原因,强烈建议使用NumPy。

如果提供了data参数,数据将写入GDALBand 输入可以是以下类型之一:打包字符串,缓冲区,列表,数组和NumPy数组。 输入中的项目数通常对应于频带中的像素总数,或者如果offsetsize

如果输入项目的数量与目标像素块不同,则必须指定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)
在Django更改1.10:

添加shape参数,并在添加设置GDALBand数据时复制数据输入的能力。

从数据创建栅格

本节介绍如何使用ds_input参数从头创建栅格。

dict传递到GDALRaster构造函数时,会创建一个新的栅格。 该字典包含新的光栅的定义参数,如原点,大小或空间参考系。 字典还可以包含像素数据和有关新栅格格式的信息。 因此,所得到的栅格可以是基于文件或基于内存的,具体取决于指定的驱动程序。

在字典或JSON风格中描述栅格数据没有标准。 因此,输入到GDALRaster类的字典的定义因此具体到Django。 它的灵感来自于geojson格式,但geojson标准目前仅限于向量格式。

在创建栅格时使用不同的键的示例可以在GDALRasterGDALBand类的相应属性和方法的文档中找到。

ds_input字典

ds_input字典中只需要几个键即可创建栅格:widthheightsrid 所有其他参数都有默认值(参见下表)。 可以在ds_input字典中传递的密钥列表与GDALRaster属性密切相关,但不完全相同。 许多参数直接映射到这些属性;其他如下所述。

下表描述了可在ds_input字典中设置的所有键。

默认 用法
SRID 需要 映射到srid属性
宽度 需要 映射到width属性
高度 需要 映射到height属性
司机 MEM 映射到driver属性
名称 “” 见下文
起源 0 映射到origin属性
规模 0 映射到scale属性
歪斜 0 映射到width属性
[] 见下文
nr_of_bands 0 见下文
数据类型 6 见下文
名称

表示栅格名称的字符串。 创建基于文件的栅格时,此参数必须是新栅格的文件路径。

数据类型

表示所有频带的数据类型的整数。 默认为6(Float32)。 新栅格的所有频段都需要具有相同的数据类型。 值映射是:

GDAL像素类型 描述
1 GDT_Byte 八位无符号整数
2 GDT_UInt16 十六位无符号整数
3 GDT_Int16 十六位有符号整数
4 GDT_UInt32 三十二位无符号整数
5 GDT_Int32 三十二位有符号整数
6 GDT_Float32 三十二位浮点数
7 GDT_Float64 六十四位浮点数
nr_of_bands

表示栅格数量的整数。 创建光栅可以创建而不通过带数据。 如果没有指定频段数,则会根据bands输入的长度自动计算。 创建后无法更改乐队的数量。

带有带输入数据的band_input字典的列表。 所得到的频带指数与所提供的列表相同。 频段输入字典的定义如下。 如果未提供频带数据,则将光栅频带值实例化为零数组,将“无数据”值设置为None

band_input字典

ds_input字典中的bands键是band_input词典的列表。 每个band_input字典可以包含要在新栅格的带上设置的像素值和“无数据”值。 数据阵列可以具有新栅格的全尺寸或更小。 对于小于全光栅的数组,sizeshapeoffset键控制像素值。 相应的键传递给data()方法。 它们的功能与使用该方法设置带数据相同。 下表介绍了可以使用的按键。

默认 用法
NODATA_VALUE 没有 映射到nodata_value属性
数据 nodata_value0相同 传递给data()方法
尺寸 (与, 高度) 传递给data()方法
形状 与大小相同 传递给data()方法
抵消 (0, 0) 传递给data()方法

Settings

GDAL_LIBRARY_PATH

指定GDAL库位置的字符串。 通常,仅当GDAL库位于非标准位置(例如,/home/john/lib/libgdal.so)时,才使用此设置。

例外¶ T0>

例外 GDALException T0> ¶ T1>

基础GDAL异常,表示GDAL相关的错误。

例外 SRSException T0> ¶ T1>

当构建或使用空间参考系统对象时发生错误时引发异常。