diff --git a/css/map.css b/css/map.css index 3e3458793..9e72ab0cf 100644 --- a/css/map.css +++ b/css/map.css @@ -1514,74 +1514,73 @@ text.gpx { fill: #FF26D4; } -/* Mapillary Layer */ +/* Mapillary Image Layer */ -.layer-mapillary { +.layer-mapillary-images { pointer-events: none; } -.layer-mapillary g { +.layer-mapillary-images g { pointer-events: visible; cursor: pointer; /* Opera */ cursor: url(img/cursor-select-mapillary.png) 6 1, pointer; /* FF */ } -.layer-mapillary g * { +.layer-mapillary-images g * { stroke-width: 1; stroke: #444; fill: #ffc600; } -.layer-mapillary g:hover * { +.layer-mapillary-images g:hover * { stroke-width: 1; stroke: #333; fill: #ff9900; } -.layer-mapillary g.selected * { +.layer-mapillary-images g.selected * { stroke-width: 2; stroke: #222; fill: #ff5800; } -.layer-mapillary g:hover path.viewfield, -.layer-mapillary g.selected path.viewfield, -.layer-mapillary g path.viewfield { +.layer-mapillary-images g:hover path.viewfield, +.layer-mapillary-images g.selected path.viewfield, +.layer-mapillary-images g path.viewfield { stroke-width: 0; fill-opacity: 0.6; - -/* Mapillary sign Layer */ - -.t { - font-size: 28px; - z-index: 100; } -.node body { - min-width: 30px; -} +/* Mapillary Sign Layer */ .layer-mapillary-signs { pointer-events: none; } .layer-mapillary-signs body { + min-width: 30px; pointer-events: visible; cursor: pointer; /* Opera */ cursor: url(img/cursor-select-mapillary.png) 6 1, pointer; /* FF */ } +.layer-mapillary-signs .icon-sign { + height: 30px; + width: 30px; +} .layer-mapillary-signs body:hover { border: 1px solid red; } -.layer-mapillary-signs .node.selected { +.layer-mapillary-signs .icon-sign.selected { stroke-width: 4; border: 1px solid yellow; } .layer-mapillary-signs .t { + font-size: 28px; + z-index: 100; position: absolute; } diff --git a/data/core.yaml b/data/core.yaml index 7440c3e5b..dbe4f06bf 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -414,14 +414,14 @@ en: drag_drop: "Drag and drop a .gpx file on the page, or click the button to the right to browse" zoom: "Zoom to GPX track" browse: "Browse for a .gpx file" - mapillary: + mapillary_images: tooltip: "Street-level photos from Mapillary" title: "Photo Overlay (Mapillary)" view_on_mapillary: "View this image on Mapillary" mapillary_signs: - tooltip: "Traffic signs from Mapillary" - title: "Traffic sign Overlay (Mapillary)" - view_on_mapillary: "View this image on Mapillary" + tooltip: "Traffic signs from Mapillary" + title: "Traffic Sign Overlay (Mapillary)" + view_on_mapillary: "View this image on Mapillary" help: title: "Help" help: | diff --git a/dist/locales/en.json b/dist/locales/en.json index b8e9edc46..47161545e 100644 --- a/dist/locales/en.json +++ b/dist/locales/en.json @@ -500,14 +500,14 @@ "zoom": "Zoom to GPX track", "browse": "Browse for a .gpx file" }, - "mapillary": { + "mapillary_images": { "tooltip": "Street-level photos from Mapillary", "title": "Photo Overlay (Mapillary)", "view_on_mapillary": "View this image on Mapillary" }, "mapillary_signs": { "tooltip": "Traffic signs from Mapillary", - "title": "Traffic sign Overlay (Mapillary)", + "title": "Traffic Sign Overlay (Mapillary)", "view_on_mapillary": "View this image on Mapillary" }, "help": { diff --git a/index.html b/index.html index 83009e4c9..3ba91340d 100644 --- a/index.html +++ b/index.html @@ -59,9 +59,8 @@ - - - + + diff --git a/js/id/renderer/background.js b/js/id/renderer/background.js index bbd2e69ed..b5fc14135 100644 --- a/js/id/renderer/background.js +++ b/js/id/renderer/background.js @@ -4,8 +4,8 @@ iD.Background = function(context) { .projection(context.projection), gpxLayer = iD.GpxLayer(context, dispatch) .projection(context.projection), - mapillaryLayer = iD.MapillaryLayer(context), - mapillarySignsLayer = iD.MapillarySignsLayer(context), + mapillaryImageLayer = iD.MapillaryImageLayer(context), + mapillarySignLayer = iD.MapillarySignLayer(context), overlayLayers = []; var backgroundSources; @@ -86,20 +86,21 @@ iD.Background = function(context) { gpx.call(gpxLayer); - var mapillary = selection.selectAll('.layer-mapillary') + var mapillaryImages = selection.selectAll('.layer-mapillary-images') .data([0]); - mapillary.enter().insert('div') - .attr('class', 'layer-layer layer-mapillary'); + mapillaryImages.enter().insert('div') + .attr('class', 'layer-layer layer-mapillary-images'); - mapillary.call(mapillaryLayer); - var mapillary_signs = selection.selectAll('.layer-mapillary-signs') + mapillaryImages.call(mapillaryImageLayer); + + var mapillarySigns = selection.selectAll('.layer-mapillary-signs') .data([0]); - mapillary_signs.enter().insert('div') + mapillarySigns.enter().insert('div') .attr('class', 'layer-layer layer-mapillary-signs'); - mapillary_signs.call(mapillarySignsLayer); + mapillarySigns.call(mapillarySignLayer); } background.sources = function(extent) { @@ -111,8 +112,8 @@ iD.Background = function(context) { background.dimensions = function(_) { baseLayer.dimensions(_); gpxLayer.dimensions(_); - mapillaryLayer.dimensions(_); - mapillarySignsLayer.dimensions(_); + mapillaryImageLayer.dimensions(_); + mapillarySignLayer.dimensions(_); overlayLayers.forEach(function(layer) { layer.dimensions(_); @@ -181,21 +182,21 @@ iD.Background = function(context) { dispatch.change(); }; - background.showsMapillaryLayer = function() { - return mapillaryLayer.enable(); + background.showsMapillaryImageLayer = function() { + return mapillaryImageLayer.enable(); }; - background.showsMapillarySignsLayer = function() { - return mapillarySignsLayer.enable(); + background.showsMapillarySignLayer = function() { + return mapillarySignLayer.enable(); }; - background.toggleMapillaryLayer = function() { - mapillaryLayer.enable(!mapillaryLayer.enable()); + background.toggleMapillaryImageLayer = function() { + mapillaryImageLayer.enable(!mapillaryImageLayer.enable()); dispatch.change(); }; - background.toggleMapillarySignsLayer = function() { - mapillarySignsLayer.enable(!mapillarySignsLayer.enable()); + background.toggleMapillarySignLayer = function() { + mapillarySignLayer.enable(!mapillarySignLayer.enable()); dispatch.change(); }; background.showsLayer = function(d) { diff --git a/js/id/renderer/mapillary_layer.js b/js/id/renderer/mapillary_image_layer.js similarity index 83% rename from js/id/renderer/mapillary_layer.js rename to js/id/renderer/mapillary_image_layer.js index 05b6e4ed7..f00d7ee14 100644 --- a/js/id/renderer/mapillary_layer.js +++ b/js/id/renderer/mapillary_image_layer.js @@ -1,5 +1,10 @@ -iD.MapillaryLayer = function (context) { - var enable = false, +iD.MapillaryImageLayer = function (context) { + var roundedProjection = iD.svg.RoundProjection(context.projection), + urlSearch = 'https://a.mapillary.com/v2/search/s/geojson', + urlImage = 'https://www.mapillary.com/map/im/', + urlThumb = 'https://d1cuyjsrcm0gby.cloudfront.net/', + clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzoxNjQ3MDY4ZTUxY2QzNGI2', + enable = false, currentImage, svg, div, request; @@ -13,10 +18,10 @@ iD.MapillaryLayer = function (context) { .classed('temp', image !== currentImage); div.selectAll('img') - .attr('src', 'https://d1cuyjsrcm0gby.cloudfront.net/' + image.key + '/thumb-320.jpg'); + .attr('src', urlThumb + image.key + '/thumb-320.jpg'); div.selectAll('a') - .attr('href', 'https://www.mapillary.com/map/im/' + image.key); + .attr('href', urlImage + image.key); } function hide() { @@ -28,9 +33,9 @@ iD.MapillaryLayer = function (context) { div.classed('hidden', true); } - function transform(image) { - var t = 'translate(' + context.projection(image.loc) + ')'; - if (image.ca) t += 'rotate(' + image.ca + ',0,0)'; + function transform(d) { + var t = iD.svg.PointTransform(roundedProjection)(d); + if (d.ca) t += ' rotate(' + Math.floor(d.ca) + ',0,0)'; return t; } @@ -80,7 +85,7 @@ iD.MapillaryLayer = function (context) { .attr('target', '_blank') .call(iD.svg.Icon('#icon-out-link', 'inline')) .append('span') - .text(t('mapillary.view_on_mapillary')); + .text(t('mapillary_images.view_on_mapillary')); if (!enable) { hide(); @@ -100,7 +105,7 @@ iD.MapillaryLayer = function (context) { if (request) request.abort(); - request = d3.json('https://a.mapillary.com/v2/search/s/geojson?client_id=NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzoxNjQ3MDY4ZTUxY2QzNGI2&min_lat=' + + request = d3.json(urlSearch + '?client_id=' + clientId + '&min_lat=' + extent[0][1] + '&max_lat=' + extent[1][1] + '&min_lon=' + extent[0][0] + '&max_lon=' + extent[1][0] + '&max_results=100&geojson=true', function (error, data) { diff --git a/js/id/renderer/mapillary_trafficsign_layer.js b/js/id/renderer/mapillary_sign_layer.js similarity index 70% rename from js/id/renderer/mapillary_trafficsign_layer.js rename to js/id/renderer/mapillary_sign_layer.js index c7565cf03..b19e05927 100644 --- a/js/id/renderer/mapillary_trafficsign_layer.js +++ b/js/id/renderer/mapillary_sign_layer.js @@ -1,17 +1,21 @@ -iD.MapillarySignsLayer = function(context) { - var enable = false, +iD.MapillarySignLayer = function(context) { + var roundedProjection = iD.svg.RoundProjection(context.projection), + urlSearch = 'https://a.mapillary.com/v2/search/im/geojson/or', + urlImage = 'http://mapillary.com/map/im/', + urlThumb = 'https://d1cuyjsrcm0gby.cloudfront.net/', + clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzoxNjQ3MDY4ZTUxY2QzNGI2', + enable = false, initiated = false, currentImage, svg, image_preview_div, request, signs_defs; request = d3.json('css/traffico-release-0.1.5/global-patched.json', function(error, data) { - // console.error(arguments); if (error) return; signs_defs = data; }); function show(image) { - svg.selectAll('.node') + svg.selectAll('.icon-sign') .classed('selected', function(d) { return currentImage && d.key === currentImage.key; }); @@ -20,24 +24,19 @@ iD.MapillarySignsLayer = function(context) { .classed('temp', image !== currentImage); image_preview_div.selectAll('img') - .attr('src', 'https://d1cuyjsrcm0gby.cloudfront.net/' + image.key + '/thumb-320.jpg'); + .attr('src', urlThumb + image.key + '/thumb-320.jpg'); image_preview_div.selectAll('a') - .attr('href', 'http://mapillary.com/map/im/' + image.key); + .attr('href', urlImage + image.key); } function hide() { currentImage = undefined; - svg.selectAll('.node') + svg.selectAll('.icon-sign') .classed('selected', false); image_preview_div.classed('hidden', true); } - function transform(image) { - var t = 'translate(' + context.projection(image.loc) + ')'; - return t; - } - function render(selection) { svg = selection.selectAll('svg') .data([0]); @@ -67,18 +66,19 @@ iD.MapillarySignsLayer = function(context) { .attr('class', 'icon icon-pre-text out-link'); link.append('span') - .text(t('mapillary.view_on_mapillary')); + .text(t('mapillary_signs.view_on_mapillary')); if (!enable) { hide(); - svg.selectAll('.node') + svg.selectAll('.icon-sign') .remove(); return; } - svg.selectAll('.node') + // hack + svg.selectAll('.icon-sign') .remove(); var extent = context.map().extent(); @@ -86,13 +86,11 @@ iD.MapillarySignsLayer = function(context) { if (request) request.abort(); - request = d3.json('https://a.mapillary.com/v2/search/im/geojson/or?' + - 'client_id=NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzoxNjQ3MDY4ZTUxY2QzNGI2&min_lat=' + + request = d3.json(urlSearch + '?client_id=' + clientId + '&min_lat=' + extent[0][1] + '&max_lat=' + extent[1][1] + '&min_lon=' + extent[0][0] + '&max_lon=' + extent[1][0] + '&limit=100&geojson=true', function(error, data) { if (error) return; - // console.log(data); var images = []; for (var i = 0; i < data.features.length; i++) { @@ -106,37 +104,32 @@ iD.MapillarySignsLayer = function(context) { } var foreignObjects = svg.selectAll('foreignObject') - .data(images, function(d) { - return d.key; - }); + .data(images, function(d) { return d.key; }); var enter = foreignObjects.enter(); enter.append('foreignObject') - .attr('x', '0') - .attr('y', '0') - .attr('width', '30px') - .attr('height', '30px') - .attr('class', 'node') + .attr('class', 'icon-sign') .append('xhtml:body') .html(function(d) { var sign_html = signs_defs[d.signs[0].type]; return sign_html; }); - foreignObjects.on('click', function(data) { - if (!data) { - d3.event.preventDefault(); - return; - } - var image = data; - if (currentImage === image) { - hide(); - } else { - currentImage = image; - show(image); - } - }) + foreignObjects + .on('click', function(data) { + if (!data) { + d3.event.preventDefault(); + return; + } + var image = data; + if (currentImage === image) { + hide(); + } else { + currentImage = image; + show(image); + } + }) .on('mouseover', function(data) { if (!data) { d3.event.preventDefault(); @@ -156,14 +149,14 @@ iD.MapillarySignsLayer = function(context) { } }); - foreignObjects.attr('transform', transform); + foreignObjects + .attr('transform', iD.svg.PointTransform(roundedProjection)); foreignObjects.exit() .remove(); - // console.log(images); + if(!initiated) { initiated = true; - //context.map().zoomOut(); } }); } diff --git a/js/id/ui/map_data.js b/js/id/ui/map_data.js index d35283eb0..b232ffb79 100644 --- a/js/id/ui/map_data.js +++ b/js/id/ui/map_data.js @@ -42,12 +42,12 @@ iD.ui.MapData = function(context) { update(); } - function clickMapillary() { - context.background().toggleMapillaryLayer(); + function clickMapillaryImages() { + context.background().toggleMapillaryImageLayer(); update(); } function clickMapillarySigns() { - context.background().toggleMapillarySignsLayer(); + context.background().toggleMapillarySignLayer(); update(); } @@ -103,8 +103,8 @@ iD.ui.MapData = function(context) { var hasGpx = context.background().hasGpxLayer(), showsGpx = context.background().showsGpxLayer(), - showsMapillary = context.background().showsMapillaryLayer(), - showsMapillarySigns = context.background().showsMapillarySignsLayer(); + showsMapillaryImages = context.background().showsMapillaryImageLayer(), + showsMapillarySigns = context.background().showsMapillarySignLayer(); gpxLayerItem .classed('active', showsGpx) @@ -112,12 +112,12 @@ iD.ui.MapData = function(context) { .property('disabled', !hasGpx) .property('checked', showsGpx); - mapillaryLayerItem - .classed('active', showsMapillary) + mapillaryImageLayerItem + .classed('active', showsMapillaryImages) .selectAll('input') - .property('checked', showsMapillary); + .property('checked', showsMapillaryImages); - mapillarySignsLayerItem + mapillarySignLayerItem .classed('active', showsMapillarySigns) .selectAll('input') .property('checked', showsMapillarySigns); @@ -203,41 +203,44 @@ iD.ui.MapData = function(context) { .attr('class', 'filters') .style('display', 'block'); - // mapillary - var mapillaryLayerItem = layerContainer.append('ul') + + // Mapillary Image Layer + var mapillaryImageLayerItem = layerContainer.append('ul') .attr('class', 'layer-list') .append('li'); - var label = mapillaryLayerItem.append('label') + var labelImage = mapillaryImageLayerItem.append('label') .call(bootstrap.tooltip() - .title(t('mapillary.tooltip')) + .title(t('mapillary_images.tooltip')) .placement('top')); - label.append('input') + labelImage.append('input') .attr('type', 'checkbox') - .on('change', clickMapillary); + .on('change', clickMapillaryImages); - label.append('span') - .text(t('mapillary.title')); + labelImage.append('span') + .text(t('mapillary_images.title')); - // mapillary signs - var mapillarySignsLayerItem = layerContainer.append('ul') + + // Mapillary Sign Layer + var mapillarySignLayerItem = layerContainer.append('ul') .attr('class', 'layer-list') .append('li'); - var label_signs = mapillarySignsLayerItem.append('label') + var labelSigns = mapillarySignLayerItem.append('label') .call(bootstrap.tooltip() .title(t('mapillary_signs.tooltip')) .placement('top')); - label_signs.append('input') + labelSigns.append('input') .attr('type', 'checkbox') .on('change', clickMapillarySigns); - label_signs.append('span') + labelSigns.append('span') .text(t('mapillary_signs.title')); - //gpx + + // GPX Layer var gpxLayerItem = layerContainer.append('ul') .style('display', iD.detect().filedrop ? 'block' : 'none') .attr('class', 'layer-list') @@ -271,17 +274,17 @@ iD.ui.MapData = function(context) { }) .call(iD.svg.Icon('#icon-geolocate')); - label = gpxLayerItem.append('label') + var labelGpx = gpxLayerItem.append('label') .call(bootstrap.tooltip() .title(t('gpx.drag_drop')) .placement('top')); - label.append('input') + labelGpx.append('input') .attr('type', 'checkbox') .property('disabled', true) .on('change', clickGpx); - label.append('span') + labelGpx.append('span') .text(t('gpx.local_layer')); diff --git a/test/index.html b/test/index.html index 04f3c5ce4..bc932e87a 100644 --- a/test/index.html +++ b/test/index.html @@ -56,8 +56,8 @@ - - + +