API de GDAL

GDAL signifie Geospatial Data Abstraction Library et est un véritable couteau suisse de fonctionnalités pour les données spatiales. La bibliothèque « Simple Features » OGR est un sous-ensemble de GDAL qui se spécialise dans la lecture et l’écriture de données géographiques vectorielles dans une variété de formats standards.

GeoDjango présente une interface Python de haut niveau pour certaines fonctionnalités de OGR, y compris la lecture et les transformations de coordonnées de données spatiales vectorielles ainsi qu’une prise en charge minimale pour des fonctionnalités GDAL en ce qui concerne les données matricielles (images).

Note

Même si le module s’appelle gdal, GeoDjango ne gère qu’une partie des fonctionnalités d’OGR et matricielles de GDAL pour le moment.

Aperçu

Données d’exemple

Les outils GDAL/OGR présentés ici sont conçus pour vous aider à lire vos données géospatiales. Pour la plupart de ces outils, il est nécessaire de disposer de données à manipuler pour qu’ils soient utiles. Si vous débutez et que vous ne disposez pas encore de vos propres données, les tests de GeoDjango contiennent un certain nombre de jeux de données d’exemple utilisables pour des tests. Vous pouvez les télécharger ici :

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

Objets sources de données vectorielles

DataSource

DataSource est un adaptateur autour de l’objet de source de données OGR qui prend en charge la lecture de données à partir d’une variété de formats de fichiers et de sources de données géospatiales que OGR sait traiter à l’aide d’une interface simple et cohérente. Chaque source de données est représentée par un objet DataSource contenant une ou plusieurs couches de données. Chaque couche représentée par un objet Layer contient un certain nombre d’éléments géographiques (Feature), des informations à propos du type d’éléments contenus dans la couche (par ex. points, polygones, etc.) ainsi que les noms et les types de champs supplémentaires (Field) de données qui peuvent être associés à chaque élément de la couche.

class DataSource(ds_input, encoding='utf-8')

Le constructeur de DataSource n’exige qu’un seul paramètre : le chemin vers le fichier que vous souhaitez lire. Cependant, OGR prend également en charge une variété de sources de données plus complexes, y compris des bases de données, dont l’accès est défini en passant une chaîne spéciale au lieu d’un chemin. Pour plus d’informations, consultez la documentation sur les formats vectoriels OGR. La propriété name d’une instance DataSource donne le nom OGR des données sous-jacentes que la source de données utilise.

Le paramètre facultatif encoding permet d’indiquer un codage non standard des chaînes dans le fichier source. Typiquement, cela peut se révéler utile lorsqu’on obtient des exceptions DjangoUnicodeDecodeError lors de la lecture des valeurs de champs.

Après avoir créé une source DataSource, il est possible de connaître le nombre de couches contenues dans cette source en accédant à la propriété layer_count ou en utilisant (de façon équivalente) la fonction len(). Pour savoir comment accéder aux couches de données elles-mêmes, passez à la section suivante :

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

Renvoie le nombre de couches de cette source de données.

name

Renvoie le nom de cette source de données.

Layer

class Layer

Layer est un adaptateur autour d’une couche de données dans un objet DataSource. Les objets Layer ne sont jamais créés directement. Ils sont obtenus plutôt à partir d’un objet DataSource, qui est fondamentalement un conteneur Python standard pour des objets Layer. Par exemple, vous pouvez accéder à une couche particulière par son indice (par ex. ds[0] pour accéder à la première couche) ou en passant en boucle toutes les couches d’un conteneur dans une boucle for. La couche elle-même joue le rôle de conteneur pour des éléments géographiques.

En principe, tous les éléments d’une même couche ont le même type de géométrie. La propriété geom_type d’une couche est un objet OGRGeomType identifiant le type des éléments. Nous pouvons l’exploiter pour afficher certaines informations de base à propos de chaque couche d’une source DataSource:

>>> for layer in ds:
...     print('Layer "%s": %i %ss' % (layer.name, len(layer), layer.geom_type.name))
...
Layer "cities": 3 Points

Cet exemple de résultat provient de la source de données des villes chargée plus haut, qui de manière évidente contient une couche nommée "cities", contenant elle-même trois éléments de type point. Par simplicité, les exemples ci-dessous comptent sur le fait que cette couche est stockée dans la variable layer:

>>> layer = ds[0]
name

Renvoie le nom de cette couche dans la source de données.

>>> layer.name
'cities'
num_feat

Renvoie le nombre d’éléments dans cette couche. Identique à len(layer):

>>> layer.num_feat
3
geom_type

Renvoie le type géométrique de cette couche, sous forme d’objet OGRGeomType:

>>> layer.geom_type.name
'Point'
num_fields

Renvoie le nombre de champs dans la couche, c’est-à-dire le nombre de champs de données associés à chaque élément de la couche :

>>> layer.num_fields
4
fields

Renvoie une liste des noms de chaque champ de cette couche :

>>> layer.fields
['Name', 'Population', 'Density', 'Created']

Renvoie une liste des types de données de chaque champ de cette couche. Ce sont des sous-classes de Field, discuté ci-dessous :

>>> [ft.__name__ for ft in layer.field_types]
['OFTString', 'OFTReal', 'OFTReal', 'OFTDate']
field_widths

Renvoie une liste des largeurs maximales de chaque champ de cette couche :

>>> layer.field_widths
[80, 11, 24, 10]
field_precisions

Renvoie une liste des précisions numériques de chaque champ de cette couche. Pour les champs non numériques, la valeur renvoyée n’a pas de sens (et définie à 0) :

>>> layer.field_precisions
[0, 0, 15, 0]
extent

Renvoie l’étendue spatiale de cette couche, sous forme d’objet Envelope:

>>> layer.extent.tuple
(-104.609252, 29.763374, -95.23506, 38.971823)
srs

Propriété renvoyant la référence SpatialReference associée à cette couche :

>>> print(layer.srs)
GEOGCS["GCS_WGS_1984",
    DATUM["WGS_1984",
        SPHEROID["WGS_1984",6378137,298.257223563]],
    PRIMEM["Greenwich",0],
    UNIT["Degree",0.017453292519943295]]

Si la couche Layer n’a pas d’information associée de référence spatiale, c’est None qui est renvoyé.

spatial_filter

Propriété pouvant être utilisée pour obtenir ou définir un filtre spatial pour cette couche. Un filtre spatial ne peut être défini qu’avec une instance OGRGeometry, un tuple à 4 éléments représentant une étendue ou la valeur None. Lorsque cette propriété est définie avec une valeur autre que None, seuls les résultats ayant une intersection avec le filtre sont renvoyés lorsqu’on traite la couche en boucle :

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

Une méthode qui renvoie une liste des valeurs d’un champ donné pour chaque élément de la couche :

>>> layer.get_fields('Name')
['Pueblo', 'Lawrence', 'Houston']
get_geoms(geos=False)

Une méthode qui renvoie une liste contenant l’objet géométrique de chaque élément de la couche. Si le paramètre facultatif geos est défini à True, les objets géométriques sont convertis en objets GEOSGeometry. Sinon ils sont renvoyés comme objets OGRGeometry:

>>> [pt.tuple for pt in layer.get_geoms()]
[(-104.609252, 38.255001), (-95.23506, 38.971823), (-95.363151, 29.763374)]
test_capability(capability)

Renvoie une valeur booléenne indiquant si cette couche prend en charge la capacité indiquée (une chaîne). Voici quelques exemples de capacités possibles : 'RandomRead', 'SequentialWrite', 'RandomWrite', 'FastSpatialFilter', 'FastFeatureCount', 'FastGetExtent', 'CreateField', 'Transactions', 'DeleteFeature' et 'FastSetNextByIndex'.

Feature

class Feature

Feature adapte un objet OGR. Les objets Feature ne sont jamais créés directement. Ils sont obtenus à partir d’un objet Layer. Chaque objet Feature est composé d’une partie géométrique et d’un ensemble de champs contenant des propriétés supplémentaires. La partie géométrique d’un élément est accessible par la propriété geom qui renvoie un objet OGRGeometry. Un objet Feature se comporte comme un conteneur Python standard pour ses champs qu’il renvoie sous forme d’objets Field: un champ est accessible directement par son indice ou son nom, mais il est aussi possible de parcourir en boucle les champs d’un élément, par exemple dans une boucle for.

geom

Renvoie la partie géométrique de l’élément sous forme d’objet OGRGeometry:

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

Une méthode qui renvoie la valeur du champ indiqué (par son nom) pour cet élément, et non pas un objet Field:

>>> city.get('Population')
102121
geom_type

Renvoie le type géométrique de cet élément, sous forme d’objet OGRGeomType. Le type est le même pour tous les éléments d’une même couche et est équivalent à la propriété Layer.geom_type de l’objet Layer d’où il provient.

num_fields

Renvoie le nombre de champs de données associés à cet élément. Ce nombre est identique pour tous les éléments d’une même couche et est équivalent à la propriété Layer.num_fields de l’objet Layer d’où il provient.

fields

Renvoie une liste des noms de champs de données associés à cet élément. Cette liste est identique pour tous les éléments d’une même couche et est équivalente à la propriété Layer.fields de l’objet Layer d’où il provient.

fid

Renvoie l’identifiant d’élément dans la couche :

>>> city.fid
0
layer_name

Renvoie le nom de la couche Layer d’où l’élément provient. Ce nom est identique pour tous les éléments d’une même couche :

>>> city.layer_name
'cities'
index

Une méthode qui renvoie l’indice du nom de champ indiqué. Cet indice est identique pour tous les éléments d’une même couche :

>>> city.index('Population')
1

Field

class Field
name

Renvoie le nom de ce champ :

>>> city['Name'].name
'Name'
type

Renvoie le type OGR de ce champ sous forme de nombre entier. Le dictionnaire FIELD_CLASSES fait correspondre ces valeurs à des sous-classes de Field:

>>> city['Density'].type
2
type_name

Renvoie une chaîne contenant le nom du type de données de ce champ :

>>> city['Name'].type_name
'String'
value

Renvoie la valeur de ce champ. La classe Field elle-même renvoie la valeur sous forme de chaîne, mais chaque sous-classe renvoie la valeur sous la forme qui lui est la plus appropriée :

>>> city['Population'].value
102121
width

Renvoie la largeur de ce champ :

>>> city['Name'].width
80
precision

Renvoie la précision numérique de ce champ. Pour les champs non numériques, cette valeur n’a pas de sens (et elle est définie à 0) :

>>> city['Density'].precision
15
as_double()

Renvoie la valeur du champ sous forme d’un nombre à virgule à double précision :

>>> city['Density'].as_double()
874.7
as_int()

Renvoie la valeur du champ sous forme d’un nombre entier :

>>> city['Population'].as_int()
102121
as_string()

Renvoie la valeur du champ sous forme de chaîne :

>>> city['Name'].as_string()
'Pueblo'
as_datetime()

Renvoie la valeur du champ sous forme d’un tuple de composants date et heure :

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

La classe Driver est utilisée en interne pour adapter un pilote de source OGR DataSource.

driver_count

Renvoie le nombre de pilotes vectoriels OGR actuellement inscrits.

Objets géométriques OGR

OGRGeometry

Les objets OGRGeometry partagent des fonctionnalités avec les objets GEOSGeometry et constituent des adaptations fines autour de la représentation géométrique interne à OGR. De ce fait, ils permettent d’accéder de manière plus efficace aux données lorsqu’on utilise une source DataSource. Contrairement à sa contrepartie GEOS, un objet OGRGeometry prend en charge les systèmes de référence spatiale et les transformations de coordonnées :

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

Cet objet est un adaptateur de la classe OGR Geometry. Ces objets sont directement créés à partir du paramètre geom_input donné, qui peut contenir une chaîne au format WKT, HEX ou GeoJSON, un tampon buffer contenant des données WKB ou un objet OGRGeomType. Ces objets sont également renvoyés par l’attribut Feature.geom, lors de la lecture de données vectorielles à partir de Layer (qui fait elle-même partie d’un objet DataSource).

classmethod from_gml(gml_string)

Construit un OGRGeometry à partir de la chaîne GML donnée.

classmethod from_bbox(bbox)

Construit un Polygon à partir du rectangle englobant indiqué (un tuple à 4 éléments).

__len__()

Renvoie le nombre de points dans une ligne LineString, le nombre de segments d’un Polygon ou le nombre d’objets géométriques dans une collection GeometryCollection. Ne s’applique pas aux autres types géométriques.

__iter__()

Effectue une itération sur les points d’une ligne LineString, sur les segments d’un Polygon ou sur les objets géométriques d’une collection GeometryCollection. Ne s’applique pas aux autres types géométriques.

__getitem__()

Renvoie le point à l’indice donné d’une ligne LineString, le segment intérieur à l’indice donnée d’un Polygon ou l’objet géométrique à l’indice donné d’une collection GeometryCollection. Ne s’applique pas aux autres types géométriques.

dimension

Renvoie les dimensions de coordonnées de cet objet géométrique. 0 pour les points, 1 pour les lignes et 2 pour les surfaces :

>> polygon.dimension
2
coord_dim

Renvoie ou définit les dimensions de coordonnées de cet objet géométrique. Par exemple, la valeur correspond à 2 pour les objets géométriques en deux dimensions.

geom_count

Renvoie le nombre d’éléments dans cet objet géométrique :

>>> polygon.geom_count
1
point_count

Renvoie le nombre de points utilisés pour définir cet objet géométrique :

>>> polygon.point_count
4
num_points

Alias de point_count.

num_coords

Alias de point_count.

geom_type

Renvoie le type de cet objet géométrique, sous forme d’objet OGRGeomType.

geom_name

Renvoie le nom du type de cet objet géométrique :

>>> polygon.geom_name
'POLYGON'
area

Renvoie l’aire de cet objet géométrique ou 0 pour les objets qui n’ont pas d’aire :

>>> polygon.area
25.0
envelope

Renvoie l’enveloppe de cet objet géométrique sous forme d’objet Envelope.

extent

Renvoie l’enveloppe de cet objet géométrique sous forme de tuple à 4 éléments au lieu d’un objet Envelope:

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

Cette propriété contrôle la référence spatiale de cet objet géométrique, ou None si aucun système de référence spatiale ne lui a été attribué. Si un tel attribut existe, la propriété renvoie un objet SpatialReference. La propriété peut être définie avec un autre objet SpatialReference ou tout autre contenu accepté par SpatialReference. Exemple :

>>> city.geom.srs.name
'GCS_WGS_1984'
srid

Renvoie ou définit l’identifiant de référence spatiale correspondant à l’objet SpatialReference de cet objet géométrique. Renvoie None si aucune information de référence spatiale n’est associé à cet objet, ou s’il n’est pas possible de déterminer le code SRID.

geos

Renvoie un objet GEOSGeometry correspondant à cet objet géométrique.

gml

Renvoie la représentation textuelle de cet objet géométrique au format GML :

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

Renvoie la représentation textuelle de cet objet géométrique au format HEX WKB :

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

Renvoie la représentation textuelle de cet objet géométrique au format JSON :

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

Renvoie la représentation textuelle de cet objet géométrique au format KML :

wkb_size

Renvoie la taille du tampon WKB nécessaire pour contenir une représentation WKB de cet objet géométrique :

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

Renvoie un tampon buffer contenant une représentation WKB de cet objet géométrique.

wkt

Renvoie la représentation textuelle de cet objet géométrique au format WKT :

ewkt

Renvoie la représentation EWKT de cet objet géométrique.

clone()

Renvoie un nouveau clone OGRGeometry de cet objet géométrique.

close_rings()

S’il existe un segment non fermé dans cet objet géométrique, cette routine le ferme en ajoutant le point de départ en fin de segment :

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

Transforme cet objet géométrique en un système de référence spatiale différent. Cette méthode accepte un objet CoordTransform, un objet SpatialReference ou toute autre contenu accepté par SpatialReference (y compris une chaîne WKT de référence spatiale, une chaîne PROJ.4 ou un code SRID nombre entier).

Par défaut, rien n’est renvoyé et l’objet géométrique est lui-même transformé. Cependant, si le paramètre clone est défini à True, un clone transformé de cet objet géométrique est renvoyé.

intersects(other)

Renvoie True si cet objet géométrique possède une intersection avec other, sinon renvoie False.

equals(other)

Renvoie True si cet objet géométrique est équivalent à other, sinon renvoie False.

disjoint(other)

Renvoie True si cet objet géométrique est spatialement disjoint de other (c’est-à-dire qu’il n’a pas d’intersection avec lui), sinon renvoie False.

touches(other)

Renvoie True si cet objet géométrique touche other, sinon renvoie False.

crosses(other)

Renvoie True si cet objet géométrique se croise avec other, sinon renvoie False.

within(other)

Renvoie True si cet objet géométrique est contenu dans other, sinon renvoie False.

contains(other)

Renvoie True si cet objet géométrique contient other, sinon renvoie False.

overlaps(other)

Renvoie True si cet objet géométrique recouvre partiellement other, sinon renvoie False.

boundary()

Les limites de cet objet géométrique, sous forme de nouvel objet OGRGeometry.

convex_hull

Le polygone convexe le plus petit contenant cet objet géométrique, sous forme de nouvel objet OGRGeometry.

difference()

Renvoie la région constituée par la différence entre cet objet géométrique et other, sous forme de nouvel objet OGRGeometry.

