12 dic 2024

Servicio OGC API de procesos (OGC API Processes): Proceso elevationProfile.



El proceso de OGC API ElevationProfile consiste en generar el perfil de elevaciones entre dos o más puntos. Para ello, se interpolan puntos intermedios en cada tramo, ajustando el número total de subtramos al valor entero más cercano al parámetro de distancia especificado. En casos donde se incluyen más de dos puntos, la longitud de los subtramos se calcula individualmente para cada tramo.

Este cálculo se realiza utilizando el Modelo Digital del Terreno (MDT05) del Plan Nacional de Ortofotografía Aérea, proporcionado por el Instituto Geográfico Nacional. Para representar el perfil de elevaciones de manera más precisa, se recomienda incluir las coordenadas de los puntos en el perfil y calcular las distancias de los subtramos, lo que permite obtener información más detallada.

En la página de API processes ElevationProfile se pueden consultar los parámetros de entrada y de salida.

Datos de entrada:
  • «geom»: Parámetro obligatorio corresponde con la geometría de puntos o lista de puntos que van a ser procesados. Tipo de dato String
  • «formato»: parámetro obligatorio que indica el formato en que se proporciona la geometría del parámetro «geom». Los formatos soportados son GeoJSON (feature collection) y 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.
  • «distancia»distancia de referencia para el espaciado entre puntos intermedios, utilizados para la obtención del perfil, entre los puntos proporcionados en el parámetro geom. Las unidades son metros. La distancia por defecto es 20m y la mínima es 5m. Los puntos intermedios se crean según el parámetro distancia, creando un número entero de tramos iguales para los que se calcula el desnivel. Por la forma de cálculo, la distancia entre los puntos intermedios puede variar respecto a la introducida. Para representar correctamente el resultado se recomienda obtener los datos con coordenadas. 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.
  • «withDistances»es un parámetro booleano para obtener las longitudes de los subtramos calculados a partir de los puntos intermedios. Es un parámetro opcional. Si no se proporciona se considera false. Tipo de dato: boolean.
Datos de salida:
  • «id»: Identificador del proceso.
  • «crs»identificador del sistema de referencia de las coordenadas calculadas.
  • «values» que es el resultado en forma de lista con las elevaciones para los puntos procesados, tanto dados como intermedios, en el mismo orden dado.
  • «distancias_sub»corresponde con una lista (array) de las distancias de los subtramos, en el mismo orden dado. Las distancias se calculan sobre el elipsoide por lo que puede haber ligeras diferencias respecto a las proyectadas.
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/elevationProfile/execution y es obligatorio ejecutar la petición en JSON.

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 elevationProfile de una manera sencilla, de modo que podemos verificar el procedimiento para la obtención del perfil de elevaciones entre dos o más puntos. 

Proceso API de OGC del cálculo del perfil de elevaciones (elevationProfile)

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.

La geometría de las entidades espaciales (en formato WKT o GeoJSON) viene definida por el parámetro geom según se vaya a calcular el perfil, ya sea de forma simple por un punto de inicio y un punto final o por una serie de puntos de una ruta. A continuación, vemos diferentes casos partiendo de las coordenadas geográficas de dos o varios puntos en diferentes sistema de referencia WGS84 (EPSG:4326) y EPSG:25830. 

GEOMETRÍA

FORMATO WKT

FORMATO GEOJSON

EPSG: 4326

EPSG: 25830

EPSG: 4326

DOS PUNTOS

X

 

X

VARIOS PUNTOS

X

X

X

CÁLCULO DEL PERFIL DE ELEVACIÓN PARA DOS PUNTOS

  • Cálculo de un perfil de elevaciones para dos puntos y distancia en formato WKT en el Sistema de Referencia de Coordenadas EPSG 4326

Vamos a calcular el perfil de elevaciones para unas coordenadas geográficas dadas en longitud y latitud, en el Sistema de referencia WGS84 (EPSG:4326) desde un punto de inicio situado en Cotos (-3.960924, 40.823162) a un punto de final de la Cima de Peñalara (-3.956023, 40.850026) (Figura 2).

Representación de los puntos de inicio y final de una ruta en el visualizador IBERPIX.

Para introducir las altitudes de los puntos de la ruta en el formato WKT, se puede utilizar geometría MULTIPOINT (conjunto de puntos). Sin embargo, no se pueden utilizar otros tipos de geometría como colección de geometrías, GeometryCollection, LINESTRING o POLYGON.

El código JSON empleado para obtención del perfil de elevaciones en formato WKT y Sistema de Referencia WGS84 (EPSG 4326) es el siguiente:

 {
 "inputs": {
    "crs": 4326,

    "distance": 500,
    "formato": "wkt",
    "geom": "MULTIPOINT(-3.960924 40.823162, -3.956023 40.850026)",
    "withCoord": true,
    "withDistances": false,
   }
 }

El cURL que se ejecuta:

curl -X POST "https://api-processes.idee.es/processes/elevationProfile/execution" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"inputs\":{\"crs\":4326,\"distance\":500,\"formato\":\"wkt\",\"geom\":\"MULTIPOINT(-3.960924 40.823162, -3.956023 40.850026)\",\"withCoord\":true,\"withDistances\":false}}"

El resultado obtenido nos muestra las altitudes de los puntos:

 {
 "id": "ElevationProfile"
    "crs": 4326,

    "values": [,
     [
        -3.960924,
        40.823162,
        1821.1390380859375
     ],
     [
        
-3.9601071666666665,
        
40.82763933333334,
        
1949.5150146484375
     ],
     [
        
-3.959290333333333,
        
40.83211666666667,
        
2064.240966796875
     ],
     [
        
-3.9584735,
        
40.836594000000005,
        
2065.27197265625
     ],

     [
        
-3.957656666666667,
        
40.84107133333333,
        
2038.9560546875
     ],

     [
        
-3.9568398333333334,
        
40.845548666666666,
        
2273.09912109375
     ],
     [
        
-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/elevationProfile/execution'
 
 myObj = {
             "inputs": {
             "crs": 4326,
             "distance": 500,
             "formato": "wkt,
             "formato": "geojson",
             "geom": "MULTIPOINT(-3.960924 40.823162, -3.956023 40.850026)",
              "withCoord": True,
              "withDistances": false
 
          }
 }

 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 un perfil de elevaciones a partir de dos puntos en formato GeoJSON en el Sistema de Referencia de Coordenadas WGS84 (EPSG 4326).

Para el cálculo de un perfil de elevaciones de dos puntos de la ruta en formato GeoJSON y en el Sistema de Referencia de Coordenadas (EPSG: 4326), utilizaremos el siguiente código JSON:

 {
 "inputs": {
    "crs": 4326,

    "distance": 500,
    "formato": "geojson",
    "geom": 
"{\"type\": \"FeatureCollection\",\"features\": [{\"geometry\": {\"coordinates\": [-3.960924,40.823162],\"type\": \"Point\"},\"type\": \"Feature\"},{\"geometry\": {\"coordinates\": [-3.956023,40.850026],\"type\": \"Point\"},\"type\": \"Feature\"}]}",
    "withCoord": true,
    "withDistances": true,
   }
 }

El cURL que se ejecuta:

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

El resultado obtenido nos muestra las altitudes de los puntos indicados de la ruta. Al utilizar el valor True en el parámetro «withoutCoord», se muestra en el resultado las coordenadas (longitud, latitud) y el valor de la altitud para ese punto. Asimismo, al indicar en el parámetro de entrada «distancias_sub» igual a True obtenemos la distancia de los subtramos:

 {
 "id": "ElevationProfile"
    "crs": 4326,

    "values": [,
     [
        -3.960924,
        40.823162,
        1821.1390380859375
     ],
     [
        
-3.9601071666666665,
        
40.82763933333334,
        
1949.5150146484375
     ],
     [
        
-3.959290333333333,
        
40.83211666666667,
        
2064.240966796875
     ],
     [
        
-3.9584735,
        
40.836594000000005,
        
2065.27197265625
     ],

     [
        
-3.957656666666667,
        
40.84107133333333,
        
2038.9560546875
     ],

     [
        
-3.9568398333333334,
        
40.845548666666666,
        
2273.09912109375
     ],
     [
        
-3.956023,
        
40.850026,
        
2426.860107421875
     ],
   ]
   "distancias_sub": [
    502,
    502,
    502,
    502,
    502,
    502,
   ]
 }

CÁLCULO DEL PERFIL DE ELEVACIÓN PARA VARIOS PUNTOS

Este proceso API de elevationProfile es también capaz de realizar el cálculo de perfiles de elevaciones para varios puntos de un recorrido. En los siguientes ejemplos se calculará el perfil de elevaciones para varios tramos. Para ello, siguiendo con el ejemplo, se añadirán varios puntos entre el punto de inicio y punto final en la ruta de senderismo desde Peñalara al Puerto de Cotos. De esta manera, se obtendrá un recorrido más realista y un análisis más detallado de la zona, como podemos ver la representación de los puntos en el visualizador IBERPIX.

Representación de los puntos de la ruta de Peñalara en el visualizador IBERPIX.

Los datos de entrada se dan en formato WKT en los Sistemas de Referencia de Coordenadas geográficas y proyectadas (EPSG: 4326 y EPSG:25830), y también, en formato GeoJSON en el Sistema de Referencia de Coordenadas geográficas (EPSG: 4326).

FORMATO WKT

  • Cálculo de un perfil de elevaciones de varios puntos en formato WKT en el Sistema de Referencia de Coordenadas EPSG 4326.

Para el cálculo de un perfil de elevaciones de los puntos de la ruta en formato WKT y en el Sistema de Referencia geográficas (EPSG:4326), utilizaremos el siguiente código JSON:

 {
 "inputs": {
    "crs": 4326,

    
"distance": 500, 
    
"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": true
    "withDistances": true
    }
}

El cURL que se ejecuta:

curl -X POST "https://api-processes.idee.es/processes/elevationProfile/execution" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"inputs\":{\"crs\":4326,\"distance\":500,\"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\":true,\"withDistances\":true}}"


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

 {
 "id": "ElevationProfile"
    "crs": 4326,

    "values": [,
     [
        -3.960924,
        40.823162,
        1821.1390380859375
     ],
     [
        
-3.962104,
        
40.824435,
        
1848.135986328125
     ],
     [
        
-3.9580219999999997,
        
40.8276475,
        
1959.6820068359375
     ],
     [
        
-3.95394,
        
40.83086,
        
1929.6490478515625
     ],

     [
        
-3.9521075,
        
40.8351425,
        
1960.8199462890625
     ],
     [
        
-3.950275,
        
40.839425000000006,
        
1950.9449462890625
     ],
     [
        
-3.9484425,
        
40.8437075,
        
2048.321044921875
     ],
     [
        
-3.94661,
        
40.84799,
        
2058.2919921875
     ],
     [
        
-3.9466233333333336,
        
40.852250000000005,
        
2126.090087890625
     ],
     [
        
-3.9466366666666666,
        
40.85651,
        
2152.4599609375
     ],
     [
        
-3.94665,
        
40.86077,
        
2171.02587890625
     ],

     [
        
-3.9497743333333335,
        
40.857188666666666 ,
        
2200.6220703125
     ],

     [
        
-3.9528986666666666,
        
40.853607333333336,
        
2330.822998046875
     ],
     [
        
-3.956023,
        
40.850026,
        
2426.860107421875
     ],
   ]
   "distancias_sub": [
    179.9,
    495.8,
    495.8,
    500.1,
    
500.1,
    
500.1,
    
500.1,
    473.1,
    
473.1,
    
473.1,
    477,
    
477,
    
477,
   ]
 }

  • Cálculo de un perfil de elevaciones de varios puntos en formato WKT en el Sistema de Referencia de Coordenadas EPSG 25830.
Para el cálculo de un perfil de elevaciones de los puntos de la ruta en formato WKT y en el Sistema de Referencia de Proyección UTM ETRS89 Huso 30 N (EPSG:25830), utilizaremos el siguiente código JSON:

 {
 "inputs": {
    "crs": 25830,

    
"distance": 500, 
    
"formato": "wkt", 
    
"geom": "MULTIPOINT (418968.652 4519570.898,418870.696 4519713.303,419566.899 4520419.007,420205.495 4522313.881,420217.458 4523732.611,419414.489 4522548.480)",
    
"withCoord": true
    "withDistances": true
    }
}

El cURL que se ejecuta:

curl -X POST "https://api-processes.idee.es/processes/elevationProfile/execution" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"inputs\":{\"crs\":25830,\"distance\":500,\"formato\":\"wkt\",\"geom\":\"MULTIPOINT(418968.652 4519570.898,418870.696 4519713.303,419566.899 4520419.007,420205.495 4522313.881,420217.458 4523732.611,419414.489 4522548.480)\",\"withCoord\":true,\"withDistances\":true}}"


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

 {
 "id": "ElevationProfile"
    "crs": 25830,

    "values": [,
     [
        
418968.652,
        
4519570.897999999,
        
1821.1390380859375
     ],
     [
        
418870.696,
        
4519713.303000001,
        
1848.135986328125
     ],
     [
        
419218.81401861215,
        
4520066.146946875,
        
1959.6820068359375
     ],
     [
        
419566.899,
        
4520419.006999999,
        
1929.6490478515625
     ],
     [
        
419726.5771805296,
        
4520892.720246325,
        
1960.8199462890625
     ],
     [
        
419886.23590908386,
        
4521366.436994881,
        
1950.9449462890625
     ],
     [
        
420045.8751830962,
        
4521840.157245996,
        
2048.321044921875
     ],
     [
        
420205.49500000005,
        
4522313.881000001,
        
2058.2919921875
     ],
     [
        
420209.4820795562,
        
4522786.7906584535,
        
2126.090087890625
     ],
     [
        
420213.46974622586,
        
4523259.700658451,
        
2152.4599609375
     ],
     [
        
420217.458,
        
4523732.611 ,
        
2152.4599609375
     ],

     [
        
419949.8297594411,
        
4523337.891134621 ,
        
2200.6220703125
     ],

     [
        
419682.17342513846,
        
4522943.180801501,
        
2330.822998046875
     ],
     [
        
419414.489,
        
4522548.4799999995,
        
2426.860107421875
     ],
   ]
   "distancias_sub": [
    179.9,
    495.8,
    495.8,
    500.1,
    
500.1,
    
500.1,
    
500.1,
    473.1,
    
473.1,
    
473.1,
    477,
    
477,
    
477,
   ]
 }

FORMATO GEOJSON
  • Cálculo de un perfil de elevaciones de varios puntos en formato GeoJSON en el Sistema de Referencia de Coordenadas EPSG 4326.
En el caso que quisiéramos obtener las altitudes de una colección o listado de puntos, en el formato GeoJSON en el Sistema de Coordenadas de Referencia WGS84 (EPSG 4326) que viene dado en longitud y latitud, el código JSON de entrada de este proceso es:

 {
 "inputs": {
    "crs": 4326,

    
"distance": 500, 
    
"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\"}]}",
    
"withCoord": true
    "withDistances": true
    }
}

El cURL que se ejecuta:

curl -X POST "https://api-processes.idee.es/processes/elevationProfile/execution" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"inputs\":{\"crs\":4326,\"distance\":500,\"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\\\"}]}\",\"withCoord\":true,\"withDistances\":true}}"


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

 {
 "id": "ElevationProfile"
    "crs": 4326,

    "values": [,
     [
        -3.960924,
        40.823162,
        1821.1390380859375
     ],
     [
        
-3.962104,
        
40.824435,
        
1848.135986328125
     ],
     [
        
-3.9580219999999997,
        
40.8276475,
        
1959.6820068359375
     ],
     [
        
-3.95394,
        
40.83086,
        
1929.6490478515625
     ],

     [
        
-3.9521075,
        
40.8351425,
        
1960.8199462890625
     ],
     [
        
-3.950275,
        
40.839425000000006,
        
1950.9449462890625
     ],
     [
        
-3.9484425,
        
40.8437075,
        
2048.321044921875
     ],
     [
        
-3.94661,
        
40.84799,
        
2058.2919921875
     ],
     [
        
-3.9466233333333336,
        
40.852250000000005,
        
2126.090087890625
     ],
     [
        
-3.9466366666666666,
        
40.85651,
        
2152.4599609375
     ],
     [
        
-3.94665,
        
40.86077,
        
2171.02587890625
     ],

     [
        
-3.9497743333333335,
        
40.857188666666666 ,
        
2200.6220703125
     ],

     [
        
-3.9528986666666666,
        
40.853607333333336,
        
2330.822998046875
     ],
     [
        
-3.956023,
        
40.850026,
        
2426.860107421875
     ],
   ]
   "distancias_sub": [
    179.9,
    495.8,
    495.8,
    500.1,
    
500.1,
    
500.1,
    
500.1,
    473.1,
    
473.1,
    
473.1,
    477,
    
477,
    
477,
   ]
 }

Si representamos el perfil de elevaciones de la ruta con los resultados obtenidos de los puntos intermedios y distancias de los subtramos, obtendríamos el siguiente gráfico en una hoja de cálculo Excel:

Representación gráfica del perfil de elevaciones de la ruta de senderismo calculada con API Processes elevationProfile

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: