Migrar la URL base del GeoNode

El migrate_baseurl Management Command le permite arreglar todos los enlaces de GeoNode siempre que, por alguna razón, necesite cambiar el Domain Name de IP Address de GeoNode.

Esto debe usarse también en los casos en que necesite cambiar el esquema de red de HTTP a HTTPS, como 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 estar utilizando 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 estar utilizando 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 estar utilizando 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úrese de desinfectar también los enlaces y los metadatos del catálogo (sync_capas_and_metadata).

Cargando datos en GeoNode

Hay situaciones en las que no es posible o no es conveniente utilizar Upload Form para agregar 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.

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

  • Importar tablas desde una base de datos.

Esta sección lo guiará a través de las diversas 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 de la documentación de formación y proyecto GeoServer.

Comando de Gestión importcapas

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

Ambos pueden invocarse utilizando el script manage.py.

En primer lugar, echemos un vistazo a la opción –help del comando de administración importcapas 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í misma, vale la pena revisar algunas de las opciones clave con un poco más de 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 el inicio de sesión.El valor predeterminado es admin.

  • El -p Identifica la contraseña para el inicio de sesión.El valor predeterminado es admin.

El comando de administración de importación de conjuntos de datos se invoca especificando opciones como se describe 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 envían con el geonode. Puede reemplazar esta ruta con un directorio para sus propios archivos de forma.

Este comando producirá el siguiente resultado en su 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 resultado, el comando imprimirá:

El código de estado es la respuesta proveniente de GeoNode.Por ejemplo 201 significa que el conjunto de datos se ha subido correctamente

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

Comando de Gestión actualizarcapas

Si bien es posible importar conjuntos de datos directamente desde el sistema de archivos de su servidor a su GeoNode, es posible que tenga un GeoServer existente que ya tenga datos, o puede que desee configurar datos desde un GeoServer que no admite directamente 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 como formatos de carga de GeoNode.Puede agregarlos a su GeoNode siguiendo el procedimiento que se describe a continuación.

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

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

Nota

Algunos de estos formatos ráster o vectoriales o tipos de bases de datos requieren que instale complementos específicos en su GeoServer para poder utilizar.Consulte 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 configuremos esos conjuntos de datos en su GeoNode.

Primero visite la interfaz de administración de GeoServer en su servidor.Suele estar 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 su instancia de GeoNode.

    Una vez que haya iniciado sesión en la interfaz de administración de GeoServer, debería 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 tengas configurado en tu GeoServer.

  2. A continuación, desea seleccionar la opción «Tiendas» en el menú de la izquierda y luego la opción «Agregar nueva tienda».Se mostrará la siguiente pantalla.

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

    ../../_images/geoserver_postgis_params.png

    Nota

    Si no está seguro de alguna de las configuraciones, déjela como predeterminada.

  4. La siguiente pantalla le permite configurar los conjuntos de datos en su base de datos.Por supuesto, esto será diferente según los conjuntos de datos de su base de datos.

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

    ../../_images/geoserver_layer_params.png
  6. Lo que debe especificarse es el SRS declarado y debe seleccionar los enlaces «Calcular a partir de datos» y «Calcular desde límites nativos» después de especificar el SRS.

    ../../_images/geoserver_srs.png
    ../../_images/geoserver_srs_2.png
  7. Haga 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.Para este fin se puede utilizar el comando de gestión updatecapas.Al igual que con importcapas, es útil mirar las opciones de línea de comando 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 recupera de GeoServer las capas WMS relevantes (todas, por tienda o por espacio de trabajo)

  • Si se define un filtro, se filtran las capas del 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, las capas existentes se reemplazan, a menos que se use la opción –skip-geonode-registered

  • Las capas de 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 desea ingerir conjuntos de datos que pertenecen a un Workspace específico.Por ejemplo, para incorporar los conjuntos de datos presentes en el espacio de trabajo geonode, deberá especificar la opción -w geonode.

  1. Ingerimos el conjunto de datos geonode:_1_SARMIENTO_ENERO_2018 del 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 que no especifique la opción -f, los conjuntos de datos que ya existen en su GeoNode simplemente 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!

Utilice GDAL y OGR para convertir sus datos para usarlos en GeoNode

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

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

  • Si sus datos Raster no se procesan correctamente, es posible que queden casi inutilizables con GeoServer y GeoNode.Deberá procesarlo usando GDAL.

Debe asegurarse de tener la biblioteca GDAL instalada en su 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, usaremos archivos .tab de MapInfo y los convertiremos en archivos de forma con el comando ogr2ogr.Usaremos archivos MapInfo de muestra del sitio web vinculado a continuación.

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

Puede descargar el conjunto de datos Admin;(Código postal) emitiendo el siguiente comando:

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

Deberá descomprimir este conjunto de datos emitiendo el siguiente comando:

$ unzip admin_postcode_vm.zip

Esto le dejará con los siguientes archivos en el directorio donde ejecutó 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

El resultado será 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 brinda información sobre la cantidad de entidades, la extensión, la proyección y los atributos de este conjunto de datos.

A continuación, sigamos adelante y conviertamos este conjunto de datos en un archivo de forma emitiendo el siguiente comando:

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

Tenga 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 será similar a la siguiente:

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'

Este resultado indica que algunos de los nombres de los campos se truncaron para cumplir con la restricción de que los atributos en los archivos de forma tienen solo 10 caracteres de longitud.

Ahora tendrá un conjunto de archivos que componen el conjunto de archivos de forma postcode_polygon.shp.Podemos inspeccionarlos emitiendo 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.

Visite la página de carga en su GeoNode, arrastre y suelte los archivos que componen el shapefile que ha generado usando el comando GDAL ogr2ogr (postcode_polygon.dbf, postcode_polygon.prj, postcode_polygon.shp, postcode_polygon.shx).Otorgue los permisos necesarios y luego haga clic en el botón «Subir archivos».

../../_images/upload_shapefile.png

Tan pronto como se complete el proceso de importación, tendrá la posibilidad de ir directamente a la página de información del conjunto de datos (botón «Información de capa»), editar los metadatos de ese conjunto de datos (botón «Editar metadatos») o administrar los estilos de ese conjunto de datos («Administrar estilos»).

../../_images/layer_info_vector.png

GDAL (datos ráster)

Veamos varios ejemplos sobre cómo convertir datos ráster a 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 ráster: datos de cuadrícula ASCII y binarios Arc/Info en formato GeoTIFF.

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

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

Le quedarán los siguientes archivos en su 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 Arc/Info ASCII Grid y los archivos en el directorio batemans_ele son un archivo Arc/Info Binary Grid.

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

gdalinfo batemans_elevation.asc

El resultado debería verse como el siguiente:

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 puede 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í.Debido a esto, usaremos los archivos batemans_ele para este ejercicio y los convertiremos a GeoTiff para usarlos 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

El resultado le mostrará el progreso de la conversión y cuando se complete, le quedará un archivo batemans_ele.tif que puede cargar en su GeoNode.

Puede 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 grandes datos ráster

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

Cuando se trata de grandes conjuntos de datos ráster, podría 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 E/S ráster de nivel superior.

En este ejemplo usaremos el conjunto de datos original del conjunto de datos ráster público chiangMai_ortho_optimized que está actualmente disponible en la plataforma tailandesa ``CHIANG MAI Urban Flooding GeoNode <https://urbanflooding.geo-solutions.it/>`_.

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

Llamando al 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 puede ver, este GeoTiff no ha sido mosaico.Sin embargo, para acceder a subconjuntos, el mosaico puede marcar la diferencia.Con el mosaico, los datos se almacenan y comprimen en bloques (en mosaico) en lugar de línea por línea (eliminados).

En el resultado del comando anterior, es visible que cada banda tiene bloques con el mismo ancho de la imagen (63203) y una unidad de longitud.Las cuadrículas en la imagen a continuación muestran una imagen con mosaicos del mismo tamaño (izquierda) y la misma cantidad de tiras (derecha).Para leer 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 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 tiene mosaicos de 256x256, tiene 3 bandas y una máscara de 1 bit para nodata.

También podemos agregar descripciones 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 sus datos originales, pero remuestreadas a una resolución más baja; también se pueden comprimir con varios algoritmos, de manera muy similar al conjunto de datos original.

De forma predeterminada, las vistas generales toman el mismo tipo de compresión y máscaras de transparencia del conjunto de datos de entrada (aplicadas mediante el comando gdal_translate), por lo que los parámetros que se especificarán son:

  • -r promedio: 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 descripción general integral para construir (a partir de la versión 2.3 de gdal, los niveles ya no son necesarios para crear descripciones generales)

Llamando nuevamente al comando gdalinfo:

gdalinfo chiangMai_ortho_optimized.tif

Resulta en:

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

Observe 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 UAV suelen proporcionar también otros dos tipos de datos: DTM (Modelo Digital del Terreno) y DSM (Modelo Digital de Superficie).