intersection()

Renvoie la région constituée par l’intersection entre cet objet géométrique et other, sous forme de nouvel objet OGRGeometry.

sym_difference()

Renvoie la région constituée par la différence symétrique entre cet objet géométrique et other, sous forme de nouvel objet OGRGeometry.

union()

Renvoie la région constituée par l’union entre cet objet géométrique et other, sous forme de nouvel objet OGRGeometry.

tuple

Renvoie les coordonnées d’un point géométrique sous forme de tuple, les coordonnées d’une ligne géométrique sous forme de tuple de tuples, et ainsi de suite :

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

Un alias de tuple.

class Point
x

Renvoie la coordonnée X de ce point :

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

Renvoie la coordonnée Y de ce point :

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

Renvoie la coordonnée Z de ce point, ou None si ce point n’a pas de coordonnée Z :

>>> OGRGeometry('POINT (1 2 3)').z
3.0
class LineString
x

Renvoie une liste des coordonnées X de cette ligne :

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

Renvoie une liste des coordonnées Y de cette ligne :

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

Renvoie une liste des coordonnées Z de cette ligne, ou None si ce point n’a pas de coordonnée Z :

>>> OGRGeometry('LINESTRING (1 2 3,4 5 6)').z
[3.0, 6.0]
class Polygon
shell

Renvoie l’enveloppe ou le segment extérieur de ce polygone, sous forme de géométrie LinearRing.

exterior_ring

Un alias de shell.

centroid

Renvoie un Point qui représente le centroïde de ce polygone.

class GeometryCollection
add(geom)

Ajoute un objet géométrique à cette collection géométrique. Non applicable aux autres types géométriques.

OGRGeomType

class OGRGeomType(type_input)

Cette classe permet de représenter un type de géométrie OGR en partant de plusieurs types de valeurs :

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

Renvoie une forme de chaîne raccourcie du type de géométrie OGR :

>>> gt1.name
'Polygon'
num

Renvoie le numéro correspondant au type de géométrie OGR :

>>> gt1.num
3
django

Renvoie le type de champ Django (une sous-classe de GeometryField) à utiliser pour stocker ce type OGR, ou None s’il n’existe pas de type de champ Django approprié :

>>> gt1.django
'PolygonField'

Envelope

class Envelope(*args)

Représente une structure d’enveloppe OGR contenant les coordonnées X et Y minimales et maximales d’un rectangle englobant. Les noms de variables sont compatibles avec la structure C de l’objet OGR Envelope.

min_x

La valeur minimum de la coordonnée X.

min_y

La valeur maximum de la coordonnée X.

max_x

La valeur minimum de la coordonnée Y.

max_y

La valeur maximum de la coordonnée Y.

ur

La coordonnée supérieure droite, sous forme de tuple.

ll

La coordonnée inférieure gauche, sous forme de tuple.

tuple

Un tuple représentant l’enveloppe.

wkt

Une chaîne représentant cette enveloppe sous forme d’un polygone au format WKT.

expand_to_include(*args)

Objets de systèmes de coordonnées

SpatialReference

class SpatialReference(srs_input)

Les objets de référence spatiale sont initialisés selon le paramètre srs_input indiqué, qui peut être dans l’un des formats suivants :

  • OGC Well Known Text (WKT) (une chaîne)
  • code EPSG (nombre entier ou chaîne)
  • chaîne PROJ.4
  • Une chaîne de raccourci correspondant à des standards bien connus ('WGS84', 'WGS72', 'NAD27', 'NAD83')

Exemple :

>>> wgs84 = SpatialReference('WGS84') # shorthand string
>>> wgs84 = SpatialReference(4326) # EPSG code
>>> wgs84 = SpatialReference('EPSG:4326') # EPSG string
>>> proj4 = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs '
>>> wgs84 = SpatialReference(proj4) # PROJ.4 string
>>> wgs84 = SpatialReference("""GEOGCS["WGS 84",
DATUM["WGS_1984",
     SPHEROID["WGS 84",6378137,298.257223563,
         AUTHORITY["EPSG","7030"]],
     AUTHORITY["EPSG","6326"]],
 PRIMEM["Greenwich",0,
     AUTHORITY["EPSG","8901"]],
 UNIT["degree",0.01745329251994328,
     AUTHORITY["EPSG","9122"]],
 AUTHORITY["EPSG","4326"]]""") # OGC WKT
__getitem__(target)

Renvoie la valeur correspondant à la chaîne de nœud d’attribut, None si le nœud n’existe pas. Accepte aussi un tuple (cible, enfant) en paramètre, où enfant est l’indice de l’attribut dans la structure WKT. Par exemple :

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

La valeur de l’attribut correspondant au nœud cible indiqué (par ex. 'PROJCS'). Le paramètre index désigne un indice de l’enfant à renvoyer.

auth_name(target)

Renvoie le nom d’autorité correspondant au nœud cible indiqué.

auth_code(target)

Renvoie le code d’autorité correspondant au nœud cible indiqué.

clone()

Renvoie un clone de cet objet de référence spatiale.

identify_epsg()

Cette méthode inspecte la représentation WKT de cet objet SpatialReference et ajoute des nœuds d’autorité EPSG lorsqu’un identifiant EPSG s’applique.

from_esri()

Transforme cet objet SpatialReference du format ESRI au format EPSG.

to_esri()

Transforme cet objet SpatialReference en format ESRI.

validate()

Vérifie si la référence spatiale est valide et génère une exception quand ce n’est pas le cas.

import_epsg(epsg)

Importe une référence spatiale à partir d’un code EPSG.

import_proj(proj)

Importe une référence spatiale à partir d’une chaîne PROJ.4.

import_user_input(user_input)
import_wkt(wkt)

Importe une référence spatiale à partir d’une chaîne WKT.

import_xml(xml)

Importe une référence spatiale à partir d’une chaîne XML.

