diff --git a/src/components/LayerSwitcher/osmappLayers.tsx b/src/components/LayerSwitcher/osmappLayers.tsx index 2a50ba32..951940ee 100644 --- a/src/components/LayerSwitcher/osmappLayers.tsx +++ b/src/components/LayerSwitcher/osmappLayers.tsx @@ -36,12 +36,20 @@ export const osmappLayers: Layers = { attribution: ['osm'], }, sat: { - name: t('layers.sat'), + name: t('layers.maptilerSat'), type: 'basemap', url: 'https://api.maptiler.com/tiles/satellite-v2/tiles.json?key=7dlhLl3hiXQ1gsth0kGu', Icon: SatelliteIcon, attribution: ['maptiler'], }, + bingSat: { + name: t('layers.bingSat'), + type: 'basemap', + url: 'https://ecn.{bingSubdomains}.tiles.virtualearth.net/tiles/a{quadkey}.jpeg?g=13657', + Icon: SatelliteIcon, + attribution: ['© Microsoft'], + maxzoom: 19, + }, // mtb: { // name: t('layers.mtb'), // type: 'basemap', diff --git a/src/components/Map/behaviour/useUpdateStyle.tsx b/src/components/Map/behaviour/useUpdateStyle.tsx index adc8c376..b2cb60b0 100644 --- a/src/components/Map/behaviour/useUpdateStyle.tsx +++ b/src/components/Map/behaviour/useUpdateStyle.tsx @@ -12,6 +12,7 @@ export const getRasterLayer = (key) => { export const useUpdateStyle = useMapEffect((map, activeLayers) => { const key = activeLayers[0] ?? DEFAULT_MAP; + map.setMaxZoom(osmappLayers[key]?.maxzoom ?? 24); // TODO find a way how to zoom bing further (now it stops at 19) map.setStyle( key === 'basic' ? basicStyle diff --git a/src/components/Map/styles/rasterStyle.ts b/src/components/Map/styles/rasterStyle.ts index e0e999e5..13ceef1b 100644 --- a/src/components/Map/styles/rasterStyle.ts +++ b/src/components/Map/styles/rasterStyle.ts @@ -1,14 +1,28 @@ import maplibregl from 'maplibre-gl'; import { GLYPHS, OSMAPP_SOURCES, OSMAPP_SPRITE } from '../consts'; +const getSource = (url) => { + if (url.match('{bingSubdomains}')) { + return { + tiles: ['t0', 't1', 't2', 't3'].map((c) => + url?.replace('{bingSubdomains}', c), + ), + }; + } + + if (url.match('{x}')) { + return { + tiles: ['a', 'b', 'c'].map((c) => url?.replace('{s}', c)), + }; + } + + return { + url, // url as a tileset.json + }; +}; + export const rasterStyle = (id, url): maplibregl.Style => { - const source = url.match('{x}') - ? { - tiles: ['a', 'b', 'c'].map((c) => url?.replace('{s}', c)), - } - : { - url, // tileset.json - }; + const source = getSource(url); return { version: 8, sprite: OSMAPP_SPRITE, diff --git a/src/components/utils/MapStateContext.tsx b/src/components/utils/MapStateContext.tsx index f041ce96..8437e362 100644 --- a/src/components/utils/MapStateContext.tsx +++ b/src/components/utils/MapStateContext.tsx @@ -9,6 +9,7 @@ export interface Layer { key?: string; Icon?: React.FC; attribution?: string[]; // missing in spacer TODO refactor ugly + maxzoom?: number; } // // [b.getWest(), b.getNorth(), b.getEast(), b.getSouth()] diff --git a/src/locales/am.js b/src/locales/am.js index 9224156f..e443b970 100644 --- a/src/locales/am.js +++ b/src/locales/am.js @@ -143,6 +143,7 @@ export default { 'layers.mtb': 'MTB', 'layers.snow': 'በረዶ', 'layers.mapnik': 'OSM Mapnik', - 'layers.sat': 'ሳተላይት (z<14)', + 'layers.maptilerSat': 'Maptiler ሳተላይት (z<14)', + 'layers.bingSat': 'Bing ሳተላይት', 'layers.bike': 'ሳይክል', }; diff --git a/src/locales/cs.js b/src/locales/cs.js index 8f1e5f9b..97adebcd 100644 --- a/src/locales/cs.js +++ b/src/locales/cs.js @@ -148,6 +148,7 @@ export default { 'layers.mtb': 'MTB', 'layers.snow': 'Zimní', 'layers.mapnik': 'OSM Mapnik', - 'layers.sat': 'Satelitní', + 'layers.maptilerSat': 'Letecká Maptiler ', + 'layers.bingSat': 'Letecká Bing', 'layers.bike': 'Cyklo', }; diff --git a/src/locales/de.js b/src/locales/de.js index b373935d..bf3f0e9b 100644 --- a/src/locales/de.js +++ b/src/locales/de.js @@ -151,6 +151,7 @@ export default { 'layers.mtb': 'MTB', 'layers.snow': 'Schnee', 'layers.mapnik': 'OSM Mapnik', - 'layers.sat': 'Satellit (z<14)', + 'layers.maptilerSat': 'Maptiler Satellit (z<14)', + 'layers.bingSat': 'Bing Satellit', 'layers.bike': 'Fahrrad', }; diff --git a/src/locales/es.js b/src/locales/es.js index 4dc5ff81..8ee8a290 100644 --- a/src/locales/es.js +++ b/src/locales/es.js @@ -24,7 +24,7 @@ export default { 'homepage.examples.eg': 'ej.', 'homepage.examples.charles_bridge_statues': 'Estatuas del puente Charles', 'homepage.screenshot_alt': 'Pantallazo de OsmAPP', - 'homepage.about_osm': `Todos los datos del mapa son de + 'homepage.about_osm': `Todos los datos del mapa son de OpenStreetMap, un mapa creado por millones de contribuidores — similar a Wikipedia. Puedes encontrar el botón Editar en cada elemento del mapa.`, @@ -106,9 +106,9 @@ export default { 'editdialog.comment': 'Commentar (opcional)', 'editdialog.comment_placeholder': 'enlace a la fuente de la información etc.', 'editdialog.info_edit': `Tu edición será guardada inmediatamente en OpenStreetMap. Por favor, - introduce únicamente información que tú poseas o que venga de fuentes verificadas. Está prohibido + introduce únicamente información que tú poseas o que venga de fuentes verificadas. Está prohibido copiar información con derechos de autor (por ej. Google Maps). Más información`, - 'editdialog.info_note': `Tu sugerencia será procesada por voluntarios de OpenStreetMap volunteers. Aquí + 'editdialog.info_note': `Tu sugerencia será procesada por voluntarios de OpenStreetMap volunteers. Aquí puedes añadir una nota adicional o describir un ajuste de la posición, etc También es apropiado apoyar tu contribución con un enlace a la fuente de la información (web, foto, etc.).`, @@ -117,7 +117,7 @@ export default { 'editdialog.other_tags.add': 'Añadir otra etiqueta', 'editdialog.other_tags.will_be_deleted': 'será borrado', 'editdialog.other_tags.info': `Las Etiquetas describen las propiedades - de cada elemento del mapa en un formato acordado. Aquí puedes encontrar una + de cada elemento del mapa en un formato acordado. Aquí puedes encontrar una descripción general de todas las etiquetas en OpenStreetMap.`, 'editsuccess.close_button': 'Cerrar', @@ -151,6 +151,7 @@ export default { 'layers.mtb': 'BTT', 'layers.snow': 'Nieve', 'layers.mapnik': 'OSM Mapnik', - 'layers.sat': 'Satélite (z<14)', + 'layers.maptilerSat': 'Maptiler Satélite (z<14)', + 'layers.bingSat': 'Bing Satélite', 'layers.bike': 'Bici', }; diff --git a/src/locales/fr.js b/src/locales/fr.js index c46f0478..5f040f91 100644 --- a/src/locales/fr.js +++ b/src/locales/fr.js @@ -154,6 +154,7 @@ export default { 'layers.mtb': 'VTT', 'layers.snow': 'Neige', 'layers.mapnik': 'OSM Mapnik', - 'layers.sat': 'Satellite (zoom < 14)', + 'layers.maptilerSat': 'Maptiler Satellite (zoom < 14)', + 'layers.bingSat': 'Bing Satellite', 'layers.bike': 'Vélo', }; diff --git a/src/locales/it.js b/src/locales/it.js index f1f32aa6..c49c56e6 100644 --- a/src/locales/it.js +++ b/src/locales/it.js @@ -110,7 +110,7 @@ export default { È proibita la copia di dati protetti da copyright (ad es. Google Maps). Ulteriori informazioni`, 'editdialog.info_note': `Il tuo suggerimento verrà valutato dai volontari di OpenStreetMap. Qua puoi aggiungere un’ulteriore nota oppure descrivere la posizione precisa, etc. - Sarebbe anche appropriato supportare il tuo contributo con un link ad una fonte (sito web, + Sarebbe anche appropriato supportare il tuo contributo con un link ad una fonte (sito web, foto, etc.).`, 'editdialog.other_tags': 'Altre proprietà (etichette)', 'editdialog.other_tags.new_key': 'nuova chiave', @@ -151,6 +151,7 @@ export default { 'layers.mtb': 'MTB', 'layers.snow': 'Neve', 'layers.mapnik': 'OSM Mapnik', - 'layers.sat': 'Satellite (z<14)', + 'layers.maptilerSat': 'Maptiler Satellite (z<14)', + 'layers.bingSat': 'Bing Satellite', 'layers.bike': 'Bici', }; diff --git a/src/locales/pl.js b/src/locales/pl.js index 1cf90ee3..e9e6ef96 100644 --- a/src/locales/pl.js +++ b/src/locales/pl.js @@ -150,6 +150,7 @@ export default { 'layers.mtb': 'MTB', 'layers.snow': 'Śnieg', 'layers.mapnik': 'OSM Mapnik', - 'layers.sat': 'Satelita (p<14)', + 'layers.maptilerSat': 'Maptiler Satelita (p<14)', + 'layers.bingSat': 'Bing Satelita', 'layers.bike': 'Rower', }; diff --git a/src/locales/vocabulary.js b/src/locales/vocabulary.js index 5be998c2..727e0a86 100644 --- a/src/locales/vocabulary.js +++ b/src/locales/vocabulary.js @@ -154,7 +154,7 @@ export default { 'layers.mtb': 'MTB', 'layers.snow': 'Snow', 'layers.mapnik': 'OSM Mapnik', - 'layers.sat': 'Satellite (z<14)', - 'layers.bingSat': 'Bing satellite', + 'layers.maptilerSat': 'Maptiler Satellite (z<14)', + 'layers.bingSat': 'Bing Satellite', 'layers.bike': 'Bike', };