class Natour::MapGeoAdmin::MapServlet

Public Instance Methods

do_GET(request, response) click to toggle source
# File lib/natour/map_geo_admin.rb, line 66
def do_GET(request, response) # rubocop:disable Naming/MethodName
  raise WEBrick::HTTPStatus::NotFound unless request.path == '/map'

  tracks = request.query.fetch('tracks', '').split(',')
  layers = request.query.fetch('layers', '').split(',')
  layers.unshift('ch.swisstopo.pixelkarte-farbe')

  width, height = request.query.fetch('size', '').split(',')
  raise WEBrick::HTTPStatus::BadRequest unless width && height

  doc = []
  doc << '<html><head>'
  doc << '<link rel="icon" href="data:;base64,iVBORw0KGgo=">'
  doc << '<script src="js/jquery-3.5.1.slim.min.js"></script>'
  doc << '<script src="js/bootstrap.min.js"></script>'
  doc << '<script src="js/loader.js"></script>'
  doc << '<script type="text/javascript">'
  doc << '  $(function() {'
  doc << '    var map = new ga.Map({'
  doc << '      controls: [],'
  doc << '      target: "map",'
  doc << '      view: new ol.View()'
  doc << '    })'
  doc << "    var layers = [#{layers.map { |layer| "\"#{layer}\"" }.join(', ')}]"
  doc << '    layers.forEach(function(layer) {'
  doc << '      map.addLayer(ga.layer.create(layer))'
  doc << '    })'
  doc << "    var tracks = [#{tracks.map { |track| "\"#{track}\"" }.join(', ')}]"
  doc << '    tracks = tracks.map(function(track) {'
  doc << '      return new ol.layer.Vector({'
  doc << '        source: new ol.source.Vector({'
  doc << '          format: new ol.format.GPX(),'
  doc << '          url: track'
  doc << '        }),'
  doc << '        style: new ol.style.Style({'
  doc << '          stroke: new ol.style.Stroke({'
  doc << '            color: "blueviolet",'
  doc << '            width: 3'
  doc << '          })'
  doc << '        })'
  doc << '      })'
  doc << '    })'
  doc << '    tracks.forEach(function(track) {'
  doc << '      map.addLayer(track)'
  doc << '      track.getSource().on("change", function(evt) {'
  doc << '        var extent = ol.extent.createEmpty()'
  doc << '        tracks.forEach(function(track) {'
  doc << '          ol.extent.extend(extent, track.getSource().getExtent())'
  doc << '        })'
  doc << '        map.getView().fit(extent, map.getSize())'
  doc << '      })'
  doc << '    })'
  doc << '  })'
  doc << '</script>'
  doc << '<style type="text/css">'
  doc << '  .map {'
  doc << "    width: #{width};"
  doc << "    height: #{height};"
  doc << '  }'
  doc << '</style>'
  doc << '</head><body><div id="map" class="map"></div></body></html>'
  response.body = doc.join("\n")
  response['Content-Type'] = 'text/html'
end