@salo/interactive-map
Version:
An SVG interactive map
139 lines (120 loc) • 4.67 kB
JavaScript
import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each";
import _mapInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/map";
import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter";
import _concatInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/concat";
import _toConsumableArray from "@babel/runtime-corejs3/helpers/toConsumableArray";
import _sortInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/sort";
import _reduceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/reduce";
import _isEmpty from "lodash/isEmpty";
import _indexOf from "lodash/indexOf";
/**
* EVALUATE COORDINATES FROM LATITUDE & LONGITUDE
*
* @param {*} { lat, lon }
* @returns
*/
export var evalCoordinates = function evalCoordinates(_ref) {
var lat = _ref.lat,
lon = _ref.lon;
// lat = N - S
// lon = W - E
var x = 0;
var y = 0;
var mapWidth = 1717;
var mapHeight = 1291; // get x value
x = (lon + 180) * (mapWidth / 360) / mapWidth * 100 - 2.75; // convert from degrees to radians
var latRad = lat * Math.PI / 180; // get y value
var mercN = Math.log(Math.tan(Math.PI / 4 + latRad / 2));
y = (mapHeight / 2 - mapWidth * mercN / (2 * Math.PI)) / mapHeight * 100 - 0.85;
return {
x: x,
y: y
};
};
/**
* EVALUATE CENTER OF AN ARRAY OF COORDINATES
*
* @param {*} { locations: [{ lat: Float, lon: Float }] }
* @returns
*/
export var evalCenter = function evalCenter(_ref2) {
var locations = _ref2.locations;
if (_isEmpty(locations)) return null; // Reduce lats and longs to get array of all location coords
var aggData = _reduceInstanceProperty(locations).call(locations, function (acc, item) {
var _context, _context2, _context3, _context4;
return {
lats: _sortInstanceProperty(_context = _concatInstanceProperty(_context2 = []).call(_context2, _toConsumableArray(acc.lats), [item.lat])).call(_context),
// sort so they are in order
lons: _sortInstanceProperty(_context3 = _concatInstanceProperty(_context4 = []).call(_context4, _toConsumableArray(acc.lons), [item.lon])).call(_context3)
};
}, {
lats: [],
lons: []
});
var centerLat = (aggData.lats[0] + aggData.lats[aggData.lats.length - 1]) / 2; // take limits and calculate the range
var centerLon = (aggData.lons[0] + aggData.lons[aggData.lons.length - 1]) / 2;
return {
lat: centerLat,
lon: centerLon
};
};
/**
* GROUP LOCATIONS BY LATITUDE
*
* @param {*} { locations, radius = 5, zoom = 1 }
* @returns
*/
export var groupPoints = function groupPoints(_ref3) {
var _context5;
var locations = _ref3.locations,
_ref3$radius = _ref3.radius,
radius = _ref3$radius === void 0 ? 5 : _ref3$radius,
_ref3$zoom = _ref3.zoom,
zoom = _ref3$zoom === void 0 ? 1 : _ref3$zoom;
var mappedLocations = [];
var latResolution = zoom ? radius / 2 / zoom : 2.5;
var lonResolution = zoom ? radius / zoom : 5;
return _filterInstanceProperty(_context5 = _mapInstanceProperty(locations).call(locations, function (location) {
// Check if location already grabbed as part of an
// earlier grouping and only proceed if not grouped
var alreadyMapped = _indexOf(mappedLocations, location);
if (alreadyMapped === -1) {
mappedLocations.push(location);
var groupedLocations = [location];
var remainingLocations = _filterInstanceProperty(locations).call(locations, function (item) {
return _indexOf(mappedLocations, item) === -1;
});
_forEachInstanceProperty(remainingLocations).call(remainingLocations, function (item) {
// CHECK IF LOCATION COLLIDES WITH ANOTHER
var latCollision = location.lat - item.lat < latResolution && location.lat - item.lat > -latResolution;
var lonCollision = location.lon - item.lon < lonResolution && location.lon - item.lon > -lonResolution;
if (latCollision && lonCollision) {
// EXCLUDE FROM A LATER MAP AND STORE
mappedLocations.push(item);
groupedLocations.push(item);
}
});
var _evalCenter = evalCenter({
locations: groupedLocations
}),
lat = _evalCenter.lat,
lon = _evalCenter.lon;
var _evalCoordinates = evalCoordinates({
lat: lat,
lon: lon
}),
x = _evalCoordinates.x,
y = _evalCoordinates.y;
return {
lat: lat,
lon: lon,
x: x,
y: y,
points: groupedLocations
};
}
return null;
})).call(_context5, function (i) {
return i;
});
};