• 3.1
  • 3.2
  • 6.1
  • Версия документации: 5.0

ГДАЛ API

`GDAL`__ означает Библиотека абстракции геопространственных данных и представляет собой настоящий «швейцарский армейский нож» для функциональности данных ГИС. Подмножеством GDAL является библиотека простых функций OGR__, которая специализируется на чтении и записи векторных географических данных в различных стандартных форматах.

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 — это оболочка для объекта источника данных 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

Возвращает имя источника данных.

Слой

class Layer

Layer — это оболочка слоя данных в объекте DataSource. Вы никогда не создаете объект Layer напрямую. Вместо этого вы извлекаете их из объекта DataSource, который по сути является стандартным контейнером Python для объектов Layer. Например, вы можете получить доступ к определенному слою по его индексу (например, ds[0] для доступа к первому слою) или вы можете перебрать все слои в контейнере в цикле for. Сам «Слой» действует как контейнер для геометрических объектов.

Обычно все объекты в данном слое имеют один и тот же тип геометрии. Свойство 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

Пример выходных данных взят из источника данных городов, загруженного выше, который, очевидно, содержит один слой, называемый «города», который содержит три точечных объекта. Для простоты в примерах ниже предполагается, что вы сохранили этот слой в переменной 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. Если установлено значение, отличное от «Нет», при итерации по слою будут возвращены только объекты, пересекающие фильтр:

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

Особенность

class Feature

Feature оборачивает функцию OGR. Вы никогда не создаете объект Feature напрямую. Вместо этого вы извлекаете их из объекта Layer. Каждый объект состоит из геометрии и набора полей, содержащих дополнительные свойства. Геометрия поля доступна через его свойство geom, которое возвращает объект OGRGeometry. Функция ведет себя как стандартный контейнер 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

Поле

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

Возвращает значение поля как двойное (с плавающей запятой):

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

Водитель

class Driver(dr_input)

Класс Driver используется внутри для оболочки драйвера OGR DataSource.

driver_count

Возвращает количество векторных драйверов OGR, зарегистрированных в данный момент.

Геометрия OGR

OGRGeometry

Объекты OGRGeometry имеют аналогичную функциональность с объектами GEOSGeometry и представляют собой тонкие оболочки внутреннего представления геометрии OGR. Таким образом, они обеспечивают более эффективный доступ к данным при использовании DataSource. В отличие от своего аналога GEOS, OGRGeometry поддерживает пространственные системы отсчета и преобразование координат:

>>> from django.contrib.gis.gdal import OGRGeometry
>>> polygon = OGRGeometry("POLYGON((0 0, 5 0, 5 5, 0 5))")
class OGRGeometry(geom_input, srs=None)

Этот объект является оболочкой класса OGR Geometry__. Эти объекты создаются непосредственно из заданного параметра geom_input, который может быть строкой, содержащей WKT, HEX, GeoJSON, буфером, содержащим данные WKB, или объектом OGRGeomType. Эти объекты также возвращаются из атрибута Feature.geom при чтении векторных данных из Layer (который, в свою очередь, является частью DataSource).

classmethod from_gml(gml_string)

Создает OGRGeometry из заданной строки GML.

classmethod from_bbox(bbox)

Создает Polygon из заданной ограничивающей рамки (четверки).

__len__()

Возвращает количество точек в LineString, количество колец в Polygon или количество геометрических фигур в GeometryCollection. Не применимо к другим типам геометрии.

__iter__()

Выполняет итерацию по точкам в LineString, кольцам в Polygon или геометрии в GeometryCollection. Не применимо к другим типам геометрии.

__getitem__()

Возвращает точку по указанному индексу для LineString, внутреннее кольцо по указанному индексу для Polygon или геометрию по указанному индексу в GeometryCollection. Не применимо к другим типам геометрии.

dimension

Возвращает количество скоординированных размеров геометрии, т. е. 0 для точек, 1 для линий и т. д.:

