48 lines
1.5 KiB
JavaScript
48 lines
1.5 KiB
JavaScript
import { check } from 'meteor/check';
|
|
import LGeo from 'leaflet-geodesy';
|
|
import tunion from '@turf/union';
|
|
import ttrunc from '@turf/truncate';
|
|
|
|
// https://stackoverflow.com/questions/35394577/leaflet-js-union-merge-circles
|
|
const truncOptions = { precision: 6, coordinates: 2 };
|
|
|
|
const unify = (polyList) => {
|
|
let unionTemp;
|
|
for (let i = 0; i < polyList.length; i += 1) {
|
|
const pol = polyList[i].toGeoJSON();
|
|
const cleanPol = ttrunc(pol, truncOptions);
|
|
if (i === 0) {
|
|
unionTemp = cleanPol;
|
|
} else {
|
|
unionTemp = ttrunc(tunion(unionTemp, cleanPol), truncOptions);
|
|
}
|
|
}
|
|
return unionTemp;
|
|
};
|
|
|
|
const calcUnion = (subs, group, decorated) => {
|
|
const unionGroup = group;
|
|
const copts = {
|
|
parts: 144
|
|
};
|
|
subs.forEach((osub) => {
|
|
try {
|
|
if (osub.location && osub.location.lat && osub.location.lon && osub.distance) {
|
|
check(osub.location.lon, Number);
|
|
check(osub.location.lat, Number);
|
|
check(osub.distance, Number);
|
|
const dsub = decorated(osub);
|
|
const circle = LGeo.circle([dsub.location.lat, dsub.location.lon], dsub.distance * 1000, copts);
|
|
circle.addTo(unionGroup);
|
|
} else {
|
|
console.error(`Wrong subscription ${JSON.stringify(osub)}`);
|
|
}
|
|
} catch (e) {
|
|
console.error(e, `Wrong subscription trying to make union ${JSON.stringify(osub)}`);
|
|
}
|
|
});
|
|
const unionJson = unify(unionGroup.getLayers());
|
|
return [unionJson, unionGroup.getBounds()];
|
|
};
|
|
|
|
export default calcUnion;
|