mirror of
https://github.com/mayswind/ezbookkeeping.git
synced 2026-05-20 01:34:24 +08:00
support OpenStreetMap(Humanitarian), OpenTopoMap, OPNVKarte, CyclOSM
This commit is contained in:
+5
-1
@@ -146,7 +146,11 @@ func startWebServer(c *cli.Context) error {
|
|||||||
proxyRoute.Use(bindMiddleware(middlewares.JWTAuthorizationByQueryString))
|
proxyRoute.Use(bindMiddleware(middlewares.JWTAuthorizationByQueryString))
|
||||||
{
|
{
|
||||||
if config.EnableMapDataFetchProxy {
|
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))
|
proxyRoute.GET("/map/tile/:zoomLevel/:coordinateX/:fileName", bindProxy(api.MapImages.MapTileImageProxyHandler))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-2
@@ -111,10 +111,19 @@ enable_register = true
|
|||||||
enable_export = true
|
enable_export = true
|
||||||
|
|
||||||
[map]
|
[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
|
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
|
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
|
# For "googlemap" only, Google map JavaScript API key, please visit https://developers.google.com/maps/get-started for more information
|
||||||
|
|||||||
@@ -5,13 +5,18 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httputil"
|
"net/http/httputil"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/mayswind/ezbookkeeping/pkg/core"
|
"github.com/mayswind/ezbookkeeping/pkg/core"
|
||||||
"github.com/mayswind/ezbookkeeping/pkg/errs"
|
"github.com/mayswind/ezbookkeeping/pkg/errs"
|
||||||
"github.com/mayswind/ezbookkeeping/pkg/settings"
|
"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
|
// MapImageProxy represents map image proxy
|
||||||
type MapImageProxy struct {
|
type MapImageProxy struct {
|
||||||
@@ -24,11 +29,19 @@ var (
|
|||||||
|
|
||||||
// MapTileImageProxyHandler returns map tile image
|
// MapTileImageProxyHandler returns map tile image
|
||||||
func (p *MapImageProxy) MapTileImageProxyHandler(c *core.Context) (*httputil.ReverseProxy, *errs.Error) {
|
func (p *MapImageProxy) MapTileImageProxyHandler(c *core.Context) (*httputil.ReverseProxy, *errs.Error) {
|
||||||
mapProvider := c.Query("provider")
|
mapProvider := strings.Replace(c.Query("provider"), "-", "_", -1)
|
||||||
targetUrl := ""
|
targetUrl := ""
|
||||||
|
|
||||||
if mapProvider == settings.OpenStreetMapProvider {
|
if mapProvider == settings.OpenStreetMapProvider {
|
||||||
targetUrl = openStreetMapTileImageUrlFormat
|
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 {
|
} else {
|
||||||
return nil, errs.ErrParameterInvalid
|
return nil, errs.ErrParameterInvalid
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,10 +18,15 @@ func ServerSettingsCookie(config *settings.Config) core.MiddlewareHandlerFunc {
|
|||||||
settingsArr := []string{
|
settingsArr := []string{
|
||||||
buildBooleanSetting("r", config.EnableUserRegister),
|
buildBooleanSetting("r", config.EnableUserRegister),
|
||||||
buildBooleanSetting("e", config.EnableDataExport),
|
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))
|
settingsArr = append(settingsArr, buildBooleanSetting("mp", config.EnableMapDataFetchProxy))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+16
-4
@@ -64,10 +64,14 @@ const (
|
|||||||
|
|
||||||
// Map provider types
|
// Map provider types
|
||||||
const (
|
const (
|
||||||
OpenStreetMapProvider string = "openstreetmap"
|
OpenStreetMapProvider string = "openstreetmap"
|
||||||
GoogleMapProvider string = "googlemap"
|
OpenStreetMapHumanitarianStyleProvider string = "openstreetmap_humanitarian"
|
||||||
BaiduMapProvider string = "baidumap"
|
OpenTopoMapProvider string = "opentopomap"
|
||||||
AmapProvider string = "amap"
|
OPNVKarteMapProvider string = "opnvkarte"
|
||||||
|
CyclOSMMapProvider string = "cyclosm"
|
||||||
|
GoogleMapProvider string = "googlemap"
|
||||||
|
BaiduMapProvider string = "baidumap"
|
||||||
|
AmapProvider string = "amap"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Amap security verification method
|
// Amap security verification method
|
||||||
@@ -452,6 +456,14 @@ func loadMapConfiguration(config *Config, configFile *ini.File, sectionName stri
|
|||||||
config.MapProvider = ""
|
config.MapProvider = ""
|
||||||
} else if getConfigItemStringValue(configFile, sectionName, "map_provider") == OpenStreetMapProvider {
|
} else if getConfigItemStringValue(configFile, sectionName, "map_provider") == OpenStreetMapProvider {
|
||||||
config.MapProvider = 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 {
|
} else if getConfigItemStringValue(configFile, sectionName, "map_provider") == GoogleMapProvider {
|
||||||
config.MapProvider = GoogleMapProvider
|
config.MapProvider = GoogleMapProvider
|
||||||
} else if getConfigItemStringValue(configFile, sectionName, "map_provider") == BaiduMapProvider {
|
} else if getConfigItemStringValue(configFile, sectionName, "map_provider") == BaiduMapProvider {
|
||||||
|
|||||||
+36
-1
@@ -2,7 +2,42 @@ const leafletTileSources = {
|
|||||||
'openstreetmap': {
|
'openstreetmap': {
|
||||||
tileUrlFormat: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
|
tileUrlFormat: 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
|
||||||
tileUrlSubDomains: 'abc',
|
tileUrlSubDomains: 'abc',
|
||||||
attribution : '© <a href="http://www.openstreetmap.org/copyright" class="external" target="_blank">OpenStreetMap</a>'
|
minZoom: 1,
|
||||||
|
maxZoom: 19,
|
||||||
|
defaultZoomLevel: 14,
|
||||||
|
attribution : '© <a href="https://www.openstreetmap.org/copyright" class="external" target="_blank">OpenStreetMap</a> contributors'
|
||||||
|
},
|
||||||
|
'openstreetmap-humanitarian': {
|
||||||
|
tileUrlFormat: 'https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png',
|
||||||
|
tileUrlSubDomains: 'abc',
|
||||||
|
minZoom: 1,
|
||||||
|
maxZoom: 19,
|
||||||
|
defaultZoomLevel: 14,
|
||||||
|
attribution : '© <a href="https://www.openstreetmap.org/copyright" class="external" target="_blank">OpenStreetMap</a> contributors, Tiles style by <a href="https://www.hotosm.org/" class="external" target="_blank">Humanitarian OpenStreetMap Team</a> hosted by <a href="https://openstreetmap.fr/" class="external" target="_blank">OpenStreetMap France</a>'
|
||||||
|
},
|
||||||
|
'opentopomap': {
|
||||||
|
tileUrlFormat: 'https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png',
|
||||||
|
tileUrlSubDomains: 'abc',
|
||||||
|
minZoom: 1,
|
||||||
|
maxZoom: 17,
|
||||||
|
defaultZoomLevel: 14,
|
||||||
|
attribution : 'Map data: © <a href="https://www.openstreetmap.org/copyright" class="external" target="_blank">OpenStreetMap</a> contributors, <a href="http://viewfinderpanoramas.org" class="external" target="_blank">SRTM</a> | Map style: © <a href="https://opentopomap.org" class="external" target="_blank">OpenTopoMap</a> (<a href="https://creativecommons.org/licenses/by-sa/3.0/" class="external" target="_blank">CC-BY-SA</a>)'
|
||||||
|
},
|
||||||
|
'opnvkarte': {
|
||||||
|
tileUrlFormat: 'https://tileserver.memomaps.de/tilegen/{z}/{x}/{y}.png',
|
||||||
|
tileUrlSubDomains: '',
|
||||||
|
minZoom: 1,
|
||||||
|
maxZoom: 17,
|
||||||
|
defaultZoomLevel: 14,
|
||||||
|
attribution : 'Map <a href="https://memomaps.de/" class="external" target="_blank">memomaps.de</a> <a href="http://creativecommons.org/licenses/by-sa/2.0/" class="external" target="_blank">CC-BY-SA</a>, map data © <a href="https://www.openstreetmap.org/copyright" class="external" target="_blank">OpenStreetMap</a> contributors'
|
||||||
|
},
|
||||||
|
'cyclosm': {
|
||||||
|
tileUrlFormat: 'https://{s}.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png',
|
||||||
|
tileUrlSubDomains: 'abc',
|
||||||
|
minZoom: 1,
|
||||||
|
maxZoom: 19,
|
||||||
|
defaultZoomLevel: 14,
|
||||||
|
attribution : '<a href="https://github.com/cyclosm/cyclosm-cartocss-style/releases" title="CyclOSM - Open Bicycle render" class="external" target="_blank">CyclOSM</a> | Map data: © <a href="https://www.openstreetmap.org/copyright" class="external" target="_blank">OpenStreetMap</a> contributors'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,12 +14,18 @@ export function loadLeafletMapAssets() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function createLeafletMapHolder(mapProvider) {
|
export function createLeafletMapHolder(mapProvider) {
|
||||||
|
const mapTileSource = mapConstants.leafletTileSources[mapProvider];
|
||||||
|
|
||||||
|
if (!mapTileSource) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
mapProvider: mapProvider,
|
mapProvider: mapProvider,
|
||||||
dependencyLoaded: !!leafletHolder.leaflet,
|
dependencyLoaded: !!leafletHolder.leaflet,
|
||||||
inited: false,
|
inited: false,
|
||||||
defaultZoomLevel: 14,
|
defaultZoomLevel: mapTileSource.defaultZoomLevel,
|
||||||
minZoomLevel: 1,
|
minZoomLevel: mapTileSource.minZoom,
|
||||||
leafletInstance: null,
|
leafletInstance: null,
|
||||||
leafletTileLayer: null,
|
leafletTileLayer: null,
|
||||||
leafletZoomControl: null,
|
leafletZoomControl: null,
|
||||||
@@ -52,7 +58,7 @@ export function createLeafletMapInstance(mapHolder, mapContainer, options) {
|
|||||||
|
|
||||||
const tileLayer = leaflet.tileLayer(mapTileSource.tileUrlFormat, {
|
const tileLayer = leaflet.tileLayer(mapTileSource.tileUrlFormat, {
|
||||||
subdomains: mapTileSource.tileUrlSubDomains,
|
subdomains: mapTileSource.tileUrlSubDomains,
|
||||||
maxZoom: 19
|
maxZoom: mapTileSource.maxZoom
|
||||||
});
|
});
|
||||||
tileLayer.addTo(leafletInstance);
|
tileLayer.addTo(leafletInstance);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user