name

Renvoie le nom de cette référence spatiale.

srid

Renvoie le SRID de l’autorité de premier niveau, ou None si elle n’est pas définie.

linear_name

Renvoie le nom d’unité linéaire.

linear_units

Renvoie la valeur d’unité linéaire.

angular_name

Renvoie le nom d’unité d’angle.

angular_units

Renvoie la valeur d’unité d’angle.

units

Renvoie un tuple binaire des valeur et nom d’unité, et détermine automatiquement s’il faut renvoyer l’unité linéaire ou l’unité d’angle.

ellipsoid

Renvoie un tuple des paramètres d’ellispoïde de cette référence spatiale : (demi-grand axe, demi-petit axe, inverse de l’aplatissement).

semi_major

Renvoie le demi-grand axe d’ellipsoïde de cette référence spatiale.

semi_minor

Renvoie le demi-petit axe d’ellipsoïde de cette référence spatiale.

inverse_flattening

Renvoie l’inverse de l’aplatissement d’ellipsoïde de cette référence spatiale.

geographic

Renvoie True si cette référence spatiale est géographique (le nœud racine est GEOGCS).

local

Renvoie True si cette référence spatiale est locale (le nœud racine est LOCAL_CS).

projected

Renvoie True si cette référence spatiale est un système de coordonnées projeté (le nœud racine est PROJCS).

wkt

Renvoie la représentation WKT de cette référence spatiale.

pretty_wkt

Renvoie la représentation « conviviale » de la chaîne WKT.

proj

Renvoie la représentation PROJ.4 de cette référence spatiale.

proj4

Alias de SpatialReference.proj.

xml

Renvoie la représentation XML de cette référence spatiale.

CoordTransform

class CoordTransform(source, target)

Représente une transformation de système de coordonnées. Elle est initialisée avec deux instances SpatialReference représentant respectivement les systèmes de coordonnées source et cible. Ces objets sont appropriés lorsqu’une même transformation de coordonnées se répète plusieurs fois pour différents objets géométriques :

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

Objets de données matricielles

GDALRaster

GDALRaster est un adaptateur autour de l’objet de source de données matricielles GDAL qui prend en charge la lecture de données à partir d’une variété de formats de fichiers et de sources de données géospatiales que GDAL sait traiter à l’aide d’une interface simple et cohérente. Chaque source de données est représentée par un objet GDALRaster contenant une ou plusieurs couches de données nommées bandes. Chaque bande représentée par un objet GDALBand contient des données d’images géoréférencées. Par exemple, une image RVB est représentée par trois bandes : une pour le rouge, une pour le vert et une pour le bleu.

Note

Pour des données matricielles, il n’y a pas de différence entre une instance d’objet matriciel et sa source de données. Contrairement aux objets Geometry, les objets GDALRaster représentent toujours une source de données. Des structures matricielles temporaires peuvent être créées en mémoire à l’aide du pilote adéquat, mais elles seront de la même classe que les sources matricielles basées sur des fichiers.

class GDALRaster(ds_input, write=False)

Le constructeur de GDALRaster accepte deux paramètres. Le premier définit la source matricielle et le second définit si la matrice doit être ouverte en mode écriture. Pour les matrices nouvellement créées, le second paramètre est ignoré et la nouvelle matrice est toujours créée en mode écriture.

Le premier paramètre peut prendre trois formes : une chaîne représentant un chemin de fichier, un dictionnaire avec des valeurs définissant une nouvelle matrice, ou un objet composé d’octets représentant une fichier matriciel.

Si le paramètre d’entrée est un chemin de fichier, la matrice est ouverte à partir de ce fichier. Si l’entrée consiste en un dictionnaire de données brutes, les paramètres width, height et srid sont obligatoires. Si l’entrée est un objet d’octets, il sera ouvert en utilisant le système de fichiers virtuel de GDAL.

Pour une description détaillée sur la façon de créer des images matricielles à l’aide d’une structure dictionnaire, voir Création de géométries matricielles à partir de données. Pour une description détaillée sur la façon de créer des images matricielles dans le système de fichiers virtuel, voir Utilisation du système de fichiers virtuel de GDAL.

L’exemple suivant montre comment des images matricielles peuvent être créées à partir de différentes sources d’entrée (en utilisant les données d’exemple des tests GeoDjango ; voir aussi la section Données d’exemple).

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

Le nom de la source qui est équivalent au chemin du fichier lu ou le nom fourni au moment de l’instanciation.

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

Le nom du pilote GDAL utilisé pour traiter le fichier d’entrée. Pour les objets GDALRaster créés à partir d’un fichier, le type de pilote est automatiquement détecté. La création de structures matricielles à partir de rien utilise par défaut le pilote en mémoire ('MEM'), mais il peut être modifié en fonction des besoins. Par exemple, indiquez GTiff pour un fichier GeoTiff. Pour une liste de types de fichiers, voir aussi la liste des formats matriciels GDAL.

L’exemple suivant montre une création d’objet matriciel en mémoire :

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

L’exemple suivant montre la création d’un objet matriciel basé sur un fichier 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

La largeur de la source en pixels (axe X).

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

La hauteur de la source en pixels (axe Y).

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

Le système de référence spatiale de la structure matricielle, sous forme d’instance SpatialReference. Ce système peut être modifié en définissant sa valeur à un autre objet SpatialReference ou en fournissant toute valeur acceptée par le constructeur de SpatialReference.

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

L’identifiant de système de référence spatiale (SRID) de l’objet matriciel. Cette propriété est un raccourci pour définir ou obtenir le SRID à partir de l’attribut 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

La matrice de transformation linéaire utilisée pour géoréférencer la source, sous forme de tuple de six coefficients qui font correspondre les coordonnées de pixel/ligne dans un espace géoréférencé en utilisant la relation suivante :

Xgeo = GT(0) + Xpixel*GT(1) + Yline*GT(2)
Ygeo = GT(3) + Xpixel*GT(4) + Yline*GT(5)

