GDAL代表地理空间数据抽象库,是一个真正的“瑞士军刀”的GIS数据功能。GDAL的子集是OGR简单特征库,其专门用于以各种标准格式读取和写入向量地理数据。
GeoDjango为OGR的一些功能提供了一个高级Python接口,包括向量空间数据的读取和坐标变换。
注意
虽然模块名为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}
DataSource是OGR数据源对象的包装器,支持使用简单,一致的界面从各种支持OGR的地理空间文件格式和数据源读取数据。每个数据源由包含一个或多个数据层的DataSource对象表示。由Layer对象表示的每个层包含一些地理特征(Feature),关于该层中包含的特征的类型的信息(例如,点,多边形等),以及可以与该层中的每个特征相关联的数据的任何附加字段(Field)的名称和类型。
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是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]
返回数据源中此图层的名称。
>>> layer.name
'cities'
返回图层中的要素数。与len(layer)相同:
>>> layer.num_feat
3
返回图层的几何类型,作为OGRGeomType对象:
>>> layer.geom_type.name
'Point'
返回图层中的字段数,即与图层中每个要素相关联的数据字段数:
>>> layer.num_fields
4
返回此图层中每个字段的名称列表:
>>> layer.fields
['Name', 'Population', 'Density', 'Created']
返回此图层中每个字段的数据类型的列表。这些是Field的子类,如下所述:
>>> [ft.__name__ for ft in layer.field_types]
['OFTString', 'OFTReal', 'OFTReal', 'OFTDate']
返回此图层中每个字段的最大字段宽度的列表:
>>> layer.field_widths
[80, 11, 24, 10]
返回此图层中每个字段的数值精度列表。对于非数字字段,这是无意义的(并设置为零):
>>> layer.field_precisions
[0, 0, 15, 0]
返回此图层的空间范围,作为Envelope对象:
>>> layer.extent.tuple
(-104.609252, 29.763374, -95.23506, 38.971823)
返回与此图层关联的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。
可用于检索或设置此图层的空间过滤器的属性。空间过滤器只能使用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
一种方法,返回图层中每个要素的给定字段的值的列表:
>>> layer.get_fields('Name')
['Pueblo', 'Lawrence', 'Houston']
返回包含图层中每个要素几何的列表的方法。如果可选参数geos设置为True,那么几何将转换为GEOSGeometry对象。否则,它们将作为OGRGeometry对象返回:
>>> [pt.tuple for pt in layer.get_geoms()]
[(-104.609252, 38.255001), (-95.23506, 38.971823), (-95.363151, 29.763374)]
返回一个布尔值,指示此图层是否支持给定能力(字符串)。有效能力字符串的示例包括:'RandomRead','SequentialWrite','RandomWrite','FastSpatialFilter' ,'FastFeatureCount','FastGetExtent','CreateField','Transactions','DeleteFeature'和'FastSetNextByIndex'。
Feature包装OGR功能。您从不直接创建Feature对象。而是从Layer对象检索它们。每个要素由几何和一组包含其他属性的字段组成。字段的几何可通过其geom属性访问,该属性返回OGRGeometry对象。A Feature behaves like a standard Python container for its fields, which it returns as Field objects: you can access a field directly by its index or name, or you can iterate over a feature’s fields, e.g. 在for循环中。
以OGRGeometry对象的形式返回此要素的几何:
>>> city.geom.tuple
(-104.609252, 38.255001)
返回此功能的给定字段(由名称指定)的值的方法,而不是 a Field包装器对象:
>>> city.get('Population')
102121
返回此要素的几何类型作为OGRGeomType对象。这对于给定图层中的所有要素都是相同的,并且等同于该要素来自的Layer对象的Layer.geom_type属性。
返回与该要素相关联的数据字段数。这对于给定图层中的所有要素都是相同的,并且等同于该要素来自的Layer对象的Layer.num_fields属性。
返回与该要素相关联的数据字段的名称列表。这对于给定图层中的所有要素都是相同的,并且等同于该要素所来自的Layer对象的Layer.fields属性。
返回图层中的要素标识符:
>>> city.fid
0
返回该函数来自的Layer的名称。这对于给定图层中的所有要素都是相同的:
>>> city.layer_name
'cities'
返回给定字段名称的索引的方法。这对于给定图层中的所有要素都是相同的:
>>> city.index('Population')
1
返回此字段的名称:
>>> city['Name'].name
'Name'
返回此字段的OGR类型作为整数。FIELD_CLASSES字典将这些值映射到Field的子类:
>>> city['Density'].type
2
返回此字段的数据类型的名称的字符串:
>>> city['Name'].type_name
'String'
返回此字段的值。Field类本身以字符串形式返回值,但每个子类以最合适的形式返回值:
>>> city['Population'].value
102121
返回此字段的宽度:
>>> city['Name'].width
80
返回此字段的数字精度。对于非数字字段,这是无意义的(并设置为零):
>>> city['Density'].precision
15
将字段的值作为double(float)返回:
>>> city['Density'].as_double()
874.7
以整数形式返回字段的值:
>>> city['Population'].as_int()
102121
以字符串形式返回字段的值:
>>> city['Name'].as_string()
'Pueblo'
以字段的日期和时间组件的形式返回字段的值:
>>> 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类在内部用于包装OGR DataSource驱动程序。
返回当前注册的OGR向量驱动程序的数量。
OGRGeometry对象与GEOSGeometry对象共享类似的功能,是OGR内部几何表示的薄包装。因此,当使用DataSource时,它们允许更有效地访问数据。与其GEOS对应方不同,OGRGeometry支持空间参考系统和坐标变换:
>>> from django.contrib.gis.gdal import OGRGeometry
>>> polygon = OGRGeometry('POLYGON((0 0, 5 0, 5 5, 0 5))')
此对象是OGR Geometry类的包装器。这些对象直接从给定的geom_input参数实例化,该参数可以是包含WKT,HEX,GeoJSON,包含WKB数据的buffer,或OGRGeomType当从Layer(其又是DataSource的一部分)读取向量数据时,这些对象也从Feature.geom属性返回。
从给定的边界框(4元组)构造Polygon。
返回LineString中的点数,Polygon中的环数或GeometryCollection中的几何数。不适用于其他几何类型。
迭代LineString中的点,Polygon中的环或GeometryCollection中的几何。不适用于其他几何类型。
返回LineString的指定索引处的点,Polygon的指定索引处的内部环或GeometryCollection不适用于其他几何类型。
返回几何的坐标维数,即0表示点,1表示线,等等:
>> polygon.dimension
2
返回或设置此几何的坐标尺寸。例如,对于二维几何,值将为2。
返回此几何中的元素数:
>>> 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)
此属性控制此几何的空间参考,或None(如果尚未为其指定空间参考系)。如果已分配,则访问此属性会返回SpatialReference对象。它可以使用另一个SpatialReference对象或SpatialReference接受的任何输入来设置。例:
>>> city.geom.srs.name
'GCS_WGS_1984'
返回或设置与此几何的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.4字符串,整数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对象。
返回点几何的坐标作为元组,线几何的坐标作为元组的元组,等等:
>>> OGRGeometry('POINT (1 2)').tuple
(1.0, 2.0)
>>> OGRGeometry('LINESTRING (1 2,3 4)').tuple
((1.0, 2.0), (3.0, 4.0))
tuple的别名。
返回此点的X坐标:
>>> OGRGeometry('POINT (1 2)').x
1.0
返回此点的Y坐标:
>>> OGRGeometry('POINT (1 2)').y
2.0
返回此点的Z坐标,如果点没有Z坐标,则返回None:
>>> OGRGeometry('POINT (1 2 3)').z
3.0
返回此行中的X坐标列表:
>>> OGRGeometry('LINESTRING (1 2,3 4)').x
[1.0, 3.0]
返回此行中的Y坐标列表:
>>> OGRGeometry('LINESTRING (1 2,3 4)').y
[2.0, 4.0]
返回此行中的Z坐标列表,如果该行没有Z坐标,则返回None:
>>> OGRGeometry('LINESTRING (1 2 3,4 5 6)').z
[3.0, 6.0]
此类允许以多种方式中的任何一种表示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'
返回与OGR几何类型对应的数字:
>>> gt1.num
3
返回用于存储此OGR类型的Django字段类型(GeometryField的子类),如果没有适当的Django类型,则返回None:
>>> gt1.django
'PolygonField'
空间参考对象在给定的srs_input上初始化,它可能是以下之一:
例:
>>> 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
返回给定字符串属性节点的值,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标识符适用的EPSG授权节点。
将此SpatialReference从ESRI格式转换为EPSG
将此SpatialReference变形为ESRI的格式。
检查以确定给定的空间参考是否有效,如果不是,将引发异常。
从EPSG代码导入空间参考。
从PROJ.4字符串导入空间参考。
从WKT导入空间参考。
从XML导入空间参考。
返回此空间参考的名称。
返回顶级权限的SRID,如果未定义,则返回None。
返回线性单位的名称。
返回线性单位的值。
返回角单位的名称。
返回角单位的值。
返回单位值和单位名称的2元组,并将自动确定是返回线性单位还是角度单位。
返回此空间参考的椭圆参数的元组:(半长轴,半长轴和逆扁平)
返回此空间参考的椭圆体的半长轴。
返回此空间参考的椭圆体的半短轴。
返回此空间参考的椭圆体的逆平展。
如果此空间参考为地理(根节点为GEOGCS),则返回True。
如果此空间参考是本地(根节点是LOCAL_CS),则返回True。
如果此空间参考是投影坐标系(根节点为PROJCS),则返回True。
返回此空间参考的WKT表示。
返回WKT的“漂亮”表示。
返回此空间参考的PROJ.4表示形式。
返回此空间参考的XML表示形式。
表示坐标系变换。它由两个SpatialReference初始化,分别表示源坐标系统和目标坐标系统。当对不同几何体重复执行相同的坐标变换时,应使用这些对象:
>>> ct = CoordTransform(SpatialReference('WGS84'), SpatialReference('NAD83'))
>>> for feat in layer:
... geom = feat.geom # getting clone of feature geometry
... geom.transform(ct) # transforming
GDALRaster是GDAL栅格源对象的包装器,支持使用简单,一致的界面从各种支持GDAL的地理空间文件格式和数据源读取数据。每个数据源由GDALRaster对象表示,其包含一个或多个名为带的数据层。由GDALBand对象表示的每个带包含地理参考的图像数据。例如,RGB图像被表示为三个波段:一个用于红色,一个用于绿色,一个用于蓝色。
GDALRaster的构造函数接受单个参数:要读取的文件的路径。
源的名称,它等同于输入文件路径。
源像素的宽度(X轴)。
源像素的高度(Y轴)。
作为SpatialReference实例的源的空间参考系。
用于对源进行地理参考的仿射变换矩阵,作为使用以下关系将像素/线坐标映射到地理参考空间中的六个系数的元组:
Xgeo = GT(0) + Xpixel*GT(1) + Yline*GT(2)
Ygeo = GT(3) + Xpixel*GT(4) + Yline*GT(5)
作为具有x和y成员的点对象,源的空间参考系中光栅的左上原点的坐标。
用于对栅格进行地理配准的像素宽度和高度,作为具有x和y成员的点对象。有关详细信息,请参阅geotransform。
用于对栅格进行地理参考的偏斜系数,作为具有x和y成员的点对象。在北向上图像的情况下,这些系数都是0。
Extent (boundary values) of the raster source, as a 4-tuple (xmin, ymin, xmax, ymax) in the spatial reference system of the source.
GDALBand实例不是显式创建的,而是通过GDALRaster对象,通过其bands属性获取。
频带的名称或描述(如果有)。
带宽(以像素为单位)(X轴)。
带的高度(像素)(Y轴)。
带的最小像素值(不包括“无数据”值)。
带的最大像素值(不包括“无数据”值)。
带的“无数据”值通常是用于标记不是有效数据的像素的特殊标记值。这样的像素通常不应被显示,也不会有助于分析操作。
包含在频带中的数据类型,为0(未知)和11之间的整数常量。如果as_string为True,则数据类型将作为字符串返回,并具有以下可能的值:GDT_Unknown,GDT_Byte ,GDT_UInt16,GDT_Int16,GDT_UInt32,GDT_Int32,GDT_Float32,GDT_Float64,GDT_CInt16,GDT_CInt32,GDT_CFloat32和GDT_CFloat64。
2015年5月13日