mirror of
https://github.com/FoggedLens/iD.git
synced 2026-05-09 03:25:37 +02:00
183 lines
5.7 KiB
JavaScript
183 lines
5.7 KiB
JavaScript
iD.MapillarySignLayer = function(context) {
|
|
var urlSearch = 'https://a.mapillary.com/v2/search/im/geojson/or',
|
|
urlImage = 'http://mapillary.com/map/im/',
|
|
urlThumb = 'https://d1cuyjsrcm0gby.cloudfront.net/',
|
|
clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi',
|
|
enable = false,
|
|
initiated = false,
|
|
signs_defs = {},
|
|
currentImage, svg, image_preview_div, request;
|
|
|
|
_.each(['au', 'br', 'ca', 'de', 'us'], function(el) {
|
|
d3.json(context.assetPath() + 'traffico/string-maps/' + el + '-map.json', function(err, data) {
|
|
if (err) return;
|
|
if (el === 'de') el = 'eu';
|
|
signs_defs[el] = data;
|
|
});
|
|
});
|
|
|
|
function show(image) {
|
|
svg.selectAll('.icon-sign')
|
|
.classed('selected', function(d) {
|
|
return currentImage && d.key === currentImage.key;
|
|
});
|
|
|
|
image_preview_div.classed('hidden', false)
|
|
.classed('temp', image !== currentImage);
|
|
|
|
image_preview_div.selectAll('img')
|
|
.attr('src', urlThumb + image.key + '/thumb-320.jpg');
|
|
|
|
image_preview_div.selectAll('a')
|
|
.attr('href', urlImage + image.key);
|
|
}
|
|
|
|
function hide() {
|
|
currentImage = undefined;
|
|
svg.selectAll('.icon-sign')
|
|
.classed('selected', false);
|
|
image_preview_div.classed('hidden', true);
|
|
}
|
|
|
|
function render(selection) {
|
|
svg = selection.selectAll('svg')
|
|
.data([0]);
|
|
|
|
svg.enter().append('svg');
|
|
|
|
svg.style('display', enable ? 'block' : 'none');
|
|
|
|
image_preview_div = context.container().selectAll('.mapillary-image')
|
|
.data([0]);
|
|
|
|
var enter = image_preview_div.enter().append('div')
|
|
.attr('class', 'mapillary-image');
|
|
|
|
enter.append('button')
|
|
.on('click', hide)
|
|
.append('div')
|
|
.attr('class', 'icon close');
|
|
|
|
enter.append('img');
|
|
|
|
var link = enter.append('a')
|
|
.attr('class', 'link')
|
|
.attr('target', '_blank');
|
|
|
|
link.append('span')
|
|
.attr('class', 'icon icon-pre-text out-link');
|
|
|
|
link.append('span')
|
|
.text(t('mapillary_signs.view_on_mapillary'));
|
|
|
|
if (!enable) {
|
|
hide();
|
|
|
|
svg.selectAll('.icon-sign')
|
|
.remove();
|
|
|
|
return;
|
|
}
|
|
|
|
// hack
|
|
svg.selectAll('.icon-sign')
|
|
.remove();
|
|
|
|
var extent = context.map().extent();
|
|
|
|
if (request)
|
|
request.abort();
|
|
|
|
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;
|
|
var images = [];
|
|
|
|
for (var i = 0; i < data.features.length; i++) {
|
|
var trafficsign = data.features[i];
|
|
images.push({
|
|
key: trafficsign.properties.key,
|
|
loc: trafficsign.geometry.coordinates,
|
|
signs: trafficsign.properties.rects
|
|
});
|
|
if (images.length >= 1000) break;
|
|
}
|
|
|
|
var foreignObjects = svg.selectAll('foreignObject')
|
|
.data(images, function(d) { return d.key; });
|
|
|
|
var enter = foreignObjects.enter();
|
|
|
|
enter.append('foreignObject')
|
|
.attr('class', 'icon-sign')
|
|
.append('xhtml:body')
|
|
.html(function(d) {
|
|
var detectionPackage = d.signs[0].package,
|
|
type = d.signs[0].type,
|
|
country= detectionPackage.split('_')[1],
|
|
sign_html = signs_defs[country][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);
|
|
}
|
|
})
|
|
.on('mouseover', function(data) {
|
|
if (!data) {
|
|
d3.event.preventDefault();
|
|
return;
|
|
}
|
|
show(data);
|
|
})
|
|
.on('mouseout', function(data) {
|
|
if (!data) {
|
|
d3.event.preventDefault();
|
|
return;
|
|
}
|
|
if (currentImage) {
|
|
show(currentImage);
|
|
} else {
|
|
hide();
|
|
}
|
|
});
|
|
|
|
foreignObjects
|
|
.attr('transform', iD.svg.PointTransform(context.projection));
|
|
|
|
foreignObjects.exit()
|
|
.remove();
|
|
|
|
if(!initiated) {
|
|
initiated = true;
|
|
}
|
|
});
|
|
}
|
|
|
|
render.enable = function(_) {
|
|
if (!arguments.length) return enable;
|
|
enable = _;
|
|
return render;
|
|
};
|
|
|
|
render.dimensions = function(_) {
|
|
if (!arguments.length) return svg.dimensions();
|
|
svg.dimensions(_);
|
|
return render;
|
|
};
|
|
|
|
return render;
|
|
};
|