Esos datos requieren diferentes procesos para optimizarse.Veamos algunos ejemplos para comprender mejor cómo usar gdal para realizar esa tarea.

Desde la plataforma CHIANG MAI Urban Flooding GeoNode <https://urbanflooding.geo-solutions.it/>`_ actualmente está 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 ser muy lenta porque aún no se ha colocado en mosaico.Entonces, 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 (es decir, fotografías aéreas, imágenes de satélite en color real o mapas en color), puede 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 modificarse, por lo que un algoritmo con pérdida como JPEG no es adecuado.JPEG generalmente solo debe usarse con datos de bytes (8 bits por canal), por lo que hemos elegido la compresión DEFLATE sin pérdidas 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 mediante el 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, 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 resúmenes.De forma 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 ser muy útiles para procesar por lotes una gran cantidad de conjuntos de datos ráster mediante programación.

  1. proceso_gris.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. proceso_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. proceso_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. proceso_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

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

La forma más sencilla 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 le pedirá un nombre de usuario (en este tutorial llamaremos al superusuario que ahora crea su_superusuario), una dirección de correo electrónico y una contraseña.

Ahora que ha creado un superusuario, debería familiarizarse 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.Para conocer más detalladamente esta interfaz consulte este ENLACE.Por ahora bastará con seguir los pasos.Para asistir a la Interfaz de administración de Django, vaya al sitio web de su geonode e inicie sesión con su_superusuario.Una vez que hayas iniciado sesión, el nombre de tu usuario aparecerá en la parte superior derecha.Haga clic en él y aparecerá el siguiente menú:

../../_images/menu_admin.png

Al hacer clic en Admin, aparece la interfaz.

../../_images/admin_interface.png

Vaya a Auth -> Users y verá todos los usuarios que existen en este momento.En tu caso solo será tu_superusuario.Haga clic en él y verá una sección sobre Información personal, una sobre Permisos y otra sobre Fechas importantes.Por el momento, el apartado de Permisos es el más importante.

../../_images/permissions_django_admin.png

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

  • 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) sólo tiene permisos activos de forma predeterminada.El usuario no podrá acceder a la Interfaz de administración de Django y se le deberán agregar ciertos permisos.

Hasta ahora sólo hemos creado superusuarios.Entonces, ¿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 todavía la tenemos abierta.Por lo tanto, regrese a Auth -> Users y debería encontrar un botón a la derecha que dice Add user.

    ../../_images/add_user.png

    Haga clic en él y aparecerá un formulario para completar.Nombra al nuevo usuario 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ía ser dirigido al sitio donde puede cambiar los permisos del usuario test_user.Por defecto sólo está marcado activo.Si desea que este usuario también pueda acceder a esta interfaz de administración, también puede verificar estado del personal.¡Pero por ahora dejamos la configuración como está!

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

  2. Sitio web de GeoNode

    Para crear un usuario normal, también puedes utilizar el sitio web de GeoNode.Si instaló GeoNode usando una versión, debería

    Verás un botón Registrarse en la parte superior, al lado del botón Iniciar sesión (es posible que tengas que cerrar sesión antes).

    ../../_images/register.png

    Pulsa el botón y nuevamente aparecerá un formulario para que lo completes.Este usuario se llamará geonode_user

    ../../_images/sign_up_test_user.png

    Al presionar Registrarse el usuario se registrará, por defecto solo con el estado activo.

Permisos de sincronización por lotes

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

Los argumentos del comando set_capas_permissions son:

  • permisos para configurar/desarmar –> 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'
    ]
    

NB: la lista de permisos anterior puede cambiar con ADVANCED_WORKFLOW habilitado.Para obtener información adicional: https://docs.geonode.org/en/master/admin/admin_panel/index.html#how-to-enable-the-advanced-workflow

  • recursos (Conjuntos de datos) a los que se asignarán permisos –> escriba la identificación del conjunto de datos, se pueden escribir múltiples opciones con separador de coma, si no se proporcionan identificaciones, se considerarán todos los conjuntos de datos

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

  • grupos a quiénes se asignarán los permisos; se pueden escribir varias opciones con un separador de coma

  • eliminar indicador (opcional), lo que significa que los permisos se cancelarán

Ejemplos de uso:

  1. Asigne permisos de edición en los conjuntos de datos con ID 1 y 2 a los usuarios nombre de usuario1 y nombre de usuario2 y al grupo nombre_grupo1.

    python manage.py set_layers-permissions -p edit -u username1,username2 -g group_name1 -r 1,2
    
  2. Asigne permisos administrar en todos los conjuntos de datos al grupo nombre_grupo1.

    python manage.py set_layers-permissions -p manage -g group_C
    
  3. Anule los permisos de descarga en el conjunto de datos con ID 1 para el usuario nombre de usuario1.

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