Les mêmes valeurs peuvent être obtenues en accédant aux propriétés origin (indices 0 et 3), scale (indices 1 et 5) et skew (indices 2 et 4).

La valeur par défaut est [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

Coordonnées de l’origine en haut à gauche de l’image matricielle dans le système de référence spatial de la source, sous forme d’objet point avec ses composantes x et 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

Largeur et hauteur de pixel utilisés pour le géoréférencement de l’image matricielle, sous forme d’objet point avec ses composantes x et y. Voir geotransform pour plus d’informations.

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

Coefficients de distortion utilisés pour le géoréférencement de l’image matricielle, sous forme d’objet point avec ses composantes x et y. Dans le cas d’images orientées au nord, ces coefficients valent tous deux 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

Étendue (valeurs limites) de la source matricielle, sous forme de tuple à 4 composants (xmin, ymin, xmax, ymax) exprimés dans le système de référence spatial de la source.

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

Liste de toutes les bandes de la source, sous forme d’instances 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)

Renvoie une version déformée de cet objet matriciel.

Les paramètres de déformation peuvent être donnés dans le paramètre ds_input. L’emploi de ds_input est semblable au même paramètre du constructeur de la classe. Il s’agit d’un dictionnaire doté des caractéristiques de la matrice cible. Les clés de dictionnaire autorisées sont width (largeur), height (hauteur), SRID, origin, scale (échelle), skew (obliquité), datatype (type de données), driver (pilote) et name (nom de fichier).

Par défaut, les fonctions de déformation maintiennent la plupart des paramètres égaux aux valeurs initiales de l’objet matriciel, de sorte que seuls les paramètres qui doivent être modifiés ont besoin d’être fournis. Notez que cela inclut le pilote, donc pour les objets matriciels basés sur des fichiers, la fonction de déformation va créer une nouvelle structure sur le disque.

Le seul paramètre qui est défini différemment de l’objet matriciel source est le nom. La valeur par défaut du nom de matrice est le nom de la source combinée avec '_copy' + nom_pilote_source. Pour les objets matriciels basés sur des fichiers, il est recommandé de fournir le chemin du fichier de la matrice cible.

L’algorithme de ré-échantillonnage utilisé pour la déformation peut être indiqué par le paramètre resampling. La valeur par défaut est NearestNeighbor et les autres valeurs autorisées sont Bilinear, Cubic, CubicSpline, Lanczos, Average, et Mode.

Le paramètre max_error peut être utilisé pour indiquer l’erreur maximale autorisée, mesurée en pixels d’entrée, pour l’approximation de la transformation. La valeur par défaut est de 0.0 ce qui implique des calculs exacts.

Pour les familiers de GDAL, cette fonction présente des capacités identiques à l’utilitaire en ligne de commande gdalwarp.

Par exemple, la fonction warp peut être utilisée pour transformer une image matricielle au double de son échelle de pixels d’origine :

>>> 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(srid, driver=None, name=None, resampling='NearestNeighbour', max_error=0.0)

Renvoie une version transformée de cet objet matriciel en fonction du code SRID indiqué.

Cette fonction transforme l’objet matriciel actuel dans un nouveau système de référence spatial qui peut être indiqué avec srid. Elle calcule les limites et l’échelle de la matrice dans le nouveau système de référence spatial et la déforme à l’aide de la fonction warp.

Par défaut, c’est le pilote de la matrice source qui est utilisé et son nom est composé du nom d’origine et de la chaîne '_copy' + nom_pilote_source. Il est possible d’indiquer un autre pilote ou un autre nom avec les paramètres driver et name.

L’algorithme de ré-échantillonnage par défaut est NearestNeighbour mais il peut être modifié par le paramètre resampling. L’erreur maximale autorisée du ré-échantillonnage est de 0.0 par défaut mais elle peut être modifiée par le paramètre max_error. Consultez la documentation de warp pour plus de détails sur ces paramètres.

>>> rst = GDALRaster({
...     "width": 6, "height": 6, "srid": 3086,
...     "origin": [500000, 400000],
...     "scale": [100, -100],
...     "bands": [{"data": range(36), "nodata_value": 99}]
... })
>>> target = rst.transform(4326)
>>> target.origin
[-82.98492744885776, 27.601924753080144]
info

Renvoie une chaîne avec un résumé de la matrice. C’est équivalent à l’utilitaire en ligne de commande gdalinfo.

metadata

Les métadonnées de cette matrice, représentée sous forme de dictionnaire imbriqué. La clé de premier niveau est le domaine de métadonnées. Le deuxième niveau contient les noms et valeurs d’éléments de métadonnées de chaque domaine.

Pour définir ou mettre à jour un élément de métadonnée, passez l’élément de métadonnée correspondant à la méthode en utilisant la structure imbriquée décrite ci-dessus. Seules les clés présentes dans le dictionnaire donné sont mises à jour ; les autres métadonnées ne sont pas modifiées.

Pour supprimer un élément de métadonnée, utilisez None comme valeur de métadonnée.

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

Une représentation binaire de cette matrice. Renvoie None pour les matrices qui ne sont pas stockées dans le système de fichiers virtuel de GDAL.

is_vsi_based

Une valeur booléenne indiquant si cette matrice est stockée dans le système de fichiers virtuel de GDAL.

GDALBand

class GDALBand

Les instances GDALBand ne sont pas créées explicitement, mais plutôt obtenues à partir d’un objet GDALRaster, au moyen de son attribut bands. Ces instances contiennent les valeurs de pixel réelles de l’image matricielle.

description

Le nom ou la description de la bande, le cas échéant.

width

La largeur de la bande en pixels (axe X).

height

La hauteur de la bande en pixels (axe Y).

pixel_count

Le nombre total de pixels dans cette bande. Il est égal à width * height.

statistics(refresh=False, approximate=False)

