diff --git a/CHANGELOG.md b/CHANGELOG.md index 453c9c7cb3..a2eb26ab17 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -46,6 +46,7 @@ _Breaking developer changes, which may affect downstream projects or sites that #### :scissors: Operations #### :camera: Street-Level * Add Panoramax as new street level imagery provider ([#9941], thanks [@mattiapezzotti]) +* Fix intermittent issues with Bing Streetside sometimes returning API results in a undocumented format ([#10341]) #### :white_check_mark: Validation #### :bug: Bugfixes * Fix bug which required a second button click when resolving/reopening of OSM notes ([#8994], thanks [@laigyu]) diff --git a/modules/services/pannellum_photo.js b/modules/services/pannellum_photo.js index 99222d4d2c..566358edde 100644 --- a/modules/services/pannellum_photo.js +++ b/modules/services/pannellum_photo.js @@ -27,7 +27,8 @@ export default { const options = { 'default': { firstScene: '' }, - scenes: {} + scenes: {}, + minHfov: 20 }; _pannellumViewer = window.pannellum.viewer('ideditor-pannellum-viewer', options); @@ -147,6 +148,8 @@ export default { _pannellumViewer.removeScene(old_key); } + _pannellumViewer.resize(); + return this; }, diff --git a/modules/services/panoramax.js b/modules/services/panoramax.js index 5cd2503633..59ac968a0b 100644 --- a/modules/services/panoramax.js +++ b/modules/services/panoramax.js @@ -63,9 +63,18 @@ function searchLimited(limit, projection, rtree) { return partitionViewport(projection) .reduce(function(result, extent) { - const found = rtree.search(extent.bbox()) + let found = rtree.search(extent.bbox()); + const spacing = Math.max(1, Math.floor(found.length / limit)); + found = found + .filter((d, idx) => idx % spacing === 0 || + d.data.id === _activeImage?.id) + .sort((a, b) => { + if (a.data.id === _activeImage?.id) return -1; + if (b.data.id === _activeImage?.id) return 1; + return 0; + }) .slice(0, limit) - .map(function(d) { return d.data; }); + .map(d => d.data); return (found.length ? result.concat(found) : result); }, []); @@ -147,6 +156,7 @@ function loadTileDataToCache(data, tile, zoom) { d = { loc: loc, capture_time: feature.properties.ts, + capture_time_parsed: new Date(feature.properties.ts), id: feature.properties.id, account_id: feature.properties.account_id, sequence_id: feature.properties.sequences.split('\"')[1], @@ -468,8 +478,8 @@ export default { _currentFrame = d.isPano ? _pannellumFrame : _planeFrame; _currentFrame - .selectPhoto(d, true) - .showPhotoFrame(wrap); + .showPhotoFrame(wrap) + .selectPhoto(d, true); }); function localeDateString(s) { diff --git a/modules/services/streetside.js b/modules/services/streetside.js index def9bc0e3d..7f4893948a 100644 --- a/modules/services/streetside.js +++ b/modules/services/streetside.js @@ -114,14 +114,18 @@ function loadNextTilePage(which, url, tile) { const bubbleId = bubble.imageUrl; if (cache.points[bubbleId]) return null; // skip duplicates - const loc = [bubble.lon, bubble.lat]; + // workaround for https://github.com/openstreetmap/iD/issues/10341#issuecomment-2275724738 + const loc = [ + bubble.lon || bubble.longitude, + bubble.lat || bubble.latitude + ]; const d = { loc: loc, key: bubbleId, imageUrl: bubble.imageUrl.replace('{subdomain}', bubble.imageUrlSubdomains[0] ), - ca: bubble.he, + ca: bubble.he || bubble.heading, captured_at: bubble.vintageEnd, captured_by: 'microsoft', pano: true, diff --git a/modules/svg/panoramax_images.js b/modules/svg/panoramax_images.js index ae0c7d3567..351ead2f6f 100644 --- a/modules/svg/panoramax_images.js +++ b/modules/svg/panoramax_images.js @@ -152,9 +152,12 @@ export function svgPanoramaxImages(projection, context, dispatch) { .on('end', editOff); } - function transform(d) { + function transform(d, selectedImageId) { let t = svgPointTransform(projection)(d); - var rot = d.heading + _viewerYaw; + let rot = d.heading; + if (d.id === selectedImageId) { + rot += _viewerYaw; + } if (rot) { t += ' rotate(' + Math.floor(rot) + ',0,0)'; } @@ -208,7 +211,7 @@ export function svgPanoramaxImages(projection, context, dispatch) { const service = getService(); let sequences = (service ? service.sequences(projection, zoom) : []); - let images = (service ? service.images(projection) : []); + let images = (service && zoom >= imageMinZoom ? service.images(projection) : []); images = await filterImages(images); sequences = await filterSequences(sequences, service); @@ -246,13 +249,18 @@ export function svgPanoramaxImages(projection, context, dispatch) { .append('g') .attr('class', 'viewfield-scale'); + const activeImageId = service.getActiveImage()?.id; // update const markers = groups .merge(groupsEnter) .sort(function(a, b) { - return b.loc[1] - a.loc[1]; // sort Y + // active image on top + if (a.id === activeImageId) return 1; + if (b.id === activeImageId) return -1; + // else: sort by capture time (newest on top) + return a.capture_time_parsed - b.capture_time_parsed; }) - .attr('transform', transform) + .attr('transform', d => transform(d, activeImageId)) .select('.viewfield-scale'); @@ -292,6 +300,7 @@ export function svgPanoramaxImages(projection, context, dispatch) { if (!service) return; const frame = service.photoFrame(); + if (!frame) return; // update viewfield rotation _viewerYaw = frame.getYaw(); @@ -301,7 +310,7 @@ export function svgPanoramaxImages(projection, context, dispatch) { if (context.map().isTransformed()) return; layer.selectAll('.viewfield-group.currentView') - .attr('transform', transform); + .attr('transform', d => transform(d, d.id)); } diff --git a/package-lock.json b/package-lock.json index de32b5c561..424adf116f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,13 +20,13 @@ "abortcontroller-polyfill": "^1.7.5", "aes-js": "^3.1.2", "alif-toolkit": "^1.3.0", - "core-js-bundle": "^3.37.1", + "core-js-bundle": "^3.38.0", "diacritics": "1.3.0", "exifr": "^7.1.3", "fast-deep-equal": "~3.1.1", "fast-json-stable-stringify": "2.1.0", "lodash-es": "~4.17.15", - "marked": "~13.0.3", + "marked": "~14.0.0", "node-diff3": "~3.1.0", "osm-auth": "~2.5.0", "pannellum": "2.5.6", @@ -44,9 +44,9 @@ "@mapbox/maki": "^8.0.1", "@openstreetmap/id-tagging-schema": "^6.7.3", "@rapideditor/mapillary_sprite_source": "^1.8.0", - "@rapideditor/temaki": "^5.8.0", - "@transifex/api": "^7.1.0", - "autoprefixer": "^10.4.19", + "@rapideditor/temaki": "^5.9.0", + "@transifex/api": "^7.1.2", + "autoprefixer": "^10.4.20", "browserslist": "^4.23.3", "browserslist-to-esbuild": "^2.1.1", "chai": "^4.5.0", @@ -77,7 +77,7 @@ "name-suggestion-index": "~6.0", "npm-run-all": "^4.0.0", "osm-community-index": "~5.8.0", - "postcss": "^8.4.40", + "postcss": "^8.4.41", "postcss-selector-prepend": "^0.5.0", "shelljs": "^0.8.0", "shx": "^0.3.0", @@ -1987,9 +1987,9 @@ "dev": true }, "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -2006,11 +2006,11 @@ } ], "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -2584,9 +2584,9 @@ } }, "node_modules/core-js-bundle": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-bundle/-/core-js-bundle-3.37.1.tgz", - "integrity": "sha512-Bt9sorQku7bA6xoaY2NYdeaEnitLg9peHJ+eAijrARCQ5FhkoUW1eF4oI35XfP9kyeyljw71uCud4ju8tjGhsg==", + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/core-js-bundle/-/core-js-bundle-3.38.0.tgz", + "integrity": "sha512-YjlkIsq3je9JSpsD+jBF5gI4rwnvJjTbLPSuZWcmbt0jS6bbGkU/aLk/sXkLHo5+CMd29JVRarHADlbRAymX0g==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5827,9 +5827,9 @@ } }, "node_modules/marked": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-13.0.3.tgz", - "integrity": "sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", + "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", "bin": { "marked": "bin/marked.js" }, @@ -6875,9 +6875,9 @@ "license": "ISC" }, "node_modules/postcss": { - "version": "8.4.40", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", - "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "dev": true, "funding": [ { @@ -10258,16 +10258,16 @@ "dev": true }, "autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "requires": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" } }, @@ -10661,9 +10661,9 @@ "dev": true }, "core-js-bundle": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-bundle/-/core-js-bundle-3.37.1.tgz", - "integrity": "sha512-Bt9sorQku7bA6xoaY2NYdeaEnitLg9peHJ+eAijrARCQ5FhkoUW1eF4oI35XfP9kyeyljw71uCud4ju8tjGhsg==" + "version": "3.38.0", + "resolved": "https://registry.npmjs.org/core-js-bundle/-/core-js-bundle-3.38.0.tgz", + "integrity": "sha512-YjlkIsq3je9JSpsD+jBF5gI4rwnvJjTbLPSuZWcmbt0jS6bbGkU/aLk/sXkLHo5+CMd29JVRarHADlbRAymX0g==" }, "core-util-is": { "version": "1.0.3", @@ -12839,9 +12839,9 @@ } }, "marked": { - "version": "13.0.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-13.0.3.tgz", - "integrity": "sha512-rqRix3/TWzE9rIoFGIn8JmsVfhiuC8VIQ8IdX5TfzmeBucdY05/0UlzKaw0eVtpcN/OdVFpBk7CjKGo9iHJ/zA==" + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", + "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==" }, "martinez-polygon-clipping": { "version": "0.7.3", @@ -13559,9 +13559,9 @@ } }, "postcss": { - "version": "8.4.40", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.40.tgz", - "integrity": "sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==", + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "dev": true, "requires": { "nanoid": "^3.3.7", diff --git a/package.json b/package.json index e5d4d36a32..08609fcbbb 100644 --- a/package.json +++ b/package.json @@ -55,13 +55,13 @@ "abortcontroller-polyfill": "^1.7.5", "aes-js": "^3.1.2", "alif-toolkit": "^1.3.0", - "core-js-bundle": "^3.37.1", + "core-js-bundle": "^3.38.0", "diacritics": "1.3.0", "exifr": "^7.1.3", "fast-deep-equal": "~3.1.1", "fast-json-stable-stringify": "2.1.0", "lodash-es": "~4.17.15", - "marked": "~13.0.3", + "marked": "~14.0.0", "node-diff3": "~3.1.0", "osm-auth": "~2.5.0", "pannellum": "2.5.6", @@ -79,9 +79,9 @@ "@mapbox/maki": "^8.0.1", "@openstreetmap/id-tagging-schema": "^6.7.3", "@rapideditor/mapillary_sprite_source": "^1.8.0", - "@rapideditor/temaki": "^5.8.0", - "@transifex/api": "^7.1.0", - "autoprefixer": "^10.4.19", + "@rapideditor/temaki": "^5.9.0", + "@transifex/api": "^7.1.2", + "autoprefixer": "^10.4.20", "browserslist": "^4.23.3", "browserslist-to-esbuild": "^2.1.1", "chai": "^4.5.0", @@ -112,7 +112,7 @@ "name-suggestion-index": "~6.0", "npm-run-all": "^4.0.0", "osm-community-index": "~5.8.0", - "postcss": "^8.4.40", + "postcss": "^8.4.41", "postcss-selector-prepend": "^0.5.0", "shelljs": "^0.8.0", "shx": "^0.3.0", diff --git a/scripts/build_data.js b/scripts/build_data.js index a5dcd2a79b..f89b841c4a 100644 --- a/scripts/build_data.js +++ b/scripts/build_data.js @@ -121,7 +121,7 @@ function buildData() { }); }).then(() => // also fetch the bleeding edge data too to make sure we're always hosting the latest icons - fetch('https://github.com/raw/openstreetmap/id-tagging-schema/main/interim/icons.json') + fetch('https://github.com/raw/openstreetmap/id-tagging-schema/interim/icons.json') ).then(response => response.json()).then(cuttingEdgeIcons => { cuttingEdgeIcons .filter(icon => /^fa[srb]-/.test(icon))