Migrar la URL Base de GeoNode

El comando de administración migrate_baseurl Management Command te permite reparar todos los enlaces de GeoNode siempre que, por alguna razón, necesites cambiar el Domain Name o la IP Address de GeoNode.

Esto debe usarse también en los casos en que necesites cambiar el esquema de red de HTTP a HTTPS, por ejemplo.

En primer lugar, echemos un vistazo a la opción –help del comando de administración migrate_baseurl para inspeccionar todas las opciones y características del comando.

Correr

DJANGO_SETTINGS_MODULE=geonode.settings python manage.py migrate_baseurl --help

Esto producirá un resultado similar al siguiente

usage: manage.py migrate_baseurl [-h] [--version] [-v {0,1,2,3}]
                             [--settings SETTINGS]
                             [--pythonpath PYTHONPATH] [--traceback]
                             [--no-color] [-f]
                             [--source-address SOURCE_ADDRESS]
                             [--target-address TARGET_ADDRESS]

Migrate GeoNode VM Base URL

optional arguments:
-h, --help            show this help message and exit
--version             show program's version number and exit
-v {0,1,2,3}, --verbosity {0,1,2,3}
                        Verbosity level; 0=minimal output, 1=normal output,
                        2=verbose output, 3=very verbose output
--settings SETTINGS   The Python path to a settings module, e.g.
                        "myproject.settings.main". If this isn't provided, the
                        DJANGO_SETTINGS_MODULE environment variable will be
                        used.
--pythonpath PYTHONPATH
                        A directory to add to the Python path, e.g.
                        "/home/djangoprojects/myproject".
--traceback           Raise on CommandError exceptions
--no-color            Don't colorize the command output.
-f, --force           Forces the execution without asking for confirmation.
--source-address SOURCE_ADDRESS
                        Source Address (the one currently on DB e.g.
                        http://192.168.1.23)
--target-address TARGET_ADDRESS
                        Target Address (the one to be changed e.g. http://my-
                        public.geonode.org)
  • Ejemplo 1: Quiero mover mi instancia de GeoNode de http:\\127.0.0.1 a http:\\example.org

    Advertencia

    Asegúrate siempre de utilizar la configuración correcta

    DJANGO_SETTINGS_MODULE=geonode.settings python manage.py migrate_baseurl --source-address=127.0.0.1 --target-address=example.org
    
  • Ejemplo 2: Quiero mover mi instancia de GeoNode de http:\\example.org a https:\\example.org

    Advertencia

    Asegúrate siempre de utilizar la configuración correcta

    DJANGO_SETTINGS_MODULE=geonode.settings python manage.py migrate_baseurl --source-address=http:\\example.org --target-address=https:\\example.org
    
  • Ejemplo 3: Quiero mover mi instancia de GeoNode de https:\\example.org a https:\\geonode.example.org

    Advertencia

    Asegúrate siempre de utilizar la configuración correcta

    DJANGO_SETTINGS_MODULE=geonode.settings python manage.py migrate_baseurl --source-address=example.org --target-address=geonode.example.org
    

Nota

Después de migrar la URL base, asegúrate de sanitizar los enlaces y los metadatos del catálogo también (Actualizar permisos, metadatos, leyendas y enlaces de descarga).

Cargando datos en GeoNode

Hay situaciones en las que no es posible o no resulta conveniente utilizar el Upload Form para añadir nuevos Conjuntos de Datos a GeoNode a través de la interfaz web. Por ejemplo:

  • El conjunto de datos es demasiado grande para cargarlo a través de una interfaz web.

  • Importar datos desde un almacenamiento masivo mediante programación.

  • Importar tablas de una base de datos.

Esta sección lo guiará a través de las distintas opciones disponibles para cargar datos en su GeoNode desde GeoServer, desde la línea de comandos o mediante programación.

Advertencia

Algunas partes de esta sección se han tomado del proyecto GeoServer y de la documentación de capacitación.

Comando de gestión importlayers

La aplicación Django geonode.geoserver incluye 2 comandos de administración que puedes usar para cargar datos en tu GeoNode.

Ambos pueden invocarse mediante el script manage.py.

En primer lugar, echemos un vistazo a la opción –help del comando de administración importlayers para inspeccionar todas las opciones y características del comando.

Correr

DJANGO_SETTINGS_MODULE=geonode.settings python manage.py importlayers --help

Nota

Si habilitó local_settings.py el comando cambiará de la siguiente manera:

DJANGO_SETTINGS_MODULE=geonode.local_settings python manage.py importlayers --help

Esto producirá un resultado similar al siguiente

usage: manage.py importlayers [-h] [-hh HOST] [-u USERNAME] [-p PASSWORD]
                              [--version] [-v {0,1,2,3}] [--settings SETTINGS]
                              [--pythonpath PYTHONPATH] [--traceback] [--no-color]
                              [--force-color] [--skip-checks]
                              [path [path ...]]

Brings files from a local directory, including subfolders, into a GeoNode site.
The datasets are added to the Django database, the GeoServer configuration, and the
pycsw metadata index. At this moment only files of type Esri Shapefile (.shp) and GeoTiff (.tif) are supported.
In order to perform the import, GeoNode must be up and running.

positional arguments:
path                  path [path...]

optional arguments:
-h, --help            show this help message and exit
--version             show program's version number and exit
-v {0,1,2,3}, --verbosity {0,1,2,3}
                        Verbosity level; 0=minimal output, 1=normal output,
                        2=verbose output, 3=very verbose output
--settings SETTINGS   The Python path to a settings module, e.g.
                        "myproject.settings.main". If this isn't provided, the
                        DJANGO_SETTINGS_MODULE environment variable will be
                        used.
--pythonpath PYTHONPATH
                        A directory to add to the Python path, e.g.
                        "/home/djangoprojects/myproject".
-hh HOST, --host HOST
                        Geonode host url
-u USERNAME, --username USERNAME
                        Geonode username
-p PASSWORD, --password PASSWORD
                        Geonode password

Si bien la descripción de la mayoría de las opciones debería explicarse por sí sola, vale la pena revisar algunas de las opciones clave un poco más en detalle.

  • El -hh identifica el servidor GeoNode donde queremos cargar nuestros conjuntos de datos. El valor predeterminado es http://localhost:8000.

  • -u identifica el nombre de usuario para iniciar sesión. El valor predeterminado es admin.

  • -p identifica la contraseña para iniciar sesión. El valor predeterminado es admin.

El comando de gestión de importación de conjuntos de datos se invoca especificando las opciones descritas anteriormente y especificando la ruta a un directorio que contiene varios archivos. Para los fines de este ejercicio, utilizaremos el conjunto predeterminado de conjuntos de datos de prueba que se incluyen con GeoNode. Puede reemplazar esta ruta con un directorio a sus propios shapefiles.

First let's run the GeoNode server:
DJANGO_SETTINGS_MODULE=geonode.settings python manage.py runserver

Then let's import the files:
DJANGO_SETTINGS_MODULE=geonode.settings python manage.py importlayers /home/user/.virtualenvs/geonode/lib/python3.8/site-packages/gisdata/data/good/vector/

Este comando producirá la siguiente salida en tu terminal

san_andres_y_providencia_poi.shp: 201
san_andres_y_providencia_location.shp: 201
san_andres_y_providencia_administrative.shp: 201
san_andres_y_providencia_coastline.shp: 201
san_andres_y_providencia_highway.shp: 201
single_point.shp: 201
san_andres_y_providencia_water.shp: 201
san_andres_y_providencia_natural.shp: 201

1.7456605294117646 seconds per Dataset

Output data: {
    "success": [
        "san_andres_y_providencia_poi.shp",
        "san_andres_y_providencia_location.shp",
        "san_andres_y_providencia_administrative.shp",
        "san_andres_y_providencia_coastline.shp",
        "san_andres_y_providencia_highway.shp",
        "single_point.shp",
        "san_andres_y_providencia_water.shp",
        "san_andres_y_providencia_natural.shp"
    ],
    "errors": []
}

Como salida, el comando imprimirá:

layer_name: status code for each Layer

upload_time spent of each Dataset

A json with the representation of the Datasets uploaded or with some errors.

El código de estado es la respuesta que llega desde GeoNode. Por ejemplo, 201 significa que el conjunto de datos se ha cargado correctamente

Si encuentras errores al ejecutar este comando, consulte los registros de GeoNode para obtener más información.

Comando de administración updatelayers

Si bien es posible importar conjuntos de datos directamente desde el sistema de archivos de tu servidor a tu GeoNode, es posible que tengas un GeoServer existente que ya contenga datos o que desees configurar datos desde un GeoServer que no sea directamente compatible con la carga de datos.

GeoServer admite una amplia gama de formatos de datos y conexiones a bases de datos; es posible que algunos de ellos no sean compatibles con los formatos de carga de GeoNode. Puede agregarlos a tu GeoNode siguiendo el procedimiento que se describe a continuación.

GeoServer admite 4 tipos de datos: Raster, Vector, Databases y Cascaded.

Para obtener una lista de los formatos admitidos para cada tipo de datos, consulta las siguientes páginas:

Nota

Algunos de estos formatos raster o vectoriales o tipos de bases de datos requieren que instale complementos específicos en GeoServer para poder usarlos. Consulta la documentación de GeoServer para obtener más información.

Datos de una base de datos PostGIS

Veamos un ejemplo de configuración de una nueva base de datos PostGIS en GeoServer y luego configure esos conjuntos de datos en tu GeoNode.

En primer lugar, visite la interfaz de administración de GeoServer en tu servidor. Normalmente, se encuentra en el puerto 8080 y está disponible en http://localhost:8080/geoserver/web/

  1. Debe iniciar sesión con las credenciales de superusuario que configuró cuando configuró por primera vez tu instancia de GeoNode.

    Una vez que hayas iniciado sesión en la interfaz de administración de GeoServer, deberías ver lo siguiente.

    ../../_images/geoserver_admin.png

    Nota

    La cantidad de tiendas, conjuntos de datos y espacios de trabajo puede ser diferente dependiendo de lo que ya tenga configurado en tu GeoServer.

  2. A continuación, selecciona la opción «Stores» en el menú de la izquierda y luego la opción «Add new Store». Se mostrará la siguiente pantalla.

    ../../_images/geoserver_new_store.png
  3. En este caso, queremos seleccionar el tipo de almacenamiento PostGIS para crear una conexión a nuestra base de datos existente. En la siguiente pantalla, deberás ingresar los parámetros para conectarse a tu base de datos PostGIS (modifica según sea necesario para tu propia base de datos).

    ../../_images/geoserver_postgis_params.png

    Nota

    Si no estás seguro de alguna configuración, déjala como predeterminada.

  4. La siguiente pantalla te permite configurar los conjuntos de datos en tu base de datos. Por supuesto, esto variará según los conjuntos de datos en tu base de datos.

    ../../_images/geoserver_publish_layers.png
  5. Selecciona el botón «Publish» para uno de los conjuntos de datos y se mostrará la siguiente pantalla en la que podrás ingresar metadatos para este conjunto de datos. Dado que administraremos estos metadatos en GeoNode, podemos dejarlos así por ahora.

    ../../_images/geoserver_layer_params.png
  6. Las cosas que deben especificarse son el SRS declarado y debes seleccionar los enlaces «Calcular desde datos» y «Calcular desde límites nativos» después de especificar el SRS.

    ../../_images/geoserver_srs.png
    ../../_images/geoserver_srs_2.png
  7. Haz clic en guardar y este conjunto de datos ahora estará configurado para su uso en su GeoServer.

    ../../_images/geoserver_layers.png
  8. El siguiente paso es configurar estos conjuntos de datos en GeoNode. El comando de administración updatelayers se puede utilizar para este propósito. Al igual que con importlayers, es útil ver las opciones de línea de comandos para este comando pasando la opción –help

Correr

DJANGO_SETTINGS_MODULE=geonode.settings python manage.py updatelayers --help

Nota

Si habilitó local_settings.py el comando cambiará de la siguiente manera:

DJANGO_SETTINGS_MODULE=geonode.local_settings python manage.py updatelayers --help

Esto producirá un resultado similar al siguiente

usage: manage.py updatelayers [-h] [--version] [-v {0,1,2,3}]
                            [--settings SETTINGS] [--pythonpath PYTHONPATH]
                            [--traceback] [--no-color] [-i]
                            [--skip-unadvertised]
                            [--skip-geonode-registered] [--remove-deleted]
                            [-u USER] [-f FILTER] [-s STORE] [-w WORKSPACE]
                            [-p PERMISSIONS]

Update the GeoNode application with data from GeoServer

optional arguments:
-h, --help            show this help message and exit
--version             show program's version number and exit
-v {0,1,2,3}, --verbosity {0,1,2,3}
                        Verbosity level; 0=minimal output, 1=normal output,
                        2=verbose output, 3=very verbose output
--settings SETTINGS   The Python path to a settings module, e.g.
                        "myproject.settings.main". If this isn't provided, the
                        DJANGO_SETTINGS_MODULE environment variable will be
                        used.
--pythonpath PYTHONPATH
                        A directory to add to the Python path, e.g.
                        "/home/djangoprojects/myproject".
--traceback           Raise on CommandError exceptions
--no-color            Don't colorize the command output.
-i, --ignore-errors   Stop after any errors are encountered.
--skip-unadvertised   Skip processing unadvertised Datasets from GeoSever.
--skip-geonode-registered
                        Just processing GeoServer Datasets still not registered
                        in GeoNode.
--remove-deleted      Remove GeoNode Datasets that have been deleted from
                        GeoSever.
-u USER, --user USER  Name of the user account which should own the imported
                        Datasets
-f FILTER, --filter FILTER
                        Only update data the Datasets that match the given
                        filter
-s STORE, --store STORE
                        Only update data the Datasets for the given geoserver
                        store name
-w WORKSPACE, --workspace WORKSPACE
                        Only update data on specified workspace
-p PERMISSIONS, --permissions PERMISSIONS
                        Permissions to apply to each Dataset

El procedimiento de actualización incluye los siguientes pasos:

  • El proceso obtiene de GeoServer las capas WMS relevantes (todas, por tienda o por espacio de trabajo)

  • Si se define un filtro, se filtran las capas de GeoServer

  • Para cada una de las capas, se crea un conjunto de datos GeoNode basado en los metadatos registrados en GeoServer (título, resumen, límites)

  • Se agregan nuevas capas, se reemplazan las capas existentes, a menos que se use la opción –skip-geonode-registered

  • Las capas GeoNode, agregadas en ejecuciones anteriores del proceso de actualización, que ya no están disponibles en GeoServer se eliminan, si la opción –remove-delete está configurada

Advertencia

Siempre se debe especificar uno de los –workspace o –store si deseas ingerir conjuntos de datos que pertenecen a un Workspace específico. Por ejemplo, para ingerir los conjuntos de datos presentes en el espacio de trabajo geonode, deberás especificar la opción -w geonode.

  1. Vamos a incorporar el Conjunto de Datos geonode:_1_SARMIENTO_ENERO_2018 desde el espacio de trabajo geonode.

    DJANGO_SETTINGS_MODULE=geonode.settings python manage.py updatelayers -w geonode -f _1_SARMIENTO_ENERO_2018
    
    Inspecting the available Datasets in GeoServer ...
    Found 1 Datasets, starting processing
    /usr/local/lib/python2.7/site-packages/owslib/iso.py:117: FutureWarning: the .identification and .serviceidentification properties will merge into .identification being a list of properties.  This is currently implemented in .identificationinfo.  Please see https://github.com/geopython/OWSLib/issues/38 for more information
    FutureWarning)
    /usr/local/lib/python2.7/site-packages/owslib/iso.py:495: FutureWarning: The .keywords and .keywords2 properties will merge into the .keywords property in the future, with .keywords becoming a list of MD_Keywords instances. This is currently implemented in .keywords2. Please see https://github.com/geopython/OWSLib/issues/301 for more information
    FutureWarning)
    Content-Type: text/html; charset="utf-8"
    MIME-Version: 1.0
    Content-Transfer-Encoding: 7bit
    Subject: [master.demo.geonode.org] A new Dataset has been uploaded
    From: webmaster@localhost
    To: mapadeldelito@chubut.gov.ar
    Reply-To: webmaster@localhost
    Date: Tue, 08 Oct 2019 12:26:17 -0000
    Message-ID: <20191008122617.28801.94967@d3cf85425231>
    
    
    <body>
    You have received the following notice from master.demo.geonode.org:
    <p>
    
    The user <i><a href="http://master.demo.geonode.org/people/profile/admin">admin</a></i> uploaded the following Dataset:<br/>
    <strong>_1_SARMIENTO_ENERO_2018</strong><br/>
    You can visit the Dataset's detail page here: http://master.demo.geonode.org/Datasets/geonode:_1_SARMIENTO_ENERO_2018
    
    </p>
    <p>
    To change how you receive notifications, please go to http://master.demo.geonode.org
    </p>
    </body>
    
    -------------------------------------------------------------------------------
    Content-Type: text/html; charset="utf-8"
    MIME-Version: 1.0
    Content-Transfer-Encoding: 7bit
    Subject: [master.demo.geonode.org] A new Dataset has been uploaded
    From: webmaster@localhost
    To: giacomo8vinci@gmail.com
    Reply-To: webmaster@localhost
    Date: Tue, 08 Oct 2019 12:26:17 -0000
    Message-ID: <20191008122617.28801.53784@d3cf85425231>
    
    
    <body>
    You have received the following notice from master.demo.geonode.org:
    <p>
    
    The user <i><a href="http://master.demo.geonode.org/people/profile/admin">admin</a></i> uploaded the following Dataset:<br/>
    <strong>_1_SARMIENTO_ENERO_2018</strong><br/>
    You can visit the Dataset's detail page here: http://master.demo.geonode.org/Datasets/geonode:_1_SARMIENTO_ENERO_2018
    
    </p>
    <p>
    To change how you receive notifications, please go to http://master.demo.geonode.org
    </p>
    </body>
    
    -------------------------------------------------------------------------------
    Content-Type: text/html; charset="utf-8"
    MIME-Version: 1.0
    Content-Transfer-Encoding: 7bit
    Subject: [master.demo.geonode.org] A new Dataset has been uploaded
    From: webmaster@localhost
    To: fmgagliano@gmail.com
    Reply-To: webmaster@localhost
    Date: Tue, 08 Oct 2019 12:26:17 -0000
    Message-ID: <20191008122617.28801.26265@d3cf85425231>
    
    
    <body>
    You have received the following notice from master.demo.geonode.org:
    <p>
    
    The user <i><a href="http://master.demo.geonode.org/people/profile/admin">admin</a></i> uploaded the following Dataset:<br/>
    <strong>_1_SARMIENTO_ENERO_2018</strong><br/>
    You can visit the Dataset's detail page here: http://master.demo.geonode.org/Datasets/geonode:_1_SARMIENTO_ENERO_2018
    
    </p>
    <p>
    To change how you receive notifications, please go to http://master.demo.geonode.org
    </p>
    </body>
    
    -------------------------------------------------------------------------------
    Found geoserver resource for this Dataset: _1_SARMIENTO_ENERO_2018
    ... Creating Default Resource Links for Layer [geonode:_1_SARMIENTO_ENERO_2018]
    -- Resource Links[Prune old links]...
    -- Resource Links[Prune old links]...done!
    -- Resource Links[Compute parameters for the new links]...
    -- Resource Links[Create Raw Data download link]...
    -- Resource Links[Create Raw Data download link]...done!
    -- Resource Links[Set download links for WMS, WCS or WFS and KML]...
    -- Resource Links[Set download links for WMS, WCS or WFS and KML]...done!
    -- Resource Links[Legend link]...
    -- Resource Links[Legend link]...done!
    -- Resource Links[Thumbnail link]...
    -- Resource Links[Thumbnail link]...done!
    -- Resource Links[OWS Links]...
    -- Resource Links[OWS Links]...done!
    Content-Type: text/html; charset="utf-8"
    MIME-Version: 1.0
    Content-Transfer-Encoding: 7bit
    Subject: [master.demo.geonode.org] A Dataset has been updated
    From: webmaster@localhost
    To: mapadeldelito@chubut.gov.ar
    Reply-To: webmaster@localhost
    Date: Tue, 08 Oct 2019 12:26:20 -0000
    Message-ID: <20191008122620.28801.81598@d3cf85425231>
    
    
    <body>
    You have received the following notice from master.demo.geonode.org:
    <p>
    
    The following Dataset was updated:<br/>
    <strong>_1_SARMIENTO_ENERO_2018</strong>, owned by <i><a href="http://master.demo.geonode.org/people/profile/admin">admin</a></i><br/>
    You can visit the Dataset's detail page here: http://master.demo.geonode.org/Datasets/geonode:_1_SARMIENTO_ENERO_2018
    
    </p>
    <p>
    To change how you receive notifications, please go to http://master.demo.geonode.org
    </p>
    </body>
    
    -------------------------------------------------------------------------------
    Content-Type: text/html; charset="utf-8"
    MIME-Version: 1.0
    Content-Transfer-Encoding: 7bit
    Subject: [master.demo.geonode.org] A Dataset has been updated
    From: webmaster@localhost
    To: giacomo8vinci@gmail.com
    Reply-To: webmaster@localhost
    Date: Tue, 08 Oct 2019 12:26:20 -0000
    Message-ID: <20191008122620.28801.93778@d3cf85425231>
    
    
    <body>
    You have received the following notice from master.demo.geonode.org:
    <p>
    
    The following Dataset was updated:<br/>
    <strong>_1_SARMIENTO_ENERO_2018</strong>, owned by <i><a href="http://master.demo.geonode.org/people/profile/admin">admin</a></i><br/>
    You can visit the Dataset's detail page here: http://master.demo.geonode.org/Datasets/geonode:_1_SARMIENTO_ENERO_2018
    
    </p>
    <p>
    To change how you receive notifications, please go to http://master.demo.geonode.org
    </p>
    </body>
    
    -------------------------------------------------------------------------------
    Content-Type: text/html; charset="utf-8"
    MIME-Version: 1.0
    Content-Transfer-Encoding: 7bit
    Subject: [master.demo.geonode.org] A Dataset has been updated
    From: webmaster@localhost
    To: fmgagliano@gmail.com
    Reply-To: webmaster@localhost
    Date: Tue, 08 Oct 2019 12:26:20 -0000
    Message-ID: <20191008122620.28801.58585@d3cf85425231>
    
    
    <body>
    You have received the following notice from master.demo.geonode.org:
    <p>
    
    The following Dataset was updated:<br/>
    <strong>_1_SARMIENTO_ENERO_2018</strong>, owned by <i><a href="http://master.demo.geonode.org/people/profile/admin">admin</a></i><br/>
    You can visit the Dataset's detail page here: http://master.demo.geonode.org/Datasets/geonode:_1_SARMIENTO_ENERO_2018
    
    </p>
    <p>
    To change how you receive notifications, please go to http://master.demo.geonode.org
    </p>
    </body>
    
    -------------------------------------------------------------------------------
    Found geoserver resource for this Dataset: _1_SARMIENTO_ENERO_2018
    /usr/local/lib/python2.7/site-packages/geoserver/style.py:80: FutureWarning: The behavior of this method will change in future versions.  Use specific 'len(elem)' or 'elem is not None' test instead.
    if not user_style:
    /usr/local/lib/python2.7/site-packages/geoserver/style.py:84: FutureWarning: The behavior of this method will change in future versions.  Use specific 'len(elem)' or 'elem is not None' test instead.
    if user_style:
    ... Creating Default Resource Links for Layer [geonode:_1_SARMIENTO_ENERO_2018]
    -- Resource Links[Prune old links]...
    -- Resource Links[Prune old links]...done!
    -- Resource Links[Compute parameters for the new links]...
    -- Resource Links[Create Raw Data download link]...
    -- Resource Links[Create Raw Data download link]...done!
    -- Resource Links[Set download links for WMS, WCS or WFS and KML]...
    -- Resource Links[Set download links for WMS, WCS or WFS and KML]...done!
    -- Resource Links[Legend link]...
    -- Resource Links[Legend link]...done!
    -- Resource Links[Thumbnail link]...
    -- Resource Links[Thumbnail link]...done!
    -- Resource Links[OWS Links]...
    -- Resource Links[OWS Links]...done!
    [created] Layer _1_SARMIENTO_ENERO_2018 (1/1)
    
    
    Finished processing 1 Datasets in 5.0 seconds.
    
    1 Created Datasets
    0 Updated Datasets
    0 Failed Datasets
    5.000000 seconds per Dataset
    

