Acceso estudiantes


¿Has olvidado tu contraseña?

Datos raster con GeoDjango

En Geolocalización con GeoDjango I vimos algunas de las ventajas que nos ofrece este framework web durante el proceso de carga de datos en un entorno de administración web, especialmente en relación a otros métodos como la geolocalización con Django-Leaflet. En este post veremos otros de los tipos de datos que podemos manejar con GeoDjango, incluidos los raster.

Tipos de datos

Al crear un campo de tipo geométrico, GeoDjango nos permite usar cualquier tipo geométrico estándar de una base de datos espacial:

  • GeometryField
  • PointField
  • LineStringField
  • PolygonField
  • MultiPointField
  • MultiLineStringField
  • MultiPolygonField
  • GeometryCollectionField

Una primera cosa interesante son los atributos que podemos usar para personalizar estos campos:

  • srid: nos permite indicar el sistema de referencia, de modo que se pueda ejecutar un proceso de validación (si intentamos cargar datos con otro SRID ocurrirá un error) y que se pueda llevar a cabo la transformación automática del SRID si se cruzan datos de tablas con sistemas distintos.
  • spatial_index: nos permite indicar si queremos tener un índice en la base de datos sobre el campo geométrico o no. Por defecto su valor es True.
  • dim: nos indica el número de dimensiones de la figura geométrica.

Por ejemplo:

class Municipio(models.Model):
    geom = models.MultiPolygonField(srid=28531, spatial_index=False)

Pero lo que queremos destacar en este nuevo capítulo de la serie sobre frameworks web es que, además de esos tipos, también podemos usar RasterField para cargar y usar datos raster con GeoDjango.

Cargar datos raster con GeoDjango

Crear una tabla para almacenar capas de datos raster con GeoDjango es tan fácil como:

  1. Definir el modelo:

class Elevacion(models.Model):
    nombre = models.CharField(max_length=100)
    datos = models.RasterField()

  1. Ejecutar las migraciones:

(env) usuario@unigis:~/Blog/GeoDjango$ python manage.py makemigrations
(env) usuario@unigis:~/Blog/GeoDjango$ python manage.py migrate

  1. Cargar los datos:

from django.contrib.gis.gdal import GDALRaster
from app.models import Elevacion

raster = GDALRaster("data/mi_capa_raster.tif", write = True)
obj = Elevacion(nombre="Blog UNIGIS", datos=raster)
obj.save()

Con estos simples pasos, nuestra capa raster ya se encuentra en la tabla de la base de datos:

Consultar datos raster con GeoDjango

Además de poder cargar con facilidad los datos mediante código Python, con GeoDjango también podemos hacer consultas espaciales usando capas raster y el ORM de Django (Object-Relation Mapping):

>>> # Definimos un punto
>>> pnt = Point(2.018602, 41.736041, srid=4326)
>>> # Buscamos qué modelos de elevación tienen un bbox que contiene el punto
>>> modelos = Elevacion.objects.filter(datos__bbcontains=pnt)
>>> print(modelos.first().nombre)
Blog UNIGIS

Podemos usar cualquier lookup espacial habitual con una capa raster. Si el tipo raster no tiene esa función particular, la función se ejecutará con el polígono que define la extensión de la capa (usando la función ST_Polygon).

Además de los lookups espaciales habituales (contains, overlaps, intersects,…) también podemos hacer consultas sobre bandas específicas de la imagen, añadiendo el número de banda en el lookup:

>>> # Definimos un punto
>>> pnt = Point(2.018602, 41.736041, srid=4326)
>>> # Buscamos qué modelos de elevación tienen un bbox que contiene el punto
>>> modelos = Elevacion.objects.filter(datos__1__bbcontains=pnt)
>>> print(modelos.first().nombre)
Blog UNIGIS

Conclusión

En este post de la serie sobre frameworks web hemos visto que además de poder cargar datos vectoriales con GeoDjango, también podemos hacer lo mismo con los datos raster. También hemos visto que podemos hacer las mismas consultas espaciales con ambos tipos de datos. Todo ello son ejemplos de por qué hacer uso de un framework web nos puede ahorrar tiempo y problemas.

Marc Compte
Ambientólogo actualmente trabajando como programador de proyectos SIG web en el Servicio de SIG y Teledetección (SIGTE) de la Universitat de Girona. Tengo especial interés en Python y el desarrollo web. Colaboro como autónomo con empresas del sector de las bases de datos o del posicionamiento indoor.


Suscríbete a nuestra newsletter