aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndré Dietrich <andre.dietrich@ovgu.de>2019-09-12 18:38:20 +0200
committerAndré Dietrich <andre.dietrich@ovgu.de>2019-09-12 18:38:20 +0200
commit1317c6de361af9d1f84abd9f0dba0408c5ef1831 (patch)
tree9a9a00e70dbcd214da9f013d6e93eec5ba7049fc
parent164bda0c7782d9995fb4bbf990b06ce4e9038457 (diff)
added special functions for decoding StyleDefinitions
-rw-r--r--src/Mapbox/Layer.elm45
-rw-r--r--src/Mapbox/Source.elm18
-rw-r--r--src/Mapbox/Style.elm89
3 files changed, 143 insertions, 9 deletions
diff --git a/src/Mapbox/Layer.elm b/src/Mapbox/Layer.elm
index dea484c..8d9cb63 100644
--- a/src/Mapbox/Layer.elm
+++ b/src/Mapbox/Layer.elm
@@ -1,6 +1,6 @@
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
@@ -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,8 +47,8 @@ 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, Symbol, Line, Raster, Circle, FillExtrusion, Heatmap, Hillshade
+@docs background, fill, json, jsonList, symbol, line, raster, circle, fillExtrusion, heatmap, hillshade
+@docs Background, Fill, Json, Symbol, Line, Raster, Circle, FillExtrusion, Heatmap, Hillshade
### General 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)
@@ -165,6 +172,11 @@ type Hillshade
= HillshadeLayer
+{-| -}
+type Json
+ = JsonLayer
+
+
{-| Turns a layer into JSON
-}
encode : Layer -> Value
@@ -173,8 +185,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 +283,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
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..20a91c1 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,18 @@ type alias 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 +299,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