X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/191af4a8b4bdd45c58917e34b545907b4e5df1b4..2f6165e040dff4231922a4d631085b6591d3b746:/vendor/assets/iD/iD.js diff --git a/vendor/assets/iD/iD.js b/vendor/assets/iD/iD.js index 8ffa66d17..e71d24583 100644 --- a/vendor/assets/iD/iD.js +++ b/vendor/assets/iD/iD.js @@ -174,11 +174,13 @@ } })(this); -d3 = (function(){ - var d3 = {version: "3.3.10"}; // semver -d3.ascending = function(a, b) { +!function(){ + var d3 = {version: "3.4.6"}; // semver +d3.ascending = d3_ascending; + +function d3_ascending(a, b) { return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; -}; +} d3.descending = function(a, b) { return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; }; @@ -250,17 +252,17 @@ function d3_number(x) { } d3.mean = function(array, f) { - var n = array.length, + var s = 0, + n = array.length, a, - m = 0, i = -1, - j = 0; + j = n; if (arguments.length === 1) { - while (++i < n) if (d3_number(a = array[i])) m += (a - m) / ++j; + while (++i < n) if (d3_number(a = array[i])) s += a; else --j; } else { - while (++i < n) if (d3_number(a = f.call(array, array[i], i))) m += (a - m) / ++j; + while (++i < n) if (d3_number(a = f.call(array, array[i], i))) s += a; else --j; } - return j ? m : undefined; + return j ? s / j : undefined; }; // R-7 per d3.quantile = function(values, p) { @@ -274,16 +276,17 @@ d3.quantile = function(values, p) { d3.median = function(array, f) { if (arguments.length > 1) array = array.map(f); array = array.filter(d3_number); - return array.length ? d3.quantile(array.sort(d3.ascending), .5) : undefined; + return array.length ? d3.quantile(array.sort(d3_ascending), .5) : undefined; }; -d3.bisector = function(f) { + +function d3_bisector(compare) { return { left: function(a, x, lo, hi) { if (arguments.length < 3) lo = 0; if (arguments.length < 4) hi = a.length; while (lo < hi) { var mid = lo + hi >>> 1; - if (f.call(a, a[mid], mid) < x) lo = mid + 1; + if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid; } return lo; @@ -293,17 +296,23 @@ d3.bisector = function(f) { if (arguments.length < 4) hi = a.length; while (lo < hi) { var mid = lo + hi >>> 1; - if (x < f.call(a, a[mid], mid)) hi = mid; + if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1; } return lo; } }; -}; +} -var d3_bisector = d3.bisector(function(d) { return d; }); -d3.bisectLeft = d3_bisector.left; -d3.bisect = d3.bisectRight = d3_bisector.right; +var d3_bisect = d3_bisector(d3_ascending); +d3.bisectLeft = d3_bisect.left; +d3.bisect = d3.bisectRight = d3_bisect.right; + +d3.bisector = function(f) { + return d3_bisector(f.length === 1 + ? function(d, x) { return d3_ascending(f(d), x); } + : f); +}; d3.shuffle = function(array) { var m = array.length, t, i; while (m) { @@ -425,24 +434,15 @@ d3.map = function(object) { function d3_Map() {} d3_class(d3_Map, { - has: function(key) { - return d3_map_prefix + key in this; - }, + has: d3_map_has, get: function(key) { return this[d3_map_prefix + key]; }, set: function(key, value) { return this[d3_map_prefix + key] = value; }, - remove: function(key) { - key = d3_map_prefix + key; - return key in this && delete this[key]; - }, - keys: function() { - var keys = []; - this.forEach(function(key) { keys.push(key); }); - return keys; - }, + remove: d3_map_remove, + keys: d3_map_keys, values: function() { var values = []; this.forEach(function(key, value) { values.push(value); }); @@ -453,18 +453,42 @@ d3_class(d3_Map, { this.forEach(function(key, value) { entries.push({key: key, value: value}); }); return entries; }, + size: d3_map_size, + empty: d3_map_empty, forEach: function(f) { - for (var key in this) { - if (key.charCodeAt(0) === d3_map_prefixCode) { - f.call(this, key.substring(1), this[key]); - } - } + for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) f.call(this, key.substring(1), this[key]); } }); var d3_map_prefix = "\0", // prevent collision with built-ins d3_map_prefixCode = d3_map_prefix.charCodeAt(0); +function d3_map_has(key) { + return d3_map_prefix + key in this; +} + +function d3_map_remove(key) { + key = d3_map_prefix + key; + return key in this && delete this[key]; +} + +function d3_map_keys() { + var keys = []; + this.forEach(function(key) { keys.push(key); }); + return keys; +} + +function d3_map_size() { + var size = 0; + for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) ++size; + return size; +} + +function d3_map_empty() { + for (var key in this) if (key.charCodeAt(0) === d3_map_prefixCode) return false; + return true; +} + d3.nest = function() { var nest = {}, keys = [], @@ -570,9 +594,7 @@ d3.set = function(array) { function d3_Set() {} d3_class(d3_Set, { - has: function(value) { - return d3_map_prefix + value in this; - }, + has: d3_map_has, add: function(value) { this[d3_map_prefix + value] = true; return value; @@ -581,19 +603,11 @@ d3_class(d3_Set, { value = d3_map_prefix + value; return value in this && delete this[value]; }, - values: function() { - var values = []; - this.forEach(function(value) { - values.push(value); - }); - return values; - }, + values: d3_map_keys, + size: d3_map_size, + empty: d3_map_empty, forEach: function(f) { - for (var value in this) { - if (value.charCodeAt(0) === d3_map_prefixCode) { - f.call(this, value.substring(1)); - } - } + for (var value in this) if (value.charCodeAt(0) === d3_map_prefixCode) f.call(this, value.substring(1)); } }); d3.behavior = {}; @@ -794,7 +808,7 @@ var d3_select = function(s, n) { return n.querySelector(s); }, // Prefer Sizzle, if available. if (typeof Sizzle === "function") { d3_select = function(s, n) { return Sizzle(s, n)[0] || null; }; - d3_selectAll = function(s, n) { return Sizzle.uniqueSort(Sizzle(s, n)); }; + d3_selectAll = Sizzle; d3_selectMatches = Sizzle.matchesSelector; } @@ -954,7 +968,7 @@ d3_selectionPrototype.classed = function(name, value) { // probably doesn't support it on SVG elements (which can be animated). if (typeof name === "string") { var node = this.node(), - n = (name = name.trim().split(/^|\s+/g)).length, + n = (name = d3_selection_classes(name)).length, i = -1; if (value = node.classList) { while (++i < n) if (!value.contains(name[i])) return false; @@ -979,9 +993,13 @@ function d3_selection_classedRe(name) { return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g"); } +function d3_selection_classes(name) { + return name.trim().split(/^|\s+/); +} + // Multiple class names are allowed (e.g., "foo bar"). function d3_selection_classed(name, value) { - name = name.trim().split(/\s+/).map(d3_selection_classedName); + name = d3_selection_classes(name).map(d3_selection_classedName); var n = name.length; function classedConstant() { @@ -1328,7 +1346,7 @@ d3_selectionPrototype.sort = function(comparator) { }; function d3_selection_sortComparator(comparator) { - if (!arguments.length) comparator = d3.ascending; + if (!arguments.length) comparator = d3_ascending; return function(a, b) { return a && b ? comparator(a.__data__, b.__data__) : !a - !b; }; @@ -1608,29 +1626,12 @@ d3.mouse = function(container) { return d3_mousePoint(container, d3_eventSource()); }; -// https://bugs.webkit.org/show_bug.cgi?id=44083 -var d3_mouse_bug44083 = /WebKit/.test(d3_window.navigator.userAgent) ? -1 : 0; - function d3_mousePoint(container, e) { if (e.changedTouches) e = e.changedTouches[0]; var svg = container.ownerSVGElement || container; if (svg.createSVGPoint) { var point = svg.createSVGPoint(); - if (d3_mouse_bug44083 < 0 && (d3_window.scrollX || d3_window.scrollY)) { - svg = d3.select("body").append("svg").style({ - position: "absolute", - top: 0, - left: 0, - margin: 0, - padding: 0, - border: "none" - }, "important"); - var ctm = svg[0][0].getScreenCTM(); - d3_mouse_bug44083 = !(ctm.f || ctm.e); - svg.remove(); - } - if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; - else point.x = e.clientX, point.y = e.clientY; + point.x = e.clientX, point.y = e.clientY; point = point.matrixTransform(container.getScreenCTM().inverse()); return [point.x, point.y]; } @@ -1658,6 +1659,14 @@ function d3_sgn(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; } +// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of +// the 3D cross product in a quadrant I Cartesian coordinate system (+x is +// right, +y is up). Returns a positive value if ABC is counter-clockwise, +// negative if clockwise, and zero if the points are collinear. +function d3_cross2d(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); +} + function d3_acos(x) { return x > 1 ? 0 : x < -1 ? π : Math.acos(x); } @@ -1756,37 +1765,37 @@ d3.behavior.zoom = function() { zoom.event = function(g) { g.each(function() { - var event_ = event.of(this, arguments), + var dispatch = event.of(this, arguments), view1 = view; if (d3_transitionInheritId) { - d3.select(this).transition() - .each("start.zoom", function() { - view = this.__chart__ || {x: 0, y: 0, k: 1}; // pre-transition state - zoomstarted(event_); - }) - .tween("zoom:zoom", function() { - var dx = size[0], - dy = size[1], - cx = dx / 2, - cy = dy / 2, - i = d3.interpolateZoom( - [(cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k], - [(cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k] - ); - return function(t) { - var l = i(t), k = dx / l[2]; - this.__chart__ = view = {x: cx - l[0] * k, y: cy - l[1] * k, k: k}; - zoomed(event_); - }; - }) - .each("end.zoom", function() { - zoomended(event_); - }); + d3.select(this).transition() + .each("start.zoom", function() { + view = this.__chart__ || {x: 0, y: 0, k: 1}; // pre-transition state + zoomstarted(dispatch); + }) + .tween("zoom:zoom", function() { + var dx = size[0], + dy = size[1], + cx = dx / 2, + cy = dy / 2, + i = d3.interpolateZoom( + [(cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k], + [(cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k] + ); + return function(t) { + var l = i(t), k = dx / l[2]; + this.__chart__ = view = {x: cx - l[0] * k, y: cy - l[1] * k, k: k}; + zoomed(dispatch); + }; + }) + .each("end.zoom", function() { + zoomended(dispatch); + }); } else { this.__chart__ = view; - zoomstarted(event_); - zoomed(event_); - zoomended(event_); + zoomstarted(dispatch); + zoomed(dispatch); + zoomended(dispatch); } }); } @@ -1862,65 +1871,65 @@ d3.behavior.zoom = function() { if (y1) y1.domain(y0.range().map(function(y) { return (y - view.y) / view.k; }).map(y0.invert)); } - function zoomstarted(event) { - event({type: "zoomstart"}); + function zoomstarted(dispatch) { + dispatch({type: "zoomstart"}); } - function zoomed(event) { + function zoomed(dispatch) { rescale(); - event({type: "zoom", scale: view.k, translate: [view.x, view.y]}); + dispatch({type: "zoom", scale: view.k, translate: [view.x, view.y]}); } - function zoomended(event) { - event({type: "zoomend"}); + function zoomended(dispatch) { + dispatch({type: "zoomend"}); } function mousedowned() { - var target = this, - event_ = event.of(target, arguments), - eventTarget = d3.event.target, + var that = this, + target = d3.event.target, + dispatch = event.of(that, arguments), dragged = 0, - w = d3.select(d3_window).on(mousemove, moved).on(mouseup, ended), - l = location(d3.mouse(target)), + subject = d3.select(d3_window).on(mousemove, moved).on(mouseup, ended), + location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress(); - d3_selection_interrupt.call(target); - zoomstarted(event_); + d3_selection_interrupt.call(that); + zoomstarted(dispatch); function moved() { dragged = 1; - translateTo(d3.mouse(target), l); - zoomed(event_); + translateTo(d3.mouse(that), location0); + zoomed(dispatch); } function ended() { - w.on(mousemove, d3_window === target ? mousewheelreset : null).on(mouseup, null); - dragRestore(dragged && d3.event.target === eventTarget); - zoomended(event_); + subject.on(mousemove, d3_window === that ? mousewheelreset : null).on(mouseup, null); + dragRestore(dragged && d3.event.target === target); + zoomended(dispatch); } } // These closures persist for as long as at least one touch is active. function touchstarted() { - var target = this, - event_ = event.of(target, arguments), + var that = this, + dispatch = event.of(that, arguments), locations0 = {}, // touchstart locations distance0 = 0, // distance² between initial touches scale0, // scale when we started touching - eventId = d3.event.changedTouches[0].identifier, - touchmove = "touchmove.zoom-" + eventId, - touchend = "touchend.zoom-" + eventId, - w = d3.select(d3_window).on(touchmove, moved).on(touchend, ended), - t = d3.select(target).on(mousedown, null).on(touchstart, started), // prevent duplicate events + zoomName = ".zoom-" + d3.event.changedTouches[0].identifier, + touchmove = "touchmove" + zoomName, + touchend = "touchend" + zoomName, + target = d3.select(d3.event.target).on(touchmove, moved).on(touchend, ended), + subject = d3.select(that).on(mousedown, null).on(touchstart, started), // prevent duplicate events dragRestore = d3_event_dragSuppress(); - d3_selection_interrupt.call(target); + d3_selection_interrupt.call(that); started(); - zoomstarted(event_); + zoomstarted(dispatch); // Updates locations of any touches in locations0. function relocate() { - var touches = d3.touches(target); + var touches = d3.touches(that); scale0 = view.k; touches.forEach(function(t) { if (t.identifier in locations0) locations0[t.identifier] = location(t); @@ -1945,7 +1954,7 @@ d3.behavior.zoom = function() { scaleTo(view.k * 2); translateTo(p, l); d3_eventPreventDefault(); - zoomed(event_); + zoomed(dispatch); } touchtime = now; } else if (touches.length > 1) { @@ -1956,7 +1965,7 @@ d3.behavior.zoom = function() { } function moved() { - var touches = d3.touches(target), + var touches = d3.touches(that), p0, l0, p1, l1; for (var i = 0, n = touches.length; i < n; ++i, l1 = null) { @@ -1977,7 +1986,7 @@ d3.behavior.zoom = function() { touchtime = null; translateTo(p0, l0); - zoomed(event_); + zoomed(dispatch); } function ended() { @@ -1995,24 +2004,24 @@ d3.behavior.zoom = function() { } } // Otherwise, remove touchmove and touchend listeners. - w.on(touchmove, null).on(touchend, null); - t.on(mousedown, mousedowned).on(touchstart, touchstarted); + target.on(zoomName, null); + subject.on(mousedown, mousedowned).on(touchstart, touchstarted); dragRestore(); - zoomended(event_); + zoomended(dispatch); } } function mousewheeled() { - var event_ = event.of(this, arguments); + var dispatch = event.of(this, arguments); if (mousewheelTimer) clearTimeout(mousewheelTimer); - else d3_selection_interrupt.call(this), zoomstarted(event_); - mousewheelTimer = setTimeout(function() { mousewheelTimer = null; zoomended(event_); }, 50); + else d3_selection_interrupt.call(this), zoomstarted(dispatch); + mousewheelTimer = setTimeout(function() { mousewheelTimer = null; zoomended(dispatch); }, 50); d3_eventPreventDefault(); var point = center || d3.mouse(this); if (!translate0) translate0 = location(point); scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k); translateTo(point, translate0); - zoomed(event_); + zoomed(dispatch); } function mousewheelreset() { @@ -2020,15 +2029,15 @@ d3.behavior.zoom = function() { } function dblclicked() { - var event_ = event.of(this, arguments), + var dispatch = event.of(this, arguments), p = d3.mouse(this), l = location(p), k = Math.log(view.k) / Math.LN2; - zoomstarted(event_); + zoomstarted(dispatch); scaleTo(Math.pow(2, d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1)); translateTo(p, l); - zoomed(event_); - zoomended(event_); + zoomed(dispatch); + zoomended(dispatch); } return d3.rebind(zoom, event, "on"); @@ -2047,6 +2056,15 @@ function d3_functor(v) { d3.functor = d3_functor; +d3.touch = function(container, touches, identifier) { + if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches; + if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) { + if ((touch = touches[i]).identifier === identifier) { + return d3_mousePoint(container, touch); + } + } +}; + var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, // is an interval (or frame) active? @@ -2257,7 +2275,6 @@ function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) { clip.lineEnd = ringEnd; segments = []; polygon = []; - listener.polygonStart(); }, polygonEnd: function() { clip.point = point; @@ -2267,13 +2284,15 @@ function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) { segments = d3.merge(segments); var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon); if (segments.length) { + if (!polygonStarted) listener.polygonStart(), polygonStarted = true; d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener); } else if (clipStartInside) { + if (!polygonStarted) listener.polygonStart(), polygonStarted = true; listener.lineStart(); interpolate(null, null, 1, listener); listener.lineEnd(); } - listener.polygonEnd(); + if (polygonStarted) listener.polygonEnd(), polygonStarted = false; segments = polygon = null; }, sphere: function() { @@ -2300,6 +2319,7 @@ function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) { var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), + polygonStarted = false, polygon, ring; @@ -2335,9 +2355,12 @@ function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) { var n = segment.length - 1, i = -1, point; - listener.lineStart(); - while (++i < n) listener.point((point = segment[i])[0], point[1]); - listener.lineEnd(); + if (n > 0) { + if (!polygonStarted) listener.polygonStart(), polygonStarted = true; + listener.lineStart(); + while (++i < n) listener.point((point = segment[i])[0], point[1]); + listener.lineEnd(); + } return; } @@ -2531,11 +2554,13 @@ function d3_geo_areaRingStart() { // previous point, current point. Uses a formula derived from Cagnoli’s // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). var dλ = λ - λ0, + sdλ = dλ >= 0 ? 1 : -1, + adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, - u = cosφ0 * cosφ + k * Math.cos(dλ), - v = k * Math.sin(dλ); + u = cosφ0 * cosφ + k * Math.cos(adλ), + v = k * sdλ * Math.sin(adλ); d3_geo_areaRingSum.add(Math.atan2(v, u)); // Advance the previous points. @@ -2622,11 +2647,13 @@ function d3_geo_pointInPolygon(point, polygon) { sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, - antimeridian = abs(dλ) > π, + sdλ = dλ >= 0 ? 1 : -1, + adλ = sdλ * dλ, + antimeridian = adλ > π, k = sinφ0 * sinφ; - d3_geo_areaRingSum.add(Math.atan2(k * Math.sin(dλ), cosφ0 * cosφ + k * Math.cos(dλ))); + d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ))); - polarAngle += antimeridian ? dλ + (dλ >= 0 ? τ : -τ): dλ; + polarAngle += antimeridian ? dλ + sdλ * τ : dλ; // Are the longitudes either side of the point's meridian, and are the // latitudes smaller than the parallel? @@ -3218,9 +3245,9 @@ function d3_geo_clipExtent(x0, y0, x1, y1) { for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) { b = v[j]; if (a[1] <= y) { - if (b[1] > y && isLeft(a, b, p) > 0) ++wn; + if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn; } else { - if (b[1] <= y && isLeft(a, b, p) < 0) --wn; + if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn; } a = b; } @@ -3228,10 +3255,6 @@ function d3_geo_clipExtent(x0, y0, x1, y1) { return wn !== 0; } - function isLeft(a, b, c) { - return (b[0] - a[0]) * (c[1] - a[1]) - (c[0] - a[0]) * (b[1] - a[1]); - } - function interpolate(from, to, direction, listener) { var a = 0, a1 = 0; if (from == null || @@ -4546,6 +4569,131 @@ function d3_geom_polygonClosed(coordinates) { b = coordinates[coordinates.length - 1]; return !(a[0] - b[0] || a[1] - b[1]); } +function d3_geom_pointX(d) { + return d[0]; +} + +function d3_geom_pointY(d) { + return d[1]; +} + +/** + * Computes the 2D convex hull of a set of points using Graham's scanning + * algorithm. The algorithm has been implemented as described in Cormen, + * Leiserson, and Rivest's Introduction to Algorithms. The running time of + * this algorithm is O(n log n), where n is the number of input points. + * + * @param vertices [[x1, y1], [x2, y2], …] + * @returns polygon [[x1, y1], [x2, y2], …] + */ +d3.geom.hull = function(vertices) { + var x = d3_geom_pointX, + y = d3_geom_pointY; + + if (arguments.length) return hull(vertices); + + function hull(data) { + if (data.length < 3) return []; + + var fx = d3_functor(x), + fy = d3_functor(y), + n = data.length, + vertices, // TODO use parallel arrays + plen = n - 1, + points = [], + stack = [], + d, + i, j, h = 0, x1, y1, x2, y2, u, v, a, sp; + + if (fx === d3_geom_pointX && y === d3_geom_pointY) vertices = data; + else for (i = 0, vertices = []; i < n; ++i) { + vertices.push([+fx.call(this, d = data[i], i), +fy.call(this, d, i)]); + } + + // find the starting ref point: leftmost point with the minimum y coord + for (i = 1; i < n; ++i) { + if (vertices[i][1] < vertices[h][1] + || vertices[i][1] == vertices[h][1] + && vertices[i][0] < vertices[h][0]) h = i; + } + + // calculate polar angles from ref point and sort + for (i = 0; i < n; ++i) { + if (i === h) continue; + y1 = vertices[i][1] - vertices[h][1]; + x1 = vertices[i][0] - vertices[h][0]; + points.push({angle: Math.atan2(y1, x1), index: i}); + } + points.sort(function(a, b) { return a.angle - b.angle; }); + + // toss out duplicate angles + a = points[0].angle; + v = points[0].index; + u = 0; + for (i = 1; i < plen; ++i) { + j = points[i].index; + if (a == points[i].angle) { + // keep angle for point most distant from the reference + x1 = vertices[v][0] - vertices[h][0]; + y1 = vertices[v][1] - vertices[h][1]; + x2 = vertices[j][0] - vertices[h][0]; + y2 = vertices[j][1] - vertices[h][1]; + if (x1 * x1 + y1 * y1 >= x2 * x2 + y2 * y2) { + points[i].index = -1; + continue; + } else { + points[u].index = -1; + } + } + a = points[i].angle; + u = i; + v = j; + } + + // initialize the stack + stack.push(h); + for (i = 0, j = 0; i < 2; ++j) { + if (points[j].index > -1) { + stack.push(points[j].index); + i++; + } + } + sp = stack.length; + + // do graham's scan + for (; j < plen; ++j) { + if (points[j].index < 0) continue; // skip tossed out points + while (!d3_geom_hullCCW(stack[sp - 2], stack[sp - 1], points[j].index, vertices)) { + --sp; + } + stack[sp++] = points[j].index; + } + + // construct the hull + var poly = []; + for (i = sp - 1; i >= 0; --i) poly.push(data[stack[i]]); + return poly; + } + + hull.x = function(_) { + return arguments.length ? (x = _, hull) : x; + }; + + hull.y = function(_) { + return arguments.length ? (y = _, hull) : y; + }; + + return hull; +}; + +// are three points in counter-clockwise order? +function d3_geom_hullCCW(i1, i2, i3, v) { + var t, a, b, c, d, e, f; + t = v[i1]; a = t[0]; b = t[1]; + t = v[i2]; c = t[0]; d = t[1]; + t = v[i3]; e = t[0]; f = t[1]; + return (f - b) * (c - a) - (d - b) * (e - a) > 0; +} var d3_ease_default = function() { return d3_identity; }; @@ -4995,7 +5143,7 @@ function d3_rgb_parse(format, rgb, hsl) { b = 0, // blue channel; int in [0, 255] m1, // CSS color specification match m2, // CSS color specification type (e.g., rgb) - name; + color; /* Handle hsl, rgb. */ m1 = /([a-z]+)\((.*)\)/i.exec(format); @@ -5020,22 +5168,19 @@ function d3_rgb_parse(format, rgb, hsl) { } /* Named colors. */ - if (name = d3_rgb_names.get(format)) return rgb(name.r, name.g, name.b); + if (color = d3_rgb_names.get(format)) return rgb(color.r, color.g, color.b); /* Hexadecimal colors: #rgb and #rrggbb. */ - if (format != null && format.charAt(0) === "#") { + if (format != null && format.charAt(0) === "#" && !isNaN(color = parseInt(format.substring(1), 16))) { if (format.length === 4) { - r = format.charAt(1); r += r; - g = format.charAt(2); g += g; - b = format.charAt(3); b += b; + r = (color & 0xf00) >> 4; r = (r >> 4) | r; + g = (color & 0xf0); g = (g >> 4) | g; + b = (color & 0xf); b = (b << 4) | b; } else if (format.length === 7) { - r = format.substring(1, 3); - g = format.substring(3, 5); - b = format.substring(5, 7); + r = (color & 0xff0000) >> 16; + g = (color & 0xff00) >> 8; + b = (color & 0xff); } - r = parseInt(r, 16); - g = parseInt(g, 16); - b = parseInt(b, 16); } return rgb(r, g, b); @@ -5304,89 +5449,55 @@ function d3_interpolateNumber(a, b) { d3.interpolateString = d3_interpolateString; function d3_interpolateString(a, b) { - var m, // current match - i, // current index - j, // current index (for coalescing) - s0 = 0, // start index of current string prefix - s1 = 0, // end index of current string prefix + var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, // scan index for next number in b + am, // current match in a + bm, // current match in b + bs, // string preceding current number in b, if any + i = -1, // index in s s = [], // string constants and placeholders - q = [], // number interpolators - n, // q.length - o; + q = []; // number interpolators // Coerce inputs to strings. a = a + "", b = b + ""; - // Reset our regular expression! - d3_interpolate_number.lastIndex = 0; - - // Find all numbers in b. - for (i = 0; m = d3_interpolate_number.exec(b); ++i) { - if (m.index) s.push(b.substring(s0, s1 = m.index)); - q.push({i: s.length, x: m[0]}); - s.push(null); - s0 = d3_interpolate_number.lastIndex; - } - if (s0 < b.length) s.push(b.substring(s0)); - - // Find all numbers in a. - for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) { - o = q[i]; - if (o.x == m[0]) { // The numbers match, so coalesce. - if (o.i) { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i - 1] += o.x; - s.splice(o.i, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } else { // This match is followed by a string, so coalesce twice. - s[o.i - 1] += o.x + s[o.i + 1]; - s.splice(o.i, 2); - for (j = i + 1; j < n; ++j) q[j].i -= 2; - } - } else { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coalesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } - } - q.splice(i, 1); - n--; - i--; - } else { - o.x = d3_interpolateNumber(parseFloat(m[0]), parseFloat(o.x)); - } + // Interpolate pairs of numbers in a & b. + while ((am = d3_interpolate_numberA.exec(a)) + && (bm = d3_interpolate_numberB.exec(b))) { + if ((bs = bm.index) > bi) { // a string precedes the next number in b + bs = b.substring(bi, bs); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } + if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match + if (s[i]) s[i] += bm; // coalesce with previous string + else s[++i] = bm; + } else { // interpolate non-matching numbers + s[++i] = null; + q.push({i: i, x: d3_interpolateNumber(am, bm)}); + } + bi = d3_interpolate_numberB.lastIndex; } - // Remove any numbers in b not found in a. - while (i < n) { - o = q.pop(); - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coalesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - } - n--; + // Add remains of b. + if (bi < b.length) { + bs = b.substring(bi); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; } // Special optimization for only a single match. - if (s.length === 1) { - return s[0] == null - ? (o = q[0].x, function(t) { return o(t) + ""; }) - : function() { return b; }; - } - // Otherwise, interpolate each of the numbers and rejoin the string. - return function(t) { - for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }; + return s.length < 2 + ? (q[0] ? (b = q[0].x, function(t) { return b(t) + ""; }) + : function() { return b; }) + : (b = q.length, function(t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); } -var d3_interpolate_number = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g; +var d3_interpolate_numberA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, + d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, "g"); d3.interpolate = d3_interpolate; @@ -5401,7 +5512,8 @@ d3.interpolators = [ var t = typeof b; return (t === "string" ? (d3_rgb_names.has(b) || /^(#|rgb\(|hsl\()/.test(b) ? d3_interpolateRgb : d3_interpolateString) : b instanceof d3_Color ? d3_interpolateRgb - : t === "object" ? (Array.isArray(b) ? d3_interpolateArray : d3_interpolateObject) + : Array.isArray(b) ? d3_interpolateArray + : t === "object" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b); } ]; @@ -5664,6 +5776,7 @@ d3_transitionPrototype.ease = function(value) { d3_transitionPrototype.delay = function(value) { var id = this.id; + if (arguments.length < 1) return this.node().__transition__[id].delay; return d3_selection_each(this, typeof value === "function" ? function(node, i, j) { node.__transition__[id].delay = +value.call(node, node.__data__, i, j); } : (value = +value, function(node) { node.__transition__[id].delay = value; })); @@ -5671,6 +5784,7 @@ d3_transitionPrototype.delay = function(value) { d3_transitionPrototype.duration = function(value) { var id = this.id; + if (arguments.length < 1) return this.node().__transition__[id].duration; return d3_selection_each(this, typeof value === "function" ? function(node, i, j) { node.__transition__[id].duration = Math.max(1, value.call(node, node.__data__, i, j)); } : (value = Math.max(1, value), function(node) { node.__transition__[id].duration = value; })); @@ -5932,8 +6046,14 @@ function d3_html(request) { d3.xml = d3_xhrType(function(request) { return request.responseXML; }); - return d3; -})(); + if (typeof define === "function" && define.amd) { + define(d3); + } else if (typeof module === "object" && module.exports) { + module.exports = d3; + } else { + this.d3 = d3; + } +}(); d3.combobox = function() { var event = d3.dispatch('accept'), data = [], @@ -16151,7 +16271,7 @@ window.iD = function () { return d3.rebind(context, dispatch, 'on'); }; -iD.version = '1.3.9'; +iD.version = '1.3.10'; (function() { var detected = {}; @@ -16622,6 +16742,13 @@ iD.geo.interp = function(p1, p2, t) { p1[1] + (p2[1] - p1[1]) * t]; }; +// 2D cross product of OA and OB vectors, i.e. z-component of their 3D cross product. +// Returns a positive value, if OAB makes a counter-clockwise turn, +// negative for clockwise turn, and zero if the points are collinear. +iD.geo.cross = function(o, a, b) { + return (a[0] - o[0]) * (b[1] - o[1]) - (a[1] - o[1]) * (b[0] - o[0]); +}; + // http://jsperf.com/id-dist-optimization iD.geo.euclideanDistance = function(a, b) { var x = a[0] - b[0], y = a[1] - b[1]; @@ -17092,12 +17219,17 @@ iD.actions.Circularize = function(wayId, projection, maxAngle) { maxAngle = (maxAngle || 20) * Math.PI / 180; var action = function(graph) { - var way = graph.entity(wayId), - nodes = _.uniq(graph.childNodes(way)), + var way = graph.entity(wayId); + + if (!way.isConvex(graph)) { + graph = action.makeConvex(graph); + } + + var nodes = _.uniq(graph.childNodes(way)), keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }), points = nodes.map(function(n) { return projection(n.loc); }), keyPoints = keyNodes.map(function(n) { return projection(n.loc); }), - centroid = d3.geom.polygon(points).centroid(), + centroid = (points.length === 2) ? iD.geo.interp(points[0], points[1], 0.5) : d3.geom.polygon(points).centroid(), radius = d3.median(points, function(p) { return iD.geo.euclideanDistance(centroid, p); }), sign = d3.geom.polygon(points).area() > 0 ? 1 : -1, ids; @@ -17118,16 +17250,19 @@ iD.actions.Circularize = function(wayId, projection, maxAngle) { // key points and nodes are those connected to the ways, // they are projected onto the circle, inbetween nodes are moved - // to constant internals between key nodes, extra inbetween nodes are + // to constant intervals between key nodes, extra inbetween nodes are // added if necessary. for (var i = 0; i < keyPoints.length; i++) { var nextKeyNodeIndex = (i + 1) % keyNodes.length, - startNodeIndex = nodes.indexOf(keyNodes[i]), - endNodeIndex = nodes.indexOf(keyNodes[nextKeyNodeIndex]), + startNode = keyNodes[i], + endNode = keyNodes[nextKeyNodeIndex], + startNodeIndex = nodes.indexOf(startNode), + endNodeIndex = nodes.indexOf(endNode), numberNewPoints = -1, indexRange = endNodeIndex - startNodeIndex, distance, totalAngle, eachAngle, startAngle, endAngle, - angle, loc, node, j; + angle, loc, node, j, + inBetweenNodes = []; if (indexRange < 0) { indexRange += nodes.length; @@ -17135,6 +17270,7 @@ iD.actions.Circularize = function(wayId, projection, maxAngle) { // position this key node distance = iD.geo.euclideanDistance(centroid, keyPoints[i]); + if (distance === 0) { distance = 1e-4; } keyPoints[i] = [ centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius, centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius]; @@ -17146,7 +17282,7 @@ iD.actions.Circularize = function(wayId, projection, maxAngle) { totalAngle = endAngle - startAngle; // detects looping around -pi/pi - if (totalAngle*sign > 0) { + if (totalAngle * sign > 0) { totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle)); } @@ -17177,7 +17313,40 @@ iD.actions.Circularize = function(wayId, projection, maxAngle) { graph = graph.replace(node); nodes.splice(endNodeIndex + j, 0, node); + inBetweenNodes.push(node.id); } + + // Check for other ways that share these keyNodes.. + // If keyNodes are adjacent in both ways, + // we can add inBetween nodes to that shared way too.. + if (indexRange === 1 && inBetweenNodes.length) { + var startIndex1 = way.nodes.lastIndexOf(startNode.id), + endIndex1 = way.nodes.lastIndexOf(endNode.id), + wayDirection1 = (endIndex1 - startIndex1); + if (wayDirection1 < -1) { wayDirection1 = 1;} + + /*jshint -W083 */ + _.each(_.without(graph.parentWays(keyNodes[i]), way), function(sharedWay) { + if (sharedWay.areAdjacent(startNode.id, endNode.id)) { + var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id), + endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id), + wayDirection2 = (endIndex2 - startIndex2), + insertAt = endIndex2; + if (wayDirection2 < -1) { wayDirection2 = 1;} + + if (wayDirection1 !== wayDirection2) { + inBetweenNodes.reverse(); + insertAt = startIndex2; + } + for (j = 0; j < inBetweenNodes.length; j++) { + sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j); + } + graph = graph.replace(sharedWay); + } + }); + /*jshint +W083 */ + } + } // update the way to have all the new nodes @@ -17190,6 +17359,38 @@ iD.actions.Circularize = function(wayId, projection, maxAngle) { return graph; }; + action.makeConvex = function(graph) { + var way = graph.entity(wayId), + nodes = _.uniq(graph.childNodes(way)), + points = nodes.map(function(n) { return projection(n.loc); }), + sign = d3.geom.polygon(points).area() > 0 ? 1 : -1, + hull = d3.geom.hull(points); + + // D3 convex hulls go counterclockwise.. + if (sign === -1) { + nodes.reverse(); + points.reverse(); + } + + for (var i = 0; i < hull.length - 1; i++) { + var startIndex = points.indexOf(hull[i]), + endIndex = points.indexOf(hull[i+1]), + indexRange = (endIndex - startIndex); + + if (indexRange < 0) { + indexRange += nodes.length; + } + + // move interior nodes to the surface of the convex hull.. + for (var j = 1; j < indexRange; j++) { + var point = iD.geo.interp(hull[i], hull[i+1], j / indexRange), + node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point)); + graph = graph.replace(node); + } + } + return graph; + }; + action.disabled = function(graph) { if (!graph.entity(wayId).isClosed()) return 'not_closed'; @@ -20371,8 +20572,10 @@ iD.operations.Circularize = function(selectedIDs, context) { }; operation.available = function() { + var entity = context.entity(entityId); return selectedIDs.length === 1 && - context.entity(entityId).type === 'way'; + entity.type === 'way' && + _.uniq(entity.nodes).length > 1; }; operation.disabled = function() { @@ -20850,6 +21053,7 @@ iD.areaKeys = { "bench": true, "clock": true, "drinking_water": true, + "parking_entrance": true, "post_box": true, "telephone": true, "vending_machine": true, @@ -22677,11 +22881,15 @@ _.extend(iD.Way.prototype, { }, isOneWay: function() { - return this.tags.oneway === 'yes' || - this.tags.oneway === '1' || - this.tags.oneway === '-1' || - this.tags.waterway === 'river' || + // explicit oneway tag.. + if (['yes', '1', '-1'].indexOf(this.tags.oneway) !== -1) { return true; } + if (['no', '0'].indexOf(this.tags.oneway) !== -1) { return false; } + + // implied oneway tag.. + return this.tags.waterway === 'river' || this.tags.waterway === 'stream' || + this.tags.highway === 'motorway' || + this.tags.highway === 'motorway_link' || this.tags.junction === 'roundabout'; }, @@ -22689,6 +22897,30 @@ _.extend(iD.Way.prototype, { return this.nodes.length > 0 && this.first() === this.last(); }, + isConvex: function(resolver) { + if (!this.isClosed() || this.isDegenerate()) return null; + + var nodes = _.uniq(resolver.childNodes(this)), + coords = _.pluck(nodes, 'loc'), + curr = 0, prev = 0; + + for (var i = 0; i < coords.length; i++) { + var o = coords[(i+1) % coords.length], + a = coords[i], + b = coords[(i+2) % coords.length], + res = iD.geo.cross(o, a, b); + + curr = (res > 0) ? 1 : (res < 0) ? -1 : 0; + if (curr === 0) { + continue; + } else if (prev && curr !== prev) { + return false; + } + prev = curr; + } + return true; + }, + isArea: function() { if (this.tags.area === 'yes') return true; @@ -24008,6 +24240,7 @@ iD.svg.Areas = function(projection) { beach: 'beach', scrub: 'scrub', construction: 'construction', + military: 'construction', cemetery: 'cemetery', grave_yard: 'cemetery', meadow: 'meadow', @@ -24979,12 +25212,12 @@ iD.svg.Surface = function(context) { }; iD.svg.TagClasses = function() { var primary = [ - 'highway', 'railway', 'waterway', 'aeroway', 'motorway', - 'boundary', 'power', 'amenity', 'natural', 'landuse', - 'building', 'leisure', 'place' + 'building', 'highway', 'railway', 'waterway', 'aeroway', + 'motorway', 'boundary', 'power', 'amenity', 'natural', 'landuse', + 'leisure', 'place' ], secondary = [ - 'oneway', 'bridge', 'tunnel', 'construction' + 'oneway', 'bridge', 'tunnel', 'construction', 'embankment', 'cutting' ], tagClassRe = /^tag-/, tags = function(entity) { return entity.tags; }; @@ -25511,7 +25744,7 @@ iD.ui.Background = function(context) { ['bottom', [0, 1]]], opacityDefault = (context.storage('background-opacity') !== null) ? (+context.storage('background-opacity')) : 0.5, - customTemplate; + customTemplate = ''; // Can be 0 from <1.3.0 use or due to issue #1923. if (opacityDefault === 0) opacityDefault = 0.5; @@ -27498,7 +27731,7 @@ iD.ui.preset = function(context) { return field.present(); }) .each(function(field) { - var reference = iD.ui.TagReference({key: field.key}); + var reference = iD.ui.TagReference(field.reference || {key: field.key}); if (state === 'hover') { reference.showing(false); @@ -27605,7 +27838,7 @@ iD.ui.PresetIcon = function() { $fill.enter().append('div'); $fill.attr('class', function() { - var s = 'preset-icon-fill icon-' + geom; + var s = 'preset-icon-fill preset-icon-fill-' + geom; for (var i in p.tags) { s += ' tag-' + i + ' tag-' + i + '-' + p.tags[i]; } @@ -28503,10 +28736,22 @@ iD.ui.RawTagEditor = function(context) { } function keyChange(d) { - var tag = {}; - tag[d.key] = undefined; - tag[this.value] = d.value; - d.key = this.value; // Maintain DOM identity through the subsequent update. + var kOld = d.key, + kNew = this.value.trim(), + tag = {}; + + if (kNew && kNew !== kOld) { + var match = kNew.match(/^(.*?)(?:_(\d+))?$/), + base = match[1], + suffix = +(match[2] || 1); + while (tags[kNew]) { // rename key if already in use + kNew = base + '_' + suffix++; + } + } + tag[kOld] = undefined; + tag[kNew] = d.value; + d.key = kNew; // Maintain DOM identity through the subsequent update. + this.value = kNew; event.change(tag); } @@ -29369,10 +29614,11 @@ iD.ui.preset.access = function(field) { } access.options = function(type) { - var options = ['no', 'permissive', 'private', 'designated', 'destination']; + var options = ['no', 'permissive', 'private', 'destination']; if (type !== 'access') { options.unshift('yes'); + options.push('designated'); } return options.map(function(option) { @@ -29385,65 +29631,104 @@ iD.ui.preset.access = function(field) { var placeholders = { footway: { - foot: 'yes', + foot: 'designated', motor_vehicle: 'no' }, steps: { foot: 'yes', - motor_vehicle: 'no' + motor_vehicle: 'no', + bicycle: 'no', + horse: 'no' }, pedestrian: { foot: 'yes', motor_vehicle: 'no' }, cycleway: { - bicycle: 'yes', - motor_vehicle: 'no' + motor_vehicle: 'no', + bicycle: 'designated' }, bridleway: { - horse: 'yes' + motor_vehicle: 'no', + horse: 'designated' }, path: { - motor_vehicle: 'no' + foot: 'yes', + motor_vehicle: 'no', + bicycle: 'yes', + horse: 'yes' }, motorway: { - motor_vehicle: 'yes' + foot: 'no', + motor_vehicle: 'yes', + bicycle: 'no', + horse: 'no' }, trunk: { motor_vehicle: 'yes' }, primary: { - motor_vehicle: 'yes' + foot: 'yes', + motor_vehicle: 'yes', + bicycle: 'yes', + horse: 'yes' }, secondary: { - motor_vehicle: 'yes' + foot: 'yes', + motor_vehicle: 'yes', + bicycle: 'yes', + horse: 'yes' }, tertiary: { - motor_vehicle: 'yes' + foot: 'yes', + motor_vehicle: 'yes', + bicycle: 'yes', + horse: 'yes' }, residential: { - motor_vehicle: 'yes' + foot: 'yes', + motor_vehicle: 'yes', + bicycle: 'yes', + horse: 'yes' }, unclassified: { - motor_vehicle: 'yes' + foot: 'yes', + motor_vehicle: 'yes', + bicycle: 'yes', + horse: 'yes' }, service: { - motor_vehicle: 'yes' + foot: 'yes', + motor_vehicle: 'yes', + bicycle: 'yes', + horse: 'yes' }, motorway_link: { - motor_vehicle: 'yes' + foot: 'no', + motor_vehicle: 'yes', + bicycle: 'no', + horse: 'no' }, trunk_link: { motor_vehicle: 'yes' }, primary_link: { - motor_vehicle: 'yes' + foot: 'yes', + motor_vehicle: 'yes', + bicycle: 'yes', + horse: 'yes' }, secondary_link: { - motor_vehicle: 'yes' + foot: 'yes', + motor_vehicle: 'yes', + bicycle: 'yes', + horse: 'yes' }, tertiary_link: { - motor_vehicle: 'yes' + foot: 'yes', + motor_vehicle: 'yes', + bicycle: 'yes', + horse: 'yes' } }; @@ -29459,7 +29744,9 @@ iD.ui.preset.access = function(field) { _.forEach(placeholders[tags.highway], function(value, key) { items.selectAll('#preset-input-access-' + key) - .attr('placeholder', value); + .attr('placeholder', function() { + return (tags.access && (value === 'yes' || value === 'designated')) ? tags.access : value; + }); }); }; @@ -29647,9 +29934,12 @@ iD.ui.preset.address = function(field, context) { return d3.rebind(address, event, 'on'); }; -iD.ui.preset.check = function(field) { +iD.ui.preset.check = +iD.ui.preset.defaultcheck = function(field) { var event = d3.dispatch('change'), - values = [undefined, 'yes', 'no'], + values = field.type === 'check' ? + [undefined, 'yes', 'no'] : + [undefined, 'yes'], value, box, text, @@ -29665,7 +29955,7 @@ iD.ui.preset.check = function(field) { .attr('class', 'preset-input-wrap'); enter.append('input') - .property('indeterminate', true) + .property('indeterminate', field.type === 'check') .attr('type', 'checkbox') .attr('id', 'preset-input-' + field.id); @@ -29676,7 +29966,7 @@ iD.ui.preset.check = function(field) { box = label.select('input') .on('click', function() { var t = {}; - t[field.key] = values[(values.indexOf(value) + 1) % 3]; + t[field.key] = values[(values.indexOf(value) + 1) % values.length]; event.change(t); d3.event.stopPropagation(); }); @@ -29686,9 +29976,10 @@ iD.ui.preset.check = function(field) { check.tags = function(tags) { value = tags[field.key]; - box.property('indeterminate', !value); + box.property('indeterminate', field.type === 'check' && !value); box.property('checked', value === 'yes'); - text.text(value ? t('inspector.check.' + value, {default: value}) : t('inspector.unknown')); + text.text(value ? t('inspector.check.' + value, {default: value}) : + field.type === 'check' ? t('inspector.unknown') : t('inspector.check.no')); label.classed('set', !!value); }; @@ -29764,36 +30055,6 @@ iD.ui.preset.typeCombo = function(field) { return d3.rebind(combo, event, 'on'); }; -iD.ui.preset.defaultcheck = function(field) { - var event = d3.dispatch('change'), - input; - - function check(selection) { - input = selection.selectAll('input') - .data([0]); - - input.enter().append('input') - .attr('type', 'checkbox') - .attr('id', 'preset-input-' + field.id); - - input - .on('change', function() { - var t = {}; - t[field.key] = input.property('checked') ? field.value || 'yes' : undefined; - event.change(t); - }); - } - - check.tags = function(tags) { - input.property('checked', !!tags[field.key] && tags[field.key] !== 'no'); - }; - - check.focus = function() { - input.node().focus(); - }; - - return d3.rebind(check, event, 'on'); -}; iD.ui.preset.text = iD.ui.preset.number = iD.ui.preset.tel = @@ -38283,6 +38544,42 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "terms_url": "http://geo.nls.uk/maps/", "terms_text": "National Library of Scotland Historic Maps" }, + { + "name": "Ireland British War Office 1:25k GSGS 3906", + "type": "tms", + "template": "http://mapwarper.net/layers/tile/101/{zoom}/{x}/{y}.png", + "scaleExtent": [ + 0, + 18 + ], + "polygon": [ + [ + [ + -10.71, + 51.32 + ], + [ + -10.71, + 55.46 + ], + [ + -5.37, + 55.46 + ], + [ + -5.37, + 51.32 + ], + [ + -10.71, + 51.32 + ] + ] + ], + "terms_url": "http://wiki.openstreetmap.org/wiki/WikiProject_Ireland#Trinity_College_Dublin", + "terms_text": "Glucksman Map Library, Trinity College Dublin", + "id": "GSGS3906" + }, { "name": "Ireland British War Office One-Inch 1941-43 GSGS 4136", "type": "tms", @@ -38512,7 +38809,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," ] ], "terms_url": "http://geo.nls.uk/maps/", - "terms_text": "National Library of Scotland Historic Maps" + "terms_text": "National Library of Scotland Historic Maps", + "id": "GSGS4136" }, { "name": "Ireland EEA CORINE 2006", @@ -62978,7 +63276,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," ], "fields": [ "ref", - "surface" + "surface", + "length", + "width" ], "tags": { "aeroway": "runway" @@ -63259,6 +63559,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "name": "Car Sharing" }, "amenity/car_wash": { + "icon": "car", "geometry": [ "point", "area" @@ -63271,6 +63572,25 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," ], "name": "Car Wash" }, + "amenity/charging_station": { + "icon": "car", + "geometry": [ + "point", + "area" + ], + "tags": { + "amenity": "charging_station" + }, + "fields": [ + "operator" + ], + "terms": [ + "EV", + "Electric Vehicle", + "Supercharger" + ], + "name": "Charging Station" + }, "amenity/childcare": { "icon": "school", "fields": [ @@ -63373,6 +63693,17 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "terms": [], "name": "College" }, + "amenity/compressed_air": { + "icon": "car", + "geometry": [ + "point", + "area" + ], + "tags": { + "amenity": "compressed_air" + }, + "name": "Compressed Air" + }, "amenity/courthouse": { "fields": [ "operator", @@ -63676,6 +64007,20 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "terms": [], "name": "Car Parking" }, + "amenity/parking_entrance": { + "icon": "entrance", + "geometry": [ + "vertex" + ], + "tags": { + "amenity": "parking_entrance" + }, + "fields": [ + "access_simple", + "ref" + ], + "name": "Parking Garage Entrance/Exit" + }, "amenity/pharmacy": { "icon": "pharmacy", "fields": [ @@ -64632,8 +64977,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "fields": [ "building", "levels", - "address", - "smoking" + "address" ], "geometry": [ "area" @@ -64829,7 +65173,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "tags": { "building": "entrance" }, - "name": "Entrance", + "name": "Entrance/Exit", "searchable": false }, "building/garage": { @@ -66154,7 +66498,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "access_simple", "address" ], - "name": "Entrance" + "name": "Entrance/Exit" }, "footway/crossing": { "fields": [ @@ -66179,6 +66523,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "fields": [ "surface", "lit", + "width", + "structure", "access" ], "geometry": [ @@ -66191,6 +66537,15 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "terms": [], "name": "Sidewalk" }, + "ford": { + "geometry": [ + "vertex" + ], + "tags": { + "ford": "yes" + }, + "name": "Ford" + }, "golf/bunker": { "icon": "golf", "geometry": [ @@ -66314,9 +66669,10 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," }, "highway/bridleway": { "fields": [ - "access", "surface", - "structure" + "width", + "structure", + "access" ], "icon": "highway-bridleway", "geometry": [ @@ -66352,7 +66708,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," }, "highway/crossing": { "fields": [ - "crossing" + "crossing", + "sloped_curb", + "tactile_paving" ], "geometry": [ "vertex" @@ -66371,9 +66729,10 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "fields": [ "surface", "lit", + "width", + "oneway", "structure", - "access", - "oneway" + "access" ], "geometry": [ "line" @@ -66387,9 +66746,11 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "highway/footway": { "icon": "highway-footway", "fields": [ + "surface", + "lit", + "width", "structure", - "access", - "surface" + "access" ], "geometry": [ "line", @@ -66513,10 +66874,11 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "highway/path": { "icon": "highway-path", "fields": [ + "surface", + "width", "structure", "access", "sac_scale", - "surface", "incline", "trail_visibility", "ref" @@ -66532,9 +66894,12 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," }, "highway/pedestrian": { "fields": [ - "access", + "surface", + "lit", + "width", "oneway", - "surface" + "structure", + "access" ], "geometry": [ "line", @@ -66801,8 +67166,10 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," }, "highway/steps": { "fields": [ - "access", - "surface" + "surface", + "lit", + "width", + "access" ], "icon": "highway-steps", "geometry": [ @@ -67133,7 +67500,22 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "terms": [], "name": "Cemetery" }, + "landuse/churchyard": { + "fields": [ + "religion", + "denomination" + ], + "geometry": [ + "area" + ], + "tags": { + "landuse": "churchyard" + }, + "terms": [], + "name": "Churchyard" + }, "landuse/commercial": { + "icon": "commercial", "geometry": [ "point", "area" @@ -67266,6 +67648,16 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "terms": [], "name": "Meadow" }, + "landuse/military": { + "geometry": [ + "area" + ], + "tags": { + "landuse": "military" + }, + "terms": [], + "name": "Military" + }, "landuse/orchard": { "fields": [ "trees" @@ -67293,6 +67685,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "name": "Quarry" }, "landuse/residential": { + "icon": "building", "geometry": [ "point", "area" @@ -67491,7 +67884,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "icon": "pitch", "fields": [ "sport", - "surface" + "surface", + "lit" ], "geometry": [ "point", @@ -67506,7 +67900,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "leisure/pitch/american_football": { "icon": "america-football", "fields": [ - "surface" + "surface", + "lit" ], "geometry": [ "point", @@ -67521,6 +67916,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," }, "leisure/pitch/baseball": { "icon": "baseball", + "fields": [ + "lit" + ], "geometry": [ "point", "area" @@ -67536,7 +67934,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "icon": "basketball", "fields": [ "surface", - "hoops" + "hoops", + "lit" ], "geometry": [ "point", @@ -67552,7 +67951,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "leisure/pitch/skateboard": { "icon": "pitch", "fields": [ - "surface" + "surface", + "lit" ], "geometry": [ "point", @@ -67568,7 +67968,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "leisure/pitch/soccer": { "icon": "soccer", "fields": [ - "surface" + "surface", + "lit" ], "geometry": [ "point", @@ -67584,7 +67985,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "leisure/pitch/tennis": { "icon": "tennis", "fields": [ - "surface" + "surface", + "lit" ], "geometry": [ "point", @@ -67600,7 +68002,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "leisure/pitch/volleyball": { "icon": "pitch", "fields": [ - "surface" + "surface", + "lit" ], "geometry": [ "point", @@ -67683,7 +68086,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "leisure/track": { "icon": "pitch", "fields": [ - "surface" + "surface", + "lit", + "width" ], "geometry": [ "point", @@ -68609,6 +69014,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," }, "place/city": { "icon": "city", + "fields": [ + "population" + ], "geometry": [ "point", "area" @@ -68620,6 +69028,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," }, "place/hamlet": { "icon": "triangle-stroked", + "fields": [ + "population" + ], "geometry": [ "point", "area" @@ -68661,6 +69072,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," }, "place/locality": { "icon": "marker", + "fields": [ + "population" + ], "geometry": [ "point", "area" @@ -68672,6 +69086,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," }, "place/neighbourhood": { "icon": "triangle-stroked", + "fields": [ + "population" + ], "geometry": [ "point", "area" @@ -68686,6 +69103,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," }, "place/suburb": { "icon": "triangle-stroked", + "fields": [ + "population" + ], "geometry": [ "point", "area" @@ -68701,6 +69121,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," }, "place/town": { "icon": "town", + "fields": [ + "population" + ], "geometry": [ "point", "area" @@ -68712,6 +69135,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," }, "place/village": { "icon": "village", + "fields": [ + "population" + ], "geometry": [ "point", "area" @@ -69321,7 +69747,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "name": "Car Dealership" }, "shop/car_parts": { - "icon": "shop", + "icon": "car", "fields": [ "address", "building_area", @@ -69338,7 +69764,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "name": "Car Parts Store" }, "shop/car_repair": { - "icon": "shop", + "icon": "car", "fields": [ "address", "building_area", @@ -69355,7 +69781,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "name": "Car Repair Shop" }, "shop/chemist": { - "icon": "shop", + "icon": "chemist", "fields": [ "address", "building_area", @@ -69676,7 +70102,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "name": "Greengrocer" }, "shop/hairdresser": { - "icon": "shop", + "icon": "hairdresser", "fields": [ "address", "building_area", @@ -69832,7 +70258,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "name": "Mall" }, "shop/mobile_phone": { - "icon": "shop", + "icon": "mobilephone", "fields": [ "address", "building_area", @@ -69849,7 +70275,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "name": "Mobile Phone Store" }, "shop/motorcycle": { - "icon": "shop", + "icon": "scooter", "fields": [ "address", "building_area", @@ -70181,6 +70607,26 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," }, "name": "Video Store" }, + "shop/wine": { + "icon": "alcohol-shop", + "fields": [ + "address", + "building_area", + "opening_hours" + ], + "geometry": [ + "point", + "vertex", + "area" + ], + "tags": { + "shop": "wine" + }, + "terms": [ + "winery" + ], + "name": "Wine Shop" + }, "tourism": { "fields": [ "tourism" @@ -70763,6 +71209,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," }, "waterway/canal": { "icon": "waterway-canal", + "fields": [ + "width" + ], "geometry": [ "line" ], @@ -70813,7 +71262,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "waterway/river": { "icon": "waterway-river", "fields": [ - "tunnel" + "tunnel", + "width" ], "geometry": [ "line" @@ -70851,7 +71301,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "waterway/stream": { "icon": "waterway-stream", "fields": [ - "tunnel" + "tunnel", + "width" ], "geometry": [ "line" @@ -93360,7 +93811,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "chemist" }, "name": "Müller", - "icon": "shop", + "icon": "chemist", "geometry": [ "point", "vertex", @@ -93379,7 +93830,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "chemist" }, "name": "Schlecker", - "icon": "shop", + "icon": "chemist", "geometry": [ "point", "vertex", @@ -93398,7 +93849,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "chemist" }, "name": "Etos", - "icon": "shop", + "icon": "chemist", "geometry": [ "point", "vertex", @@ -93417,7 +93868,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "chemist" }, "name": "Bipa", - "icon": "shop", + "icon": "chemist", "geometry": [ "point", "vertex", @@ -93436,7 +93887,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "chemist" }, "name": "Rossmann", - "icon": "shop", + "icon": "chemist", "geometry": [ "point", "vertex", @@ -93455,7 +93906,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "chemist" }, "name": "DM Drogeriemarkt", - "icon": "shop", + "icon": "chemist", "geometry": [ "point", "vertex", @@ -93474,7 +93925,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "chemist" }, "name": "Ihr Platz", - "icon": "shop", + "icon": "chemist", "geometry": [ "point", "vertex", @@ -93493,7 +93944,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "chemist" }, "name": "Douglas", - "icon": "shop", + "icon": "chemist", "geometry": [ "point", "vertex", @@ -93512,7 +93963,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "chemist" }, "name": "Kruidvat", - "icon": "shop", + "icon": "chemist", "geometry": [ "point", "vertex", @@ -93531,7 +93982,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Peugeot", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93550,7 +94001,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Kwik Fit", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93569,7 +94020,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "ATU", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93588,7 +94039,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Kwik-Fit", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93607,7 +94058,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Midas", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93626,7 +94077,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Feu Vert", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93645,7 +94096,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Norauto", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93664,7 +94115,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Speedy", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93683,7 +94134,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Автозапчасти", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93702,7 +94153,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Renault", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93721,7 +94172,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Pit Stop", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93740,7 +94191,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Jiffy Lube", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93759,7 +94210,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Шиномонтаж", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93778,7 +94229,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "СТО", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93797,7 +94248,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "O'Reilly Auto Parts", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93816,7 +94267,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Carglass", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93835,7 +94286,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "шиномонтаж", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93854,7 +94305,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Citroen", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93873,7 +94324,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Euromaster", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93892,7 +94343,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Firestone", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93911,7 +94362,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "AutoZone", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93930,7 +94381,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Автосервис", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93949,7 +94400,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Advance Auto Parts", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -93968,7 +94419,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "car_repair" }, "name": "Roady", - "icon": "shop", + "icon": "car", "geometry": [ "point", "vertex", @@ -94927,24 +95378,6 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," ], "suggestion": true }, - "shop/car/Ford": { - "tags": { - "name": "Ford", - "shop": "car" - }, - "name": "Ford", - "icon": "car", - "geometry": [ - "point", - "vertex", - "area" - ], - "fields": [ - "address", - "opening_hours" - ], - "suggestion": true - }, "shop/car/Volkswagen": { "tags": { "name": "Volkswagen", @@ -98756,7 +99189,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "Билайн", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -98775,7 +99208,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "ソフトバンクショップ (SoftBank shop)", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -98794,7 +99227,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "Vodafone", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -98813,7 +99246,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "O2", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -98832,7 +99265,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "Carphone Warehouse", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -98851,7 +99284,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "Orange", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -98870,7 +99303,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "Verizon Wireless", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -98889,7 +99322,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "Sprint", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -98908,7 +99341,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "T-Mobile", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -98927,7 +99360,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "МТС", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -98946,7 +99379,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "Евросеть", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -98965,7 +99398,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "Bell", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -98984,7 +99417,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "The Phone House", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -99003,7 +99436,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "SFR", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -99022,7 +99455,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "Связной", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -99041,7 +99474,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "Мегафон", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -99060,7 +99493,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "AT&T", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -99079,7 +99512,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "ドコモショップ (docomo shop)", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -99098,7 +99531,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "au", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -99117,7 +99550,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "Movistar", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -99136,7 +99569,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "mobile_phone" }, "name": "Bitė", - "icon": "shop", + "icon": "mobilephone", "geometry": [ "point", "vertex", @@ -99193,7 +99626,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "hairdresser" }, "name": "Klier", - "icon": "shop", + "icon": "hairdresser", "geometry": [ "point", "vertex", @@ -99212,7 +99645,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "hairdresser" }, "name": "Supercuts", - "icon": "shop", + "icon": "hairdresser", "geometry": [ "point", "vertex", @@ -99231,7 +99664,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "hairdresser" }, "name": "Hairkiller", - "icon": "shop", + "icon": "hairdresser", "geometry": [ "point", "vertex", @@ -99250,7 +99683,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "hairdresser" }, "name": "Great Clips", - "icon": "shop", + "icon": "hairdresser", "geometry": [ "point", "vertex", @@ -99269,7 +99702,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "hairdresser" }, "name": "Парикмахерская", - "icon": "shop", + "icon": "hairdresser", "geometry": [ "point", "vertex", @@ -99288,7 +99721,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "hairdresser" }, "name": "Стиль", - "icon": "shop", + "icon": "hairdresser", "geometry": [ "point", "vertex", @@ -99307,7 +99740,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "hairdresser" }, "name": "Fryzjer", - "icon": "shop", + "icon": "hairdresser", "geometry": [ "point", "vertex", @@ -99326,7 +99759,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "hairdresser" }, "name": "Franck Provost", - "icon": "shop", + "icon": "hairdresser", "geometry": [ "point", "vertex", @@ -99345,7 +99778,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "hairdresser" }, "name": "Салон красоты", - "icon": "shop", + "icon": "hairdresser", "geometry": [ "point", "vertex", @@ -99383,7 +99816,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": "motorcycle" }, "name": "Yamaha", - "icon": "shop", + "icon": "scooter", "geometry": [ "point", "vertex", @@ -99486,7 +99919,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "landuse/farmyard", "landuse/forest", "landuse/meadow", - "landuse/cemetery" + "landuse/cemetery", + "landuse/military" ] }, "category-path": { @@ -99589,6 +100023,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "bicycle", "horse" ], + "reference": { + "key": "access" + }, "type": "access", "label": "Access", "placeholder": "Unknown", @@ -99647,6 +100084,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "addr:city", "addr:postcode" ], + "reference": { + "key": "addr" + }, "icon": "address", "universal": true, "label": "Address", @@ -99769,7 +100209,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," }, "building_area": { "key": "building", - "type": "check", + "type": "defaultcheck", "default": "yes", "geometry": "area", "label": "Building" @@ -99928,6 +100368,51 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "type": "combo", "label": "Fuel" }, + "fuel/biodiesel": { + "key": "fuel:biodiesel", + "type": "check", + "label": "Sells Biodiesel" + }, + "fuel/diesel": { + "key": "fuel:diesel", + "type": "check", + "label": "Sells Diesel" + }, + "fuel/e10": { + "key": "fuel:e10", + "type": "check", + "label": "Sells E10" + }, + "fuel/e85": { + "key": "fuel:e85", + "type": "check", + "label": "Sells E85" + }, + "fuel/lpg": { + "key": "fuel:lpg", + "type": "check", + "label": "Sells Propane" + }, + "fuel/octane_100": { + "key": "fuel:octane_100", + "type": "check", + "label": "Sells Racing Gasoline" + }, + "fuel/octane_91": { + "key": "fuel:octane_91", + "type": "check", + "label": "Sells Regular Gasoline" + }, + "fuel/octane_95": { + "key": "fuel:octane_95", + "type": "check", + "label": "Sells Midgrade Gasoline" + }, + "fuel/octane_98": { + "key": "fuel:octane_98", + "type": "check", + "label": "Sells Premium Gasoline" + }, "gauge": { "key": "gauge", "type": "combo", @@ -100038,6 +100523,11 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "type": "typeCombo", "label": "Type" }, + "length": { + "key": "length", + "type": "number", + "label": "Length (Meters)" + }, "levels": { "key": "building:levels", "type": "number", @@ -100167,6 +100657,11 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "type": "typeCombo", "label": "Type" }, + "population": { + "key": "population", + "type": "text", + "label": "Population" + }, "power": { "key": "power", "type": "typeCombo", @@ -100293,6 +100788,11 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "type": "typeCombo", "label": "Type" }, + "sloped_curb": { + "key": "sloped_curb", + "type": "combo", + "label": "Sloped Curb" + }, "smoking": { "key": "smoking", "type": "combo", @@ -100356,7 +100856,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "bridge", "tunnel", "embankment", - "cutting" + "cutting", + "ford" ], "label": "Structure", "placeholder": "Unknown", @@ -100365,7 +100866,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "bridge": "Bridge", "tunnel": "Tunnel", "embankment": "Embankment", - "cutting": "Cutting" + "cutting": "Cutting", + "ford": "Ford" } } }, @@ -100388,6 +100890,11 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "type": "combo", "label": "Surface" }, + "tactile_paving": { + "key": "tactile_paving", + "type": "check", + "label": "Tactile Paving" + }, "toilets/disposal": { "key": "toilets:disposal", "type": "combo", @@ -100473,6 +100980,11 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "universal": true, "label": "Wheelchair Access" }, + "width": { + "key": "width", + "type": "number", + "label": "Width (Meters)" + }, "wikipedia": { "key": "wikipedia", "type": "wikipedia", @@ -111903,6 +112415,62 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," 504 ] }, + "hairdresser": { + "12": [ + 42, + 528 + ], + "18": [ + 24, + 528 + ], + "24": [ + 0, + 528 + ] + }, + "chemist": { + "12": [ + 96, + 528 + ], + "18": [ + 78, + 528 + ], + "24": [ + 54, + 528 + ] + }, + "mobilephone": { + "12": [ + 150, + 528 + ], + "18": [ + 132, + 528 + ], + "24": [ + 108, + 528 + ] + }, + "scooter": { + "12": [ + 204, + 528 + ], + "18": [ + 186, + 528 + ], + "24": [ + 162, + 528 + ] + }, "highway-motorway": { "line": [ 20, @@ -112350,7 +112918,6 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "nl", "en-GB", "et", - "fil", "fi", "fr", "gl", @@ -112382,6 +112949,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "sl", "es", "sv", + "tl", "ta", "te", "tr", @@ -113004,6 +113572,33 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "fuel": { "label": "Fuel" }, + "fuel/biodiesel": { + "label": "Sells Biodiesel" + }, + "fuel/diesel": { + "label": "Sells Diesel" + }, + "fuel/e10": { + "label": "Sells E10" + }, + "fuel/e85": { + "label": "Sells E85" + }, + "fuel/lpg": { + "label": "Sells Propane" + }, + "fuel/octane_100": { + "label": "Sells Racing Gasoline" + }, + "fuel/octane_91": { + "label": "Sells Regular Gasoline" + }, + "fuel/octane_95": { + "label": "Sells Midgrade Gasoline" + }, + "fuel/octane_98": { + "label": "Sells Premium Gasoline" + }, "gauge": { "label": "Gauge" }, @@ -113069,6 +113664,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "leisure": { "label": "Type" }, + "length": { + "label": "Length (Meters)" + }, "levels": { "label": "Levels", "placeholder": "2, 4, 6..." @@ -113140,6 +113738,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "place": { "label": "Type" }, + "population": { + "label": "Population" + }, "power": { "label": "Type" }, @@ -113203,6 +113804,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "shop": { "label": "Type" }, + "sloped_curb": { + "label": "Sloped Curb" + }, "smoking": { "label": "Smoking" }, @@ -113226,7 +113830,8 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "bridge": "Bridge", "tunnel": "Tunnel", "embankment": "Embankment", - "cutting": "Cutting" + "cutting": "Cutting", + "ford": "Ford" } }, "studio_type": { @@ -113238,6 +113843,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "surface": { "label": "Surface" }, + "tactile_paving": { + "label": "Tactile Paving" + }, "toilets/disposal": { "label": "Disposal" }, @@ -113281,6 +113889,9 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "wheelchair": { "label": "Wheelchair Access" }, + "width": { + "label": "Width (Meters)" + }, "wikipedia": { "label": "Wikipedia" }, @@ -113425,6 +114036,10 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "name": "Car Wash", "terms": "" }, + "amenity/charging_station": { + "name": "Charging Station", + "terms": "EV,Electric Vehicle,Supercharger" + }, "amenity/childcare": { "name": "Childcare", "terms": "nursery,orphanage,playgroup" @@ -113445,6 +114060,10 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "name": "College", "terms": "" }, + "amenity/compressed_air": { + "name": "Compressed Air", + "terms": "" + }, "amenity/courthouse": { "name": "Courthouse", "terms": "" @@ -113509,6 +114128,10 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "name": "Car Parking", "terms": "" }, + "amenity/parking_entrance": { + "name": "Parking Garage Entrance/Exit", + "terms": "" + }, "amenity/pharmacy": { "name": "Pharmacy", "terms": "" @@ -113754,7 +114377,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "terms": "" }, "building/entrance": { - "name": "Entrance", + "name": "Entrance/Exit", "terms": "" }, "building/garage": { @@ -114034,7 +114657,7 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "terms": "" }, "entrance": { - "name": "Entrance", + "name": "Entrance/Exit", "terms": "" }, "footway/crossing": { @@ -114045,6 +114668,10 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "name": "Sidewalk", "terms": "" }, + "ford": { + "name": "Ford", + "terms": "" + }, "golf/bunker": { "name": "Sand Trap", "terms": "hazard,bunker" @@ -114277,6 +114904,10 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "name": "Cemetery", "terms": "" }, + "landuse/churchyard": { + "name": "Churchyard", + "terms": "" + }, "landuse/commercial": { "name": "Commercial", "terms": "" @@ -114317,6 +114948,10 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "name": "Meadow", "terms": "" }, + "landuse/military": { + "name": "Military", + "terms": "" + }, "landuse/orchard": { "name": "Orchard", "terms": "" @@ -115069,6 +115704,10 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081]," "name": "Video Store", "terms": "" }, + "shop/wine": { + "name": "Wine Shop", + "terms": "winery" + }, "tourism": { "name": "Tourism", "terms": ""