Saltar al contenido principal

Trabaja polígonos en Auravant más fácil con TurfJS

· 5 min de lectura
Guille Gonzalez
Project Leader

¿Estuviste desarrollando en Auravant y te encontraste con dificultades para trabajar con polígonos? Seguí leyendo que tengo una solución para vos.

thumbnail image

¡Hola a todos!

En este artículo, vamos a hablar sobre Turf.js, una excelente biblioteca de Javascript que facilita el análisis geoespacial. No importa si eres un experto en GIS (Sistemas de Información Geográfica) o sólo un desarrollador de extensiones, Turf.js te será de ayuda si quieres interactuar con el polígono de tu lote. ¡Empezemos!

¿Qué es Turf.js?

Turf.js es como el asistente mágico del análisis geoespacial, pero en forma de biblioteca de código abierto en JavaScript. Lo que hace es tomar tareas complicadas relacionadas con mapas y simplificarlas. Un ejemplo para entenderlo mejor:

const punto = turf.point([-73.935242, 40.730610]); // Crear un punto
const polígono = turf.polygon([[
[-73.988418, 40.747727],
[-73.949141, 40.747727],
[-73.949141, 40.717124],
[-73.988418, 40.717124],
[-73.988418, 40.747727]
]]); // Crear un polígono

const estáDentro = turf.booleanPointInPolygon(punto, polígono);

console.log(estáDentro); // ¡Verdadero!

¡Mira qué simple! En solo unas pocas líneas, hemos determinado si un punto se encuentra dentro de un polígono. Turf.js hace toda la magia por nosotros.

¿Por qué elegir Turf.js?

  1. Fácil de Usar Una de las mejores cosas de Turf.js es su API amigable. Olvídate de las ecuaciones complejas y las fórmulas crípticas. Con Turf.js, puedes realizar operaciones geoespaciales asombrosas con solo unas pocas líneas de código.

  2. Funcionalidad Completa Turf.js ofrece una amplia variedad de funciones geoespaciales, desde cálculos básicos de distancia y área hasta operaciones avanzadas como uniones espaciales y comprobaciones topológicas. Es como tener un conjunto completo de herramientas geoespaciales a tu disposición.

  3. Rendimiento Óptimo La biblioteca está diseñada para un rendimiento excepcional. Aprovecha las capacidades de los navegadores web modernos y puede manejar grandes conjuntos de datos de manera eficiente. Esto es esencial para aplicaciones que requieren análisis geoespaciales en tiempo real y del lado del cliente.

Un ejemplo del mundo real

Hasta aquí bien, pero, ¿qué tiene que ver con Auravant? Por si aún no te diste cuenta, cuando obtenemos información de nuestro lote, vemos una propiedad que nos proporciona el polígono georreferenciado en formato WKT del lote. Si no sabes lo que es un WKT, recomiendo este artículo sobre Todo lo que necesitas saber sobre representación geoespacial.

Sigamos… En muchas oportunidades buscamos relacionar una capa de información que tenemos en GeoJSON con nuestro lote. Aquí es donde Turf.js nos ayuda. Supongamos que tenemos una capa geográfica con información sobre un tipo específico de suelo y queremos saber si un lote en cuestión tiene ese tipo de suelo.

Por un lado, tenemos el polígono del lote, y por el otro, el polígono del tipo de suelo. Ya vas entendiendo por donde viene el tema… Veamos cómo utilizar el SDK de Auravant y Turf.js para relacionar estas capas.

Primero obtenemos el polígono del lote seleccionado en la plataforma:

const lote = avt.state.async_getActualField()
.then(res => {
console.log(res)
return res
})

/* Obtendremos algo como esto:
{
"result": "success",
"info": {
"id": "000000",
"bounds": [
-59.7994038300101,
-37.1375243175337,
-59.7794483731461,
-37.1246961699717
],
"nombre": "tosca",
"area": 120.121,
"centroide": "POINT(-59.7897197433957 -37.1315452604907)",
"wkt": "POLYGON((-59.7993662571025 -37.1288761511949,-59.7994038300101 -37.1289692369715,-59.7935696897473 -37.1337889219541,-59.7918327990397 -37.1351641026127,-59.7904780925349 -37.1362219338886,-59.7889467199963 -37.1373505038563,-59.7883786329894 -37.1375243175337,-59.779595069232 -37.1351769663482,-59.7794803270419 -37.1351343505663,-59.779476495263 -37.1351017151021,-59.7794609152629 -37.1349690190443,-59.7794483731461 -37.1348088742837,-59.7795962544985 -37.1345059379021,-59.7806005529878 -37.133707938882,-59.7825428590177 -37.1322148299723,-59.7924286200181 -37.1246961699717,-59.7993662571025 -37.1288761511949))"
}
}
*/

Podemos utilizar ahora alguna biblioteca como wkt para convertir el polígono en formato wkt a GeoJSON. Y, ¿por qué? Bueno, Turf.js es una biblioteca que trabaja con formato GeoJSON.

const loteGeoJSON = {
"type": "Polygon",
"coordinates": [
[
[ -59.7993662571025, -37.1288761511949 ],
[ -59.7994038300101, -37.1289692369715 ],
[ -59.7935696897473, -37.1337889219541 ],
[ -59.7918327990397, -37.1351641026127 ],
[ -59.7904780925349, -37.1362219338886 ],
[ -59.7889467199963, -37.1373505038563 ],
[ -59.7883786329894, -37.1375243175337 ],
[ -59.7795950692320, -37.1351769663482 ],
[ -59.7794803270419, -37.1351343505663 ],
[ -59.7794764952630, -37.1351017151021 ],
[ -59.7794609152629, -37.1349690190443 ],
[ -59.7794483731461, -37.1348088742837 ],
[ -59.7795962544985, -37.1345059379021 ],
[ -59.7806005529878, -37.1337079388820 ],
[ -59.7825428590177, -37.1322148299723 ],
[ -59.7924286200181, -37.1246961699717 ],
[ -59.7993662571025, -37.1288761511949 ]
]
]
}

Luego, supongamos que tenemos una capa de tipo de suelo con esta definición:

const capa = {
"type": "Feature",
"id": "3331f815-d624-1475-867e-678adf714fd0",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
-59.80395818059076,
-37.120915774733184
],
[
-59.802993851538666,
-37.129971413178914
],
[
-59.788957506447126,
-37.129117153950325
],
[
-59.78756458670522,
-37.121513822004076
],
[
-59.80395818059076,
-37.120915774733184
]
]
]
},
"properties": {
"distancias": [
"1.01km",
"1.25km",
"854.4m",
"1.46km"
],
"tipo_de_suelo": "arenoso"
}
}

Ahora, usamos la función “intersect” de Turf.js para conocer la intersección entre ambos polígonos:

const interseccion = turf.intersect(capa, loteGeoJSON)

Y eso es todo, bien sencillo. Lo interesante es que el resultado de esta función devuelve otro GeoJSON con el polígono resultante, y con este podemos trabajar. Por ejemplo, podemos calcular el área con la función turf.area, luego podemos usar el área total del lote, y el área de la intersección para conocer el porcentaje del lote que tiene este tipo de suelo.

Bonus track

Existen funciones del SDK interesantes que pueden combinarse con este resultado. Acá les dejo un listado de funciones que ayudan a obtener polígonos y dibujarlos sobre el mapa:

  • Draw feature 🔗
  • Start Draw 🔗
  • Add tooltip to feature 🔗

Conclusión

En resumen, Turf.js se presenta como un gran compañero en el apasionante mundo del análisis geoespacial. Esta biblioteca de JavaScript, con su interfaz amigable y su potente conjunto de funciones, simplifica en gran medida la resolución de problemas complejos relacionados con mapas y polígonos. Su capacidad para manejar grandes conjuntos de datos con un rendimiento óptimo es un recurso valioso para aplicaciones en tiempo real. Así que, la próxima vez que te enfrentes a un desafío geoespacial, no dudes en recurrir a Turf.js para simplificar tus tareas y llevar tus análisis a un nivel superior.