support custom map tile server url

This commit is contained in:
MaysWind
2023-10-29 00:31:56 +08:00
parent acc9bf77fb
commit f673677c2a
8 changed files with 102 additions and 23 deletions
+2 -1
View File
@@ -160,7 +160,8 @@ func startWebServer(c *cli.Context) error {
config.MapProvider == settings.OpenTopoMapProvider || config.MapProvider == settings.OpenTopoMapProvider ||
config.MapProvider == settings.OPNVKarteMapProvider || config.MapProvider == settings.OPNVKarteMapProvider ||
config.MapProvider == settings.CyclOSMMapProvider || config.MapProvider == settings.CyclOSMMapProvider ||
config.MapProvider == settings.TomTomMapProvider { config.MapProvider == settings.TomTomMapProvider ||
config.MapProvider == settings.CustomProvider {
proxyRoute.GET("/map/tile/:zoomLevel/:coordinateX/:fileName", bindProxy(api.MapImages.MapTileImageProxyHandler)) proxyRoute.GET("/map/tile/:zoomLevel/:coordinateX/:fileName", bindProxy(api.MapImages.MapTileImageProxyHandler))
} }
} }
+14 -1
View File
@@ -157,10 +157,11 @@ enable_export = true
# "googlemap": https://map.google.com # "googlemap": https://map.google.com
# "baidumap": https://map.baidu.com # "baidumap": https://map.baidu.com
# "amap": https://amap.com # "amap": https://amap.com
# "custom": custom map tile server url
# Leave blank if you want to disable map # Leave blank if you want to disable map
map_provider = openstreetmap map_provider = openstreetmap
# Set to true to use the ezbookkeeping server to proxy map data requests, for "openstreetmap", "openstreetmap_humanitarian", "opentopomap", "opnvkarte", "cyclosm" or "tomtom" # Set to true to use the ezbookkeeping server to proxy map data requests, for "openstreetmap", "openstreetmap_humanitarian", "opentopomap", "opnvkarte", "cyclosm", "tomtom" or "custom"
map_data_fetch_proxy = false map_data_fetch_proxy = false
# For "tomtom" only, TomTom map API key, please visit https://developer.tomtom.com/how-to-get-tomtom-api-key # For "tomtom" only, TomTom map API key, please visit https://developer.tomtom.com/how-to-get-tomtom-api-key
@@ -188,6 +189,18 @@ amap_application_secret =
# For "amap" only, Amap JavaScript API external proxy url, this setting must be provided when "amap_security_verification_method" is set to "external_proxy" # For "amap" only, Amap JavaScript API external proxy url, this setting must be provided when "amap_security_verification_method" is set to "external_proxy"
amap_api_external_proxy_url = amap_api_external_proxy_url =
# For "custom" only, the custom map tile server url, supports {x}, {y} (coordinates) and {z} (zoom level) placeholders, like "https://tile.openstreetmap.org/{z}/{x}/{y}.png"
custom_map_tile_server_url =
# For "custom" only, the min zoom level (0 - 255) for custom map tile server, default is 1
custom_map_tile_server_min_zoom_level = 1
# For "custom" only, the max zoom level (0 - 255) for custom map tile server, default is 18
custom_map_tile_server_max_zoom_level = 18
# For "custom" only, the default zoom level (0 - 255) for custom map tile server, default is 14
custom_map_tile_server_default_zoom_level = 14
[exchange_rates] [exchange_rates]
# Exchange rates data source, supports the following types: # Exchange rates data source, supports the following types:
# "euro_central_bank" # "euro_central_bank"
+2
View File
@@ -50,6 +50,8 @@ func (p *MapImageProxy) MapTileImageProxyHandler(c *core.Context) (*httputil.Rev
if language != "" { if language != "" {
targetUrl = targetUrl + "&language=" + language targetUrl = targetUrl + "&language=" + language
} }
} else if mapProvider == settings.CustomProvider {
targetUrl = settings.Container.Current.CustomMapTileServerUrl
} else { } else {
return nil, errs.ErrParameterInvalid return nil, errs.ErrParameterInvalid
} }
+10 -1
View File
@@ -29,10 +29,19 @@ func ServerSettingsCookie(config *settings.Config) core.MiddlewareHandlerFunc {
config.MapProvider == settings.OpenTopoMapProvider || config.MapProvider == settings.OpenTopoMapProvider ||
config.MapProvider == settings.OPNVKarteMapProvider || config.MapProvider == settings.OPNVKarteMapProvider ||
config.MapProvider == settings.CyclOSMMapProvider || config.MapProvider == settings.CyclOSMMapProvider ||
config.MapProvider == settings.TomTomMapProvider) { config.MapProvider == settings.TomTomMapProvider ||
config.MapProvider == settings.CustomProvider) {
settingsArr = append(settingsArr, buildBooleanSetting("mp", config.EnableMapDataFetchProxy)) settingsArr = append(settingsArr, buildBooleanSetting("mp", config.EnableMapDataFetchProxy))
} }
if config.MapProvider == settings.CustomProvider {
settingsArr = append(settingsArr, buildStringSetting("cmzl", fmt.Sprintf("%d-%d-%d", config.CustomMapTileServerMinZoomLevel, config.CustomMapTileServerMaxZoomLevel, config.CustomMapTileServerDefaultZoomLevel)))
if !config.EnableMapDataFetchProxy {
settingsArr = append(settingsArr, buildEncodedStringSetting("cmsu", config.CustomMapTileServerUrl))
}
}
if config.MapProvider == settings.TomTomMapProvider && config.TomTomMapAPIKey != "" && !config.EnableMapDataFetchProxy { if config.MapProvider == settings.TomTomMapProvider && config.TomTomMapAPIKey != "" && !config.EnableMapDataFetchProxy {
settingsArr = append(settingsArr, buildEncodedStringSetting("tmak", config.TomTomMapAPIKey)) settingsArr = append(settingsArr, buildEncodedStringSetting("tmak", config.TomTomMapAPIKey))
} }
+12
View File
@@ -78,6 +78,7 @@ const (
TomTomMapProvider string = "tomtom" TomTomMapProvider string = "tomtom"
BaiduMapProvider string = "baidumap" BaiduMapProvider string = "baidumap"
AmapProvider string = "amap" AmapProvider string = "amap"
CustomProvider string = "custom"
) )
// Amap security verification method // Amap security verification method
@@ -227,6 +228,10 @@ type Config struct {
AmapSecurityVerificationMethod string AmapSecurityVerificationMethod string
AmapApplicationSecret string AmapApplicationSecret string
AmapApiExternalProxyUrl string AmapApiExternalProxyUrl string
CustomMapTileServerUrl string
CustomMapTileServerMinZoomLevel uint8
CustomMapTileServerMaxZoomLevel uint8
CustomMapTileServerDefaultZoomLevel uint8
EnableMapDataFetchProxy bool EnableMapDataFetchProxy bool
// Exchange Rates // Exchange Rates
@@ -544,6 +549,8 @@ func loadMapConfiguration(config *Config, configFile *ini.File, sectionName stri
config.MapProvider = BaiduMapProvider config.MapProvider = BaiduMapProvider
} else if mapProvider == AmapProvider { } else if mapProvider == AmapProvider {
config.MapProvider = AmapProvider config.MapProvider = AmapProvider
} else if mapProvider == CustomProvider {
config.MapProvider = CustomProvider
} else { } else {
return errs.ErrInvalidMapProvider return errs.ErrInvalidMapProvider
} }
@@ -569,6 +576,11 @@ func loadMapConfiguration(config *Config, configFile *ini.File, sectionName stri
config.AmapApplicationSecret = getConfigItemStringValue(configFile, sectionName, "amap_application_secret") config.AmapApplicationSecret = getConfigItemStringValue(configFile, sectionName, "amap_application_secret")
config.AmapApiExternalProxyUrl = getConfigItemStringValue(configFile, sectionName, "amap_api_external_proxy_url") config.AmapApiExternalProxyUrl = getConfigItemStringValue(configFile, sectionName, "amap_api_external_proxy_url")
config.CustomMapTileServerUrl = getConfigItemStringValue(configFile, sectionName, "custom_map_tile_server_url")
config.CustomMapTileServerMinZoomLevel = getConfigItemUint8Value(configFile, sectionName, "custom_map_tile_server_min_zoom_level", 1)
config.CustomMapTileServerMaxZoomLevel = getConfigItemUint8Value(configFile, sectionName, "custom_map_tile_server_max_zoom_level", 18)
config.CustomMapTileServerDefaultZoomLevel = getConfigItemUint8Value(configFile, sectionName, "custom_map_tile_server_default_zoom_level", 14)
return nil return nil
} }
func loadExchangeRatesConfiguration(config *Config, configFile *ini.File, sectionName string) error { func loadExchangeRatesConfiguration(config *Config, configFile *ini.File, sectionName string) error {
+6 -6
View File
@@ -40,7 +40,7 @@ import {
} from './amap.js'; } from './amap.js';
export function loadMapAssets(language) { export function loadMapAssets(language) {
if (mapConstants.leafletTileSources[getMapProvider()]) { if (mapConstants.leafletTileSources[getMapProvider()] || getMapProvider() === 'custom') {
return loadLeafletMapAssets(language); return loadLeafletMapAssets(language);
} else if (getMapProvider() === 'googlemap') { } else if (getMapProvider() === 'googlemap') {
return loadGoogleMapAssets(language); return loadGoogleMapAssets(language);
@@ -52,7 +52,7 @@ export function loadMapAssets(language) {
} }
export function createMapHolder() { export function createMapHolder() {
if (mapConstants.leafletTileSources[getMapProvider()]) { if (mapConstants.leafletTileSources[getMapProvider()] || getMapProvider() === 'custom') {
return createLeafletMapHolder(getMapProvider()); return createLeafletMapHolder(getMapProvider());
} else if (getMapProvider() === 'googlemap') { } else if (getMapProvider() === 'googlemap') {
return createGoogleMapHolder(getMapProvider()); return createGoogleMapHolder(getMapProvider());
@@ -70,7 +70,7 @@ export function initMapInstance(mapHolder, mapContainer, options) {
return; return;
} }
if (mapConstants.leafletTileSources[getMapProvider()]) { if (mapConstants.leafletTileSources[getMapProvider()] || getMapProvider() === 'custom') {
createLeafletMapInstance(mapHolder, mapContainer, options); createLeafletMapInstance(mapHolder, mapContainer, options);
} else if (mapHolder.mapProvider === 'googlemap') { } else if (mapHolder.mapProvider === 'googlemap') {
createGoogleMapInstance(mapHolder, mapContainer, options); createGoogleMapInstance(mapHolder, mapContainer, options);
@@ -86,7 +86,7 @@ export function setMapCenterTo(mapHolder, center, zoomLevel) {
return; return;
} }
if (mapConstants.leafletTileSources[getMapProvider()]) { if (mapConstants.leafletTileSources[getMapProvider()] || getMapProvider() === 'custom') {
setLeafletMapCenterTo(mapHolder, center, zoomLevel); setLeafletMapCenterTo(mapHolder, center, zoomLevel);
} else if (mapHolder.mapProvider === 'googlemap') { } else if (mapHolder.mapProvider === 'googlemap') {
setGoogleMapCenterTo(mapHolder, center, zoomLevel); setGoogleMapCenterTo(mapHolder, center, zoomLevel);
@@ -102,7 +102,7 @@ export function setMapCenterMarker(mapHolder, position) {
return; return;
} }
if (mapConstants.leafletTileSources[getMapProvider()]) { if (mapConstants.leafletTileSources[getMapProvider()] || getMapProvider() === 'custom') {
setLeafletMapCenterMaker(mapHolder, position); setLeafletMapCenterMaker(mapHolder, position);
} else if (mapHolder.mapProvider === 'googlemap') { } else if (mapHolder.mapProvider === 'googlemap') {
setGoogleMapCenterMaker(mapHolder, position); setGoogleMapCenterMaker(mapHolder, position);
@@ -118,7 +118,7 @@ export function removeMapCenterMarker(mapHolder) {
return; return;
} }
if (mapConstants.leafletTileSources[getMapProvider()]) { if (mapConstants.leafletTileSources[getMapProvider()] || getMapProvider() === 'custom') {
removeLeafletMapCenterMaker(mapHolder); removeLeafletMapCenterMaker(mapHolder);
} else if (mapHolder.mapProvider === 'googlemap') { } else if (mapHolder.mapProvider === 'googlemap') {
removeGoogleMapCenterMaker(mapHolder); removeGoogleMapCenterMaker(mapHolder);
+28 -5
View File
@@ -1,5 +1,12 @@
import mapConstants from '@/consts/map.js'; import mapConstants from '@/consts/map.js';
import { isMapDataFetchProxyEnabled, getTomTomMapAPIKey } from '@/lib/server_settings.js'; import {
isMapDataFetchProxyEnabled,
getCustomMapTileServerUrl,
getCustomMapMinZoomLevel,
getCustomMapMaxZoomLevel,
getCustomMapDefaultZoomLevel,
getTomTomMapAPIKey
} from '@/lib/server_settings.js';
import services from '@/lib/services.js'; import services from '@/lib/services.js';
const leafletHolder = { const leafletHolder = {
@@ -16,7 +23,7 @@ export function loadLeafletMapAssets() {
export function createLeafletMapHolder(mapProvider) { export function createLeafletMapHolder(mapProvider) {
const mapTileSource = mapConstants.leafletTileSources[mapProvider]; const mapTileSource = mapConstants.leafletTileSources[mapProvider];
if (!mapTileSource) { if (mapProvider !== 'custom' && !mapTileSource) {
return null; return null;
} }
@@ -24,8 +31,8 @@ export function createLeafletMapHolder(mapProvider) {
mapProvider: mapProvider, mapProvider: mapProvider,
dependencyLoaded: !!leafletHolder.leaflet, dependencyLoaded: !!leafletHolder.leaflet,
inited: false, inited: false,
defaultZoomLevel: mapTileSource.defaultZoomLevel, defaultZoomLevel: mapProvider !== 'custom' ? mapTileSource.defaultZoomLevel : getCustomMapDefaultZoomLevel(),
minZoomLevel: mapTileSource.minZoom, minZoomLevel: mapProvider !== 'custom' ? mapTileSource.minZoom : getCustomMapMinZoomLevel(),
leafletInstance: null, leafletInstance: null,
leafletTileLayer: null, leafletTileLayer: null,
leafletZoomControl: null, leafletZoomControl: null,
@@ -46,7 +53,13 @@ export function createLeafletMapInstance(mapHolder, mapContainer, options) {
attributionControl: false, attributionControl: false,
zoomControl: false zoomControl: false
}); });
let mapTileSource = Object.assign({}, mapConstants.leafletTileSources[mapHolder.mapProvider]); let mapTileSource = null;
if (mapHolder.mapProvider !== 'custom') {
mapTileSource = Object.assign({}, mapConstants.leafletTileSources[mapHolder.mapProvider]);
} else {
mapTileSource = createCustomMapSource();
}
if (isMapDataFetchProxyEnabled()) { if (isMapDataFetchProxyEnabled()) {
mapTileSource.tileUrlFormat = services.generateMapProxyTileImageUrl(mapHolder.mapProvider, options.language); mapTileSource.tileUrlFormat = services.generateMapProxyTileImageUrl(mapHolder.mapProvider, options.language);
@@ -137,3 +150,13 @@ export function removeLeafletMapCenterMaker(mapHolder) {
mapHolder.leafletCenterMarker.remove(); mapHolder.leafletCenterMarker.remove();
mapHolder.leafletCenterMarker = null; mapHolder.leafletCenterMarker = null;
} }
function createCustomMapSource() {
return {
tileUrlFormat: getCustomMapTileServerUrl(),
tileUrlSubDomains: '',
minZoom: getCustomMapMinZoomLevel(),
maxZoom: getCustomMapMaxZoomLevel(),
defaultZoomLevel: getCustomMapDefaultZoomLevel()
};
}
+19
View File
@@ -53,6 +53,25 @@ export function isMapDataFetchProxyEnabled() {
return getServerSetting('mp') === '1'; return getServerSetting('mp') === '1';
} }
export function getCustomMapTileServerUrl() {
return getServerDecodedSetting('cmsu');
}
export function getCustomMapMinZoomLevel() {
const zoomLevelSettings = (getServerSetting('cmzl') || '').split('-');
return (zoomLevelSettings && zoomLevelSettings[0]) ? parseInt(zoomLevelSettings[0]) : 1;
}
export function getCustomMapMaxZoomLevel() {
const zoomLevelSettings = (getServerSetting('cmzl') || '').split('-');
return (zoomLevelSettings && zoomLevelSettings[1]) ? parseInt(zoomLevelSettings[1]) : 18;
}
export function getCustomMapDefaultZoomLevel() {
const zoomLevelSettings = (getServerSetting('cmzl') || '').split('-');
return (zoomLevelSettings && zoomLevelSettings[2]) ? parseInt(zoomLevelSettings[2]) : 14;
}
export function getTomTomMapAPIKey() { export function getTomTomMapAPIKey() {
return getServerDecodedSetting('tmak'); return getServerDecodedSetting('tmak');
} }