Nota

En caso de no especificar la opción -f, los Datasets que ya existen en tu GeoNode solo se actualizarán y la configuración se sincronizará entre GeoServer y GeoNode.

Advertencia

Al actualizar desde GeoServer, ¡se cambiará la configuración en GeoNode!

Uso de GDAL y OGR para convertir tus datos para su uso en GeoNode

GeoNode admite la carga de datos en formatos ESRI shapefiles, GeoTIFF, CSV, GeoJSON, ASCII-GRID y KML / KMZ (solo para los últimos tres formatos si está utilizando el backend geonode.importer).

  • Si tus datos están en otros formatos, deberás convertirlos a uno de estos formatos para usarlos en GeoNode.

  • Si tus datos ráster no se procesan correctamente, es posible que no puedan utilizarse con GeoServer ni con GeoNode. Deberás procesarlos con GDAL.

Debes asegurarte de tener la biblioteca GDAL instalada en tu sistema. En Ubuntu puedes instalar este paquete con el siguiente comando:

sudo apt-get install gdal-bin

OGR (datos vectoriales)

OGR se utiliza para manipular datos vectoriales. En este ejemplo, utilizaremos archivos .tab de MapInfo y los convertiremos en archivos de formas con el comando ogr2ogr. Utilizaremos archivos de MapInfo de muestra del sitio web vinculado a continuación.

http://services.land.vic.gov.au/landchannel/content/help?name=sampledata

Puedes descargar el conjunto de datos Admin;(Postcode) emitiendo el siguiente comando:

$ wget http://services.land.vic.gov.au/sampledata/shape/admin_postcode_vm.zip

Necesitarás descomprimir este conjunto de datos emitiendo el siguiente comando:

$ unzip admin_postcode_vm.zip

Esto te dejará con los siguientes archivos en el directorio donde ejecutaste los comandos anteriores:

|-- ANZVI0803003025.htm
|-- DSE_Data_Access_Licence.pdf
|-- VMADMIN.POSTCODE_POLYGON.xml
|-- admin_postcode_vm.zip
--- vicgrid94
    --- mif
        --- lga_polygon
            --- macedon\ ranges
                |-- EXTRACT_POLYGON.mid
                |-- EXTRACT_POLYGON.mif
                --- VMADMIN
                    |-- POSTCODE_POLYGON.mid
                    --- POSTCODE_POLYGON.mif

Primero, inspeccionemos este conjunto de archivos usando el siguiente comando:

$ ogrinfo -so vicgrid94/mif/lga_polygon/macedon\ ranges/VMADMIN/POSTCODE_POLYGON.mid POSTCODE_POLYGON

La salida tendrá un aspecto similar al siguiente:

Had to open data source read-only.
INFO: Open of `vicgrid94/mif/lga_polygon/macedon ranges/VMADMIN/POSTCODE_POLYGON.mid'
    using driver `MapInfo File' successful.

Layer name: POSTCODE_POLYGON
Geometry: 3D Unknown (any)
Feature Count: 26
Extent: (2413931.249367, 2400162.366186) - (2508952.174431, 2512183.046927)
Layer SRS WKT:
PROJCS["unnamed",
    GEOGCS["unnamed",
        DATUM["GDA94",
            SPHEROID["GRS 80",6378137,298.257222101],
            TOWGS84[0,0,0,-0,-0,-0,0]],
        PRIMEM["Greenwich",0],
        UNIT["degree",0.0174532925199433]],
    PROJECTION["Lambert_Conformal_Conic_2SP"],
    PARAMETER["standard_parallel_1",-36],
    PARAMETER["standard_parallel_2",-38],
    PARAMETER["latitude_of_origin",-37],
    PARAMETER["central_meridian",145],
    PARAMETER["false_easting",2500000],
    PARAMETER["false_northing",2500000],
    UNIT["Meter",1]]
PFI: String (10.0)
POSTCODE: String (4.0)
FEATURE_TYPE: String (6.0)
FEATURE_QUALITY_ID: String (20.0)
PFI_CREATED: Date (10.0)
UFI: Real (12.0)
UFI_CREATED: Date (10.0)
UFI_OLD: Real (12.0)

Esto le proporciona información sobre la cantidad de características, la extensión, la proyección y los atributos de este conjunto de datos.

A continuación, sigamos adelante y convirtamos este conjunto de datos en un shapefile emitiendo el siguiente comando:

$ ogr2ogr -t_srs EPSG:4326 postcode_polygon.shp vicgrid94/mif/lga_polygon/macedon\ ranges/VMADMIN/POSTCODE_POLYGON.mid POSTCODE_POLYGON

Ten en cuenta que también hemos reproyectado el conjunto de datos al sistema de referencia espacial WGS84 con la opción -t_srs ogr2ogr.

La salida de este comando se verá así:

Warning 6: Normalized/laundered field name: 'FEATURE_TYPE' to 'FEATURE_TY'
Warning 6: Normalized/laundered field name: 'FEATURE_QUALITY_ID' to 'FEATURE_QU'
Warning 6: Normalized/laundered field name: 'PFI_CREATED' to 'PFI_CREATE'
Warning 6: Normalized/laundered field name: 'UFI_CREATED' to 'UFI_CREATE'

Esta salida indica que algunos de los nombres de campo se truncaron para ajustarse a la restricción que los atributos en los shapefiles solo tienen 10 caracteres de longitud.

Ahora tendrás un conjunto de archivos que conforman el conjunto de archivos de forma postcode_polygon.shp. Podemos inspeccionarlos ejecutando el siguiente comando:

$ ogrinfo -so postcode_polygon.shp postcode_polygon

El resultado será similar al que vimos arriba cuando inspeccionamos el archivo MapInfo que convertimos:

INFO: Open of `postcode_polygon.shp'
      using driver `ESRI Shapefile' successful.

Layer name: postcode_polygon
Geometry: Polygon
Feature Count: 26
Extent: (144.030296, -37.898156) - (145.101137, -36.888878)
Layer SRS WKT:
GEOGCS["GCS_WGS_1984",
    DATUM["WGS_1984",
        SPHEROID["WGS_84",6378137,298.257223563]],
    PRIMEM["Greenwich",0],
    UNIT["Degree",0.017453292519943295]]
PFI: String (10.0)
POSTCODE: String (4.0)
FEATURE_TY: String (6.0)
FEATURE_QU: String (20.0)
PFI_CREATE: Date (10.0)
UFI: Real (12.0)
UFI_CREATE: Date (10.0)
UFI_OLD: Real (12.0)

Estos archivos ahora se pueden cargar en su instancia de GeoNode a través del cargador normal.

Visita la página de carga de tu GeoNode, arrastra y suelta los archivos que componen el shapefile que has generado con el comando ogr2ogr de GDAL (postcode_polygon.dbf, postcode_polygon.prj, postcode_polygon.shp, postcode_polygon.shx). Concede los permisos necesarios y luego haz clic en el botón «Cargar archivos».

../../_images/upload_shapefile.png

Tan pronto como se complete el proceso de importación, tendrás la posibilidad de ir directamente a la página de información del conjunto de datos (botón «Layer Info»), o editar los metadatos para ese conjunto de datos (botón «Edit Metadata»), o administrar los estilos para ese conjunto de datos («Manage Styles»).

../../_images/layer_info_vector.png

GDAL (datos ráster)

Veamos varios ejemplos sobre cómo convertir datos raster en diferentes formatos y/o procesarlos para obtener el mejor rendimiento.

Referencias:

  1. https://geoserver.geo-solutions.it/edu/en/raster_data/processing.html

  2. https://geoserver.geo-solutions.it/edu/en/raster_data/advanced_gdal/

Conversión de Datos Raster: datos de Grid Binario y ASCII de Arc/Info a formato GeoTIFF.

Supongamos que tenemos un archivo de Grid ASCII de muestra comprimido como un archivo.

# Un-tar the files
tar -xvf sample_asc.tar

Te quedarán los siguientes archivos en tu sistema de archivos:

|-- batemans_ele
|   |-- dblbnd.adf
|   |-- hdr.adf
|   |-- metadata.xml
|   |-- prj.adf
|   |-- sta.adf
|   |-- w001001.adf
|   |-- w001001x.adf
|-- batemans_elevation.asc

El archivo batemans_elevation.asc es un archivo de Grid ASCII de Arc/Info y los archivos en el directorio batemans_ele son un archivo de Grid Binario de Arc/Info.

Puedes utilizar el comando gdalinfo para inspeccionar ambos archivos ejecutando el siguiente comando:

gdalinfo batemans_elevation.asc

El resultado debería verse así:

Driver: AAIGrid/Arc/Info ASCII Grid
Files: batemans_elevation.asc
Size is 155, 142
Coordinate System is `'
Origin = (239681.000000000000000,6050551.000000000000000)
Pixel Size = (100.000000000000000,-100.000000000000000)
Corner Coordinates:
Upper Left  (  239681.000, 6050551.000)
Lower Left  (  239681.000, 6036351.000)
Upper Right (  255181.000, 6050551.000)
Lower Right (  255181.000, 6036351.000)
Center      (  247431.000, 6043451.000)
Band 1 Block=155x1 Type=Float32, ColorInterp=Undefined
    NoData Value=-9999

Luego puedes inspeccionar los archivos batemans_ele ejecutando el siguiente comando:

gdalinfo batemans_ele

Y este debería ser el resultado correspondiente:

Driver: AIG/Arc/Info Binary Grid
Files: batemans_ele
    batemans_ele/dblbnd.adf
    batemans_ele/hdr.adf
    batemans_ele/metadata.xml
    batemans_ele/prj.adf
    batemans_ele/sta.adf
    batemans_ele/w001001.adf
    batemans_ele/w001001x.adf
Size is 155, 142
Coordinate System is:
PROJCS["unnamed",
    GEOGCS["GDA94",
        DATUM["Geocentric_Datum_of_Australia_1994",
            SPHEROID["GRS 1980",6378137,298.257222101,
                AUTHORITY["EPSG","7019"]],
            TOWGS84[0,0,0,0,0,0,0],
            AUTHORITY["EPSG","6283"]],
        PRIMEM["Greenwich",0,
            AUTHORITY["EPSG","8901"]],
        UNIT["degree",0.0174532925199433,
            AUTHORITY["EPSG","9122"]],
        AUTHORITY["EPSG","4283"]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",153],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",10000000],
    UNIT["METERS",1]]
Origin = (239681.000000000000000,6050551.000000000000000)
Pixel Size = (100.000000000000000,-100.000000000000000)
Corner Coordinates:
Upper Left  (  239681.000, 6050551.000) (150d 7'28.35"E, 35d39'16.56"S)
Lower Left  (  239681.000, 6036351.000) (150d 7'11.78"E, 35d46'56.89"S)
Upper Right (  255181.000, 6050551.000) (150d17'44.07"E, 35d39'30.83"S)
Lower Right (  255181.000, 6036351.000) (150d17'28.49"E, 35d47'11.23"S)
Center      (  247431.000, 6043451.000) (150d12'28.17"E, 35d43'13.99"S)
Band 1 Block=256x4 Type=Float32, ColorInterp=Undefined
    Min=-62.102 Max=142.917
NoData Value=-3.4028234663852886e+38

Notarás que el archivo batemans_elevation.asc no contiene información de proyección, mientras que el archivo batemans_ele sí. Por este motivo, utilizaremos los archivos batemans_ele para este ejercicio y los convertiremos a GeoTiff para utilizarlos en GeoNode. También reproyectaremos este archivo en WGS84 en el proceso. Esto se puede lograr con el siguiente comando.

gdalwarp -t_srs EPSG:4326 batemans_ele batemans_ele.tif

La salida te mostrará el progreso de la conversión y cuando se complete, obtendrás un archivo batemans_ele.tif que puede cargar a su GeoNode.

Puedes inspeccionar este archivo con el comando gdalinfo:

gdalinfo batemans_ele.tif

Lo que producirá el siguiente resultado:

Driver: GTiff/GeoTIFF
Files: batemans_ele.tif
Size is 174, 130
Coordinate System is:
GEOGCS["WGS 84",
    DATUM["WGS_1984",
        SPHEROID["WGS 84",6378137,298.257223563,
            AUTHORITY["EPSG","7030"]],
        AUTHORITY["EPSG","6326"]],
    PRIMEM["Greenwich",0],
    UNIT["degree",0.0174532925199433],
    AUTHORITY["EPSG","4326"]]
Origin = (150.119938943722502,-35.654598806259330)
Pixel Size = (0.001011114155919,-0.001011114155919)
Metadata:
    AREA_OR_POINT=Area
Image Structure Metadata:
    INTERLEAVE=BAND
Corner Coordinates:
Upper Left  ( 150.1199389, -35.6545988) (150d 7'11.78"E, 35d39'16.56"S)
Lower Left  ( 150.1199389, -35.7860436) (150d 7'11.78"E, 35d47' 9.76"S)
Upper Right ( 150.2958728, -35.6545988) (150d17'45.14"E, 35d39'16.56"S)
Lower Right ( 150.2958728, -35.7860436) (150d17'45.14"E, 35d47' 9.76"S)
Center      ( 150.2079059, -35.7203212) (150d12'28.46"E, 35d43'13.16"S)
Band 1 Block=174x11 Type=Float32, ColorInterp=Gray

Optimización de datos ráster: optimización y entrega de datos ráster de gran tamaño

(ref: https://geoserver.geo-solutions.it/edu/en/raster_data/advanced_gdal/example5.html)

Al trabajar con grandes conjuntos de datos raster, puede resultar muy útil utilizar mosaicos.

El mosaico permite dividir grandes conjuntos de datos ráster en partes manejables y es fundamental para definir e implementar una interfaz de ráster E/S de nivel superior.

En este ejemplo, utilizaremos el conjunto de datos original del conjunto de datos ráster público chiangMai_ortho_optimized que actualmente está disponible en la plataforma tailandesa CHIANG MAI Urban Flooding GeoNode.

Este conjunto de datos contiene una imagen ortorectificada almacenada como RGBa GeoTiff con 4 bandas, tres bandas para el RGB y una para la transparencia (el canal alfa).

Ejecutando el comando gdalinfo para ver información detallada:

gdalinfo chiangMai_ortho.tif

Producirá los siguientes resultados:

Driver: GTiff/GeoTIFF
Files: chiangMai_ortho.tif
Size is 63203, 66211
Coordinate System is:
PROJCS["WGS 84 / UTM zone 47N",
    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.0174532925199433,
            AUTHORITY["EPSG","9122"]],
        AUTHORITY["EPSG","4326"]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",99],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",0],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]],
    AXIS["Easting",EAST],
    AXIS["Northing",NORTH],
    AUTHORITY["EPSG","32647"]]
Origin = (487068.774750000040513,2057413.889810000080615)
Pixel Size = (0.028850000000000,-0.028850000000000)
Metadata:
AREA_OR_POINT=Area
TIFFTAG_SOFTWARE=pix4dmapper
Image Structure Metadata:
COMPRESSION=LZW
INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  (  487068.775, 2057413.890) ( 98d52'38.72"E, 18d36'27.34"N)
Lower Left  (  487068.775, 2055503.702) ( 98d52'38.77"E, 18d35'25.19"N)
Upper Right (  488892.181, 2057413.890) ( 98d53'40.94"E, 18d36'27.38"N)
Lower Right (  488892.181, 2055503.702) ( 98d53'40.98"E, 18d35'25.22"N)
Center      (  487980.478, 2056458.796) ( 98d53' 9.85"E, 18d35'56.28"N)
Band 1 Block=63203x1 Type=Byte, ColorInterp=Red
NoData Value=-10000
Mask Flags: PER_DATASET ALPHA
Band 2 Block=63203x1 Type=Byte, ColorInterp=Green
NoData Value=-10000
Mask Flags: PER_DATASET ALPHA
Band 3 Block=63203x1 Type=Byte, ColorInterp=Blue
NoData Value=-10000
Mask Flags: PER_DATASET ALPHA
Band 4 Block=63203x1 Type=Byte, ColorInterp=Alpha
NoData Value=-10000

Como puedes ver, este GeoTiff no se ha dividido en mosaicos. Sin embargo, para acceder a subconjuntos, el uso de mosaicos puede marcar la diferencia. Con el uso de mosaicos, los datos se almacenan y comprimen en bloques (tiled) en lugar de línea por línea (stripped).

En la salida del comando anterior se puede ver que cada banda tiene bloques con el mismo ancho de la imagen (63203) y una longitud unitaria. Las cuadrículas de la imagen siguiente muestran una imagen con mosaicos de igual tamaño (izquierda) y la misma cantidad de franjas (derecha). Para leer los datos del subconjunto rojo, será necesario descomprimir el área intersectada.

../../_images/tiled_vs_stripped.png

En la imagen en mosaico tendremos que descomprimir solo 16 mosaicos, mientras que en la imagen despojada de la derecha tendremos que descomprimir muchas más tiras.

Los datos de imágenes de drones suelen tener una estructura simplificada, por lo que, en la mayoría de los casos, es necesario optimizarlos para aumentar el rendimiento.

Echemos un vistazo al comando gdal_translate utilizado para optimizar nuestro GeoTiff:

gdal_translate -co TILED=YES -co COMPRESS=JPEG -co PHOTOMETRIC=YCBCR
            --config GDAL_TIFF_INTERNAL_MASK YES -b 1 -b 2 -b 3 -mask 4
            chiangMai_ortho.tif
            chiangMai_ortho_optimized.tif

Nota

Para obtener más detalles sobre los parámetros del comando, consulte https://geoserver.geo-solutions.it/edu/en/raster_data/advanced_gdal/example5.html

Una vez finalizado el proceso, llame al comando gdalinfo en el archivo tif resultante:

gdalinfo chiangMai_ortho_optimized.tif

Los siguientes deberían ser los resultados:

Driver: GTiff/GeoTIFF
Files: chiangMai_ortho_optimized.tif
Size is 63203, 66211
Coordinate System is:
PROJCS["WGS 84 / UTM zone 47N",
    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.0174532925199433,
            AUTHORITY["EPSG","9122"]],
        AUTHORITY["EPSG","4326"]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",99],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",0],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]],
    AXIS["Easting",EAST],
    AXIS["Northing",NORTH],
    AUTHORITY["EPSG","32647"]]
Origin = (487068.774750000040513,2057413.889810000080615)
Pixel Size = (0.028850000000000,-0.028850000000000)
Metadata:
AREA_OR_POINT=Area
TIFFTAG_SOFTWARE=pix4dmapper
Image Structure Metadata:
COMPRESSION=YCbCr JPEG
INTERLEAVE=PIXEL
SOURCE_COLOR_SPACE=YCbCr
Corner Coordinates:
Upper Left  (  487068.775, 2057413.890) ( 98d52'38.72"E, 18d36'27.34"N)
Lower Left  (  487068.775, 2055503.702) ( 98d52'38.77"E, 18d35'25.19"N)
Upper Right (  488892.181, 2057413.890) ( 98d53'40.94"E, 18d36'27.38"N)
Lower Right (  488892.181, 2055503.702) ( 98d53'40.98"E, 18d35'25.22"N)
Center      (  487980.478, 2056458.796) ( 98d53' 9.85"E, 18d35'56.28"N)
Band 1 Block=256x256 Type=Byte, ColorInterp=Red
NoData Value=-10000
Mask Flags: PER_DATASET
Band 2 Block=256x256 Type=Byte, ColorInterp=Green
NoData Value=-10000
Mask Flags: PER_DATASET
Band 3 Block=256x256 Type=Byte, ColorInterp=Blue
NoData Value=-10000
Mask Flags: PER_DATASET

Nuestro GeoTiff ahora está dividido en mosaicos de 256x256, tiene 3 bandas y una máscara de 1 bit para no data.

También podemos agregar vistas generales internas al archivo usando el comando gdaladdo:

gdaladdo -r average chiangMai_ortho_optimized.tif 2 4 8 16 32 64 128 256 512

Las vistas generales son versiones duplicadas de los datos originales, pero remuestreadas a una resolución más baja; también se pueden comprimir con varios algoritmos, de la misma manera que el conjunto de datos original.

De manera predeterminada, las vistas generales toman el mismo tipo de compresión y máscaras de transparencia del conjunto de datos de entrada (aplicados a través del comando gdal_translate), por lo que los parámetros que se deben especificar son:

  • -r average: calcula el promedio de todos los píxeles contribuyentes que no son NODATA

  • 2 4 8 16 32 64 128 256 512: la lista de niveles de visión general integral para construir (a partir de la versión 2.3 de gdal ya no se requieren niveles para construir visiones generales)

Llamando nuevamente al comando gdalinfo:

gdalinfo chiangMai_ortho_optimized.tif

El resultado es:

Driver: GTiff/GeoTIFF
Files: chiangMai_ortho_optimized.tif
Size is 63203, 66211
Coordinate System is:
PROJCS["WGS 84 / UTM zone 47N",
    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.0174532925199433,
            AUTHORITY["EPSG","9122"]],
        AUTHORITY["EPSG","4326"]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",99],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",0],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]],
    AXIS["Easting",EAST],
    AXIS["Northing",NORTH],
    AUTHORITY["EPSG","32647"]]
Origin = (487068.774750000040513,2057413.889810000080615)
Pixel Size = (0.028850000000000,-0.028850000000000)
Metadata:
AREA_OR_POINT=Area
TIFFTAG_SOFTWARE=pix4dmapper
Image Structure Metadata:
COMPRESSION=YCbCr JPEG
INTERLEAVE=PIXEL
SOURCE_COLOR_SPACE=YCbCr
Corner Coordinates:
Upper Left  (  487068.775, 2057413.890) ( 98d52'38.72"E, 18d36'27.34"N)
Lower Left  (  487068.775, 2055503.702) ( 98d52'38.77"E, 18d35'25.19"N)
Upper Right (  488892.181, 2057413.890) ( 98d53'40.94"E, 18d36'27.38"N)
Lower Right (  488892.181, 2055503.702) ( 98d53'40.98"E, 18d35'25.22"N)
Center      (  487980.478, 2056458.796) ( 98d53' 9.85"E, 18d35'56.28"N)
Band 1 Block=256x256 Type=Byte, ColorInterp=Red
NoData Value=-10000
Overviews: 31602x33106, 15801x16553, 7901x8277, 3951x4139, 1976x2070, 988x1035, 494x518, 247x259, 124x130
Mask Flags: PER_DATASET
Overviews of mask band: 31602x33106, 15801x16553, 7901x8277, 3951x4139, 1976x2070, 988x1035, 494x518, 247x259, 124x130
Band 2 Block=256x256 Type=Byte, ColorInterp=Green
NoData Value=-10000
Overviews: 31602x33106, 15801x16553, 7901x8277, 3951x4139, 1976x2070, 988x1035, 494x518, 247x259, 124x130
Mask Flags: PER_DATASET
Overviews of mask band: 31602x3Results in:3106, 15801x16553, 7901x8277, 3951x4139, 1976x2070, 988x1035, 494x518, 247x259, 124x130
Band 3 Block=256x256 Type=Byte, ColorInterp=Blue
NoData Value=-10000
Overviews: 31602x33106, 15801x16553, 7901x8277, 3951x4139, 1976x2070, 988x1035, 494x518, 247x259, 124x130
Mask Flags: PER_DATASET
Overviews of mask band: 31602x33106, 15801x16553, 7901x8277, 3951x4139, 1976x2070, 988x1035, 494x518, 247x259, 124x130

Ten en cuenta que se han aplicado las máscaras de transparencia de las vistas generales internas (su compresión no aparece en los metadatos del archivo).

Los vehículos aéreos no tripulados suelen proporcionar también otros dos tipos de datos: «DTM (modelo digital del terreno)» y «DSM (modelo digital de superficie)».

Para optimizar esos datos es necesario llevar a cabo distintos procesos. Veamos algunos ejemplos para entender mejor cómo utilizar gdal para llevar a cabo esa tarea.

Desde la plataforma CHIANG MAI Urban Flooding GeoNode se encuentra actualmente disponible el conjunto de datos chiangMai_dtm_optimized, descarguemos su conjunto de datos original.

Este conjunto de datos debe contener el archivo DTM chiangMai_dtm.tif.

Llamando al comando gdalinfo:

gdalinfo chiangMai_dtm.tif

Se mostrará la siguiente información:

Driver: GTiff/GeoTIFF
Files: chiangMai_dtm.tif
Size is 12638, 13240
Coordinate System is:
PROJCS["WGS 84 / UTM zone 47N",
    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.0174532925199433,
            AUTHORITY["EPSG","9122"]],
        AUTHORITY["EPSG","4326"]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",99],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",0],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]],
    AXIS["Easting",EAST],
    AXIS["Northing",NORTH],
    AUTHORITY["EPSG","32647"]]
Origin = (487068.774750000040513,2057413.889810000080615)
Pixel Size = (0.144270000000000,-0.144270000000000)
Metadata:
AREA_OR_POINT=Area
TIFFTAG_SOFTWARE=pix4dmapper
Image Structure Metadata:
COMPRESSION=LZW
INTERLEAVE=BAND
Corner Coordinates:
Upper Left  (  487068.775, 2057413.890) ( 98d52'38.72"E, 18d36'27.34"N)
Lower Left  (  487068.775, 2055503.755) ( 98d52'38.77"E, 18d35'25.19"N)
Upper Right (  488892.059, 2057413.890) ( 98d53'40.94"E, 18d36'27.37"N)
Lower Right (  488892.059, 2055503.755) ( 98d53'40.98"E, 18d35'25.22"N)
Center      (  487980.417, 2056458.822) ( 98d53' 9.85"E, 18d35'56.28"N)
Band 1 Block=12638x1 Type=Float32, ColorInterp=Gray
NoData Value=-10000

La lectura de esta imagen puede resultar muy lenta porque aún no se ha dividido en mosaicos. Por lo tanto, como se mencionó anteriormente, sus datos deben almacenarse y comprimirse en mosaicos para aumentar el rendimiento.

El siguiente comando gdal_translate debería ser apropiado para ese propósito:

gdal_translate -co TILED=YES -co COMPRESS=DEFLATE chiangMai_dtm.tif chiangMai_dtm_optimized.tif

Cuando los datos a comprimir consisten en imágenes (por ejemplo, fotografías aéreas, imágenes satelitales en color verdadero o mapas en color), se pueden utilizar algoritmos con pérdida como JPEG. Ahora estamos comprimiendo datos donde la precisión es importante, el tipo de datos de banda es Float32 y los valores de elevación no deben alterarse, por lo que un algoritmo con pérdida como JPEG no es adecuado. JPEG generalmente solo se debe utilizar con datos de bytes (8 bits por canal), por lo que hemos elegido la compresión DEFLATE sin pérdida a través de la opción de creación COMPRESS=DEFLATE.

Llamando nuevamente al comando gdalinfo:

gdalinfo chiangMai_dtm_optimized.tif

Podemos observar los siguientes resultados:

Driver: GTiff/GeoTIFF
Files: chiangMai_dtm_optimized.tif
Size is 12638, 13240
Coordinate System is:
PROJCS["WGS 84 / UTM zone 47N",
    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.0174532925199433,
            AUTHORITY["EPSG","9122"]],
        AUTHORITY["EPSG","4326"]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",99],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",0],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]],
    AXIS["Easting",EAST],
    AXIS["Northing",NORTH],
    AUTHORITY["EPSG","32647"]]
Origin = (487068.774750000040513,2057413.889810000080615)
Pixel Size = (0.144270000000000,-0.144270000000000)
Metadata:
AREA_OR_POINT=Area
TIFFTAG_SOFTWARE=pix4dmapper
Image Structure Metadata:
COMPRESSION=DEFLATE
INTERLEAVE=BAND
Corner Coordinates:
Upper Left  (  487068.775, 2057413.890) ( 98d52'38.72"E, 18d36'27.34"N)
Lower Left  (  487068.775, 2055503.755) ( 98d52'38.77"E, 18d35'25.19"N)
Upper Right (  488892.059, 2057413.890) ( 98d53'40.94"E, 18d36'27.37"N)
Lower Right (  488892.059, 2055503.755) ( 98d53'40.98"E, 18d35'25.22"N)
Center      (  487980.417, 2056458.822) ( 98d53' 9.85"E, 18d35'56.28"N)
Band 1 Block=256x256 Type=Float32, ColorInterp=Gray
NoData Value=-10000

También necesitamos crear vistas generales a través del comando gdaladdo:

gdaladdo -r nearest chiangMai_dtm_optimized.tif 2 4 8 16 32 64

A diferencia del ejemplo anterior, las vistas generales se crearán con el algoritmo de remuestreo más cercano. Esto se debe a la naturaleza de los datos que estamos representando: no debemos considerar el promedio entre dos valores de elevación sino simplemente el más cercano, ya que es más confiable en cuanto a la conservación de los datos originales.

Llamando nuevamente al comando gdalinfo:

gdalinfo chiangMai_dtm_optimized.tif

Podemos ver la siguiente información:

Driver: GTiff/GeoTIFF
Files: chiangMai_dtm_optimized.tif
Size is 12638, 13240
Coordinate System is:
PROJCS["WGS 84 / UTM zone 47N",
    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.0174532925199433,
            AUTHORITY["EPSG","9122"]],
        AUTHORITY["EPSG","4326"]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",99],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",0],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]],
    AXIS["Easting",EAST],
    AXIS["Northing",NORTH],
    AUTHORITY["EPSG","32647"]]
Origin = (487068.774750000040513,2057413.889810000080615)
Pixel Size = (0.144270000000000,-0.144270000000000)
Metadata:
AREA_OR_POINT=Area
TIFFTAG_SOFTWARE=pix4dmapper
Image Structure Metadata:
COMPRESSION=DEFLATE
INTERLEAVE=BAND
Corner Coordinates:
Upper Left  (  487068.775, 2057413.890) ( 98d52'38.72"E, 18d36'27.34"N)
Lower Left  (  487068.775, 2055503.755) ( 98d52'38.77"E, 18d35'25.19"N)
Upper Right (  488892.059, 2057413.890) ( 98d53'40.94"E, 18d36'27.37"N)
Lower Right (  488892.059, 2055503.755) ( 98d53'40.98"E, 18d35'25.22"N)
Center      (  487980.417, 2056458.822) ( 98d53' 9.85"E, 18d35'56.28"N)
Band 1 Block=256x256 Type=Float32, ColorInterp=Gray
NoData Value=-10000
Overviews: 6319x6620, 3160x3310, 1580x1655, 790x828, 395x414, 198x207

Se han creado vistas generales. De manera predeterminada, heredan el mismo tipo de compresión del conjunto de datos original (no hay evidencia de ello en la salida de gdalinfo).

Procesar conjuntos de datos ráster mediante programación

En esta sección proporcionaremos un conjunto de scripts shell que pueden resultar muy útiles para procesar por lotes una gran cantidad de conjuntos de datos ráster de forma programada.

  1. process_gray.sh

    for filename in *.tif*; do echo gdal_translate -co TILED=YES -co COMPRESS=DEFLATE $filename ${filename//.tif/.optimized.tif}; done > gdal_translate.sh
    chmod +x gdal_translate.sh
    ./gdal_translate.sh
    
    for filename in *.optimized.tif*; do echo gdaladdo -r nearest $filename 2 4 8 16 32 64 128 256 512; done > gdaladdo.sh
    for filename in *.optimized.tif*; do echo mv \"$filename\" \"${filename//.optimized.tif/.tif}\"; done > rename.sh
    chmod +x *.sh
    ./gdaladdo.sh
    ./rename.sh
    
  2. process_rgb.sh

    for filename in *.tif*; do echo gdal_translate -co TILED=YES -co COMPRESS=JPEG -co PHOTOMETRIC=YCBCR -b 1 -b 2 -b 3 $filename ${filename//.tif/.optimized.tif}; done > gdal_translate.sh
    chmod +x gdal_translate.sh
    ./gdal_translate.sh
    
    for filename in *.optimized.tif*; do echo gdaladdo -r average $filename 2 4 8 16 32 64 128 256 512; done > gdaladdo.sh
    for filename in *.optimized.tif*; do echo mv \"$filename\" \"${filename//.optimized.tif/.tif}\"; done > rename.sh
    chmod +x *.sh
    ./gdaladdo.sh
    ./rename.sh
    
  3. process_rgb_alpha.sh

    for filename in *.tif*; do echo gdal_translate -co TILED=YES -co COMPRESS=JPEG -co PHOTOMETRIC=YCBCR --config GDAL_TIFF_INTERNAL_MASK YES -b 1 -b 2 -b 3 -mask 4 $filename ${filename//.tif/.optimized.tif}; done > gdal_translate.sh
    chmod +x gdal_translate.sh
    ./gdal_translate.sh
    
    for filename in *.optimized.tif*; do echo gdaladdo -r average $filename 2 4 8 16 32 64 128 256 512; done > gdaladdo.sh
    for filename in *.optimized.tif*; do echo mv \"$filename\" \"${filename//.optimized.tif/.tif}\"; done > rename.sh
    chmod +x *.sh
    ./gdaladdo.sh
    ./rename.sh
    
  4. process_rgb_palette.sh

    for filename in *.tif*; do echo gdal_translate -co TILED=YES -co COMPRESS=DEFLATE $filename ${filename//.tif/.optimized.tif}; done > gdal_translate.sh
    chmod +x gdal_translate.sh
    ./gdal_translate.sh
    
    for filename in *.optimized.tif*; do echo gdaladdo -r average $filename 2 4 8 16 32 64 128 256 512; done > gdaladdo.sh
    for filename in *.optimized.tif*; do echo mv \"$filename\" \"${filename//.optimized.tif/.tif}\"; done > rename.sh
    chmod +x *.sh
    ./gdaladdo.sh
    ./rename.sh
    

Crear usuarios y superusuarios

Tu primer paso será crear un usuario. Existen tres opciones para hacerlo, dependiendo del tipo de usuario que quieras crear puedes elegir una opción diferente. Comenzaremos creando un superusuario, ya que este usuario es el más importante. Un superusuario tiene todos los permisos sin necesidad de asignarlos explícitamente.

La forma más fácil de crear un superusuario (en Linux) es abrir su terminal y escribir:

$ DJANGO_SETTINGS_MODULE=geonode.settings python manage.py createsuperuser

Nota

Si habilitó local_settings.py el comando cambiará de la siguiente manera:

$ DJANGO_SETTINGS_MODULE=geonode.local_settings python manage.py createsuperuser

Se te pedirá un nombre de usuario (en este tutorial llamaremos al superusuario que ahora cree su_superusuario), una dirección de correo electrónico y una contraseña.

Ahora que has creado un superusuario, deberías familiarizarte con la Interfaz de administración de Django. Como superusuario, tienes acceso a esta interfaz, donde puedes administrar usuarios, conjuntos de datos, permisos y más. Por ahora, será suficiente con seguir los pasos. Para acceder a la Interfaz de administración de Django, ve al sitio web de tu GeoNode e inicia sesión con tu_superusuario. Una vez que hayas iniciado sesión, el nombre de tu usuario aparecerá en la parte superior derecha. Haz clic en él y aparecerá el siguiente menú:

../../_images/menu_admin.png

Al hacer clic en Admin se muestra la interfaz.

../../_images/admin_interface.png

Ve a Auth -> Users y verás todos los usuarios que existen en este momento. En tu caso solo será your_superuser. Haz clic en él y verás una sección de Personal Info, otra de Permissions y otra de Important dates. Por el momento, la sección de Permissions es la más importante.

../../_images/permissions_django_admin.png

Como puedes ver, hay tres casillas que se pueden marcar y desmarcar. Como has creado un superusuario, las tres casillas están marcadas de forma predeterminada. Si solo se hubiera marcado la casilla active, el usuario no sería un superusuario y no podría acceder a la Django Admin Interface (que solo está disponible para usuarios con el estado staff). Por lo tanto, tenga en cuenta las dos cosas siguientes:

  • un superusuario puede acceder a la Interfaz de administración de Django y tiene todos los permisos sobre los datos cargados en GeoNode.

  • un usuario normal (creado desde la interfaz GeoNode) solo tiene permisos activos de forma predeterminada. El usuario no tendrá la capacidad de acceder a la Interfaz de administración de Django y se le deben agregar ciertos permisos.

Hasta ahora solo hemos creado superusuarios. ¿Cómo se crea un usuario normal? Tienes dos opciones:

  1. Interfaz de administración de Django

    Primero crearemos un usuario a través de la Interfaz de administración de Django porque aún la tenemos abierta. Por lo tanto, regresa a Auth -> Users y deberías encontrar un botón a la derecha que dice Add user.

    ../../_images/add_user.png

    Haz clic en él y aparecerá un formulario para rellenar. Ponle al nuevo usuario el nombre test_user, elige una contraseña y haz clic en guardar en la parte inferior derecha del sitio.

    ../../_images/add_test_user.png

    Ahora deberías ser dirigido al sitio donde puedes cambiar los permisos del usuario test_user. De manera predeterminada, solo está marcada la opción active. Si quieres que este usuario también pueda asistir a esta interfaz de administración, también puedes marcar staff status. ¡Pero por ahora dejamos la configuración como está!

    Para probar si el nuevo usuario se creó correctamente, regresa a la página web de GeoNode e intente iniciar sesión.

  2. Sitio web de GeoNode

    Para crear un usuario normal, también puede utilizar el sitio web de GeoNode. Si instaló GeoNode utilizando una versión, debe

    verá un botón Registrarse en la parte superior, al lado del botón Sign in (es posible que tenga que cerrar la sesión antes).

    ../../_images/register.png

    Pulsa el botón y aparecerá de nuevo un formulario para que lo rellenes. Este usuario se llamará geonode_user

    ../../_images/sign_up_test_user.png

    Al pulsar Sign up el usuario quedará registrado, por defecto solo con el estado activo.

Permisos de sincronización por lotes

GeoNode proporciona un comando de administración muy útil set_layers_permisions que permite a un administrador agregar o eliminar fácilmente permisos a grupos y usuarios en uno o más conjuntos de datos.

Los argumentos del comando set_layers_permisions son:

  • permissions para configurar/desconfigurar –> leer, descargar, editar, administrar

    READ_PERMISSIONS = [
        'view_resourcebase'
    ]
    DOWNLOAD_PERMISSIONS = [
        'view_resourcebase',
        'download_resourcebase'
    ]
    EDIT_PERMISSIONS = [
        'view_resourcebase',
        'change_dataset_style',
        'download_resourcebase',
        'change_resourcebase_metadata',
        'change_dataset_data',
        'change_resourcebase'
    ]
    MANAGE_PERMISSIONS = [
        'delete_resourcebase',
        'change_resourcebase',
        'view_resourcebase',
        'change_resourcebase_permissions',
        'change_dataset_style',
        'change_resourcebase_metadata',
        'publish_resourcebase',
        'change_dataset_data',
        'download_resourcebase'
    ]
    

Nota: la lista de permisos anterior puede cambiar si se habilita ADVANCED_WORKFLOW. Para obtener más información, consulte: https://docs.geonode.org/en/master/admin/admin_panel/index.html#how-to-enable-the-advanced-workflow

  • resources (Conjuntos de datos) sobre los que se asignarán permisos –> escriba el ID del conjunto de datos, se pueden escribir múltiples opciones con separador de coma, si no se proporcionan identificadores, se considerarán todos los conjuntos de datos

  • users a quienes se les asignarán permisos, se pueden escribir opciones múltiples con un separador de coma

  • groups a los que se asignarán permisos, se pueden escribir opciones múltiples con un separador de coma

  • Bandera delete (opcional) que significa que los permisos no se establecerán

Ejemplos de uso:

  1. Asignar permisos de edit en los conjuntos de datos con id 1 y 2 a los usuarios username1 y username2 y al grupo group_name1.

    python manage.py set_layers-permissions -p edit -u username1,username2 -g group_name1 -r 1,2
    
  2. Asignar permisos de administración en todos los conjuntos de datos al grupo group_name1.

    python manage.py set_layers-permissions -p manage -g group_C
    
  3. Anular los permisos de descarga en el conjunto de datos con id 1 para el usuario username1.

    python manage.py set_layers-permissions -p download -u username1 -r 1 -d
    

Las mismas funcionalidades, con algunas limitaciones, están disponibles también desde el Admin Dashboard >> Users o desde el Admin Dashboard >> Groups >> Group profiles.

../../_images/layer_batch_perms_admin.png

Una acción denominada Set layer permissions está disponible en la lista, redirigiendo al administrador a un formulario para establecer/desestablecer permisos de lectura, edición y descarga en el perfil de usuario/grupo seleccionado.

../../_images/layer_batch_perms_form.png

Basta con seleccionar el conjunto de datos y pulsar «Enviar». Si está activado el modo asíncrono, la asignación de permisos es asíncrona

Eliminar determinados recursos de GeoNode

El comando de administración delete_resources Management Command permite eliminar recursos que cumplan una determinada condición, especificada en forma de una expresión serializada django Q().

En primer lugar, echemos un vistazo a la opción --help del comando de administración delete_resources para inspeccionar todas las opciones y características del comando.

Correr

DJANGO_SETTINGS_MODULE=geonode.settings python manage.py delete_resources --help

Nota

Si habilitó local_settings.py el comando cambiará de la siguiente manera:

DJANGO_SETTINGS_MODULE=geonode.local_settings python manage.py delete_resources --help

Esto producirá el siguiente resultado:

usage: manage.py delete_resources [-h] [-c CONFIG_PATH]
                                  [-l LAYER_FILTERS [LAYER_FILTERS ...]]
                                  [-m MAP_FILTERS [MAP_FILTERS ...]]
                                  [-d DOCUMENT_FILTERS [DOCUMENT_FILTERS ...]]
                                  [--version] [-v {0,1,2,3}]
                                  [--settings SETTINGS]
                                  [--pythonpath PYTHONPATH] [--traceback]
                                  [--no-color] [--force-color]

Delete resources meeting a certain condition

optional arguments:
  -h, --help            show this help message and exit
  -c CONFIG_PATH, --config CONFIG_PATH
                        Configuration file path. Default is:
                        delete_resources.json
  -l LAYER_FILTERS [LAYER_FILTERS ...], --layer_filters LAYER_FILTERS [LAYER_FILTERS ...]
  -m MAP_FILTERS [MAP_FILTERS ...], --map_filters MAP_FILTERS [MAP_FILTERS ...]
  -d DOCUMENT_FILTERS [DOCUMENT_FILTERS ...], --document_filters DOCUMENT_FILTERS [DOCUMENT_FILTERS ...]
  --version             show program's version number and exit
  -v {0,1,2,3}, --verbosity {0,1,2,3}
                        Verbosity level; 0=minimal output, 1=normal output,
                        2=verbose output, 3=very verbose output
  --settings SETTINGS   The Python path to a settings module, e.g.
                        "myproject.settings.main". If this isn't provided, the
                        DJANGO_SETTINGS_MODULE environment variable will be
                        used.
  --pythonpath PYTHONPATH
                        A directory to add to the Python path, e.g.
                        "/home/djangoprojects/myproject".
  --traceback           Raise on CommandError exceptions
  --no-color            Don't colorize the command output.
  --force-color         Force colorization of the command output.

Hay dos formas de declarar expresiones Q() para filtrar qué recursos deben eliminarse:

  1. Con un archivo de configuración JSON: pasando el argumento -c que especifica la ruta al archivo de configuración JSON.

  • Ejemplo 1: Ruta relativa al archivo de configuración (a manage.py)

    DJANGO_SETTINGS_MODULE=geonode.settings python manage.py delete_resources -c geonode/base/management/commands/delete_resources.json
    
  • Ejemplo 2: Ruta absoluta al archivo de configuración

    DJANGO_SETTINGS_MODULE=geonode.settings python manage.py delete_resources -c /home/User/Geonode/configs/delete_resources.json
    
  1. Con CLI: pasando -l -d -m lista de argumentos para cada uno de los recursos (conjuntos de datos, documentos, mapas)

  • Ejemplo 3: Eliminar recursos sin archivo de configuración

    DJANGO_SETTINGS_MODULE=geonode.settings python manage.py delete_resources -l 'Q(pk__in: [1, 2]) | Q(title__icontains:"italy")' 'Q(owner__name=admin)' -d '*' -m "Q(pk__in=[1, 2])"
    

Archivo de configuración

El archivo de configuración JSON debe contener un único objeto filters, que consta de las listas Dataset, map y document. Cada lista especifica las condiciones de filtro aplicadas a un conjunto de consultas correspondiente, definiendo qué elementos se eliminarán. Los filtros se evalúan y se insertan directamente en el método .filter() de Django, lo que significa que los filtros que aparecen como elementos de lista separados se tratan como una condición AND. Para crear una consulta OR, se debe utilizar el operador |. Para obtener más información, consulte la [documentación](https://docs.djangoproject.com/en/3.2/topics/db/queries/#complex-lookups-with-q-objects) de Django. La única excepción es pasar una lista con '*', lo que provocará la eliminación de todo el conjunto de consultas del recurso.

  • Ejemplo 4: Ejemplo de contenido del archivo de configuración, que eliminará los conjuntos de datos con ID 1, 2 y 3, aquellos propiedad del usuario admin, junto con todos los mapas definidos.

    {
      "filters": {
      "Dataset": [
          "Q(pk__in=[1, 2, 3]) | Q(title__icontains='italy')",
          "Q(user__name=admin)"
        ],
      "map": ["*"],
      "document": []
      }
    }
    

CLI

La configuración de CLI se puede especificar con argumentos de lista -l -d -m, que de hecho son una traducción del archivo JSON de configuración. Los argumentos -l -d -m se evalúan de la misma manera que filters.Dataset, filters.map y filter.document, según el Ejemplo 4. El resultado del siguiente ejemplo será equivalente al Ejemplo 4:

  • Ejemplo 5: Ejemplo de configuración de CLI, que eliminará los conjuntos de datos con los ID 1, 2 y 3, junto con todos los mapas.

    DJANGO_SETTINGS_MODULE=geonode.settings python manage.py delete_resources -l 'Q(pk__in: [1, 2, 3]) | Q(title__icontains:"italy")' 'Q(owner__name=admin)' -m '*'
    

Ejecución asincrónica a través de http

Es posible exponer y ejecutar comandos de administración a través de http.

Para ejecutar comandos de administración de django personalizados usualmente usamos la línea de comando:

python manage.py ping_mngmt_commands_http
$> pong

La aplicación management_commands_http nos permite ejecutar comandos cuando no tenemos acceso a la línea de comandos. Es posible ejecutar un comando mediante la API o la interfaz gráfica de usuario de administración de Django.

Por razones de seguridad, solo los usuarios administradores pueden acceder a la función y el comando deseado debe exponerse explícitamente. De forma predeterminada, se exponen los siguientes comandos: ping_mngmt_commands_http, updatelayers, sync_geonode_datasets, sync_geonode_maps, importlayers y set_all_datasets_metadata.

Para exponer más comandos, puede cambiar la variable de entorno MANAGEMENT_COMMANDS_EXPOSED_OVER_HTTP y los comandos agregados se expondrán en tu aplicación.

La lista de comandos expuestos está disponible en el punto final list_management_commands y también se presenta mediante el formulario en la página de administración create management command job.

Nota

Para utilizar los comandos de forma asincrónica, ASYNC_SIGNALS debe configurarse en True y Celery debe estar ejecutándose.

Administrar mediante la interfaz de administración de Django

Creando un puesto de trabajo

Acceda al panel de administración: http://<your_geonode_host>/admin y vaya a «Management command jobs».

Comandos de gestión a través del menú de administración http.

Sección de administración del comando de gestión

Llegarás a http://<your_geonode_host>/es/admin/management_commands_http/managementcommandjob/, luego harás clic en el botón + Add management command job (http://<your_geonode_host>/es/admin/management_commands_http/managementcommandjob/add/).

Botón: Agregar trabajo de comando de gestión.

Añadir tarea de comando de gestión

Seleccione el comando y complete el formulario, con los argumentos y/o claves si es necesario. Guarde su trabajo y en la lista seleccione la acción start, alternativamente puede marcar la opción autostart y el comando se iniciará automáticamente al crearse.

Formulario: Agregar trabajo de comando de gestión.

Creación de un formulario de trabajo de comando de gestión

Comenzando un trabajo

Para iniciar un trabajo:

Iniciando un trabajo de comando de administración.

Comenzando un trabajo

  1. Seleccione el trabajo que desea iniciar.

  2. Seleccione la acción «start».

  3. Haga clic en «Go».

  4. La página se actualizará y el estado del trabajo habrá cambiado. Si tarda mucho en ejecutarse, actualiza la página para ver el estado actualizado.

  5. También está disponible la opción «stop».

Nota

Si la página tarda demasiado en cargarse, es posible que ASYNC_SIGNALS no esté activado. Si tu estado se queda bloqueado en QUEUED, verifique si Celery está ejecutándose y configurado correctamente.

Estado del trabajo

Al hacer clic en el enlace del ID de un trabajo, podemos ver los detalles de este trabajo. Para el trabajo que acabamos de crear, podemos verificar el mensaje de salida y el estado del trabajo de Celery.

Estado del trabajo del comando de gestión.

Ejemplo de estado laboral

Cuando se produce un error durante la ejecución, el mensaje de seguimiento estará disponible en el traceback de Celery. En la siguiente imagen se creó un trabajo ping_mngmt_commands_http con los argumentos ["--force_exception", true]. Verificar el texto en este campo puede ser útil para solucionar errores.

Estado del trabajo de comando de administración con un mensaje de traceback.

Ejemplo de mensaje de seguimiento de trabajo

Administrar mediante puntos finales de API

La ejecución de los comandos de gestión se puede gestionar mediante solicitudes http a una API: http://<your_geonode_host>/api/v2/management/.

Todas las solicitudes deben ser autenticadas con permisos administrativos (superusuario).

Puedes encontrar aquí una colección de Postman con todos los ejemplos listados aquí y otros endpoints disponibles:

geonode_mngmt_commands.postman_collection.json

Lista de comandos expuestos

Obtener una lista de los comandos expuestos:

curl --location --request GET 'http://<your_geonode_host>/api/v2/management/commands/' --header 'Authorization: Basic YWRtaW46YWRtaW4='

Respuesta:

{
    "success": true,
    "error": null,
    "data": [
        "ping_mngmt_commands_http",
        "updatelayers",
        "set_all_datasets_metadata",
        "sync_geonode_maps",
        "importlayers",
        "sync_geonode_datasets"
    ]
}

Nota

Debes cambiar el encabezado `Authorization (Basic YWRtaW46YWRtaW4=) a tu token de autenticación, en este ejemplo estoy usando un token para admin como nombre de usuario y admin como contraseña.

