API GDAL¶
GDAL расшифровывается как Geospatial Data Abstraction Library, и является настоящим «швейцарским армейским ножом» функциональности ГИС-данных. Подмножеством GDAL является библиотека OGR Simple Features Library, которая специализируется на чтении и записи векторных географических данных в различных стандартных форматах.
GeoDjango предоставляет высокоуровневый интерфейс Python для некоторых возможностей OGR, включая чтение и преобразование координат векторных пространственных данных и минимальную поддержку возможностей 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')¶ Конструктор для
DataSource
требует только один параметр: путь к файлу, который вы хотите прочитать. Однако OGR также поддерживает множество более сложных источников данных, включая базы данных, доступ к которым можно получить, передав вместо пути специальную строку имени. Для получения дополнительной информации см. документацию OGR Vector Formats. Свойство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_count
¶
Возвращает количество слоев в источнике данных.
-
name
¶
Возвращает имя источника данных.
Changed in Django 3.2:Добавлена поддержка
pathlib.Path
ds_input
.-
Layer
¶
-
class
Layer
¶ Layer
- это обертка для слоя данных в объектеDataSource
. Вы никогда не создаете объектLayer
напрямую. Вместо этого вы получаете их из объектаDataSource
, который по сути является стандартным контейнером Python для объектовLayer
. Например, вы можете получить доступ к определенному слою по его индексу (например,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
(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.geom_type
объектаLayer
, из которого был получен объект.-
num_fields
¶
Возвращает количество полей данных, связанных с характеристикой. Это число будет одинаковым для всех объектов в данном слое и эквивалентно свойству
Layer.num_fields
> объектаLayer
, из которого был получен объект.-
fields
¶
Возвращает список имен полей данных, связанных с характеристикой. Это имя будет одинаковым для всех объектов в данном слое и эквивалентно свойству
Layer.fields
> объектаLayer
, из которого был получен объект.-
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
()¶
Возвращает значение поля в формате 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)¶ Класс
Driver
используется внутри для обертывания драйвера OGRDataSource
.-
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))')
-
class
OGRGeometry
(geom_input, srs=None)¶ Этот объект является оберткой для класса OGR Geometry. Эти объекты инстанцируются непосредственно из заданного
geom_input
> параметра, который может быть строкой, содержащей WKT, HEX, GeoJSON,buffer
, содержащей данные WKB, или объектомOGRGeomType
. Эти объекты также возвращаются из атрибутаFeature.geom
при чтении векторных данных изLayer
(который в свою очередь является частьюDataSource
).-
classmethod
from_gml
(gml_string)¶
Конструирует
OGRGeometry
из заданной строки GML.-
classmethod
from_bbox
(bbox)¶
Строит
Polygon
из заданной граничной области (4-кортеж).-
__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
данной геометрии. ВозвращаетNone
, если нет информации о пространственной ссылке, связанной с этой геометрией, или если SRID не может быть определен.-
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
¶
Возвращает
buffer
, содержащий WKB-представление данной геометрии.-
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, или целое число 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
.-
classmethod
-
class
Point
¶ -
x
¶
Возвращает координату X этой точки:
>>> OGRGeometry('POINT (1 2)').x 1.0
-
y
¶
Возвращает координату Y этой точки:
>>> OGRGeometry('POINT (1 2)').y 2.0
-
z
¶
Возвращает координату Z данной точки, или
None
, если точка не имеет координаты Z:>>> OGRGeometry('POINT (1 2 3)').z 3.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 в данной строке, или
None
, если строка не имеет координат Z:>>> OGRGeometry('LINESTRING (1 2 3,4 5 6)').z [3.0, 6.0]
-
OGRGeomType
¶
-
class
OGRGeomType
(type_input)¶ Этот класс позволяет представить тип геометрии 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 Geometry:
>>> gt1.name 'Polygon'
-
num
¶
Возвращает число, соответствующее типу геометрии OGR:
>>> gt1.num 3
-
django
¶
Возвращает тип поля Django (подкласс GeometryField) для хранения этого типа OGR, или
None
, если нет подходящего типа Django:>>> gt1.django 'PolygonField'
-
Envelope
¶
-
class
Envelope
(*args)¶ Представляет структуру OGR Envelope, содержащую минимальные и максимальные координаты X, Y для ограничивающего прямоугольника. Именование переменных совместимо со структурой OGR Envelope C.
-
min_x
¶
Значение минимальной координаты X.
-
min_y
¶
Значение максимальной координаты X.
-
max_x
¶
Значение минимальной координаты Y.
-
max_y
¶
Значение максимальной координаты Y.
-
ur
¶
Верхняя правая координата, в виде кортежа.
-
ll
¶
Координата нижнего левого угла, в виде кортежа.
-
tuple
¶
Кортеж, представляющий конверт.
-
wkt
¶
Строка, представляющая данную оболочку в виде многоугольника в формате WKT.
-
expand_to_include
(*args)¶
-
Объекты системы координат¶
SpatialReference
¶
-
class
SpatialReference
(srs_input)¶ Объекты пространственных ссылок инициализируются на заданном
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
-
__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
()¶
Этот метод проверяет WKT данного
SpatialReference
и добавляет узлы полномочий EPSG, где применим идентификатор EPSG.-
from_esri
()¶
Переводит данную пространственную ссылку из формата ESRI в формат EPSG
-
to_esri
()¶
Морфирует эту SpatialReference в формат ESRI.
-
validate
()¶
Проверяет, действительна ли заданная пространственная ссылка, если нет, то будет выдано исключение.
-
import_epsg
(epsg)¶
Импорт пространственной привязки из кода EPSG.
-
import_proj
(proj)¶
Импорт пространственной ссылки из строки PROJ.
-
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
¶
Возвращает кортеж из значения единиц измерения и имени единиц измерения и автоматически определяет, какие единицы измерения возвращать - линейные или угловые.
-
ellipsoid
¶
Возвращает кортеж параметров эллипсоида для данной пространственной ссылки: (главная полуось, главная полуось и обратное сплющивание).
-
semi_major
¶
Возвращает полуглавную ось эллипсоида для данной пространственной привязки.
-
semi_minor
¶
Возвращает полуминорную ось эллипсоида для данной пространственной привязки.
-
inverse_flattening
¶
Возвращает обратное сплющивание эллипсоида для данной пространственной привязки.
-
geographic
¶
Возвращает
True
, если данная пространственная ссылка является географической (корневой узелGEOGCS
).-
local
¶
Возвращает
True
, если данная пространственная ссылка является локальной (корневой узелLOCAL_CS
).-
projected
¶
Возвращает
True
, если данная пространственная ссылка является проецируемой системой координат (корневой узелPROJCS
).-
wkt
¶
Возвращает представление WKT данной пространственной ссылки.
-
pretty_wkt
¶
Возвращает «красивое» представление WKT.
-
proj
¶
Возвращает представление PROJ для данной пространственной ссылки.
-
proj4
¶
Псевдоним для
SpatialReference.proj
.-
xml
¶
Возвращает XML-представление этой пространственной ссылки.
CoordTransform
¶
-
class
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-изображение представлено в виде трех полос: одна для красного, одна для зеленого и одна для синего.
Примечание
Для растровых данных нет разницы между экземпляром растра и его источником данных. В отличие от объектов Geometry, объекты GDALRaster
всегда являются источником данных. Временные растры могут быть инстанцированы в памяти с помощью соответствующего драйвера, но они будут того же класса, что и растровые источники на основе файлов.
-
class
GDALRaster
(ds_input, write=False)¶ Конструктор для
GDALRaster
принимает два параметра. Первый параметр определяет источник растра, а второй параметр определяет, следует ли открывать растр в режиме записи. Для вновь создаваемых растров второй параметр игнорируется, и новый растр всегда создается в режиме записи.Первый параметр может принимать три формы: строка, представляющая путь к файлу (файловая система или виртуальная файловая система GDAL), словарь со значениями, определяющими новый растр, или байтовый объект, представляющий растровый файл.
Если входными данными является путь к файлу, растр открывается оттуда. Если входными данными являются необработанные данные в словаре, необходимы параметры
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'
Changed in Django 4.0:Создание растров в любой виртуальной файловой системе GDAL было разрешено.
-
name
¶ Имя источника, которое эквивалентно пути к входному файлу или имени, указанному при инстанцировании.
>>> GDALRaster({'width': 10, 'height': 10, 'name': 'myraster', 'srid': 4326}).name 'myraster'
-
driver
¶ Имя драйвера GDAL, используемого для обработки входного файла. Для
GDALRaster
, созданных из файла, тип драйвера определяется автоматически. При создании растров с нуля по умолчанию используется растр в памяти ('MEM'
), но при необходимости его можно изменить. Например, используйтеGTiff
для файлаGeoTiff
. Список типов файлов см. также в списке GDAL Raster Formats.Растр в памяти создается с помощью следующего примера:
>>> 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
. SRS можно изменить, установив ее в другое значениеSpatialReference
или предоставив любой ввод, который принимается конструкторомSpatialReference
.>>> rst = GDALRaster({'width': 10, 'height': 20, 'srid': 4326}) >>> rst.srs.srid 4326 >>> rst.srs = 3086 >>> rst.srs.srid 3086
-
srid
¶ Идентификатор пространственной системы координат (SRID) растра. Это свойство является сокращением для получения или установки SRID через атрибут
srs
.>>> 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
(индексы 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
¶ Координаты левого верхнего начала растра в пространственной системе отсчета источника, как точечный объект с членами
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 (имя файла).По умолчанию функция warp сохраняет большинство параметров равными значениям исходного растра, поэтому необходимо указывать только те параметры, которые должны быть изменены. Обратите внимание, что это относится и к драйверу, поэтому для растра, хранящегося в файле, функция warp создаст новый растр на диске.
Единственный параметр, который задается иначе, чем для исходного растра, - это имя. По умолчанию имя растра - это имя исходного растра, дополненное символом
'_copy' + source_driver_name
. Для файловых растров рекомендуется указывать путь к файлу целевого растра.Алгоритм дискретизации, используемый для искривления, может быть задан аргументом
resampling
. По умолчанию используетсяNearestNeighbor
, другие допустимые значения:Bilinear
,Cubic
,CubicSpline
,Lanczos
,Average
иMode
.Аргумент
max_error
может быть использован для указания максимальной ошибки, измеряемой в пикселях ввода, которая допускается при аппроксимации преобразования. По умолчанию 0.0 для точных вычислений.Для пользователей, знакомых с
GDAL
, эта функция имеет сходную функциональность с утилитой командной строкиgdalwarp
.Например, функция деформации может использоваться для агрегирования растра до удвоенного масштаба пикселей:
>>> 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)¶ Преобразование растра в другую пространственную систему отсчета (
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]
Changed in Django 3.2:Добавлена поддержка
SpatialReference
srs
-
info
¶ Возвращает строку с кратким описанием растра. Это эквивалентно утилите командной строки gdalinfo.
-
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'}}
-
vsi_buffer
¶ bytes
представление данного растра. ВозвращаетNone
для растров, которые не хранятся в виртуальной файловой системе GDAL.
-
is_vsi_based
¶ Булево значение, указывающее, хранится ли данный растр в виртуальной файловой системе GDAL.
-
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
, статистика будет вычисляться из данных напрямую, и кэш будет обновлен результатом.Если найдено постоянное значение кэша, то это значение возвращается. Для растровых форматов, использующих сервисы Persistent Auxiliary Metadata (PAM), статистика может кэшироваться во вспомогательном файле. В некоторых случаях эти метаданные могут быть рассинхронизированы со значениями пикселей или возвращать значения предыдущего вызова, которые не отражают значение аргумента
approximate
. В таких случаях используйте аргументrefresh
, чтобы получить обновленные значения и сохранить их в кэше.Для пустых полос (где все значения пикселей - «нет данных») вся статистика возвращается в виде
None
.Статистику также можно получить напрямую, обратившись к свойствам
min
,max
,mean
иstd
.
-
min
¶ Минимальное значение пикселя в полосе (исключая значение «нет данных»).
-
max
¶ Максимальное значение пикселя в полосе (исключая значение «нет данных»).
-
mean
¶ Среднее значение всех значений пикселей полосы (исключая значение «нет данных»).
-
std
¶ Стандартное отклонение всех значений пикселей полосы (исключая значение «нет данных»).
-
nodata_value
¶ Значение «нет данных» для полосы обычно является специальным маркерным значением, используемым для маркировки пикселей, которые не являются достоверными данными. Такие пиксели обычно не отображаются и не участвуют в операциях анализа.
Чтобы удалить существующее значение «нет данных», установите это свойство в
None
(требуется GDAL ≥ 2.1).
-
datatype
(as_string=False)¶ Тип данных, содержащихся в диапазоне, в виде целочисленной константы от 0 (Unknown) до 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
.
-
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.
Данные записываются в
GDALBand
, если указан параметрdata
. Входные данные могут быть одного из следующих типов - упакованная строка, буфер, список, массив и массив 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
.
Ключ | По умолчанию | Применение |
---|---|---|
srid |
требуется | Сопоставлен с атрибутом srid |
width |
требуется | Сопоставлен с атрибутом width |
height |
требуется | Сопоставлен с атрибутом height |
driver |
MEM |
Сопоставлен с атрибутом driver |
name |
'' |
См. далее |
origin |
0 |
Сопоставлен с атрибутом origin |
scale |
0 |
Сопоставлен с атрибутом scale |
skew |
0 |
Сопоставлен с атрибутом width |
bands |
[] |
См. далее |
nr_of_bands |
0 |
См. далее |
datatype |
6 |
См. далее |
papsz_options |
{} |
См. далее |
-
name
Строка, представляющая имя растра. При создании растра на основе файла этот параметр должен быть путем к файлу для нового растра. Если имя начинается с
/vsimem/
, растр создается в виртуальной файловой системе GDAL.
-
datatype
Целое число, представляющее тип данных для всех диапазонов. По умолчанию
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
. Количество полос не может быть изменено после создания.
-
bands
Список словарей
band_input
с входными данными диапазона. Индексы результирующих полос соответствуют индексам в предоставленном списке. Определение словаря входных данных полосы приведено ниже. Если данные о полосах не предоставлены, значения полос растра инстанцируются как массив нулей, а значение «нет данных» устанавливается вNone
.
-
papsz_options
Словарь с параметрами создания растра. Пары ключ-значение входного словаря передаются драйверу при создании растра.
Доступные опции зависят от конкретного драйвера и описаны в документации к каждому драйверу.
Значения в словаре не чувствительны к регистру и автоматически преобразуются в правильный строковый формат при создании.
В следующем примере используются некоторые из опций, доступных для GTiff driver. В результате получается сжатый знаковый байтовый растр с внутренней схемой черепицы. Внутренние плитки имеют размер блока 23 на 23:
>>> GDALRaster({ ... 'driver': 'GTiff', ... 'name': '/path/to/new/file.tif', ... 'srid': 4326, ... 'width': 255, ... 'height': 255, ... 'nr_of_bands': 1, ... 'papsz_options': { ... 'compress': 'packbits', ... 'pixeltype': 'signedbyte', ... 'tiled': 'yes', ... 'blockxsize': 23, ... 'blockysize': 23, ... } ... })
Словарь band_input
¶
Ключ bands
в словаре ds_input
представляет собой список словарей band_input
. Каждый словарь band_input
может содержать значения пикселей и значение «нет данных», которое должно быть установлено на полосах нового растра. Массив данных может иметь полный размер нового растра или быть меньше. Для массивов, которые меньше полного растра, ключи size
, shape
и offset
управляют значениями пикселей. Соответствующие ключи передаются в метод data()
. Их функциональность такая же, как и при установке данных диапазона этим методом. В следующей таблице описаны ключи, которые могут быть использованы.
Ключ | По умолчанию | Применение |
---|---|---|
nodata_value |
None |
Сопоставлен с атрибутом nodata_value |
data |
То же, что и nodata_value или 0 |
Передается в метод data() |
size |
(with, height) растра |
Передается в метод data() |
shape |
Такой же, как размер | Передается в метод data() |
offset |
(0, 0) |
Передается в метод data() |
Использование виртуальной файловой системы GDAL¶
GDAL может обращаться к файлам, хранящимся в файловой системе, но также поддерживает виртуальные файловые системы для абстрагирования доступа к другим типам файлов, таким как сжатые, зашифрованные или удаленные файлы.
Использование виртуальной файловой системы на основе памяти¶
GDAL имеет внутреннюю файловую систему, основанную на памяти, которая позволяет рассматривать блоки памяти как файлы. Она может использоваться для чтения и записи объектов GDALRaster
в и из буферов двоичных файлов.
Это полезно в веб-контекстах, где растры могут быть получены в виде буфера из удаленного хранилища или возвращены из представления без записи на диск.
Объекты GDALRaster
создаются в виртуальной файловой системе, когда в качестве входных данных предоставляется объект bytes
, или когда путь к файлу начинается с /vsimem/
.
Входные данные, предоставленные в виде bytes
, должны быть полным двоичным представлением файла. Например:
# Read a raster as a file object from a remote source.
>>> from urllib.request import urlopen
>>> dat = urlopen('http://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
и предоставьте аргумент name
, начинающийся с /vsimem/
(подробнее о представлении словаря см. в Создание растров из данных). Для виртуальных растров на основе файлов атрибут 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 Virtual Filesystems documentation.
Сжатые растры¶
Вместо распаковки файла и инстанцирования полученного растра, 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 Virtual Filesystems documentation).