Merge branch 'esri-vintage' of https://github.com/jgravois/iD into jgravois-esri-vintage

This commit is contained in:
Bryan Housel
2017-09-12 09:45:18 -04:00
6 changed files with 110 additions and 33 deletions
+4
View File
@@ -278,6 +278,10 @@ en:
title: Background
zoom: Zoom
vintage: Vintage
source: Source
description: Description
resolution: Resolution
accuracy: Accuracy
unknown: Unknown
show_tiles: Show Tiles
hide_tiles: Hide Tiles
+52 -26
View File
@@ -133,7 +133,7 @@ export function rendererBackgroundSource(data) {
source.copyrightNotices = function() {};
source.getVintage = function(center, tileCoord, callback) {
source.getMetadata = function(center, tileCoord, callback) {
var vintage = {
start: localeDateString(source.startDate),
end: localeDateString(source.endDate)
@@ -190,7 +190,7 @@ rendererBackgroundSource.Bing = function(data, dispatch) {
};
bing.getVintage = function(center, tileCoord, callback) {
bing.getMetadata = function(center, tileCoord, callback) {
var tileId = tileCoord.slice(0, 3).join('/'),
zoom = Math.min(tileCoord[2], 21),
centerPoint = center[1] + ',' + center[0], // lat,lng
@@ -232,6 +232,7 @@ rendererBackgroundSource.Bing = function(data, dispatch) {
rendererBackgroundSource.Esri = function(data) {
// don't request blank tiles, instead overzoom real tiles - #4327
// deprecated technique, but it works (for now)
if (data.template.match(/blankTile/) === null) {
data.template = data.template + '?blankTile=false';
}
@@ -239,13 +240,26 @@ rendererBackgroundSource.Esri = function(data) {
var esri = rendererBackgroundSource(data),
cache = {};
esri.getVintage = function(center, tileCoord, callback) {
var tileId = tileCoord.slice(0, 3).join('/');
// FIXME: construct service URL
// zoom = Math.min(tileCoord[2], esri.scaleExtent[1]),
// centerPoint = center[1] + ',' + center[0], // lat,lng
// url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
// '?zl=' + zoom + '&key=' + key + '&jsonp={callback}';
esri.getMetadata = function(center, tileCoord, callback) {
var tileId = tileCoord.slice(0, 3).join('/'),
zoom = Math.min(tileCoord[2], esri.scaleExtent[1]),
centerPoint = center[0] + ',' + center[1], // long, lat (as it should be)
metadataLayer;
switch (true) {
case zoom >= 19:
metadataLayer = 3;
break;
case zoom >= 17:
metadataLayer = 2;
break;
case zoom >= 13:
metadataLayer = 0;
break;
default:
metadataLayer = 99;
}
// build up query using the layer appropriate to the current zoom
var url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/' + metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json&callback={callback}';
if (!cache[tileId]) {
cache[tileId] = {};
@@ -254,24 +268,36 @@ rendererBackgroundSource.Esri = function(data) {
return callback(null, cache[tileId].vintage);
}
// FIXME: remove dummy result:
callback(null, { start: null, end: null, range: '? - ?'});
// accurate metadata is only available >= 13
if (metadataLayer === 99) {
callback(null, {
range: 'Unknown',
source: 'Unknown',
description: 'Unknown',
resolution: 'Unknown',
accuracy: 'Unknown'
});
} else {
jsonpRequest(url, function(result) {
var err = !result || result.features.length < 1;
if (err) {
return callback(err);
} else {
var vintage = {
// pass through the discrete capture date from metadata
range: localeDateString(result.features[0].attributes.SRC_DATE2),
source: result.features[0].attributes.NICE_NAME,
description: result.features[0].attributes.NICE_DESC,
resolution: result.features[0].attributes.SRC_RES,
accuracy: result.features[0].attributes.SRC_ACC,
// FIXME: call service instead:
// jsonpRequest(url, function(result) {
// var err = (!result && 'Unknown Error') || result.errorDetails;
// if (err) {
// return callback(err);
// } else {
// var vintage = {
// start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
// end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
// };
// vintage.range = vintageRange(vintage);
// cache[tileId].vintage = vintage;
// return callback(null, vintage);
// }
// });
};
cache[tileId].vintage = vintage;
return callback(null, vintage);
}
});
}
};
return esri;
+1 -1
View File
@@ -255,7 +255,7 @@ export function rendererTileLayer(context) {
.each(function(d) {
var span = d3.select(this);
var center = context.projection.invert(tileCenter(d));
source.getVintage(center, d, function(err, result) {
source.getMetadata(center, d, function(err, result) {
span.text((result && result.range) ||
t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
);
+50 -5
View File
@@ -9,6 +9,10 @@ export function uiPanelBackground(context) {
var currZoom = '';
var currVintage = '';
var currProvider = '';
var currDescription = '';
var currResolution = '';
var currAccuracy = '';
function redraw(selection) {
if (currSource !== background.baseLayerSource().name()) {
@@ -42,9 +46,35 @@ export function uiPanelBackground(context) {
.text(currVintage);
if (!currVintage) {
debouncedGetVintage(selection);
debouncedGetMetadata(selection);
}
if (currSource === 'Esri World Imagery') {
list
.append('li')
.text(t('info_panels.background.source') + ': ')
.append('span')
.attr('class', 'source')
.text(currProvider);
list
.append('li')
.text(t('info_panels.background.description') + ': ')
.append('span')
.attr('class', 'description')
.text(currDescription);
list
.append('li')
.text(t('info_panels.background.resolution') + ': ')
.append('span')
.attr('class', 'resolution')
.text(currResolution);
list
.append('li')
.text(t('info_panels.background.accuracy') + ': ')
.append('span')
.attr('class', 'accuracy')
.text(currAccuracy);
}
var toggle = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
selection
@@ -60,8 +90,8 @@ export function uiPanelBackground(context) {
}
var debouncedGetVintage = _.debounce(getVintage, 250);
function getVintage(selection) {
var debouncedGetMetadata = _.debounce(getMetadata, 250);
function getMetadata(selection) {
var tile = d3.select('.layer-background img.tile-center'); // tile near viewport center
if (tile.empty()) return;
@@ -74,10 +104,25 @@ export function uiPanelBackground(context) {
.text(currZoom);
if (!d || !d.length >= 3) return;
background.baseLayerSource().getVintage(center, d, function(err, result) {
background.baseLayerSource().getMetadata(center, d, function(err, result) {
currVintage = (result && result.range) || t('info_panels.background.unknown');
selection.selectAll('.vintage')
.text(currVintage);
// metadata from Esri can tell us the specific provider
if (result.source) {
currSource = result.source;
selection.selectAll('.source')
.text(currSource);
currDescription = result.description;
selection.selectAll('.description')
.text(currDescription);
currResolution = result.resolution;
selection.selectAll('.resolution')
.text(currResolution + ' (m)');
currAccuracy = result.accuracy;
selection.selectAll('.accuracy')
.text(currAccuracy + ' (m)');
}
});
}
@@ -90,7 +135,7 @@ export function uiPanelBackground(context) {
selection.call(redraw);
})
.on('move.info-background', function() {
selection.call(debouncedGetVintage);
selection.call(debouncedGetMetadata);
});
};
+1
View File
@@ -29,6 +29,7 @@ export function uiStatus(context) {
osm.authenticate();
});
} else {
// eslint-disable-next-line no-warning-comments
// TODO: nice messages for different error types
selection.text(t('status.error'));
}
+2 -1
View File
@@ -20,4 +20,5 @@ mocha.setup({
});
expect = chai.expect;
var d3 = iD.d3;
// eslint-disable-next-line no-unused-vars
var d3 = iD.d3;