Creando un puesto de trabajo

Opcionalmente, antes de crear el trabajo puedes obtener tu mensaje de ayuda con la siguiente llamada:

curl --location --request GET 'http://<your_geonode_host>/api/v2/management/commands/ping_mngmt_commands_http/' --header 'Authorization: Basic YWRtaW46YWRtaW4='

Creación de un trabajo para ejecutar ping_mngmt_commands_http con 30 segundos de tiempo de suspensión:

curl --location --request POST 'http://<your_geonode_host>/api/v2/management/commands/ping_mngmt_commands_http/jobs/' \
--header 'Authorization: Basic YWRtaW46YWRtaW4=' \
--header 'Content-Type: application/json' \
--data-raw '{
    "args": ["--sleep", 30],
    "kwargs": {},
    "autostart": false
}'

Respuesta:

{
    "success": true,
    "error": null,
    "data": {
        "id": 8,
        "command": "ping_mngmt_commands_http",
        "app_name": "geonode.management_commands_http",
        "user": 1000,
        "status": "CREATED",
        "created_at": "2021-10-08T18:17:25.045752Z",
        "start_time": null,
        "end_time": null,
        "args": [
            "--sleep",
            30
        ],
        "kwargs": {},
        "celery_result_id": null,
        "output_message": null
    }
}

