Probando la librería Turf de análisis espacial (Gracias @Mappinggis )

Hoy he visto que desde @MappingGIS han sacado un artículo sobre una librería para operaciones espaciales hecha en Javascript. Y nos viene genial para seguir completando el visor que hicimos sobre Leaflet en los anteriores post.

Para toda la información sobre la librería y los usos de esta librería con más en profundidad, visitar su artículo: Turf: Análisis espacial en la web

Desde aquí, vamos a comenzar con el visor que dejamos de Cities_Europe_leaflet.zip

Añadimos el acceso a la librería con la línea siguiente dentro del <head> de nuestra página index.html:

<script type="text/javascript" src="https:////api.tiles.mapbox.com/mapbox.js/plugins/turf/v2.0.2/turf.min.js"></script>

Recordamos que todo el código Javascript que hace referencia al mapa lo encontramos en js/leaf-demo.js

Recordar también que nosotros tenemos toda nuestra info de puntos es una variable llamada geodata, en el fichero data/cities_europe.js. Vamos a intentar hacer algo con toda esta nube de puntos. Empezamos con nuestra vista así:

2015-11-25 21_32_40-127.0.0.1_59816_index.html

Todos los métodos que voy a comentar y muchísimos más los podéis encontrar en la API de Turf, bien explicados y con sus respectivos ejemplos.

 

Una de las operaciones espaciales que tenemos es el convexHull, el polígono mínimo que engloba todos los puntos. Podemos calcularlo simplemente pasando los puntos geodata a la operación convex de turf, quedando así (todo esto después del código donde creamos nuestro mapa):

var convexHull = turf.convex(geodata);
L.geoJson(convexHull).addTo(map);

Y como lo añadimos a la vista del mapa quedaría así:

2015-11-25 21_31_42-127.0.0.1_59816_index.html

 

Podemos crear una cuadrícula de hexágonos dentro de nuestro boundary box:

var bbox = [-10,30,75,60];
var cellWidth = 500;
var units = 'miles';
var hexgrid = turf.hexGrid(bbox, cellWidth, units);
L.geoJson(hexgrid).addTo(map);

2015-11-25 21_41_54-127.0.0.1_59816_index.html

Para el último ejemplo de isolines podríamos crear unos puntos aleatorios como usan en su web para los ejemplos:


var points = turf.random('point', 100, {
bbox: [0, 30, 20, 50]
});

Pero nosotros vamos a aprovechar para darle un valor aleatorio a la Z de los puntos que ya tenemos en geodata. Para ello usamos:


for (var i = 0; i < geodata.features.length; i++) {
geodata.features[i].properties.z = Math.random() * 10;
}
var breaks = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var isolined = turf.isolines(geodata, 'z', 15, breaks);
L.geoJson(isolined).addTo(map);

Quedando así (no es bonito al ser valores aleatorios, pero para visualizarlo sobra):

2015-11-25 21_50_04-127.0.0.1_59816_index.html

 

En resumen, nuestro código en leaf-demo.js quedaría así, en el cual visualizaríamos los tres ejemplos juntos anteriores:

var bounds = L.latLngBounds([30, -10], [60, 75]);

var map = L.map( 'map', {
    center: [50, 10],
    minZoom: 2,
    zoom: 5,
    zoomControl: false,
    maxBounds: bounds
});


// Example: convexHull
var convexHull = turf.convex(geodata);
L.geoJson(convexHull).addTo(map);

// Example: hexgrid
var bbox = [-10,30,75,60];
var cellWidth = 500;
var units = 'miles';
var hexgrid = turf.hexGrid(bbox, cellWidth, units);
L.geoJson(hexgrid).addTo(map);


// Example: Isolines
/*
var points = turf.random('point', 100000, {
  bbox: [-10,30,75,60]
});
*/

for (var i = 0; i < geodata.features.length; i++) {
  geodata.features[i].properties.z = Math.random() * 10;
}
var breaks = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var isolined = turf.isolines(geodata, 'z', 15, breaks);
L.geoJson(isolined).addTo(map);


// Previous code
L.marker([50, 10]).addTo(map);

L.tileLayer( 'http://a.tile.openstreetmap.org/{z}/{x}/{y}.png', {
    attribution: 'OpenStreetMap',
}).addTo( map );


var geojsonMarkerOptions = {
    radius: 5,
    fillColor: "#ff7800",
    color: "#000",
    weight: 1,
    opacity: 1,
    fillOpacity: 0.8
};

L.geoJson(geodata, {
    pointToLayer: function (feature, latlng) {
        return L.circleMarker(latlng, geojsonMarkerOptions);
    }
}).addTo(map);

Agradecer a Mappinggis por el artículo, no conocía esta librería.

Un saludo y espero que os sean estos ejemplos de utilidad.

Os podéis descargar el ejemplo completo desde aquí.

2 comentarios
  1. Muy buen artículo, este complemento el nuestro con alguna herramienta de análisis espacial más.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: