Class: Decidim::Map::StaticMap

Inherits:
Utility
  • Object
show all
Defined in:
lib/decidim/map/static_map.rb

Overview

A base class for static mapping functionality, common to all static map services.

Instance Attribute Summary

Attributes inherited from Utility

#configuration, #locale, #organization

Instance Method Summary collapse

Methods inherited from Utility

#initialize

Constructor Details

This class inherits a constructor from Decidim::Map::Utility

Instance Method Details

#image_data(latitude:, longitude:, options: {}) ⇒ String

Creates a static map image data for the given map location with the given options.

Parameters:

  • params (Hash)

    The parameters for the static map URL

Returns:

  • (String)

    The raw data for the image.



118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/decidim/map/static_map.rb', line 118

def image_data(latitude:, longitude:, options: {})
  request_url = url(
    latitude: latitude,
    longitude: longitude,
    options: options
  )
  return "" unless request_url

  response = Faraday.get(request_url) do |req|
    req.headers["Referer"] = organization.host
  end
  response.body
end

Creates a link for the static maps. This will point to an external map service where the user can further explore the given location.

Parameters:

  • params (Hash)

    The parameters for the static map URL

Returns:

  • (String)

    The link where the static map images link to.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/decidim/map/static_map.rb', line 21

def link(latitude:, longitude:, options: {})
  zoom = options.fetch(:zoom, 17)
  base_url = configuration.fetch(
    :link,
    "https://www.openstreetmap.org/"
  )

  params = { mlat: latitude, mlon: longitude }
  fragment = "map=#{zoom}/#{latitude}/#{longitude}"

  URI.parse(base_url).tap do |uri|
    uri.query = URI.encode_www_form(params)
    uri.fragment = fragment
  end.to_s
end

#url(latitude:, longitude:, options: {}) ⇒ String

Creates a URL that generates a static map image for the given map location with the given options.

Parameters:

  • params (Hash)

    The parameters for the static map URL

Returns:

  • (String)

    The URL to request for the static map image.



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/decidim/map/static_map.rb', line 56

def url(latitude:, longitude:, options: {})
  map_url = configuration.fetch(:url, nil)
  return unless map_url

  # If a lambda or proc is passed as the :static_map_url configuration.
  if map_url.respond_to?(:call)
    return map_url.call(
      latitude: latitude,
      longitude: longitude,
      options: options
    ).to_s
  end

  # Fetch the "extra" parameters from the configured map URL
  configured_uri = URI.parse(map_url)
  configured_params = Rack::Utils.parse_nested_query(
    configured_uri.query
  ).symbolize_keys

  # Generate a base URL without the URL parameters
  configured_uri.query = nil
  configured_uri.fragment = nil
  base_url = configured_uri.to_s

  # Generate the actual parameters by combining the configured parameters
  # with the provider specific parameters, giving priority to the
  # dynamically set parameters.
  params = configured_params.merge(
    url_params(
      latitude: latitude,
      longitude: longitude,
      options: options
    )
  )

  # Generate the actual URL to call with all the prepared parameters.
  URI.parse(base_url).tap do |uri|
    uri.query = URI.encode_www_form(params)
  end.to_s
end

#url_params(latitude:, longitude:, options: {}) ⇒ Hash

Prepares the URL params for the static map URL.

Parameters:

  • params (Hash)

    The parameters for the static map URL

Returns:

  • (Hash)

    The parameters to pass to the static map image URL.



102
103
104
105
106
107
108
109
110
# File 'lib/decidim/map/static_map.rb', line 102

def url_params(latitude:, longitude:, options: {})
  {
    latitude: latitude,
    longitude: longitude,
    zoom: options.fetch(:zoom, 15),
    width: options.fetch(:width, 120),
    height: options.fetch(:height, 120)
  }
end