summaryrefslogtreecommitdiff
path: root/vendor/github.com/felix/go-staticmaps/area.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/felix/go-staticmaps/area.go')
-rw-r--r--vendor/github.com/felix/go-staticmaps/area.go94
1 files changed, 94 insertions, 0 deletions
diff --git a/vendor/github.com/felix/go-staticmaps/area.go b/vendor/github.com/felix/go-staticmaps/area.go
new file mode 100644
index 0000000..387105a
--- /dev/null
+++ b/vendor/github.com/felix/go-staticmaps/area.go
@@ -0,0 +1,94 @@
+// Copyright 2016 Florian Pigorsch. All rights reserved.
+//
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package sm
+
+import (
+ "image/color"
+ "strconv"
+ "strings"
+
+ "github.com/flopp/go-coordsparser"
+ "github.com/fogleman/gg"
+ "github.com/golang/geo/s2"
+)
+
+// Area represents a area or area on the map
+type Area struct {
+ MapObject
+ Positions []s2.LatLng
+ Color color.Color
+ Fill color.Color
+ Weight float64
+}
+
+// ParseAreaString parses a string and returns an area
+func ParseAreaString(s string) (*Area, error) {
+ area := new(Area)
+ area.Color = color.RGBA{0xff, 0, 0, 0xff}
+ area.Fill = color.Transparent
+ area.Weight = 5.0
+
+ for _, ss := range strings.Split(s, "|") {
+ if ok, suffix := hasPrefix(ss, "color:"); ok {
+ var err error
+ area.Color, err = ParseColorString(suffix)
+ if err != nil {
+ return nil, err
+ }
+ } else if ok, suffix := hasPrefix(ss, "fill:"); ok {
+ var err error
+ area.Fill, err = ParseColorString(suffix)
+ if err != nil {
+ return nil, err
+ }
+ } else if ok, suffix := hasPrefix(ss, "weight:"); ok {
+ var err error
+ area.Weight, err = strconv.ParseFloat(suffix, 64)
+ if err != nil {
+ return nil, err
+ }
+ } else {
+ lat, lng, err := coordsparser.Parse(ss)
+ if err != nil {
+ return nil, err
+ }
+ area.Positions = append(area.Positions, s2.LatLngFromDegrees(lat, lng))
+ }
+
+ }
+ return area, nil
+}
+
+func (p *Area) extraMarginPixels() float64 {
+ return 0.5 * p.Weight
+}
+
+func (p *Area) bounds() s2.Rect {
+ r := s2.EmptyRect()
+ for _, ll := range p.Positions {
+ r = r.AddPoint(ll)
+ }
+ return r
+}
+
+func (p *Area) draw(gc *gg.Context, trans *transformer) {
+ if len(p.Positions) <= 1 {
+ return
+ }
+
+ gc.ClearPath()
+ gc.SetLineWidth(p.Weight)
+ gc.SetLineCap(gg.LineCapRound)
+ gc.SetLineJoin(gg.LineJoinRound)
+ for _, ll := range p.Positions {
+ gc.LineTo(trans.ll2p(ll))
+ }
+ gc.ClosePath()
+ gc.SetColor(p.Fill)
+ gc.FillPreserve()
+ gc.SetColor(p.Color)
+ gc.Stroke()
+}