>>> polygon.dimension
2
coord_dim

Возвращает координатный размер этой геометрии. Например, значение будет 2 для двумерной геометрии.

Не рекомендуется, начиная с версии 5.1: Установка coord_dim устарела. Вместо этого используйте set_3d().

is_3d
New in Django 5.1.

Логическое значение, указывающее, имеет ли эта геометрия координаты Z.

set_3d(value)
New in Django 5.1.

Метод, который добавляет или удаляет размер координаты Z.

>>> p = OGRGeometry("POINT (1 2 3)")
>>> p.is_3d
True
>>> p.set_3d(False)
>>> p.wkt
"POINT (1 2)"
is_measured
New in Django 5.1.

Логическое значение, указывающее, имеет ли эта геометрия координаты M.

set_measured(value)
New in Django 5.1.

Метод добавления или удаления размера координаты M.

>>> p = OGRGeometry("POINT (1 2)")
>>> p.is_measured
False
>>> p.set_measured(True)
>>> p.wkt
"POINT M (1 2 0)"
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

Возвращает оболочку этой геометрии как кортеж из четырех элементов, а не как объект Envelope:

>>> point.extent
(0.0, 0.0, 5.0, 5.0)
srs

Это свойство управляет пространственной привязкой для этой геометрии или «Нет», если ей не назначена никакая система пространственной привязки. Если оно назначено, доступ к этому свойству возвращает объект 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

Возвращает буфер, содержащий 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.

centroid

Возвращает Point, представляющий центр тяжести этой геометрии.

Changed in Django 5.1:

centroid был повышен с атрибута Polygon до доступности для всех типов геометрии.

tuple

Возвращает координаты точечной геометрии в виде кортежа, координаты линейной геометрии в виде кортежа кортежей и т. д.:

>>> OGRGeometry("POINT (1 2)").tuple
(1.0, 2.0)
>>> OGRGeometry("LINESTRING (1 2,3 4)").tuple
((1.0, 2.0), (3.0, 4.0))
coords

Псевдоним для tuple.

class Point
x

Возвращает координату X этой точки:

>>> OGRGeometry("POINT (1 2)").x
1.0
y

Возвращает координату Y этой точки:

>>> OGRGeometry("POINT (1 2)").y
2.0
z

Возвращает координату Z этой точки или None, если точка не имеет координаты Z:

>>> OGRGeometry("POINT (1 2 3)").z
3.0
m
New in Django 5.1.

Возвращает координату M этой точки или None, если точка не имеет координаты M:

>>> OGRGeometry("POINT ZM (1 2 3 4)").m
4.0
class LineString
x

Возвращает список координат X в этой строке:

>>> OGRGeometry("LINESTRING (1 2,3 4)").x
[1.0, 3.0]
y

Возвращает список координат Y в этой строке:

>>> OGRGeometry("LINESTRING (1 2,3 4)").y
[2.0, 4.0]
z

Возвращает список координат Z в этой строке или None, если в строке нет Z-координат:

>>> OGRGeometry("LINESTRING (1 2 3,4 5 6)").z
[3.0, 6.0]
m
New in Django 5.1.

Возвращает список M координат в этой строке или None, если в строке нет M координат:

>>> OGRGeometry("LINESTRING(0 1 2 10, 1 2 3 11, 2 3 4 12)").m
[10.0, 11.0, 12.0]
class Polygon
shell

Возвращает оболочку или внешнее кольцо этого многоугольника в виде геометрии LinearRing.

exterior_ring

Псевдоним для shell.

class GeometryCollection
add(geom)

Добавляет геометрию в эту коллекцию геометрии. Не применимо к другим типам геометрии.

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'

Конверт

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)

Объекты системы координат

Пространственная ссылка

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, если узел не существует. В качестве параметра также можно использовать кортеж (цель, дочерний элемент), где дочерний элемент — это индекс атрибута в 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()

