Hice esta pregunta en SO, pero ahora me doy cuenta de que tal vez este es un foro más adecuado. Necesito generar una rejilla hexagonal para todo el mundo y almacenarla en mi db.
Antecedentes: Tengo más de 300K puntos lng/lat y me gustaría crear un mapa de densidad de puntos (heatmap). Pero en lugar de enviar más de 300K puntos al navegador, me gustaría agruparlos usando una rejilla hexagonal de un tamaño adecuado para que el número de polígonos (en este caso) a enviar al navegador sea más razonable. Voy a jugar con el tamaño de la rejilla, tal vez 200kms lado, o incluso generar y almacenar diferentes rejillas de tamaño para diferentes niveles de zoom. De ahí mi necesidad de generar esto en el servidor y almacenarlo.
Estoy utilizando @turf/hex-grid
v 6.5.0 pero sin llegar a ninguna parte.
// area of 510M sq kms
const EARTH = 510000000;
// https://www.math.net/area-of-a-hexagon
const hexarea = (side) => 3 * Math.sqrt(3) * side * side / 2;
const bbox = [-179.99, -90, 179.99, 90];
const options = { units: 'kilometers' };
const output = (side) => {
const area_of_hex = hexarea(side);
const grid = turf.hexGrid(bbox, side, options);
console.log(`area of hexagon of side ${side} kms: ${area_of_hex}`);
console.log(`number of hexagons to cover the earth: ${EARTH / area_of_hex}`);
console.log(`num of hexagons generated by turf: ${grid.features.length}`);
console.log(grid);
console.log('----------------------------')
}
output(200);
output(1);
// output
area of hexagon of side 500 kms: 649519.052838329
number of hexagons to cover the earth: 785.1963660978911
num of hexagons generated by turf: 0
{ type: 'FeatureCollection', features: [] }
----------------------------
area of hexagon of side 1 kms: 2.598076211353316
number of hexagons to cover the earth: 196299091.52447274
num of hexagons generated by turf: 11555
{
type: 'FeatureCollection',
features: [
{ type: 'Feature', properties: {}, geometry: [Object] },
{ type: 'Feature', properties: {}, geometry: [Object] },
… (98 more lines like above) …
... 11455 more items
]
}
Desconcertantemente, puedo generar una cuadrícula hexagonal global si utilizo turf@2.0.0
disponible en //api.tiles.mapbox.com/mapbox.js/plugins/turf/v2.0.0/turf.min.js (he visto un ejemplo que funciona en http://muxlab.github.io/map-effects-100/Leaflet/10_hex-grid-with-turf.html código en https://github.com/muxlab/map-effects-100/blob/gh-pages/Leaflet/10_hex-grid-with-turf.html pero ese código utiliza un lado de la celda muy poco intuitivo de 1
con unidades kilometers
. Como ya se ha señalado, un hexágono de 1 km de lado requeriría más de 196299091 hexágonos. Pero, turf2.0.0
genera un número razonable de celdas hexagonales, como se ve en el mapa enlazado más arriba.
Veo que hay un tema sobre este problema https://github.com/Turfjs/turf/issues/2199 pero lo pregunto aquí por si alguien puede arrojar luz sobre lo que está pasando? ¿Hay alguna librería JS mejor? ¿Hay límites para bbox
? Soy consciente de que la cuadrícula será aproximada hacia los polos, pero no me importa ir sólo hasta donde sea práctico.