31 ene 2024

Servicio OGC API de procesos: Proceso getElevation – Altitud de puntos


El Proceso
getElevation (Altitud de puntos) nos permite obtener la elevación de uno o varios puntos a partir del Modelo Digital del Terreno (MDT05) del Plan Nacional de Ortofotografía Aérea. En página de API processes getElevation se pueden consultar los parámetros de entrada y de salida:

Parámetros de entrada:
  • «geom»:  corresponde con la geometría de puntos o lista de puntos. Actualmente no admite multigeometrías ni polígonos GeoJSON. Tipo de dato: string.
  • «formato» parámetro obligatorio que indica el formato en que se proporciona la geometría del parámetro «geom» puede ser en formato GeoJSON (feature collection) o en formato WKT (GeometryCollection, Multipoint o Point). Tipo de dato: string.
  • «crs» parámetro es opcional, que viene proporcionado por el sistema de referencia de los parámetros «geom», por defecto se utilizará el Sistema de referencia (EPSG: 4326). Tipo de dato: integer.
  • «withCoord» Es un valor booleano (true/false), en el caso que empleemos el valor true, obtenemos las coordenadas geográficas junto a sus altitudes, y en el caso de valores false, obtenemos solo el valor de la altitud o altitudes de los puntos asociados. Por defecto se utiliza el valor false. Tipo de dato: boolean.
  • «outformat» parámetro opcional que indica el formato de salida. El valor por defecto  es «array» que consiste en los valores de las altitudes del los puntos en forma de lista. Tipo de dato: string.
Parámetros de salida:
  • «id» que se identifica con el proceso «GetElevation»
  • «values» que es el resultado en forma de lista con las elevaciones para cada punto en el mismo orden dado que los datos de entrada. En el caso que el parámetro de entrada «withCoord» sea valor true, se obtienen las coordenadas geográficas junto con la altitud del punto o de la lista de puntos.
Ejecución del proceso:

Para la ejecución del proceso se utiliza una función POST. Se accede a la dirección: https://api-processes.idee.es/processes/getElevation/execution y es obligatorio ejecutar la petición en JSON.

En la galería de ejemplos de API CNIG se puede consultar un ejemplo completo para este proceso para la obtención de la altitud de un punto sobre el MDT desde una página web. En este caso se usa como datos de entrada las coordenadas de un punto haciendo clic sobre el mapa en el Sistema de referencia EPSG:3857 para construir un JSON de entrada. El resultado es la altitud del punto que viene dado por el parámetro «values [0]».



Una opción para verificar los API de procesos es utilizar Swagger UI que ofrece la misma interfaz de procesos. Desde aquí podemos acceder al proceso getElevation de una manera sencilla, de modo que podemos verificar el procedimiento para la obtención de la elevación de uno o varios puntos a partir del MDT05. 


Otra forma más experta de explotar lo servicios es a través del comando cURL o de una biblioteca de Python llamada requests, como se detalla en los siguientes ejemplos.

En este proceso se puede utilizar como datos de entrada dos formatos: GeoJSON o WKT (Well Known Text), en nuestro caso utilizaremos dos sistemas de referencia de coordenadas distintos, WGS84 (EPSG:4326) y ETRS89 Huso 30 N (EPSG:25830).

A continuación, veremos varios ejemplos de cómo utilizar diferentes combinaciones de datos de entrada según las siguientes opciones de esta tabla:

Formato

EPSG

Punto

Lista de puntos

GeoJSON

4326

x

x

25830

-

x

WKT

4326

x

x

25830

-

x


FORMATO GEOJSON

Cálculo de la altitud de un punto en formato GeoJSON y Sistema de referencia EPSG 4326:

Si quisiéramos conocer la altitud de un punto para unas coordenadas dadas en longitud y latitud en el Sistema de referencia WGS84 (EPSG:4326), por ejemplo, situándonos en la Cima de Peñalara con coordenadas geográficas (-3.956023, 40.850026).


El código JSON de entrada empleado sería: 

{
 "inputs": {
    "crs": 4326,
    "formato": "geojson",
    "geom": "{\"type\": \"FeatureCollection\",\"features\": [{\"geometry\":{\"coordinates\": [-3.956023,40.850026],\"type\":\"Point\"},\"type\": \"Feature\"}]}",
    "outputFormat": "array",
   "withCoord": true
  }
}

El cURL que se ejecuta:

