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))
} }
+21 -9
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
@@ -219,15 +220,19 @@ type Config struct {
EnableDataExport bool EnableDataExport bool
// Map // Map
MapProvider string MapProvider string
TomTomMapAPIKey string TomTomMapAPIKey string
GoogleMapAPIKey string GoogleMapAPIKey string
BaiduMapAK string BaiduMapAK string
AmapApplicationKey string AmapApplicationKey string
AmapSecurityVerificationMethod string AmapSecurityVerificationMethod string
AmapApplicationSecret string AmapApplicationSecret string
AmapApiExternalProxyUrl string AmapApiExternalProxyUrl string
EnableMapDataFetchProxy bool CustomMapTileServerUrl string
CustomMapTileServerMinZoomLevel uint8
CustomMapTileServerMaxZoomLevel uint8
CustomMapTileServerDefaultZoomLevel uint8
EnableMapDataFetchProxy bool
// Exchange Rates // Exchange Rates
ExchangeRatesDataSource string ExchangeRatesDataSource string
@@ -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');
} }