chrispump/elm-maps-extra/2.0.0

Maps

Functions for creating a maps program and maniuplating the maps model.

Showing a map

You can use the functions below to display a map.

import Html exposing (program)
import Maps


main =
    program
        { init = ( Maps.defaultModel, Cmd.none )
        , subscriptions = Maps.subscriptions
        , update = Maps.update
        , view = Maps.view
        }
defaultModel : Model msg

The default model is a map zoomed into Sydney, Australia with no markers.

subscriptions : Model msg -> Sub (Msg msg)
update : Msg msg -> Model msg -> ( Model msg, Cmd (Msg msg) )
view : Model msg -> Html (Msg msg)
mapView : (Msg msg -> msg) -> Html (Msg msg) -> Html msg

Transforms the Maps HTML view into an arbitrary HTML view. Requires a function that can transform Maps.Msgs into msgs.

import Html
import Html.Event exposing (onClick)
import Maps


type MyMsg = Click | MapsMsg Maps.Msg


...


view msg model =
  Html.div
    []
    [ Maps.view model.map |> Maps.mapView MapsMsg
    , Html.button [ onClick Click ] [ Html.text "Click!" ]
    ]

Update Model

updateMap : (Map -> Map) -> Model msg -> Model msg

Change the map inside of a model.

For example, set the width/height of a map and zoom into Seoul, South Korea:

import Maps.Geo
import Maps.Map as Map


let
  seoul = Maps.Geo.latLng 37.532600 127.024612
in
  model
  |> updateMap (Map.setHeight 600)
  |> updateMap (Map.setWidth 1000)
  |> updateMap (Map.viewBounds <| Maps.Geo.centeredBounds 10 seoul)

See Maps.Map for documentation of the Map functions.

updateMarkers : (List (Marker msg) -> List (Marker msg)) -> Model msg -> Model msg

Change the markers inside of the model

For example, add markers for some Sydney attractions and then another marker for the city center:

import Maps.Geo
import Maps.Marker as Marker


let
  attractions =
    List.map (uncurry Maps.Geo.latLng)
      [ (-33.852324, 151.210819)
      , (-33.856872, 151.215239)
      , (-33.870397, 151.208835)
      ]
  sydney = Maps.Geo.latLng -33.865143 151.209900
in
  model
  |> updateMarkers (\markers -> List.map Marker.create attractions ++ markers)
  |> updateMarkers ((::) (Marker.create sydney))

See Maps.Marker for documentation of the Marker functions.

updateAreas : (List Area -> List Area) -> Model msg -> Model msg

Change the areas inside of the model

For example, add some areas to the map:

import Maps.Area exposing (Area, create, withRotation, withBorder, withFill)
import Maps.Geo exposing (latLng)


let
  areas =
    [ ( latLng 54.797 9.425, latLng 54.794 9.435 )
    , ( latLng 54.782 9.436, latLng 54.78 9.438 )
    ]
    |> List.map (\( topLeft, bottomRight ) ->
        create topLeft bottomRight
          |> withRotation 30
          |> withBorder { width = 2, color = "blue" }
          |> withFill "rgba(0, 128, 255, 0.4)"
      )
in
  model
  |> updateAreas (\_ -> areas)
updateOptions : (Options -> Options) -> Model msg -> Model msg

Change the options inside of the model For example, disable dragging and zooming of the map:

import Maps.Internal.Options exposing (Options)


model
|> updateOptions (\o -> { o | enableDrag = False, enablePinch = False, enableZoom = False })

Types

The following types are opaque. Use the functions above to maniuplate and extract information from them.

type alias Msg msg =
Msg msg
type alias Model msg =
Model msg