GDAL代表地理空间数据抽象库,是一个真正的“瑞士军刀”的GIS数据功能。 GDAL的子集是OGR简单特征库,其专门用于以各种标准格式读取和写入向量地理数据。
GeoDjango为OGR的一些功能提供了高级Python接口,包括矢量空间数据的读取和坐标转换,以及对于栅格(图像)数据的GDAL功能的最小支持。
注
虽然该模块名为gdal
,但GeoDjango此时只支持OGR和GDAL的栅格功能的一些功能。
这里描述的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
DataSource
¶DataSource
是OGR数据源对象的包装器,支持使用简单,一致的界面从各种支持OGR的地理空间文件格式和数据源读取数据。 每个数据源由包含一个或多个数据层的DataSource
对象表示。 由Layer
对象表示的每个层包含一些地理要素(Feature
),有关该层中包含的要素类型的信息(例如点,多边形等) 。),以及可以与该层中的每个特征相关联的数据的任何附加字段(Field
)的名称和类型。
DataSource
(ds_input,encoding ='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>
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"
的图层,其中包含三个点要素。 为了简单起见,以下示例假设您已将该图层存储在变量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向量驱动程序的数量。
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))')
OGRGeometry
(geom_input,srs = None)¶此对象是OGR Geometry类的包装器。 这些对象直接从给定的buffer
参数实例化,该参数可以是包含WKT,HEX,GeoJSON,包含WKB数据的geom_input
,或OGRGeomType
当从Layer
(其又是DataSource
的一部分)读取向量数据时,这些对象也从Feature.geom
属性返回。
from_gml T0>( gml_string T1>)¶ T2>
从给定的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]
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'
SpatialReference
¶的SpatialReference T0>( srs_input T1>)¶ T2>
空间参考对象在给定的srs_input
上初始化,它可能是以下之一:
'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
¶xml
¶返回此空间参考的XML表示形式。
CoordTransform
¶CoordTransform
(source,target)¶表示坐标系变换。 它由两个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
对象始终是数据源。 临时光栅可以使用相应的驱动程序在内存中实例化,但它们将与基于文件的光栅源相同。
GDALRaster
(ds_input,write = False)¶GDALRaster
的构造函数接受两个参数。 第一个参数定义了光栅源,它是文件的路径或具有定义新栅格属性(如大小和名称)的值的空间数据。 如果输入是文件路径,则第二个参数指定是否应以写访问权限打开栅格。 如果输入是原始数据,则需要参数width
,height
和srid
。 以下示例显示了如何从不同的输入源创建栅格(使用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)
添加了在创建GDALRaster
对象时传递size
,shape
和offset
参数的功能。 这些参数可以通过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
¶光栅的空间参考系统标识符(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
¶作为具有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
¶用于对栅格进行地理配准的像素宽度和高度,作为具有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
¶用于对栅格进行地理参考的偏斜系数,作为具有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
¶光栅源的范围(边界值)作为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)
warp
(ds_input,resampling ='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)
转换
(srid,driver = None,name = None,resampling ='NearestNeighbour' t4>,max_error = 0.0)¶返回具有指定SRID的此栅格的转换版本。
此函数将当前栅格转换为可以使用srid
指定的新空间参考系。 它计算新空间参考系统中当前栅格的边界和比例,并使用warp
函数扭曲光栅。
默认情况下,使用源光栅的驱动程序,光栅的名称是附加'_ copy' + source_driver_name T3> T0>。
可以使用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 = 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
。
statistics
(refresh = False,approximate = False)¶计算该频带的像素值的统计。 返回值是具有以下结构的元组:(最小值 最大值 表示 标准 偏差) T5> T0>。
如果approximate
参数设置为True
,则可以基于概述或图像块子集计算统计信息。
如果refresh
参数设置为True
,则将直接从数据中计算统计信息,并使用结果更新缓存。
如果找到持久缓存值,则返回该值。 对于使用永久辅助元数据(PAM)服务的栅格格式,统计信息可能会缓存在辅助文件中。 在某些情况下,这些元数据可能与像素值不一致,或者导致来自先前调用的值不会反映approximate
参数的值。 在这种情况下,请使用refresh
参数获取更新值并将其存储在缓存中。
对于空波段(其中所有像素值为“无数据”),所有统计信息返回为None
。
min
¶带的最小像素值(不包括“无数据”值)。
max
¶带的最大像素值(不包括“无数据”值)。
意味着 T0> ¶ T1>
频带的所有像素值的平均值(不包括“无数据”值)。
STD T0> ¶ T1>
带的所有像素值的标准偏差(不包括“无数据”值)。
nodata_value
¶带的“无数据”值通常是用于标记不是有效数据的像素的特殊标记值。 这样的像素通常不应被显示,也不会有助于分析操作。
要删除现有的“无数据”值,请将此属性设置为None
(需要GDAL≥2.1)。
现在可以通过将nodata_value
属性设置为None
来删除“无数据”值。
数据类型 T0>( as_string =假 T1>)¶ T2>
包含在频带中的数据类型,为0(未知)和11之间的整数常量。 如果GDT_Unknown
为True
,则数据类型将作为字符串返回,并具有以下可能的值:GDT_Float64
,GDT_Byte
,GDT_Float32
,GDT_CInt16
,GDT_UInt32
,GDT_UInt16
,GDT_Int16
,GDT_CFloat32
,GDT_Int32
,as_string
,GDT_CFloat64
和GDT_CInt32
。
data
(data = None,offset = None,size = None,shape = T4>)¶ T5>访问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)
添加shape
参数,并在添加设置GDALBand
数据时复制数据输入的能力。
本节介绍如何使用ds_input
参数从头创建栅格。
当dict
传递到GDALRaster
构造函数时,会创建一个新的栅格。 该字典包含新的光栅的定义参数,如原点,大小或空间参考系。 字典还可以包含像素数据和有关新栅格格式的信息。 因此,所得到的栅格可以是基于文件或基于内存的,具体取决于指定的驱动程序。
在字典或JSON风格中描述栅格数据没有标准。
因此,输入到GDALRaster
类的字典的定义因此具体到Django。 它的灵感来自于geojson格式,但geojson
标准目前仅限于向量格式。
在创建栅格时使用不同的键的示例可以在GDALRaster
和GDALBand
类的相应属性和方法的文档中找到。
ds_input
字典¶ds_input
字典中只需要几个键即可创建栅格:width
,height
和srid
。 所有其他参数都有默认值(参见下表)。 可以在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
字典可以包含要在新栅格的带上设置的像素值和“无数据”值。 数据阵列可以具有新栅格的全尺寸或更小。 对于小于全光栅的数组,size
,shape
和offset
键控制像素值。 相应的键传递给data()
方法。 它们的功能与使用该方法设置带数据相同。 下表介绍了可以使用的按键。
键 | 默认 | 用法 |
---|---|---|
NODATA_VALUE |
没有 |
映射到nodata_value 属性 |
数据 |
与nodata_value 或0 相同 |
传递给data() 方法 |
尺寸 |
(与, 高度) |
传递给data() 方法 |
形状 |
与大小相同 | 传递给data() 方法 |
抵消 |
(0, 0) |
传递给data() 方法 |
2017年9月6日