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);