Calcule des statistiques sur les valeurs de pixel de cette bande. La valeur renvoyée est un tuple ayant la structure suivante : (minimum, maximum, moyenne, déviation standard).

Si le paramètre approximate est défini à True, les statistiques peuvent être calculées à partir d’aperçus ou d’un sous-ensemble des tuiles d’images.

Si le paramètre refresh est défini à True, les statistiques seront calculées directement à partir des données et le cache sera mis à jour avec les résultats.

Si une valeur de cache persistante est trouvée, cette valeur est renvoyée. Pour les formats matriciels utilisant les services Persistent Auxiliary Metadata (PAM), les statistiques peuvent être mises en cache dans un fichier annexe. Dans certains cas, ces métadonnées peuvent être désynchronisées avec les valeurs de pixels ou provoquer le renvoi de valeurs d’un appel précédent, ce qui ne correspond pas à la valeur du paramètre approximate. Dans de tels cas, utilisez le paramètre refresh afin d’obtenir des valeurs à jour et de pouvoir les stocker dans le cache.

Pour des bandes vides (où toutes les valeurs de pixels sont « pas de données »), toutes les statistiques renvoient None.

Les statistiques peuvent aussi être récupérées directement en accédant aux propriétés min, max, mean et std.

min

La valeur de pixel minimale de la bande (à l’exclusion de la valeur « no data »).

max

La valeur de pixel maximale de la bande (à l’exclusion de la valeur « no data »).

mean

La moyenne de toutes les valeurs de pixels de la bande (à l’exclusion de la valeur « no data »).

std

La déviation standard de toutes les valeurs de pixels de la bande (à l’exclusion de la valeur « no data »).

nodata_value

La valeur « no data » d’une bande est généralement un marqueur spécial servant à identifier les pixels qui ne sont pas des données valides. De tels pixels ne sont généralement pas affichés et ne contribuent pas non plus aux opérations d’analyse.

Pour supprimer une valeur « no data » existante, définissez cette propriété à None (nécessite GDAL ≥ 2.1).

datatype(as_string=False)

Le type de données contenu dans la bande, sous forme de constante entière entre 0 (inconnu) et 11. Si as_string vaut True, le type de données est renvoyé sous forme de chaîne avec les valeurs possibles suivantes : GDT_Unknown, GDT_Byte, GDT_UInt16, GDT_Int16, GDT_UInt32, GDT_Int32, GDT_Float32, GDT_Float64, GDT_CInt16, GDT_CInt32, GDT_CFloat32 et GDT_CFloat64.

color_interp(as_string=False)

L’interprétation de couleur de la bande, sous forme de nombre entier entre 0 et 16. Si as_string vaut True, le type de données est renvoyé sous forme de chaîne avec les valeurs possibles suivantes : 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 et GCI_YCbCr_CrBandGCI_YCbCr_CrBand représente aussi GCI_Max parce que les deux correspondent à l’entier 16, mais seul GCI_YCbCr_CrBand est renvoyé sous forme de chaîne.

data(data=None, offset=None, size=None, shape=None)

L’accesseur aux valeurs de pixel de la bande GDALBand. Renvoie le tableau complet des données si aucun paramètre n’est fourni. Il est possible de ne récupérer qu’un sous-ensemble de la matrice de pixels en spécifiant une taille de bloc et un décalage sous forme de tuples.

Si NumPy est disponible, les données sont renvoyées sous forme de tableau NumPy. Pour des raisons de performance, il est fortement recommandé d’utiliser NumPy.

Les données sont écrites dans la bande GDALBand si le paramètre data est fourni. Les types de données acceptés sont : packed string, buffer, list, array et array NumPy. Le nombre d’éléments dans les données doit normalement correspondre au nombre total de pixels dans la bande, ou au nombre de pixels d’un bloc spécifique de valeurs de pixels si les paramètres offset et size sont fournis.

Si le nombre d’éléments des données est différent du bloc de pixels cible, le paramètre shape doit être fourni. La forme shape est un tuple qui définit la largeur et la hauteur des données d’entrée en pixels. Les données sont ensuite recopiées pour mettre à jour les valeurs de pixels du bloc sélectionné. C’est utile par exemple pour remplir une bande entière avec une seule valeur.

Par exemple :

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

Les métadonnées de cette bande. La fonctionnalité est identique à GDALRaster.metadata.

Création de géométries matricielles à partir de données

Cette section explique comment créer des géométries matricielles à partir de zéro en utilisant le paramètre ds_input.

Une nouvelle géométrie matricielle est créée lorsqu’un dict est transmis au constructeur GDALRaster. Ce dictionnaire contient les paramètres définissant le nouvel objet, tels que l’origine, la taille ou le système de référence spatial. Il peut aussi contenir des données de pixels et des informations sur le format à utiliser. La géométrie matricielle résultante peut donc être basée sur un fichier ou en mémoire, en fonction du pilote indiqué.

Il n’existe pas de standard de description de données matricielles dans un dictionnaire ou une variante JSON. La définition du dictionnaire d’initialisation pour la classe GDALRaster est donc spécifique à Django. Elle s’inspire du format geojson, mais ce dernier est pour l’instant limité aux formats vectoriels.

On peut trouver des exemples d’utilisation des différentes clés de dictionnaire lors de la création de géométries vectorielles dans la documentation des attributs et méthodes correspondants des classes GDALRaster et GDALBand.

Le dictionnaire ds_input

Seules quelques clés sont obligatoires dans le dictionnaire ds_input servant à créer la géométrie matricielle : width, height et srid. Tous les autres paramètres ont des valeurs par défaut (voir le tableau ci-dessous). La liste des clés pouvant figurer dans le dictionnaire ds_input est étroitement liée mais pas totalement identique aux propriétés de GDALRaster. Beaucoup de ces paramètres ont une correspondance directe à ces propriétés ; les autres sont décrits ci-dessous.