Las mismas funcionalidades, con algunas limitaciones, también están disponibles desde Panel de administración >> Usuarios o Panel de administración >> Grupos >> Perfiles de grupo.

../../_images/layer_batch_perms_admin.png

Una acción llamada Establecer permisos de capa está disponible en la lista, redirigiendo al administrador a un formulario para configurar/desconfigurar 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 presionar «Enviar».Si el modo asíncrono está activado, la asignación de permisos es asíncrona

Eliminar ciertos recursos de GeoNode

El delete_resources Management Command permite eliminar recursos que cumplan una determinada condición, especificada en forma de expresión serializada de 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() filtrando 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: pasar -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 «filtros», que consta de listas «Conjunto de datos», «mapa» y «documentos».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 Django .filter(), lo que significa que los filtros que aparecen como elementos de lista separados se tratan como condición AND.Para crear una consulta OR se debe utilizar el operador |.Para obtener más información, consulte Django [documentación] (https://docs.djangoproject.com/en/3.2/topics/db/queries/#complex-lookups-with-q-objects)).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: Contenido de ejemplo 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 CLI se puede especificar con -l -d -m argumentos de lista, 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 en consecuencia del Ejemplo 4. El resultado del siguiente ejemplo será equivalente al Ejemplo 4:

  • Ejemplo 5: ejemplo de configuración 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 asíncrona 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 personalizados de Django normalmente utilizamos 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 usando la API o la GUI 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.Por defecto están expuestos los siguientes comandos: ping_mngmt_commands_http, updatecapas, sync_geonode_datasets, sync_geonode_maps, importcapas 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 su aplicación.

La lista de comandos expuestos está disponible en el punto final list_management_commands y también se presenta en el formulario en la página de administración crear trabajo de comando de administración.

Nota

Para usar los comandos en un enfoque asíncrono, ASYNC_SIGNALS debe estar configurado en True y el apio debe estar ejecutándose.

Administrar usando la interfaz de administración de Django

Creando un trabajo

Accede al panel de administración: http://<your_geonode_host>/admin y ve a «Gestión de trabajos de comando».

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

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

Llegará a http://<your_geonode_host>/en/admin/management_commands_http/managementcommandjob/, luego haga clic en el botón + Agregar trabajo de comando de administración (http://<your_geonode_host>/en/admin/management_commands_http/managementcommandjob/add/).

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

Agregar trabajo de comando de administración

Seleccione el comando y complete el formulario, con los argumentos y/o argumentos clave si es necesario.Guarde su trabajo y en la lista seleccione la acción iniciar, alternativamente puede marcar la opción inicio automático y el comando se iniciará automáticamente cuando se cree.

Formulario: Agregar trabajo de comando de administración.

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

Empezando un trabajo

Para comenzar un trabajo:

Iniciar un trabajo de comando de gestión.

Empezando un trabajo

  1. Seleccione el trabajo a iniciar.

  2. Seleccione la acción iniciar.

  3. Haga clic en Ir.

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

  5. También está disponible una opción de «detener».

Nota

Si la página tarda demasiado en cargarse, es posible que ASYNC_SIGNALS no esté activado.Si su estado se atasca en EN COLA, verifique si el apio se está ejecutando y configurado correctamente.

Estado del trabajo

Al hacer clic en el enlace en el 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 del apio.

Estado del trabajo del comando de gestión.

Ejemplo de estado laboral

Cuando tengamos un error durante la ejecución el mensaje de rastreo estará disponible en el rastreo de apio.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 resultar útil para solucionar errores.

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

Ejemplo de mensaje de rastreo de trabajo

Gestionar mediante API punto finales

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

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

Puedes encontrar aquí una colección de cartero con todos los ejemplos aquí enumerados y otros puntos finales disponibles:

:descargar:`geonode_mngmt_commands.postman_collection.json <data/geonode_mngmt_commands.postman_collection.json>`

Listar comandos expuestos

Obteniendo 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 Autorización (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 trabajo

Opcionalmente, antes de crear el trabajo puedes obtener su 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='

Creando 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

Como alternativa, 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)

Iniciar/Detener acciones

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 CREADO a EN COLA, durante la ejecución será INICIADO y al final FINALIZADO.

Lista de trabajos y estado

Puedes verificar el estado y detalles de tu trabajo 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 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».