diff --git a/cmd/webserver.go b/cmd/webserver.go index f223b285..fc4d4975 100644 --- a/cmd/webserver.go +++ b/cmd/webserver.go @@ -146,7 +146,11 @@ func startWebServer(c *cli.Context) error { proxyRoute.Use(bindMiddleware(middlewares.JWTAuthorizationByQueryString)) { if config.EnableMapDataFetchProxy { - if config.MapProvider == settings.OpenStreetMapProvider { + if config.MapProvider == settings.OpenStreetMapProvider || + config.MapProvider == settings.OpenStreetMapHumanitarianStyleProvider || + config.MapProvider == settings.OpenTopoMapProvider || + config.MapProvider == settings.OPNVKarteMapProvider || + config.MapProvider == settings.CyclOSMMapProvider { proxyRoute.GET("/map/tile/:zoomLevel/:coordinateX/:fileName", bindProxy(api.MapImages.MapTileImageProxyHandler)) } } diff --git a/conf/ezbookkeeping.ini b/conf/ezbookkeeping.ini index 22e1deab..2ce8bd6e 100644 --- a/conf/ezbookkeeping.ini +++ b/conf/ezbookkeeping.ini @@ -111,10 +111,19 @@ enable_register = true enable_export = true [map] -# Map provider, supports "openstreetmap", "googlemap", "baidumap", "amap". Leave blank if you want to disable map +# Map provider, supports the following types: +# "openstreetmap": https://www.openstreetmap.org +# "openstreetmap_humanitarian": http://map.hotosm.org +# "opentopomap": https://opentopomap.org +# "opnvkarte": https://publictransportmap.org +# "cyclosm": https://www.cyclosm.org +# "googlemap": https://map.google.com +# "baidumap": https://map.baidu.com +# "amap": https://amap.com +# Leave blank if you want to disable map map_provider = openstreetmap -# Set to true to use the ezbookkeeping server to proxy map data requests, for "openstreetmap" +# Set to true to use the ezbookkeeping server to proxy map data requests, for "openstreetmap", "openstreetmap_humanitarian", "opentopomap", "opnvkarte" or "cyclosm" map_data_fetch_proxy = false # For "googlemap" only, Google map JavaScript API key, please visit https://developers.google.com/maps/get-started for more information diff --git a/pkg/api/map_image_proxies.go b/pkg/api/map_image_proxies.go index c2a7277b..51b7513f 100644 --- a/pkg/api/map_image_proxies.go +++ b/pkg/api/map_image_proxies.go @@ -5,13 +5,18 @@ import ( "net/http" "net/http/httputil" "net/url" + "strings" "github.com/mayswind/ezbookkeeping/pkg/core" "github.com/mayswind/ezbookkeeping/pkg/errs" "github.com/mayswind/ezbookkeeping/pkg/settings" ) -const openStreetMapTileImageUrlFormat = "https://tile.openstreetmap.org/%s/%s/%s" // https://tile.openstreetmap.org/{z}/{x}/{y}.png +const openStreetMapTileImageUrlFormat = "https://tile.openstreetmap.org/%s/%s/%s" // https://tile.openstreetmap.org/{z}/{x}/{y}.png +const openStreetMapHumanitarianStyleTileImageUrlFormat = "https://a.tile.openstreetmap.fr/hot/%s/%s/%s" // https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png +const openTopoMapTileImageUrlFormat = "https://tile.opentopomap.org/%s/%s/%s" // https://tile.opentopomap.org/{z}/{x}/{y}.png +const opnvKarteMapTileImageUrlFormat = "https://tileserver.memomaps.de/tilegen/%s/%s/%s" // https://tileserver.memomaps.de/tilegen/{z}/{x}/{y}.png +const cyclOSMMapTileImageUrlFormat = "https://a.tile-cyclosm.openstreetmap.fr/cyclosm/%s/%s/%s" // https://{s}.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png // MapImageProxy represents map image proxy type MapImageProxy struct { @@ -24,11 +29,19 @@ var ( // MapTileImageProxyHandler returns map tile image func (p *MapImageProxy) MapTileImageProxyHandler(c *core.Context) (*httputil.ReverseProxy, *errs.Error) { - mapProvider := c.Query("provider") + mapProvider := strings.Replace(c.Query("provider"), "-", "_", -1) targetUrl := "" if mapProvider == settings.OpenStreetMapProvider { targetUrl = openStreetMapTileImageUrlFormat + } else if mapProvider == settings.OpenStreetMapHumanitarianStyleProvider { + targetUrl = openStreetMapHumanitarianStyleTileImageUrlFormat + } else if mapProvider == settings.OpenTopoMapProvider { + targetUrl = openTopoMapTileImageUrlFormat + } else if mapProvider == settings.OPNVKarteMapProvider { + targetUrl = opnvKarteMapTileImageUrlFormat + } else if mapProvider == settings.CyclOSMMapProvider { + targetUrl = cyclOSMMapTileImageUrlFormat } else { return nil, errs.ErrParameterInvalid } diff --git a/pkg/middlewares/server_settings_cookie.go b/pkg/middlewares/server_settings_cookie.go index 49cada0c..4824dca3 100644 --- a/pkg/middlewares/server_settings_cookie.go +++ b/pkg/middlewares/server_settings_cookie.go @@ -18,10 +18,15 @@ func ServerSettingsCookie(config *settings.Config) core.MiddlewareHandlerFunc { settingsArr := []string{ buildBooleanSetting("r", config.EnableUserRegister), buildBooleanSetting("e", config.EnableDataExport), - buildStringSetting("m", config.MapProvider), + buildStringSetting("m", strings.Replace(config.MapProvider, "_", "-", -1)), } - if config.MapProvider == settings.OpenStreetMapProvider && config.EnableMapDataFetchProxy { + if config.EnableMapDataFetchProxy && + (config.MapProvider == settings.OpenStreetMapProvider || + config.MapProvider == settings.OpenStreetMapHumanitarianStyleProvider || + config.MapProvider == settings.OpenTopoMapProvider || + config.MapProvider == settings.OPNVKarteMapProvider || + config.MapProvider == settings.CyclOSMMapProvider) { settingsArr = append(settingsArr, buildBooleanSetting("mp", config.EnableMapDataFetchProxy)) } diff --git a/pkg/settings/setting.go b/pkg/settings/setting.go index 4e52cfd9..4b028af8 100644 --- a/pkg/settings/setting.go +++ b/pkg/settings/setting.go @@ -64,10 +64,14 @@ const ( // Map provider types const ( - OpenStreetMapProvider string = "openstreetmap" - GoogleMapProvider string = "googlemap" - BaiduMapProvider string = "baidumap" - AmapProvider string = "amap" + OpenStreetMapProvider string = "openstreetmap" + OpenStreetMapHumanitarianStyleProvider string = "openstreetmap_humanitarian" + OpenTopoMapProvider string = "opentopomap" + OPNVKarteMapProvider string = "opnvkarte" + CyclOSMMapProvider string = "cyclosm" + GoogleMapProvider string = "googlemap" + BaiduMapProvider string = "baidumap" + AmapProvider string = "amap" ) // Amap security verification method @@ -452,6 +456,14 @@ func loadMapConfiguration(config *Config, configFile *ini.File, sectionName stri config.MapProvider = "" } else if getConfigItemStringValue(configFile, sectionName, "map_provider") == OpenStreetMapProvider { config.MapProvider = OpenStreetMapProvider + } else if getConfigItemStringValue(configFile, sectionName, "map_provider") == OpenStreetMapHumanitarianStyleProvider { + config.MapProvider = OpenStreetMapHumanitarianStyleProvider + } else if getConfigItemStringValue(configFile, sectionName, "map_provider") == OpenTopoMapProvider { + config.MapProvider = OpenTopoMapProvider + } else if getConfigItemStringValue(configFile, sectionName, "map_provider") == OPNVKarteMapProvider { + config.MapProvider = OPNVKarteMapProvider + } else if getConfigItemStringValue(configFile, sectionName, "map_provider") == CyclOSMMapProvider { + config.MapProvider = CyclOSMMapProvider } else if getConfigItemStringValue(configFile, sectionName, "map_provider") == GoogleMapProvider { config.MapProvider = GoogleMapProvider } else if getConfigItemStringValue(configFile, sectionName, "map_provider") == BaiduMapProvider { diff --git a/src/consts/map.js b/src/consts/map.js index 43139ec2..bbe7656f 100644 --- a/src/consts/map.js +++ b/src/consts/map.js @@ -2,7 +2,42 @@ const leafletTileSources = { 'openstreetmap': { tileUrlFormat: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', tileUrlSubDomains: 'abc', - attribution : '© OpenStreetMap' + minZoom: 1, + maxZoom: 19, + defaultZoomLevel: 14, + attribution : '© OpenStreetMap contributors' + }, + 'openstreetmap-humanitarian': { + tileUrlFormat: 'https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png', + tileUrlSubDomains: 'abc', + minZoom: 1, + maxZoom: 19, + defaultZoomLevel: 14, + attribution : '© OpenStreetMap contributors, Tiles style by Humanitarian OpenStreetMap Team hosted by OpenStreetMap France' + }, + 'opentopomap': { + tileUrlFormat: 'https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png', + tileUrlSubDomains: 'abc', + minZoom: 1, + maxZoom: 17, + defaultZoomLevel: 14, + attribution : 'Map data: © OpenStreetMap contributors, SRTM | Map style: © OpenTopoMap (CC-BY-SA)' + }, + 'opnvkarte': { + tileUrlFormat: 'https://tileserver.memomaps.de/tilegen/{z}/{x}/{y}.png', + tileUrlSubDomains: '', + minZoom: 1, + maxZoom: 17, + defaultZoomLevel: 14, + attribution : 'Map memomaps.de CC-BY-SA, map data © OpenStreetMap contributors' + }, + 'cyclosm': { + tileUrlFormat: 'https://{s}.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png', + tileUrlSubDomains: 'abc', + minZoom: 1, + maxZoom: 19, + defaultZoomLevel: 14, + attribution : 'CyclOSM | Map data: © OpenStreetMap contributors' } } diff --git a/src/lib/map/leaflet.js b/src/lib/map/leaflet.js index 720382dc..42029f3b 100644 --- a/src/lib/map/leaflet.js +++ b/src/lib/map/leaflet.js @@ -14,12 +14,18 @@ export function loadLeafletMapAssets() { } export function createLeafletMapHolder(mapProvider) { + const mapTileSource = mapConstants.leafletTileSources[mapProvider]; + + if (!mapTileSource) { + return null; + } + return { mapProvider: mapProvider, dependencyLoaded: !!leafletHolder.leaflet, inited: false, - defaultZoomLevel: 14, - minZoomLevel: 1, + defaultZoomLevel: mapTileSource.defaultZoomLevel, + minZoomLevel: mapTileSource.minZoom, leafletInstance: null, leafletTileLayer: null, leafletZoomControl: null, @@ -52,7 +58,7 @@ export function createLeafletMapInstance(mapHolder, mapContainer, options) { const tileLayer = leaflet.tileLayer(mapTileSource.tileUrlFormat, { subdomains: mapTileSource.tileUrlSubDomains, - maxZoom: 19 + maxZoom: mapTileSource.maxZoom }); tileLayer.addTo(leafletInstance);