Преобразует эту SpatialReference из формата 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 принимает два параметра. Первый параметр определяет источник растра, а второй параметр определяет, следует ли открывать растр в режиме записи. Для вновь создаваемых растров второй параметр игнорируется, и новый растр всегда создается в режиме записи.

Первый параметр может принимать три формы: строку или Path, представляющую путь к файлу (файловая система или виртуальная файловая система GDAL), словарь со значениями, определяющими новый растр, или байтовый объект, представляющий растровый файл.

Если входными данными является путь к файлу, растр открывается оттуда. Если входные данные представляют собой необработанные данные в словаре, параметры «ширина», «высота» и «srid» являются обязательными. Если входные данные представляют собой байтовый объект, он будет открыт с использованием виртуальной файловой системы GDAL.

Подробное описание того, как создавать растры с использованием словарного ввода, см. в разделе Создание растров из данных. Подробное описание создания растров в виртуальной файловой системе см. в разделе Использование виртуальной файловой системы GDAL.

В следующем примере показано, как можно создавать растры из разных входных источников (с использованием примеров данных из тестов GeoDjango; см. также раздел Пример данных).

>>> from django.contrib.gis.gdal import GDALRaster
>>> rst = GDALRaster("/path/to/your/raster.tif", write=False)
>>> rst.name
'/path/to/your/raster.tif'
>>> rst.width, rst.height  # This file has 163 x 174 pixels
(163, 174)
>>> rst = GDALRaster(
...     {  # Creates an in-memory raster
...         "srid": 4326,
...         "width": 4,
...         "height": 4,
...         "datatype": 1,
...         "bands": [
...             {
...                 "data": (2, 3),
...                 "offset": (1, 1),
...                 "size": (2, 2),
...                 "shape": (2, 1),
...                 "nodata_value": 5,
...             }
...         ],
...     }
... )
>>> rst.srs.srid
4326
>>> rst.width, rst.height
(4, 4)
>>> rst.bands[0].data()
array([[5, 5, 5, 5],
       [5, 2, 3, 5],
       [5, 2, 3, 5],
       [5, 5, 5, 5]], dtype=uint8)
>>> rst_file = open("/path/to/your/raster.tif", "rb")
>>> rst_bytes = rst_file.read()
>>> rst = GDALRaster(rst_bytes)
>>> rst.is_vsi_based
True
>>> rst.name  # Stored in a random path in the vsimem filesystem.
'/vsimem/da300bdb-129d-49a8-b336-e410a9428dad'
name

Имя источника, эквивалентное пути к входному файлу, или имени, указанному при создании экземпляра.

>>> 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. 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 аналогично соответствующему аргументу конструктора класса. Это словарь с характеристиками целевого растра. Допустимые значения ключей словаря: ширина, высота, SRID, начало координат, масштаб, наклон, тип данных, драйвер и имя (имя файла).

По умолчанию функции деформации сохраняют большинство параметров равными значениям исходного исходного растра, поэтому необходимо указать только те параметры, которые следует изменить. Обратите внимание, что сюда входит и драйвер, поэтому для файловых растров функция деформации создаст новый растр на диске.

Единственный параметр, который задается иначе, чем у исходного растра, — это имя. Значением имени растра по умолчанию является имя исходного растра, к которому добавляется '_copy' + source_driver_name. Для файловых растров рекомендуется указывать путь к файлу целевого растра.

Алгоритм повторной выборки, используемый для деформации, можно указать с помощью аргумента resampling. По умолчанию установлено значение «NearestNeighbor», а другими допустимыми значениями являются «Билинейный», «Кубический», «Кубический сплайн», «Ланцос», «Средний» и «Режим».

Аргумент 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]
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

Байтовое представление этого растра. Возвращает None для растров, которые не хранятся в виртуальной файловой системе GDAL.

is_vsi_based

Логическое значение, указывающее, хранится ли этот растр в виртуальной файловой системе GDAL.

GDALBand

class GDALBand

Экземпляры GDALRaster не создаются явно, а скорее получаются из объекта GDALRaster через его атрибут bands. GDALBands содержит фактические значения пикселей растра.

description

Название или описание группы, если таковое имеется.

width

Ширина полосы в пикселях (ось X).

height

Высота полосы в пикселях (ось Y).

pixel_count

Общее количество пикселей в этой полосе. Равен ширина * высота.

statistics(refresh=False, approximate=False)

Вычислите статистику по значениям пикселей этой полосы. Возвращаемое значение представляет собой кортеж со следующей структурой: (минимум, максимум, среднее, стандартное отклонение).

Если аргумент approximate установлен в True, статистика может быть вычислена на основе обзоров или подмножества фрагментов изображений.

Если для аргумента refresh установлено значение True, статистика будет рассчитываться непосредственно из данных, а кеш будет обновляться с учетом результата.

Если найдено значение постоянного кэша, это значение возвращается. Для растровых форматов, использующих службы постоянных вспомогательных метаданных (PAM), статистика может кэшироваться во вспомогательном файле. В некоторых случаях эти метаданные могут не синхронизироваться со значениями пикселей или вызывать возврат значений из предыдущего вызова, которые не отражают значение аргумента approximate. В таких случаях используйте аргумент «обновить», чтобы получить обновленные значения и сохранить их в кеше.

Для пустых полос (где все значения пикселей «нет данных») вся статистика возвращается как «Нет».

Статистику также можно получить напрямую, обратившись к свойствам min, max, mean и std.

min

Минимальное значение пикселя полосы (исключая значение «нет данных»).

max

Максимальное значение пикселя полосы (исключая значение «нет данных»).

mean

Среднее значение всех пикселей полосы (исключая значение «нет данных»).

std

Стандартное отклонение всех значений пикселей полосы (исключая значение «нет данных»).

nodata_value

Значение «нет данных» для полосы обычно представляет собой специальное значение маркера, используемое для обозначения пикселей, которые не являются допустимыми данными. Такие пиксели, как правило, не должны отображаться и не должны участвовать в операциях анализа.

Чтобы удалить существующее значение «нет данных», установите для этого свойства значение «Нет».

datatype(as_string=False)

Тип данных, содержащийся в полосе, в виде целочисленной константы от 0 (неизвестно) до 14. Если as_string имеет значение True, тип данных возвращается в виде строки. Проверьте столбец «Тип пикселя GDAL» в таблице значений типов данных, чтобы узнать возможные значения.

color_interp(as_string=False)

Интерпретация цвета полосы в виде целого числа от 0 до 16. Если as_string имеет значение True, тип данных возвращается в виде строки со следующими возможными значениями: GCI_Undefine, 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.

Новый растр создается, когда конструктору GDALRaster передается dict. Словарь содержит определяющие параметры нового растра, такие как начало координат, размер или система пространственной привязки. Словарь также может содержать данные пикселей и информацию о формате нового растра. Таким образом, результирующий растр может быть основан на файлах или памяти, в зависимости от указанного драйвера.

