UNPKG

@salo/interactive-map

Version:
139 lines (120 loc) 4.67 kB
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; }); };