diff --git a/modules/renderer/background.js b/modules/renderer/background.js index 553047532..75e3066fd 100644 --- a/modules/renderer/background.js +++ b/modules/renderer/background.js @@ -1,15 +1,18 @@ -import * as d3 from 'd3'; -import _ from 'lodash'; -import { data } from '../../data/index'; -import { geoExtent, geoMetersToOffset, geoOffsetToMeters} from '../geo/index'; +import _find from 'lodash-es/find'; + +import { dispatch as d3_dispatch } from 'd3-dispatch'; +import { select as d3_select } from 'd3-selection'; + +import { data } from '../../data'; +import { geoExtent, geoMetersToOffset, geoOffsetToMeters} from '../geo'; import { rendererBackgroundSource } from './background_source'; import { rendererTileLayer } from './tile_layer'; -import { utilQsString, utilStringQs } from '../util/index'; +import { utilQsString, utilStringQs } from '../util'; import { utilRebind } from '../util/rebind'; export function rendererBackground(context) { - var dispatch = d3.dispatch('change'), + var dispatch = d3_dispatch('change'), baseLayer = rendererTileLayer(context).projection(context.projection), overlayLayers = [], backgroundSources; @@ -35,7 +38,7 @@ export function rendererBackground(context) { .insert('div', '.layer-data') .attr('class', 'layer layer-overlay') .merge(overlays) - .each(function(layer) { d3.select(this).call(layer); }); + .each(function(layer) { d3_select(this).call(layer); }); } @@ -161,7 +164,7 @@ export function rendererBackground(context) { background.findSource = function(id) { - return _.find(backgroundSources, function(d) { + return _find(backgroundSources, function(d) { return d.id && d.id === id; }); }; @@ -263,7 +266,7 @@ export function rendererBackground(context) { // Decide which background layer to display if (!requested && extent) { - best = _.find(this.sources(extent), function(s) { return s.best(); }); + best = _find(this.sources(extent), function(s) { return s.best(); }); } if (requested && requested.indexOf('custom:') === 0) { template = requested.replace(/^custom:/, ''); @@ -279,7 +282,7 @@ export function rendererBackground(context) { ); } - var locator = _.find(backgroundSources, function(d) { + var locator = _find(backgroundSources, function(d) { return d.overlay && d.default; }); diff --git a/modules/renderer/background_source.js b/modules/renderer/background_source.js index 5fbbfca8a..5407f1050 100644 --- a/modules/renderer/background_source.js +++ b/modules/renderer/background_source.js @@ -1,7 +1,10 @@ -import * as d3 from 'd3'; -import _ from 'lodash'; +import _clone from 'lodash-es/clone'; +import _some from 'lodash-es/some'; + +import { geoArea as d3_geoArea } from 'd3-geo'; + import { t } from '../util/locale'; -import { geoExtent, geoPolygonIntersectsPolygon } from '../geo/index'; +import { geoExtent, geoPolygonIntersectsPolygon } from '../geo'; import { jsonpRequest } from '../util/jsonp_request'; @@ -25,7 +28,7 @@ function vintageRange(vintage) { export function rendererBackgroundSource(data) { - var source = _.clone(data), + var source = _clone(data), offset = [0, 0], name = source.name, description = source.description, @@ -69,7 +72,7 @@ export function rendererBackgroundSource(data) { source.area = function() { if (!data.polygon) return Number.MAX_VALUE; // worldwide - var area = d3.geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] }); + var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] }); return isNaN(area) ? 0 : area; }; @@ -182,7 +185,7 @@ rendererBackgroundSource.Bing = function(data, dispatch) { bing.copyrightNotices = function(zoom, extent) { zoom = Math.min(zoom, 21); return providers.filter(function(provider) { - return _.some(provider.areas, function(area) { + return _some(provider.areas, function(area) { return extent.intersects(area.extent) && area.zoom[0] <= zoom && area.zoom[1] >= zoom; diff --git a/modules/renderer/features.js b/modules/renderer/features.js index d706556ae..281e27da4 100644 --- a/modules/renderer/features.js +++ b/modules/renderer/features.js @@ -1,6 +1,12 @@ -import * as d3 from 'd3'; -import _ from 'lodash'; -import { osmEntity } from '../osm/index'; +import _clone from 'lodash-es/clone'; +import _groupBy from 'lodash-es/groupBy'; +import _reduce from 'lodash-es/reduce'; +import _some from 'lodash-es/some'; +import _union from 'lodash-es/union'; + +import { dispatch as d3_dispatch } from 'd3-dispatch'; + +import { osmEntity } from '../osm'; import { utilRebind } from '../util/rebind'; @@ -48,7 +54,7 @@ export function rendererFeatures(context) { 'obliterated': true }; - var dispatch = d3.dispatch('change', 'redraw'), + var dispatch = d3_dispatch('change', 'redraw'), _cullFactor = 1, _cache = {}, _features = {}, @@ -250,7 +256,7 @@ export function rendererFeatures(context) { features.gatherStats = function(d, resolver, dimensions) { var needsRedraw = false, - type = _.groupBy(d, function(ent) { return ent.type; }), + type = _groupBy(d, function(ent) { return ent.type; }), entities = [].concat(type.relation || [], type.way || [], type.node || []), currHidden, geometry, matches, i, j; @@ -340,7 +346,7 @@ export function rendererFeatures(context) { if (parents.length === 1 && parents[0].isMultipolygon()) { var pkey = osmEntity.key(parents[0]); if (_cache[pkey] && _cache[pkey].matches) { - matches = _.clone(_cache[pkey].matches); + matches = _clone(_cache[pkey].matches); continue; } } @@ -421,11 +427,11 @@ export function rendererFeatures(context) { } // gather ways connected to child nodes.. - connections = _.reduce(childNodes, function(result, e) { - return resolver.isShared(e) ? _.union(result, resolver.parentWays(e)) : result; + connections = _reduce(childNodes, function(result, e) { + return resolver.isShared(e) ? _union(result, resolver.parentWays(e)) : result; }, connections); - return connections.length ? _.some(connections, function(e) { + return connections.length ? _some(connections, function(e) { return features.isHidden(e, resolver, e.geometry(resolver)); }) : false; }; diff --git a/modules/renderer/map.js b/modules/renderer/map.js index 85e960071..56dbbf8d1 100644 --- a/modules/renderer/map.js +++ b/modules/renderer/map.js @@ -1,5 +1,21 @@ -import * as d3 from 'd3'; -import _ from 'lodash'; +import _compact from 'lodash-es/compact'; +import _map from 'lodash-es/map'; +import _values from 'lodash-es/values'; + +import { set as d3_set } from 'd3-collection'; +import { dispatch as d3_dispatch } from 'd3-dispatch'; +import { interpolate as d3_interpolate } from 'd3-interpolate'; + +import { + event as d3_event, + select as d3_select +} from 'd3-selection'; + +import { + zoom as d3_zoom, + zoomIdentity as d3_zoomIdentity +} from 'd3-zoom'; + import { t } from '../util/locale'; import { geoExtent } from '../geo'; @@ -35,7 +51,7 @@ import { utilGetDimensions } from '../util/dimensions'; export function rendererMap(context) { var dimensions = [1, 1], - dispatch = d3.dispatch('move', 'drawn'), + dispatch = d3_dispatch('move', 'drawn'), projection = context.projection, curtainProjection = context.curtainProjection, dblclickEnabled = true, @@ -51,19 +67,19 @@ export function rendererMap(context) { drawAreas = svgAreas(projection, context), drawMidpoints = svgMidpoints(projection, context), drawLabels = svgLabels(projection, context), - supersurface = d3.select(null), - wrapper = d3.select(null), - surface = d3.select(null), + supersurface = d3_select(null), + wrapper = d3_select(null), + surface = d3_select(null), mouse, mousemove; - var zoom = d3.zoom() + var zoom = d3_zoom() .scaleExtent([ztok(2), ztok(24)]) - .interpolate(d3.interpolate) + .interpolate(d3_interpolate) .filter(zoomEventFilter) .on('zoom', zoomPan); - var _selection = d3.select(null); + var _selection = d3_select(null); var isRedrawScheduled = false; var pendingRedrawCall; @@ -150,19 +166,19 @@ export function rendererMap(context) { surface .call(drawLabels.observe) .on('mousedown.zoom', function() { - if (d3.event.button === 2) { - d3.event.stopPropagation(); + if (d3_event.button === 2) { + d3_event.stopPropagation(); } }, true) .on('mouseup.zoom', function() { if (resetTransform()) immediateRedraw(); }) .on('mousemove.map', function() { - mousemove = d3.event; + mousemove = d3_event; }) .on('mouseover.vertices', function() { if (map.editable() && !transformed) { - var hover = d3.event.target.__data__; + var hover = d3_event.target.__data__; surface.selectAll('.data-layer-osm') .call(drawVertices.drawHover, context.graph(), hover, map.extent(), map.zoom()); dispatch.call('drawn', this, {full: false}); @@ -170,7 +186,7 @@ export function rendererMap(context) { }) .on('mouseout.vertices', function() { if (map.editable() && !transformed) { - var hover = d3.event.relatedTarget && d3.event.relatedTarget.__data__; + var hover = d3_event.relatedTarget && d3_event.relatedTarget.__data__; surface.selectAll('.data-layer-osm') .call(drawVertices.drawHover, context.graph(), hover, map.extent(), map.zoom()); dispatch.call('drawn', this, {full: false}); @@ -204,7 +220,7 @@ export function rendererMap(context) { // This can happen if a previous `mousedown` occurred without a `mouseup`. // If we detect this, dispatch `mouseup` to complete the orphaned gesture, // so that d3-zoom won't stop propagation of new `mousedown` events. - if (d3.event.type === 'mousedown') { + if (d3_event.type === 'mousedown') { var hasOrphan = false; var listeners = window.__on; for (var i = 0; i < listeners.length; i++) { @@ -228,7 +244,7 @@ export function rendererMap(context) { } } - return d3.event.button !== 2; // ignore right clicks + return d3_event.button !== 2; // ignore right clicks } @@ -253,7 +269,7 @@ export function rendererMap(context) { if (difference) { var complete = difference.complete(map.extent()); - data = _.compact(_.values(complete)); + data = _compact(_values(complete)); filter = function(d) { return d.id in complete; }; features.clear(data); @@ -266,7 +282,7 @@ export function rendererMap(context) { if (extent) { data = context.intersects(map.extent().intersection(extent)); - var set = d3.set(_.map(data, 'id')); + var set = d3_set(_map(data, 'id')); filter = function(d) { return set.has(d.id); }; } else { @@ -299,14 +315,14 @@ export function rendererMap(context) { function dblClick() { if (!dblclickEnabled) { - d3.event.preventDefault(); - d3.event.stopImmediatePropagation(); + d3_event.preventDefault(); + d3_event.stopImmediatePropagation(); } } function zoomPan(manualEvent) { - var event = (manualEvent || d3.event), + var event = (manualEvent || d3_event), source = event.sourceEvent, eventTransform = event.transform; @@ -334,7 +350,7 @@ export function rendererMap(context) { x2 = p0[0] - p1[0] * k2, y2 = p0[1] - p1[1] * k2; - eventTransform = d3.zoomIdentity.translate(x2,y2).scale(k2); + eventTransform = d3_zoomIdentity.translate(x2,y2).scale(k2); _selection.node().__zoom = eventTransform; } @@ -444,7 +460,7 @@ export function rendererMap(context) { map.mouse = function() { - var event = mousemove || d3.event; + var event = mousemove || d3_event; if (event) { var s; while ((s = event.sourceEvent)) { event = s; } @@ -484,7 +500,7 @@ export function rendererMap(context) { .transition() .duration(duration) .on('start', function() { map.startEase(); }) - .call(zoom.transform, d3.zoomIdentity.translate(t2.x, t2.y).scale(t2.k)); + .call(zoom.transform, d3_zoomIdentity.translate(t2.x, t2.y).scale(t2.k)); } else { projection.transform(t2); transformStart = t2; @@ -517,7 +533,7 @@ export function rendererMap(context) { .transition() .duration(duration) .on('start', function() { map.startEase(); }) - .call(zoom.transform, d3.zoomIdentity.translate(t[0], t[1]).scale(k2)); + .call(zoom.transform, d3_zoomIdentity.translate(t[0], t[1]).scale(k2)); } else { projection.translate(t); transformStart = projection.transform(); @@ -547,7 +563,7 @@ export function rendererMap(context) { .transition() .duration(duration) .on('start', function() { map.startEase(); }) - .call(zoom.transform, d3.zoomIdentity.translate(t[0], t[1]).scale(k)); + .call(zoom.transform, d3_zoomIdentity.translate(t[0], t[1]).scale(k)); } else { projection.translate(t); transformStart = projection.transform(); @@ -570,7 +586,7 @@ export function rendererMap(context) { .transition() .duration(duration) .on('start', function() { map.startEase(); }) - .call(zoom.transform, d3.zoomIdentity.translate(t[0], t[1]).scale(k)); + .call(zoom.transform, d3_zoomIdentity.translate(t[0], t[1]).scale(k)); } else { projection.translate(t); transformStart = projection.transform(); diff --git a/modules/renderer/tile_layer.js b/modules/renderer/tile_layer.js index 88f2d9141..ceb846117 100644 --- a/modules/renderer/tile_layer.js +++ b/modules/renderer/tile_layer.js @@ -1,13 +1,14 @@ -import * as d3 from 'd3'; +import { select as d3_select } from 'd3-selection'; import { t } from '../util/locale'; -import { d3geoTile } from '../lib/d3.geo.tile'; + +import { d3geoTile as d3_geoTile } from '../lib/d3.geo.tile'; import { geoEuclideanDistance } from '../geo'; import { utilPrefixCSSProperty } from '../util'; export function rendererTileLayer(context) { var tileSize = 256, - geotile = d3geoTile(), + geotile = d3_geoTile(), projection, cache = {}, tileOrigin, @@ -136,7 +137,7 @@ export function rendererTileLayer(context) { function load(d) { cache[d[3]] = true; - d3.select(this) + d3_select(this) .on('error', null) .on('load', null) .classed('tile-loaded', true); @@ -145,7 +146,7 @@ export function rendererTileLayer(context) { function error(d) { cache[d[3]] = false; - d3.select(this) + d3_select(this) .on('error', null) .on('load', null) .remove(); @@ -200,7 +201,7 @@ export function rendererTileLayer(context) { .classed('tile-removing', true) .classed('tile-center', false) .each(function() { - var tile = d3.select(this); + var tile = d3_select(this); window.setTimeout(function() { if (tile.classed('tile-removing')) { tile.remove(); @@ -253,7 +254,7 @@ export function rendererTileLayer(context) { debug .selectAll('.tile-label-debug-vintage') .each(function(d) { - var span = d3.select(this); + var span = d3_select(this); var center = context.projection.invert(tileCenter(d)); source.getMetadata(center, d, function(err, result) { span.text((result && result.vintage && result.vintage.range) ||