aboutsummaryrefslogtreecommitdiff
path: root/src/map/core/useMapStyles.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/core/useMapStyles.js')
-rw-r--r--src/map/core/useMapStyles.js259
1 files changed, 259 insertions, 0 deletions
diff --git a/src/map/core/useMapStyles.js b/src/map/core/useMapStyles.js
new file mode 100644
index 00000000..7c3412b5
--- /dev/null
+++ b/src/map/core/useMapStyles.js
@@ -0,0 +1,259 @@
+import { useMemo } from 'react';
+import { useSelector } from 'react-redux';
+import { useTranslation } from '../../common/components/LocalizationProvider';
+import { useAttributePreference } from '../../common/util/preferences';
+
+const styleCustom = ({ tiles, minZoom, maxZoom, attribution }) => {
+ const source = {
+ type: 'raster',
+ tiles,
+ attribution,
+ tileSize: 256,
+ minzoom: minZoom,
+ maxzoom: maxZoom,
+ };
+ Object.keys(source).forEach((key) => source[key] === undefined && delete source[key]);
+ return {
+ version: 8,
+ sources: {
+ custom: source,
+ },
+ glyphs: 'https://cdn.traccar.com/map/fonts/{fontstack}/{range}.pbf',
+ layers: [{
+ id: 'custom',
+ type: 'raster',
+ source: 'custom',
+ }],
+ };
+};
+
+export default () => {
+ const t = useTranslation();
+
+ const mapTilerKey = useAttributePreference('mapTilerKey');
+ const locationIqKey = useAttributePreference('locationIqKey') || 'pk.0f147952a41c555a5b70614039fd148b';
+ const bingMapsKey = useAttributePreference('bingMapsKey');
+ const tomTomKey = useAttributePreference('tomTomKey');
+ const hereKey = useAttributePreference('hereKey');
+ const mapboxAccessToken = useAttributePreference('mapboxAccessToken');
+ const customMapUrl = useSelector((state) => state.session.server.mapUrl);
+
+ return useMemo(() => [
+ {
+ id: 'locationIqStreets',
+ title: t('mapLocationIqStreets'),
+ style: `https://tiles.locationiq.com/v3/streets/vector.json?key=${locationIqKey}`,
+ available: true,
+ },
+ {
+ id: 'locationIqDark',
+ title: t('mapLocationIqDark'),
+ style: `https://tiles.locationiq.com/v3/dark/vector.json?key=${locationIqKey}`,
+ available: true,
+ },
+ {
+ id: 'osm',
+ title: t('mapOsm'),
+ style: styleCustom({
+ tiles: ['https://tile.openstreetmap.org/{z}/{x}/{y}.png'],
+ maxZoom: 19,
+ attribution: '© <a target="_top" rel="noopener" href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',
+ }),
+ available: true,
+ },
+ {
+ id: 'openTopoMap',
+ title: t('mapOpenTopoMap'),
+ style: styleCustom({
+ tiles: ['a', 'b', 'c'].map((i) => `https://${i}.tile.opentopomap.org/{z}/{x}/{y}.png`),
+ maxZoom: 17,
+ }),
+ available: true,
+ },
+ {
+ id: 'carto',
+ title: t('mapCarto'),
+ style: styleCustom({
+ tiles: ['a', 'b', 'c', 'd'].map((i) => `https://${i}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}@2x.png`),
+ maxZoom: 22,
+ attribution: '© <a target="_top" rel="noopener" href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, © <a target="_top" rel="noopener" href="https://carto.com/attribution">CARTO</a>',
+ }),
+ available: true,
+ },
+ {
+ id: 'googleRoad',
+ title: t('mapGoogleRoad'),
+ style: styleCustom({
+ tiles: [0, 1, 2, 3].map((i) => `https://mt${i}.google.com/vt/lyrs=m&hl=en&x={x}&y={y}&z={z}&s=Ga`),
+ maxZoom: 20,
+ attribution: '© Google',
+ }),
+ available: true,
+ },
+ {
+ id: 'googleSatellite',
+ title: t('mapGoogleSatellite'),
+ style: styleCustom({
+ tiles: [0, 1, 2, 3].map((i) => `https://mt${i}.google.com/vt/lyrs=s&hl=en&x={x}&y={y}&z={z}&s=Ga`),
+ maxZoom: 20,
+ attribution: '© Google',
+ }),
+ available: true,
+ },
+ {
+ id: 'googleHybrid',
+ title: t('mapGoogleHybrid'),
+ style: styleCustom({
+ tiles: [0, 1, 2, 3].map((i) => `https://mt${i}.google.com/vt/lyrs=y&hl=en&x={x}&y={y}&z={z}&s=Ga`),
+ maxZoom: 20,
+ attribution: '© Google',
+ }),
+ available: true,
+ },
+ {
+ id: 'mapTilerBasic',
+ title: t('mapMapTilerBasic'),
+ style: `https://api.maptiler.com/maps/basic/style.json?key=${mapTilerKey}`,
+ available: !!mapTilerKey,
+ attribute: 'mapTilerKey',
+ },
+ {
+ id: 'mapTilerHybrid',
+ title: t('mapMapTilerHybrid'),
+ style: `https://api.maptiler.com/maps/hybrid/style.json?key=${mapTilerKey}`,
+ available: !!mapTilerKey,
+ attribute: 'mapTilerKey',
+ },
+ {
+ id: 'bingRoad',
+ title: t('mapBingRoad'),
+ style: styleCustom({
+ tiles: [0, 1, 2, 3].map((i) => `https://t${i}.ssl.ak.dynamic.tiles.virtualearth.net/comp/ch/{quadkey}?mkt=en-US&it=G,L&shading=hill&og=1885&n=z`),
+ maxZoom: 21,
+ }),
+ available: !!bingMapsKey,
+ attribute: 'bingMapsKey',
+ },
+ {
+ id: 'bingAerial',
+ title: t('mapBingAerial'),
+ style: styleCustom({
+ tiles: [0, 1, 2, 3].map((i) => `https://ecn.t${i}.tiles.virtualearth.net/tiles/a{quadkey}.jpeg?g=12327`),
+ maxZoom: 19,
+ }),
+ available: !!bingMapsKey,
+ attribute: 'bingMapsKey',
+ },
+ {
+ id: 'bingHybrid',
+ title: t('mapBingHybrid'),
+ style: styleCustom({
+ tiles: [0, 1, 2, 3].map((i) => `https://t${i}.ssl.ak.dynamic.tiles.virtualearth.net/comp/ch/{quadkey}?mkt=en-US&it=A,G,L&og=1885&n=z`),
+ maxZoom: 19,
+ }),
+ available: !!bingMapsKey,
+ attribute: 'bingMapsKey',
+ },
+ {
+ id: 'tomTomBasic',
+ title: t('mapTomTomBasic'),
+ style: `https://api.tomtom.com/map/1/style/20.0.0-8/basic_main.json?key=${tomTomKey}`,
+ available: !!tomTomKey,
+ attribute: 'tomTomKey',
+ },
+ {
+ id: 'hereBasic',
+ title: t('mapHereBasic'),
+ style: `https://assets.vector.hereapi.com/styles/berlin/base/mapbox/tilezen?apikey=${hereKey}`,
+ available: !!hereKey,
+ attribute: 'hereKey',
+ },
+ {
+ id: 'hereHybrid',
+ title: t('mapHereHybrid'),
+ style: styleCustom({
+ tiles: [1, 2, 3, 4].map((i) => `https://${i}.aerial.maps.ls.hereapi.com/maptile/2.1/maptile/newest/hybrid.day/{z}/{x}/{y}/256/png8?apiKey=${hereKey}`),
+ maxZoom: 20,
+ }),
+ available: !!hereKey,
+ attribute: 'hereKey',
+ },
+ {
+ id: 'hereSatellite',
+ title: t('mapHereSatellite'),
+ style: styleCustom({
+ tiles: [1, 2, 3, 4].map((i) => `https://${i}.aerial.maps.ls.hereapi.com/maptile/2.1/maptile/newest/satellite.day/{z}/{x}/{y}/256/png8?apiKey=${hereKey}`),
+ maxZoom: 19,
+ }),
+ available: !!hereKey,
+ attribute: 'hereKey',
+ },
+ {
+ id: 'autoNavi',
+ title: t('mapAutoNavi'),
+ style: styleCustom({
+ tiles: [1, 2, 3, 4].map((i) => `https://webrd0${i}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}`),
+ minZoom: 3,
+ maxZoom: 18,
+ }),
+ available: true,
+ },
+ {
+ id: 'ordnanceSurvey',
+ title: t('mapOrdnanceSurvey'),
+ style: 'https://api.os.uk/maps/vector/v1/vts/resources/styles?key=EAZ8p83u72FTGiLjLC2MsTAl1ko6XQHC',
+ transformRequest: (url) => ({
+ url: `${url}&srs=3857`,
+ }),
+ available: true,
+ },
+ {
+ id: 'mapboxStreets',
+ title: t('mapMapboxStreets'),
+ style: styleCustom({
+ tiles: [`https://api.mapbox.com/styles/v1/mapbox/streets-v11/tiles/{z}/{x}/{y}?access_token=${mapboxAccessToken}`],
+ maxZoom: 22,
+ }),
+ available: !!mapboxAccessToken,
+ attribute: 'mapboxAccessToken',
+ },
+ {
+ id: 'mapboxStreetsDark',
+ title: t('mapMapboxStreetsDark'),
+ style: styleCustom({
+ tiles: [`https://api.mapbox.com/styles/v1/mapbox/dark-v11/tiles/{z}/{x}/{y}?access_token=${mapboxAccessToken}`],
+ maxZoom: 22,
+ }),
+ available: !!mapboxAccessToken,
+ attribute: 'mapboxAccessToken',
+ },
+ {
+ id: 'mapboxOutdoors',
+ title: t('mapMapboxOutdoors'),
+ style: styleCustom({
+ tiles: [`https://api.mapbox.com/styles/v1/mapbox/outdoors-v11/tiles/{z}/{x}/{y}?access_token=${mapboxAccessToken}`],
+ maxZoom: 22,
+ }),
+ available: !!mapboxAccessToken,
+ attribute: 'mapboxAccessToken',
+ },
+ {
+ id: 'mapboxSatelliteStreet',
+ title: t('mapMapboxSatellite'),
+ style: styleCustom({
+ tiles: [`https://api.mapbox.com/styles/v1/mapbox/satellite-streets-v11/tiles/{z}/{x}/{y}?access_token=${mapboxAccessToken}`],
+ maxZoom: 22,
+ }),
+ available: !!mapboxAccessToken,
+ attribute: 'mapboxAccessToken',
+ },
+ {
+ id: 'custom',
+ title: t('mapCustom'),
+ style: styleCustom({
+ tiles: [customMapUrl],
+ }),
+ available: !!customMapUrl,
+ },
+ ], [t, mapTilerKey, locationIqKey, bingMapsKey, tomTomKey, hereKey, mapboxAccessToken, customMapUrl]);
+};