curl -X POST "https://api-processes.idee.es/processes/getElevation/execution" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"inputs\":{\"crs\":4326,\"formato\":\"geojson\",\"geom\":\"{\\\"type\\\": \\\"FeatureCollection\\\",\\\"features\\\": [{\\\"geometry\\\": {\\\"coordinates\\\": [-3.956023,40.850026],\\\"type\\\": \\\"Point\\\"},\\\"type\\\": \\\"Feature\\\"}]}\",\"outputFormat\":\"array\",\"withCoord\":true}}".

Al utilizar el valor true en el parámetro «withCoord», nos muestra en el resultado las coordenadas longitud y latitud del punto y el valor de la altitud, 2426.86 m:

{
 "id": "GetElevacion",
 "values": [
  [
   -3.956023,
   40.850026,
   2426.860107421875
  ]
 ]
}

Ejemplo de petición desde script Python

En el siguiente ejemplo se muestra cómo realizar la misma petición HTTP POST al servicio publicado en una OGC API processes desde un script de Python. Para ello, se utiliza la librería requests, cuya importación se realiza en la primera línea. Posteriormente se definen las variables «url» (texto con la URL a la que se va a realizar la petición) y «myObj» (json con los parámetros de entrada de la función a ejecutar). Por último, se realiza la petición y se guarda en el parámetro «result».

Dentro de la variable tenemos distintos métodos, entre los que destacan: 
  • «request» para obtener los datos de la petición 
  • «.json()» para obtener el resultado de la operación ejecutada en formato json
  • «.status_code» para obtener el estado de la petición HTTP.

 import requests

 # URL del proceso en el processes
 url = 'https://api-processes.idee.es/processes/getElevation/execution'
 
 myObj = {
                 "inputs": {
                 "crs": 4326,
                 "formato": "geojson",
                 "geom": "{\"type\": \"FeatureCollection\",\"features\": [{\"geometry\": {\"coordinates\": [-3.956023,40.850026],\"type\": \"Point\"},\"type\": \"Feature\"}]}",
                 "outputFormat": "array",
                 "withCoord": True
                }
 }

 result = requests.post(url, json = myObj)

 print('resultado de la petición: ',result.request)
 print('resultado del proceso: ',result.json())
 print('estado de la petición: ',result.status_code)

En los siguientes ejemplos sólo se muestra la petición cURL, por simplificar. Para crear el script de Python, solo habría que modificar el objeto myObj con el JSON indicado en cada caso.

Cálculo de altitudes para varios puntos en formato GeoJSON y Sistema de referencia EPSG 4326:

En el siguiente ejemplo vamos a obtener las altitudes de una serie de puntos de una ruta de senderismo, desde Peñalara al Puerto de Cotos, planeada con el visualizador IBERPIX.