Le tableau suivant décrit toutes les clés pouvant être définies dans le dictionnaire ds_input.

Clé Valeur par défaut Utilisation
srid obligatoire Correspond à l’attribut srid
width obligatoire Correspond à l’attribut width
height obligatoire Correspond à l’attribut height
driver MEM Correspond à l’attribut driver
name '' Voir ci-dessous
origin 0 Correspond à l’attribut origin
scale 0 Correspond à l’attribut scale
skew 0 Correspond à l’attribut width
bands [] Voir ci-dessous
nr_of_bands 0 Voir ci-dessous
datatype 6 Voir ci-dessous
papsz_options {} Voir ci-dessous
name

Chaîne représentant le nom de la géométrie matricielle. Lors de la création d’un objet basé sur un fichier, ce paramètre doit correspondre au chemin du fichier de la nouvelle géométrie matricielle. Si le nom commence par /vsimem/, la géométrie est créée dans le système de fichiers virtuel de GDAL.

datatype

Nombre entier représentant le type de données de toutes les bandes. Vaut 6 (Float32) par défaut. Toutes les bandes de la nouvelle géométrie matricielle ont obligatoirement le même type de données. La correspondance des valeurs est :

Valeur Type de pixel GDAL Description
1 GDT_Byte Nombre entier non signé de 8 bits
2 GDT_UInt16 Nombre entier non signé de 16 bits
3 GDT_Int16 Nombre entier signé de 16 bits
4 GDT_UInt32 Nombre entier non signé de 32 bits
5 GDT_Int32 Nombre entier signé de 32 bits
6 GDT_Float32 Nombre à virgule flottante de 32 bits
7 GDT_Float64 Nombre à virgule flottante de 64 bits
nr_of_bands

Nombre entier représentant le nombre de bandes de la géométrie matricielle. Il n’est pas obligatoire de transmettre des données de bandes lors de la création. Si le nombre de bandes n’est pas indiqué, il est automatiquement déduit de la longueur de la valeur d’entrée bands. Ce nombre ne peut plus être modifié après la création.

bands

Une liste de dictionnaires band_input contenant les données de bandes initiales. Les indices de bandes créés seront les mêmes que dans cette liste. La définition du dictionnaire de bande en valeur d’entrée est décrit ci-dessous. Si les données de bande ne sont pas fournies, les valeurs des bandes sont initialisées sous forme de tableau de zéros et la valeur no data est définie à None.

papsz_options

Un dictionnaire avec des options de création de géométrie matricielle. Les paires clé-valeur du dictionnaire d’entrée sont transmises au pilote lors de la création de l’objet.

Les options disponibles sont spécifiques au pilote et sont décrites dans la documentation de chaque pilote.

Les valeurs dans le dictionnaire ne sont pas sensibles à la casse et sont automatiquement converties dans le bon format de chaîne lors de la création.

L’exemple suivant utilise certaines des options disponibles pour le pilote GTiff. Le résultat est une géométrie matricielle compressée d’octets signés avec un système interne de tuiles. Les tuiles internes ont une taille de bloc de 23 par 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,
...    }
... })

Le dictionnaire band_input

La clé bands dans le dictionnaire ds_input est une liste de dictionnaires band_input. Chacun de ces dictionnaires peut contenir des valeurs de pixels et la valeur no data à définir pour les bandes de la nouvelle géométrie matricielle. Le tableau des données peut avoir la pleine taille du nouvel objet ou être plus petit. Pour les tableaux plus petits que la taille de la nouvelle matrice, les clés size, shape et offset contrôlent les valeurs de pixels. Les clés correspondantes sont transmises à la méthode data(). Elles jouent le même rôle que lorsque vous définissez des données de bandes avec cette méthode. Le tableau suivant décrit les clés pouvant être utilisées.

Clé Valeur par défaut Utilisation
nodata_value None Correspond à l’attribut nodata_value
data Identique à nodata_value ou 0 Transmis à la méthode data()
size (largeur, hauteur) de la matrice Transmis à la méthode data()
shape Comme pour size Transmis à la méthode data()
offset (0, 0) Transmis à la méthode data()

Utilisation du système de fichiers virtuel de GDAL

GDAL possède un système de fichiers interne basé sur la mémoire qui permet de traiter des blocs de mémoire comme des fichiers. Il peut être utilisé pour lire et écrire des objets GDALRaster vers et à partir de tampons de fichiers binaires.

Cela se révèle utile dans des contextes Web où les objets matriciels peuvent être obtenus comme tampons depuis un stockage distant ou renvoyés à partir d’une vue sans être écrits sur disque.

Les objets GDALRaster sont créés dans le système de fichiers virtuel lorsqu’un objet de type bytes est fourni en entrée ou lorsque le chemin de fichier commence par /vsimem/.

L’entrée binaire sous forme de bytes doit être une représentation binaire complète d’un fichier. Par exemple

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

Pour créer un nouvelle géométrie matricielle basée sur un fichier virtuel à partir de rien, utilisez le dictionnaire ds_input et fournissez un paramètre name commençant par /vsimem/ (pour plus de détails sur la forme du dictionnaire, voir Création de géométries matricielles à partir de données). Pour les matrices basées sur des fichiers virtuels, l’attribut vsi_buffer renvoie la représentation binaire de la matrice.

Voici comment créer une géométrie matricielle et la renvoyer comme fichier dans une réponse 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')

Réglages

GDAL_LIBRARY_PATH

Une chaîne indiquant l’emplacement de la bibliothèque GDAL. Typiquement, ce réglage n’est utilisé que si la bibliothèque GDAL ne se trouve pas à un emplacement standard (par ex. /home/john/lib/libgdal.so).

Exceptions

exception GDALException

L’exception GDAL de base, indiquant une erreur liée à GDAL.

exception SRSException

Une exception levée quand une erreur survient lors de la construction ou de l’usage d’un objet à système de référence spatiale.

Back to Top