Nota

Alternativamente, puedes omitir la parte jobs de la URL para crear un trabajo. (Utilice http://<your_geonode_host>/api/v2/management/commands/ping_mngmt_commands_http/ como URL)

Acciones Start/Stop

Para iniciar el trabajo creado:

curl --location --request PATCH 'http://<your_geonode_host>/api/v2/management/jobs/8/start/' --header 'Authorization: Basic YWRtaW46YWRtaW4='

Respuesta:

{
    "success": true,
    "error": null,
    "data": {
        "id": 8,
        "command": "ping_mngmt_commands_http",
        "app_name": "geonode.management_commands_http",
        "user": 1000,
        "status": "QUEUED",
        "created_at": "2021-10-08T18:17:25.045752Z",
        "start_time": null,
        "end_time": null,
        "args": [
            "--sleep",
            30
        ],
        "kwargs": {},
        "celery_result_id": null,
        "output_message": null
    }
}

Nota

Durante la ejecución, el trabajo se puede interrumpir mediante la siguiente llamada:

curl --location --request PATCH 'http://<your_geonode_host>/api/v2/management/jobs/8/stop/' --header 'Authorization: Basic YWRtaW46YWRtaW4='

Tenga en cuenta que el estado cambió de CREATED a QUEUED, durante la ejecución será STARTED y al final FINISHED.

Listado de trabajos y estado

Puedes verificar tu estado y detalles laborales con la siguiente llamada:

curl --location --request GET 'http://<your_geonode_host>/api/v2/management/jobs/8/status/' --header 'Authorization: Basic YWRtaW46YWRtaW4='

Respuesta:

{
    "id": 8,
    "command": "ping_mngmt_commands_http",
    "app_name": "geonode.management_commands_http",
    "user": 1000,
    "status": "FINISHED",
    "created_at": "2021-10-08T18:17:25.045752Z",
    "start_time": "2021-10-08T18:20:02.761475Z",
    "end_time": "2021-10-08T18:20:32.802007Z",
    "args": [
        "--sleep",
        30
    ],
    "kwargs": {},
    "celery_result_id": "fe7359a6-5f8c-47bf-859a-84351b5ed80c",
    "output_message": "Sleeping for 30.0 seconds...\npong\n",
    "celery_task_meta": {
        "date_done": "2021-10-08T18:20:32.810649Z",
        "status": "SUCCESS",
        "traceback": null,
        "worker": "worker1@4f641ffa9c0b"
    }
}

Al ejecutar varios trabajos y auditar los trabajos ya ejecutados, se puede recuperar una lista de trabajos mediante la siguiente llamada:

curl --location --request GET 'http://<your_geonode_host>/api/v2/management/jobs/' --header 'Authorization: Basic YWRtaW46YWRtaW4='

Respuesta:

{
    "links": {
        "next": null,
        "previous": null
    },
    "total": 1,
    "page": 1,
    "page_size": 10,
    "data": [
        {
            "id": 1,
            "command": "ping_mngmt_commands_http",
            "app_name": "geonode.management_commands_http",
            "user": 1000,
            "status": "FINISHED",
            "created_at": "2021-10-08T18:17:25.045752Z"
        }
    ]
}

Nota

Esta lista se puede filtrar por los campos «celery_result_id», «command», «app_name», «status», «user» y «user__username».