From cd2f44b9df3867e609e2590fcbbc26aa78d20445 Mon Sep 17 00:00:00 2001 From: Shanghui Yang Date: Sat, 6 Nov 2021 21:26:55 +0800 Subject: [PATCH] enable users to fetch tiles only from cache (#59) enable users to fetch tiles only from cache --- context.go | 10 +++++- create-static-map/create-static-map.go | 2 +- examples/stars/stars.go | 2 +- examples/text-marker/text-marker.go | 2 +- go.mod | 12 +++---- go.sum | 43 +++++++++++++++++++++----- tile_fetcher.go | 8 ++++- 7 files changed, 60 insertions(+), 19 deletions(-) diff --git a/context.go b/context.go index 1eb4a41..b877fdc 100644 --- a/context.go +++ b/context.go @@ -40,6 +40,7 @@ type Context struct { overlays []*TileProvider userAgent string + online bool tileProvider *TileProvider cache TileCache @@ -56,6 +57,7 @@ func NewContext() *Context { t.hasBoundingBox = false t.background = nil t.userAgent = "" + t.online = true t.tileProvider = NewTileProviderOpenStreetMaps() t.cache = NewTileCacheFromUserCache(0777) return t @@ -71,6 +73,12 @@ func (m *Context) SetCache(cache TileCache) { m.cache = cache } +// SetOnline enables/disables online +// TileFetcher will only fetch tiles from cache if online = false +func (m *Context) SetOnline(online bool) { + m.online = online +} + // SetUserAgent sets the HTTP user agent string used when downloading map tiles func (m *Context) SetUserAgent(a string) { m.userAgent = a @@ -603,7 +611,7 @@ func (m *Context) RenderWithBounds() (image.Image, s2.Rect, error) { } func (m *Context) renderLayer(gc *gg.Context, zoom int, trans *Transformer, tileSize int, provider *TileProvider) error { - t := NewTileFetcher(provider, m.cache) + t := NewTileFetcher(provider, m.cache, m.online) if m.userAgent != "" { t.SetUserAgent(m.userAgent) } diff --git a/create-static-map/create-static-map.go b/create-static-map/create-static-map.go index bdd5986..4cc70f5 100644 --- a/create-static-map/create-static-map.go +++ b/create-static-map/create-static-map.go @@ -13,10 +13,10 @@ import ( "strings" "github.com/flopp/go-coordsparser" - sm "github.com/flopp/go-staticmaps" "github.com/fogleman/gg" "github.com/golang/geo/s2" "github.com/jessevdk/go-flags" + sm "github.com/shanghuiyang/go-staticmaps" ) func handleTypeOption(ctx *sm.Context, parameter string) { diff --git a/examples/stars/stars.go b/examples/stars/stars.go index 5c6fa66..b475aea 100644 --- a/examples/stars/stars.go +++ b/examples/stars/stars.go @@ -7,9 +7,9 @@ import ( "math" "math/rand" - sm "github.com/flopp/go-staticmaps" "github.com/fogleman/gg" "github.com/golang/geo/s2" + sm "github.com/shanghuiyang/go-staticmaps" ) // Star represents a 5-pointed star on the map diff --git a/examples/text-marker/text-marker.go b/examples/text-marker/text-marker.go index 2ba512b..f9a0af7 100644 --- a/examples/text-marker/text-marker.go +++ b/examples/text-marker/text-marker.go @@ -6,9 +6,9 @@ import ( "image/color" "math" - sm "github.com/flopp/go-staticmaps" "github.com/fogleman/gg" "github.com/golang/geo/s2" + sm "github.com/shanghuiyang/go-staticmaps" "golang.org/x/image/font" "golang.org/x/image/font/basicfont" ) diff --git a/go.mod b/go.mod index 3304c95..c9b380a 100644 --- a/go.mod +++ b/go.mod @@ -1,14 +1,14 @@ -module github.com/flopp/go-staticmaps +module github.com/shanghuiyang/go-staticmaps -go 1.12 +go 1.15 require ( github.com/Wessie/appdirs v0.0.0-20141031215813-6573e894f8e2 github.com/flopp/go-coordsparser v0.0.0-20201115094714-8baaeb7062d5 github.com/fogleman/gg v1.3.0 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/golang/geo v0.0.0-20210108004804-a63082ebfb66 - github.com/jessevdk/go-flags v1.4.0 - github.com/tkrajina/gpxgo v1.0.1 - golang.org/x/image v0.0.0-20201208152932-35266b937fa6 + github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 + github.com/jessevdk/go-flags v1.5.0 + github.com/tkrajina/gpxgo v1.1.2 + golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d ) diff --git a/go.sum b/go.sum index 79b6088..772fd30 100644 --- a/go.sum +++ b/go.sum @@ -1,17 +1,44 @@ github.com/Wessie/appdirs v0.0.0-20141031215813-6573e894f8e2 h1:fqg13ru+I2eUOcsjpZkPITUSdbLUgTdRVnSy/BVTiig= github.com/Wessie/appdirs v0.0.0-20141031215813-6573e894f8e2/go.mod h1:MxPYge+YNbiBwX/6rN+6zOX1fWQAfKj/RxwJpSImex4= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/flopp/go-coordsparser v0.0.0-20201115094714-8baaeb7062d5 h1:o5yuyiGtJ4c9ECOq12K6EqsQNnsGF6I+WqBZynB2Hlw= github.com/flopp/go-coordsparser v0.0.0-20201115094714-8baaeb7062d5/go.mod h1:t5EAdR9sDhKR06Ix2ZS/8jt8INpzeV3P5uVyEkCDYJc= github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/geo v0.0.0-20210108004804-a63082ebfb66 h1:wNA26/2ftrz6nI4dbIim6OSKtLlNdjpNiwFB+l/yqtQ= -github.com/golang/geo v0.0.0-20210108004804-a63082ebfb66/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= -github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/tkrajina/gpxgo v1.0.1 h1:oK5eembUxE+d8huab5+1OTTVAsT/D3JcJvcBw9/ycW0= -github.com/tkrajina/gpxgo v1.0.1/go.mod h1:hsBsIBkzEjyYpLUmDeCBb1+x+Dj3vCD0mYL3562UV2Y= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6 h1:nfeHNc1nAqecKCy2FCy4HY+soOOe5sDLJ/gZLbx6GYI= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +github.com/golang/geo v0.0.0-20210211234256-740aa86cb551 h1:gtexQ/VGyN+VVFRXSFiguSNcXmS6rkKT+X7FdIrTtfo= +github.com/golang/geo v0.0.0-20210211234256-740aa86cb551/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= +github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/joeshaw/gengen v0.0.0-20190604015154-c77d87825f5a/go.mod h1:v2qvRL8Xwk4OlARK6gPlf2JreZXzv0dYp/8+kUJ0y7Q= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/tkrajina/gpxgo v1.1.2 h1:il6rjS6IGm3yqa/yr7+fKBlF3ufWDEPZrYi/kxI1Jv0= +github.com/tkrajina/gpxgo v1.1.2/go.mod h1:795sjVRFo5wWyN6oOZp0RYienGGBJjpAlgOz2nCngA0= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d h1:RNPAfi2nHY7C2srAV8A49jpsYr0ADedCk1wq6fTMTvs= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190603231351-8aaa1484dc10/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/tile_fetcher.go b/tile_fetcher.go index 2b53414..2a71848 100644 --- a/tile_fetcher.go +++ b/tile_fetcher.go @@ -29,14 +29,16 @@ type TileFetcher struct { tileProvider *TileProvider cache TileCache userAgent string + online bool } // NewTileFetcher creates a new Tilefetcher struct -func NewTileFetcher(tileProvider *TileProvider, cache TileCache) *TileFetcher { +func NewTileFetcher(tileProvider *TileProvider, cache TileCache, online bool) *TileFetcher { t := new(TileFetcher) t.tileProvider = tileProvider t.cache = cache t.userAgent = "Mozilla/5.0+(compatible; go-staticmaps/0.1; https://github.com/flopp/go-staticmaps)" + t.online = online return t } @@ -74,6 +76,10 @@ func (t *TileFetcher) Fetch(zoom, x, y int) (image.Image, error) { } } + if !t.online { + return nil, errTileNotFound + } + url := t.url(zoom, x, y) data, err := t.download(url) if err != nil {