Не существует стандарта для описания растровых данных в словаре или формате JSON. Таким образом, определение ввода словаря в класс GDALRaster специфично для Django. Он основан на формате geojson`__, но стандарт ``geojson в настоящее время ограничен векторными форматами.

Примеры использования разных ключей при создании растров можно найти в документации соответствующих атрибутов и методов классов GDALRaster и GDALBand.

Словарь ds_input

Для создания растра в словаре ds_input требуется всего несколько ключей: width, height и srid. Все остальные параметры имеют значения по умолчанию (см. таблицу ниже). Список ключей, которые можно передать в словаре ds_input, тесно связан со свойствами GDALRaster, но не идентичен ему. Многие параметры напрямую сопоставлены с этими свойствами; остальные описаны ниже.

В следующей таблице описаны все ключи, которые можно установить в словаре ds_input.

Ключ

По умолчанию

Использование

срид

необходимый

Сопоставляется с атрибутом srid.

ширина

необходимый

Сопоставляется с атрибутом width.

высота

необходимый

Сопоставляется с атрибутом height.

водитель

МЕМ

Сопоставляется с атрибутом driver.

name

''

См. ниже

происхождение

0

Сопоставляется с атрибутом origin.

масштаб

0

Сопоставляется с атрибутом scale.

перекос

0

Сопоставляется с атрибутом width.

группы

[]

См. ниже

nr_of_bands

0

См. ниже

тип данных

6

См. ниже

papsz_options

{}

См. ниже

name

Строка, представляющая имя растра. При создании файлового растра этот параметр должен быть путем к файлу нового растра. Если имя начинается с /vsimem/, растр создается в виртуальной файловой системе GDAL.

datatype

Целое число, представляющее тип данных для всех каналов. По умолчанию 6 (Float32). Все каналы нового растра должны иметь один и тот же тип данных. Сопоставление значений:

Значение

Тип пикселя GDAL

Описание

1

GDT_байт

8-битное целое число без знака

2

GDT_UInt16

16-битное целое число без знака

3

GDT_Int16

16-битное целое число со знаком

4

GDT_UInt32

32-битное целое число без знака

5

GDT_Int32

32-битное целое число со знаком

6

GDT_Float32

32-битная с плавающей запятой

7

GDT_Float64

64-битная с плавающей запятой

12

GDT_UInt64

64-битное целое число без знака (GDAL 3.5+)

13

GDT_Int64

64-битное целое число со знаком (GDAL 3.5+)

14

GDT_Int8

8-битное целое число со знаком (GDAL 3.7+)

nr_of_bands

Целое число, представляющее количество каналов растра. Растр может быть создан без передачи данных канала при создании. Если количество полос не указано, оно автоматически рассчитывается на основе длины входных данных bands. После создания количество групп изменить нельзя.

bands

Список словарейband_input с входными данными диапазона. Итоговые индексы полос такие же, как в приведенном списке. Определение входного словаря полосы приведено ниже. Если данные каналов не предоставлены, значения растровых каналов создаются как массив нулей, а для значения «нет данных» устанавливается значение «Нет».

papsz_options

Словарь с опциями создания растра. Пары ключ-значение входного словаря передаются драйверу при создании растра.

Доступные параметры зависят от драйвера и описаны в документации каждого драйвера.

Значения в словаре не чувствительны к регистру и автоматически преобразуются в правильный строковый формат при создании.

В следующем примере используются некоторые параметры, доступные для драйвера GTiff____. В результате получается сжатый растр с внутренней схемой листов. Внутренние тайлы имеют размер блока 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",
...             "tiled": "yes",
...             "blockxsize": 23,
...             "blockysize": 23,
...         },
...     }
... )

Словарь band_input

Ключ Bands в словаре ds_input представляет собой список словарей Band_input. Каждый словарь band_input может содержать значения пикселей и значение «нет данных», которое должно быть установлено на каналах нового растра. Массив данных может иметь полный размер нового растра или быть меньше. Для массивов, размер которых меньше полного растра, значениями пикселей управляют клавиши размера, формы и смещения. Соответствующие ключи передаются методу data(). Их функциональность аналогична настройке данных полосы этим методом. В следующей таблице описаны ключи, которые можно использовать.

Ключ

По умолчанию

Использование

nodata_value

None

Сопоставляется с атрибутом nodata_value.

данные

То же, что nodata_value или 0

Передается в метод data().

размер

высотой) растра

Передается в метод data().

форма

То же, что и размер

Передается в метод data().

смещение

(0, 0)

Передается в метод data().

Использование виртуальной файловой системы GDAL

GDAL может получать доступ к файлам, хранящимся в файловой системе, но также поддерживает виртуальные файловые системы для абстрагирования доступа к другим типам файлов, таким как сжатые, зашифрованные или удаленные файлы.

Использование виртуальной файловой системы на основе памяти

GDAL имеет внутреннюю файловую систему, основанную на памяти, которая позволяет рассматривать блоки памяти как файлы. Его можно использовать для чтения и записи объектов GDALRaster в буферы двоичных файлов и из них.

Это полезно в веб-контекстах, где растры могут быть получены в виде буфера из удаленного хранилища или возвращены из представления без записи на диск.

Объекты GDALRaster создаются в виртуальной файловой системе, когда объект bytes предоставляется в качестве входных данных или когда путь к файлу начинается с /vsimem/.

Входные данные, представленные в виде байтов, должны быть полным двоичным представлением файла. Например:

# Read a raster as a file object from a remote source.
>>> from urllib.request import urlopen
>>> dat = urlopen("https://example.com/raster.tif").read()
# Instantiate a raster from the bytes object.
>>> rst = GDALRaster(dat)
# The name starts with /vsimem/, indicating that the raster lives in the
# virtual filesystem.
>>> rst.name
'/vsimem/da300bdb-129d-49a8-b336-e410a9428dad'

Чтобы создать новый виртуальный файловый растр с нуля, используйте словарное представление ds_input и укажите аргумент name, который начинается с /vsimem/ (подробнее о словарном представлении см. Создание растров из данных). Для виртуальных файловых растров атрибут vsi_buffer возвращает байтовое представление растра.

Вот как создать растр и вернуть его в виде файла в HttpResponse:

>>> from django.http import HttpResponse
>>> rst = GDALRaster(
...     {
...         "name": "/vsimem/temporarymemfile",
...         "driver": "tif",
...         "width": 6,
...         "height": 6,
...         "srid": 3086,
...         "origin": [500000, 400000],
...         "scale": [100, -100],
...         "bands": [{"data": range(36), "nodata_value": 99}],
...     }
... )
>>> HttpResponse(rast.vsi_buffer, "image/tiff")

Использование других виртуальных файловых систем

В зависимости от локальной сборки GDAL могут поддерживаться другие виртуальные файловые системы. Вы можете использовать их, добавив к указанному пути соответствующий префикс /vsi*/. Дополнительную информацию см. в документации по виртуальным файловым системам GDAL.

Сжатые растры

Вместо распаковки файла и создания экземпляра результирующего растра GDAL может напрямую обращаться к сжатым файлам, используя виртуальные файловые системы /vsizip/, /vsigzip/ или /vsitar/:

>>> from django.contrib.gis.gdal import GDALRaster
>>> rst = GDALRaster("/vsizip/path/to/your/file.zip/path/to/raster.tif")
>>> rst = GDALRaster("/vsigzip/path/to/your/file.gz")
>>> rst = GDALRaster("/vsitar/path/to/your/file.tar/path/to/raster.tif")
Сетевые растры

GDAL может прозрачно поддерживать онлайн-ресурсы и поставщиков хранилищ. Пока он построен с такими возможностями.

Чтобы получить доступ к общедоступному растровому файлу без аутентификации, вы можете использовать /vsicurl/:

>>> from django.contrib.gis.gdal import GDALRaster
>>> rst = GDALRaster("/vsicurl/https://example.com/raster.tif")
>>> rst.name
'/vsicurl/https://example.com/raster.tif'

Для коммерческих поставщиков хранилищ (например, /vsis3/) система должна быть предварительно настроена для аутентификации и, возможно, других настроек (доступные параметры см. в ``документации по виртуальным файловым системам GDAL`_).

Настройки

GDAL_LIBRARY_PATH

Строка, указывающая расположение библиотеки GDAL. Обычно этот параметр используется только в том случае, если библиотека GDAL находится в нестандартном расположении (например, /home/john/lib/libgdal.so).

Исключения

exception GDALException

Базовое исключение GDAL, указывающее на ошибку, связанную с GDAL.

exception SRSException

Исключение, возникающее при возникновении ошибки при построении или использовании объекта системы пространственной привязки.

Back to Top