El código JSON de entrada empleado sería: 
{
 {
  "inputs": {
     "crs": 4326,
     "formato": "geojson",
     "geom": "{\"type\": \"FeatureCollection\",\"features\":[{\"geometry\": {\"coordinates\": [-3.960924, 40.823162],\"type\": \"Point\"},\"type\": \"Feature\"},{\"geometry\": {\"coordinates\": [-3.962104,40.824435],\"type\": \"Point\"},\"type\": \"Feature\"},{\"geometry\": {\"coordinates\": [-3.95394,40.83086],\"type\": \"Point\"},\"type\": \"Feature\"},{\"geometry\": {\"coordinates\": [-3.94661,40.84799],\"type\": \"Point\"},\"type\": \"Feature\"},{\"geometry\": {\"coordinates\": [-3.94665,40.86077],\"type\": \"Point\"},\"type\": \"Feature\"},{\"geometry\": {\"coordinates\": [-3.956023,40.850026],\"type\": \"Point\"},\"type\": \"Feature\"}]}",
    "outformat": "array"
    "withCoord": true
   }
 }

El cURL que se ejecuta:

curl -X POST "https://api-processes.idee.es/processes/getElevation/execution" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"inputs\":{\"crs\":4326,\"formato\":\"geojson\",\"geom\":\"{\\\"type\\\": \\\"FeatureCollection\\\",\\\"features\\\":[{\\\"geometry\\\": {\\\"coordinates\\\": [-3.960924, 40.823162],\\\"type\\\": \\\"Point\\\"},\\\"type\\\": \\\"Feature\\\"},{\\\"geometry\\\": {\\\"coordinates\\\": [-3.962104,40.824435],\\\"type\\\": \\\"Point\\\"},\\\"type\\\": \\\"Feature\\\"},{\\\"geometry\\\": {\\\"coordinates\\\": [-3.95394,40.83086],\\\"type\\\": \\\"Point\\\"},\\\"type\\\": \\\"Feature\\\"},{\\\"geometry\\\": {\\\"coordinates\\\": [-3.94661,40.84799],\\\"type\\\": \\\"Point\\\"},\\\"type\\\": \\\"Feature\\\"},{\\\"geometry\\\": {\\\"coordinates\\\": [-3.94665,40.86077],\\\"type\\\": \\\"Point\\\"},\\\"type\\\": \\\"Feature\\\"},{\\\"geometry\\\": {\\\"coordinates\\\": [-3.956023,40.850026],\\\"type\\\": \\\"Point\\\"},\\\"type\\\": \\\"Feature\\\"}]}\",\"outputFormat\":\"array\",\"withCoord\":true}}".

Como resultado obtenemos:

{
 "id": "GetElevacion",
 "values": [
  [
   -3.
960924,
   40.
823162,
   
1821.1390380859375
  ]
  [
   -3.
962104,
   40.
824435,
   
1848.135986328125
  ]
  [
   -3.
95394,
   40.
83086,
   
1929.6490478515625
  ]
  [
   -3.
94661,
   40.
84799,
   
2058.2919921875
  ]
  [
     -3.94665,
   40.86077,
  2171.02587890625
  ]
  [
   -3.956023,
    40.850026,
   2426.860107421875
    ]
  ]
}

Cálculo de altitudes para varios puntos en formato GeoJSON y Sistema de referencia EPSG 25830:

Para realizar el mismo caso anterior pero en el sistema de referencia EPSG 25830 el código JSON de entrada sería:

 {
  "inputs": {
     "crs": 25830,
     "formato": "geojson",
     "geom": "{\"type\": \"FeatureCollection\",\"features\":[{\"geometry\": {\"coordinates\": [418968.65169915627, 4519570.897995114],\"type\": \"Point\"},\"type\": \"Feature\"},{\"geometry\": {\"coordinates\": [418870.69647217955,4519713.3034235155],\"type\": \"Point\"},\"type\": \"Feature\"},{\"geometry\": {\"coordinates\": [419566.8985195706,4520419.006521905],\"type\": \"Point\"},\"type\": \"Feature\"},{\"geometry\": {\"coordinates\": [420205.4951092379,4522313.881248297],\"type\": \"Point\"},\"type\": \"Feature\"},{\"geometry\": {\"coordinates\": [420217.45760421915,4523732.611317685],\"type\": \"Point\"},\"type\": \"Feature\"},{\"geometry\": {\"coordinates\": [419414.48224599997,4522548.512953534],\"type\": \"Point\"},\"type\": \"Feature\"}]}",
    "outformat": "array"
    "withCoord": false
   }
 }

El cURL que se ejecuta:

curl -X POST "https://api-processes.idee.es/processes/getElevation/execution" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"inputs\":{\"crs\":25830,\"formato\":\"geojson\",\"geom\":\"{\\\"type\\\": \\\"FeatureCollection\\\",\\\"features\\\":[{\\\"geometry\\\": {\\\"coordinates\\\": [418968.65169915627, 4519570.897995114],\\\"type\\\": \\\"Point\\\"},\\\"type\\\": \\\"Feature\\\"},{\\\"geometry\\\": {\\\"coordinates\\\": [418870.69647217955,4519713.3034235155],\\\"type\\\": \\\"Point\\\"},\\\"type\\\": \\\"Feature\\\"},{\\\"geometry\\\": {\\\"coordinates\\\": [419566.8985195706,4520419.006521905],\\\"type\\\": \\\"Point\\\"},\\\"type\\\": \\\"Feature\\\"},{\\\"geometry\\\": {\\\"coordinates\\\": [420205.4951092379,4522313.881248297],\\\"type\\\": \\\"Point\\\"},\\\"type\\\": \\\"Feature\\\"},{\\\"geometry\\\": {\\\"coordinates\\\": [420217.45760421915,4523732.611317685],\\\"type\\\": \\\"Point\\\"},\\\"type\\\": \\\"Feature\\\"},{\\\"geometry\\\": {\\\"coordinates\\\": [419414.48224599997,4522548.512953534],\\\"type\\\": \\\"Point\\\"},\\\"type\\\": \\\"Feature\\\"}]}\",\"outputFormat\":\"array\",\"withCoord\":false}}".

En este caso el parámetro de entrada «withCoord» lo pusimos con valor false por lo que en el resultado solo nos va a mostrar solo la altitud de los puntos sin sus coordenadas UTM:

{
 "id": "GetElevacion",
 "values": [
  [
   
1821.1390380859375,
     1848.135986328125,
     1929.6490478515625,
     2058.2919921875,
     2171.02587890625,
     2426.860107421875
    ]
 
  ]
}

FORMATO WKT

Cálculo de la altitud para un punto en formato WKT y Sistema de referencia EPSG 4326:

Para el cálculo de las altitudes de un punto de la ruta en formato WKT y el Sistema de referencia WGS84 (EPSG: 4326) el código JSON de entrada sería:
 {
  "inputs": {
     "crs": 4326,
     "formato": "wkt",
     "geom": " POINT(-3.956023 40.850026)",
    "withCoord": true
    "outformat": "array"
   }
 }

El cURL que se ejecuta:

curl -X POST "https://api-processes.idee.es/processes/getElevation/execution" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"inputs\":{\"crs\":4326,\"formato\":\"wkt\",\"geom\":\"POINT(-3.956023 40.850026)\",\"outputFormat\":\"array\",\"withCoord\":true}}".

 El resultado es:

{
 "id": "GetElevacion",
 "values": [
    [
     
-3.956023,
     40.850026,
     2426.860107421875
    ]
  ]
}

Cálculo de altitudes para varios puntos en formato WKT y Sistema de referencia EPSG 4326:

Para conocer las altitudes de los varios puntos de una ruta con el formato WKT se puede utilizar geometría MULTIPOINT (conjunto de puntos). No se pueden utilizar otros tipos de geometría como GeometryCollection, LINESTRING o POLYGON.
 {
  "inputs": {
     "crs": 4326,
     "formato": "wkt",
     "geom": "MULTIPOINT(-3.960924 40.823162, -3.962104 40.824435, -3.95394 40.83086,-3.94661 40.84799, -3.94665 40.86077, -3.956023 40.850026)",
    "withCoord": false
    "outformat": "array"
   }
 }

El cURL que se ejecuta:

curl -X POST "https://api-processes.idee.es/processes/getElevation/execution" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"inputs\":{\"crs\":4326,\"formato\":\"wkt\",\"geom\":\"MULTIPOINT(-3.960924 40.823162, -3.962104 40.824435, -3.95394 40.83086,-3.94661 40.84799, -3.94665 40.86077, -3.956023 40.850026)\",\"outputFormat\":\"array\",\"withCoord\":false}}".

El resultado obtenido nos muestra las altitudes de los puntos:

{
 "id": "GetElevacion",
 "values": [
    [
      
1821.1390380859375,
     1848.135986328125,
     1929.6490478515625,
     2058.2919921875,
     2171.02587890625,
     2426.860107421875
    ]
  ]
}

Cálculo de altitudes para varios puntos en formato WKT y Sistema de Referencia EPSG 25830:

Para realizar el mismo caso anterior pero en el Sistema de Referencia UTM ETRS89 Huso 30N (EPSG: 25830) el código JSON que emplearíamos es el siguiente: 
 {
  "inputs": {
     "crs": 25830,
     "formato": "wkt",
     "geom": "MULTIPOINT (418968.65169915627 4519570.897995114,418870.69647217955 4519713.3034235155,419566.8985195706 4520419.006521905,420205.4951092379 4522313.881248297,420217.45760421915 4523732.611317685,419414.48224599997 4522548.512953534)",
    "withCoord": false
    "outformat": "array"
   }
 }

El cURL que se ejecuta:

curl -X POST "https://api-processes.idee.es/processes/getElevation/execution" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"inputs\":{\"crs\":25830,\"formato\":\"wkt\",\"geom\":\"MULTIPOINT(418968.65169915627 4519570.897995114,418870.69647217955 4519713.3034235155,419566.8985195706 4520419.006521905,420205.4951092379 4522313.881248297,420217.45760421915 4523732.611317685,419414.48224599997 4522548.512953534)\",\"outputFormat\":\"array\",\"withCoord\":false}}".

El resultado obtenido corresponde a las altitudes de los puntos indicados de la ruta:

{
 "id": "GetElevacion",
 "values": [
     
1821.1390380859375,
     1848.135986328125,
     1929.6490478515625,
     2058.2919921875,
     2171.02587890625,
     2426.860107421875
    ]
 }

Este artículo forma parte de una serie,  para saber más sobre OGC API Processes y otros procesos del Servicio OGC API procesos del CNIG consulta el artículo índice.

Publicado por María José García Rodríguez.

No hay comentarios: