aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndré Dietrich <andre.dietrich@ovgu.de>2020-01-07 18:02:43 +0100
committerAndré Dietrich <andre.dietrich@ovgu.de>2020-01-07 18:02:43 +0100
commit1d440169042ecb74482569637f480306ad331f26 (patch)
tree80ea57140c34d738788cae8d98018915e5aa802b /src
parent42d5dacc1e2edeff15fabe507fdd6b4e335923d2 (diff)
parentd07b8909baedf4740b12f0c72d61b4f111ba2af2 (diff)
Merge branch 'master' of https://github.com/andre-dietrich/elm-mapbox
Diffstat (limited to 'src')
-rw-r--r--src/Mapbox/Layer.elm57
-rw-r--r--src/Mapbox/Source.elm18
-rw-r--r--src/Mapbox/Style.elm96
3 files changed, 161 insertions, 10 deletions
diff --git a/src/Mapbox/Layer.elm b/src/Mapbox/Layer.elm
index 9f5e8a2..24f457d 100644
--- a/src/Mapbox/Layer.elm
+++ b/src/Mapbox/Layer.elm
@@ -1,9 +1,9 @@
module Mapbox.Layer exposing
( Layer, SourceId, encode
- , background, fill, symbol, line, raster, circle, fillExtrusion, heatmap, hillshade
+ , background, fill, json, jsonList, symbol, line, raster, circle, fillExtrusion, heatmap, hillshade
, Background, Fill, Symbol, Line, Raster, Circle, FillExtrusion, Heatmap, Hillshade
, LayerAttr
- , metadata, sourceLayer, minzoom, maxzoom, filter, visible
+ , metadata, sourceLayer, minzoom, maxzoom, filter, visible, visible2
, fillAntialias, fillColor, fillOpacity, fillOutlineColor, fillPattern, fillTranslate, fillTranslateAnchor
, lineBlur, lineCap, lineColor, lineDasharray, lineDasharray2, lineGapWidth, lineGradient, lineJoin, lineMiterLimit, lineOffset, lineOpacity, linePattern, lineRoundLimit, lineTranslate, lineTranslateAnchor, lineWidth
, circleBlur, circleColor, circleOpacity, circlePitchAlignment, circlePitchScale, circleRadius, circleStrokeColor, circleStrokeOpacity, circleStrokeWidth, circleTranslate, circleTranslateAnchor
@@ -13,6 +13,7 @@ module Mapbox.Layer exposing
, rasterBrightnessMax, rasterBrightnessMin, rasterContrast, rasterFadeDuration, rasterHueRotate, rasterOpacity, rasterResampling, rasterSaturation
, hillshadeAccentColor, hillshadeExaggeration, hillshadeHighlightColor, hillshadeIlluminationAnchor, hillshadeIlluminationDirection, hillshadeShadowColor
, backgroundColor, backgroundOpacity, backgroundPattern
+ , decode
)
{-| Layers specify what is actually rendered on the map and are rendered in order.
@@ -46,14 +47,14 @@ Paint properties are applied later in the rendering process. Changes to a paint
### Layer Types
-@docs background, fill, symbol, line, raster, circle, fillExtrusion, heatmap, hillshade
+@docs background, fill, json, jsonList, symbol, line, raster, circle, fillExtrusion, heatmap, hillshade
@docs Background, Fill, Symbol, Line, Raster, Circle, FillExtrusion, Heatmap, Hillshade
### General Attributes
@docs LayerAttr
-@docs metadata, sourceLayer, minzoom, maxzoom, filter, visible
+@docs metadata, sourceLayer, minzoom, maxzoom, filter, visible, visible2
### Fill Attributes
@@ -100,10 +101,16 @@ Paint properties are applied later in the rendering process. Changes to a paint
@docs backgroundColor, backgroundOpacity, backgroundPattern
+
+### List Decoder
+
+@docs decode
+
-}
import Array exposing (Array)
import Internal exposing (Supported)
+import Json.Decode as Decode exposing (Decoder)
import Json.Encode as Encode exposing (Value)
import Mapbox.Expression as Expression exposing (CameraExpression, Color, DataExpression, Expression, FormattedText)
@@ -173,8 +180,8 @@ encode (Layer value) =
layerImpl tipe id source attrs =
- [ ( "type", Encode.string tipe )
- , ( "id", Encode.string id )
+ [ ( "id", Encode.string id )
+ , ( "type", Encode.string tipe )
, ( "source", Encode.string source )
]
++ encodeAttrs attrs
@@ -271,6 +278,29 @@ hillshade =
layerImpl "hillshade"
+{-| Directly aass a json value layer
+-}
+json : Value -> Layer
+json =
+ Layer
+
+
+{-| Directly aass a json value layer
+-}
+jsonList : String -> List Layer
+jsonList =
+ Decode.decodeString (Decode.list Decode.value)
+ >> Result.withDefault []
+ >> List.map json
+
+
+{-| Directly aass a json value layer
+-}
+decode : Decoder (List Layer)
+decode =
+ Decode.list (Decode.value |> Decode.map json)
+
+
{-| -}
type LayerAttr tipe
= Top String Value
@@ -331,6 +361,21 @@ visible isVisible =
"none"
+{-| Directly use a boolean value to set a layer to visible or not.
+-}
+visible2 : Bool -> LayerAttr any
+visible2 vis =
+ (if vis then
+ "visible"
+
+ else
+ "none"
+ )
+ |> Expression.str
+ |> Expression.encode
+ |> Layout "visibility"
+
+
-- Fill
diff --git a/src/Mapbox/Source.elm b/src/Mapbox/Source.elm
index 68d1862..5ca38ea 100644
--- a/src/Mapbox/Source.elm
+++ b/src/Mapbox/Source.elm
@@ -1,6 +1,6 @@
module Mapbox.Source exposing
( Source, SourceOption
- , Id, Url
+ , Id, Url, decode
, vector, vectorFromUrl, VectorSource
, raster, tileSize, rasterFromUrl, RasterSource
, rasterDEMMapbox, rasterDEMTerrarium
@@ -17,7 +17,7 @@ module Mapbox.Source exposing
@docs Source, SourceOption
-@docs Id, Url
+@docs Id, Url, decode
### Vector
@@ -58,7 +58,9 @@ Tiled sources can also take the following attributes:
-}
+import Dict
import Internal
+import Json.Decode as Decode exposing (Decoder)
import Json.Encode exposing (Value)
import LngLat exposing (LngLat)
import Mapbox.Expression as Expression exposing (DataExpression, Expression)
@@ -123,6 +125,18 @@ encode (Source _ value) =
{-| -}
+decode : Decoder (List Source)
+decode =
+ Decode.dict Decode.value
+ |> Decode.map (Dict.toList >> List.map tupleToSource)
+
+
+tupleToSource : ( String, Value ) -> Source
+tupleToSource ( id, value ) =
+ Source id value
+
+
+{-| -}
getId : Source -> String
getId (Source k _) =
k
diff --git a/src/Mapbox/Style.elm b/src/Mapbox/Style.elm
index c33de45..8d1f12e 100644
--- a/src/Mapbox/Style.elm
+++ b/src/Mapbox/Style.elm
@@ -1,5 +1,5 @@
module Mapbox.Style exposing
- ( Style(..), encode, StyleDef
+ ( Style(..), encode, StyleDef, decode, MiscDef, decodeMiscDef, miscDefToList
, Light, defaultLight
, Transition, defaultTransition
, MiscAttr, sprite, glyphs, name, defaultCenter, defaultZoomLevel, defaultBearing, defaultPitch, metadata
@@ -8,7 +8,7 @@ module Mapbox.Style exposing
{-| A Mapbox style is a document that defines the visual appearance of a map: what data to draw, the order to draw it in, and how to style the data when drawing it. A style document is a JSON object with specific root level and nested properties. This specification defines and describes these properties.
-@docs Style, encode, StyleDef
+@docs Style, encode, StyleDef, decode, MiscDef, decodeMiscDef, miscDefToList
### Light
@@ -35,7 +35,9 @@ You can also use one of these predefined styles.
-}
import Array exposing (Array)
+import Dict
import Internal exposing (Supported)
+import Json.Decode as Decode exposing (Decoder)
import Json.Encode as Encode exposing (Value)
import LngLat exposing (LngLat)
import Mapbox.Expression exposing (CameraExpression, Color, Expression, float, floats, rgba, viewport)
@@ -154,6 +156,25 @@ type alias StyleDef =
}
+{-| A simple record to be used, when a style is read from a json file.
+
+use `decodeMiscDef json` to read out default values, you can reset them by
+setting them to `Nothing` use afterwards `miscDefToList` to generate a misc-list
+to be used in your StyleDef.
+
+-}
+type alias MiscDef =
+ { sprite : Maybe MiscAttr
+ , glyphs : Maybe MiscAttr
+ , name : Maybe MiscAttr
+ , center : Maybe MiscAttr
+ , zoom : Maybe MiscAttr
+ , bearing : Maybe MiscAttr
+ , pitch : Maybe MiscAttr
+ , meta : Maybe MiscAttr
+ }
+
+
{-| -}
type MiscAttr
= MiscAttr String Value
@@ -285,3 +306,74 @@ defaultTransition =
{ duration = 300
, delay = 0
}
+
+
+{-| -}
+decode : Decoder StyleDef
+decode =
+ Decode.map5 StyleDef
+ (Decode.maybe decTransition
+ |> Decode.map (Maybe.withDefault defaultTransition)
+ )
+ (Decode.succeed defaultLight)
+ (Decode.field "layers" Mapbox.Layer.decode)
+ (Decode.field "sources" Mapbox.Source.decode)
+ (Decode.succeed [])
+
+
+decTransition : Decoder Transition
+decTransition =
+ Decode.map2 Transition
+ (Decode.field "duration" Decode.int)
+ (Decode.field "delay" Decode.int)
+
+
+maybeDecode : String -> Decoder a -> (a -> b) -> Decoder (Maybe b)
+maybeDecode id dec fn =
+ Decode.field id (dec |> Decode.map fn)
+ |> Decode.maybe
+
+
+{-| -}
+decodeMiscDef : Decoder MiscDef
+decodeMiscDef =
+ Decode.map8 MiscDef
+ (maybeDecode "sprite" Decode.string sprite)
+ (maybeDecode "glyphs" Decode.string glyphs)
+ (maybeDecode "name" Decode.string name)
+ (maybeDecode "center"
+ (Decode.float
+ |> Decode.list
+ |> Decode.andThen
+ (\list ->
+ case list of
+ [ lng, lat ] ->
+ Decode.succeed <| LngLat lng lat
+
+ _ ->
+ Decode.fail "not a valid position"
+ )
+ )
+ defaultCenter
+ )
+ (maybeDecode "zoom" Decode.float defaultZoomLevel)
+ (maybeDecode "pitch" Decode.float defaultPitch)
+ (maybeDecode "bearing" Decode.float defaultBearing)
+ (maybeDecode "metadata" (Decode.dict Decode.value) (Dict.toList >> metadata))
+
+
+maybeSingleton : Maybe MiscAttr -> List MiscAttr
+maybeSingleton =
+ Maybe.map List.singleton >> Maybe.withDefault []
+
+
+{-| -}
+miscDefToList : MiscDef -> List MiscAttr
+miscDefToList miscDef =
+ maybeSingleton miscDef.sprite
+ ++ maybeSingleton miscDef.glyphs
+ ++ maybeSingleton miscDef.name
+ ++ maybeSingleton miscDef.center
+ ++ maybeSingleton miscDef.zoom
+ ++ maybeSingleton miscDef.bearing
+ ++ maybeSingleton miscDef.pitch