From c587996e5ef848f47390a6fb785e2971477444d1 Mon Sep 17 00:00:00 2001 From: Jack Reed Date: Wed, 13 Jul 2016 11:39:40 -0400 Subject: [PATCH] Enables more configurable basemaps Opens the door for WMS, and other customized basemaps. --- README.md | 21 +++++++++++++++ .../blacklight_heatmaps/basemaps.js | 24 +++++++++++++++++ .../blacklight_heatmaps.js | 8 ++++++ .../blacklight_heatmaps/default.js | 1 + .../blacklight_heatmaps/viewers/index.js | 6 ++--- app/helpers/blacklight/maps_helper.rb | 2 +- .../blacklight_heatmaps/install_generator.rb | 3 ++- spec/features/configurable_basemap_spec.rb | 27 +++++++++++++++++++ spec/helpers/blacklight/maps_helper_spec.rb | 4 +-- 9 files changed, 89 insertions(+), 7 deletions(-) create mode 100644 app/assets/javascripts/blacklight_heatmaps/basemaps.js create mode 100644 spec/features/configurable_basemap_spec.rb diff --git a/README.md b/README.md index 7cb63b0..88fb93c 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ rails generate blacklight_heatmaps:install ## Getting started +### Indexing data BlacklightHeatmaps expects your data to be indexed as a [Spatial Recursive Prefix Tree](https://cwiki.apache.org/confluence/display/solr/Spatial+Search#SpatialSearch-RPT) type. The plugin currently supports data indexed in formats: - `x y` Syntax. example: "-121.631609 36.688128" @@ -41,6 +42,26 @@ BlacklightHeatmaps expects your data to be indexed as a [Spatial Recursive Prefi Additional formats could be added by extending `BlacklightHeatmaps::GeometryParser` +### Customizing the basemap + +By default three different basemaps are included with BlacklightHeatmaps. You can modify these by changing the configuration value in the `CatalogController`. + +```ruby + # Basemaps configured include: 'positron', 'darkMatter', 'OpenStreetMap.HOT' + config.basemap_provider = 'OpenStreetMap.HOT' +``` + +BlacklightHeatmaps allows you to customize your basemap further to any Leaflet TileLayer subclass. This includes WMS layers, TileLayers, etc. Checkout [Leaflet Providers](https://github.com/leaflet-extras/leaflet-providers) for more ideas on basemaps you can use. + +To customize the basemap, make sure that you extend the `BlacklightHeatmaps.Basemaps` object to include your basemap selection: + +```javascript + BlacklightHeatmaps.Basemaps[' OpenStreetMap.BlackAndWhite'] = L.tileLayer('http://{s}.tiles.wmflabs.org/bw-mapnik/{z}/{x}/{y}.png', { + maxZoom: 18, + attribution: '© OpenStreetMap' +}); +``` + ## Development Run Solr and Blacklight (with BlacklightMaps) for interactive development: diff --git a/app/assets/javascripts/blacklight_heatmaps/basemaps.js b/app/assets/javascripts/blacklight_heatmaps/basemaps.js new file mode 100644 index 0000000..122948d --- /dev/null +++ b/app/assets/javascripts/blacklight_heatmaps/basemaps.js @@ -0,0 +1,24 @@ +BlacklightHeatmaps.Basemaps = { + darkMatter: L.tileLayer( + 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/dark_all/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap contributors, © CartoDB', + maxZoom: 18, + worldCopyJump: true, + detectRetina: true, + } + ), + positron: L.tileLayer( + 'https://cartodb-basemaps-{s}.global.ssl.fastly.net/light_all/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap contributors, © CartoDB', + maxZoom: 18, + worldCopyJump: true, + detectRetina: true, + } + ), + 'OpenStreetMap.HOT': L.tileLayer( + 'https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png', { + attribution: '© OpenStreetMap, Tiles courtesy of Humanitarian OpenStreetMap Team', + maxZoom: 19, + } + ), +}; diff --git a/app/assets/javascripts/blacklight_heatmaps/blacklight_heatmaps.js b/app/assets/javascripts/blacklight_heatmaps/blacklight_heatmaps.js index d159614..e580381 100644 --- a/app/assets/javascripts/blacklight_heatmaps/blacklight_heatmaps.js +++ b/app/assets/javascripts/blacklight_heatmaps/blacklight_heatmaps.js @@ -4,6 +4,14 @@ var BlacklightHeatmaps = L.Class.extend({ statics: { __version__: '0.0.2', + + selectBasemap: function (basemap) { + if (basemap && basemap !== undefined) { + return BlacklightHeatmaps.Basemaps[basemap]; + } else { + return BlacklightHeatmaps.Basemaps.positron; + } + }, }, }); global.BlacklightHeatmaps = BlacklightHeatmaps; diff --git a/app/assets/javascripts/blacklight_heatmaps/default.js b/app/assets/javascripts/blacklight_heatmaps/default.js index eb557ed..19d6dda 100644 --- a/app/assets/javascripts/blacklight_heatmaps/default.js +++ b/app/assets/javascripts/blacklight_heatmaps/default.js @@ -3,4 +3,5 @@ //= require L.Control.Sidebar //= require leaflet_solr_heatmap //= require blacklight_heatmaps/blacklight_heatmaps +//= require blacklight_heatmaps/basemaps //= require_tree ./viewers diff --git a/app/assets/javascripts/blacklight_heatmaps/viewers/index.js b/app/assets/javascripts/blacklight_heatmaps/viewers/index.js index 8fb9375..51ecf3c 100644 --- a/app/assets/javascripts/blacklight_heatmaps/viewers/index.js +++ b/app/assets/javascripts/blacklight_heatmaps/viewers/index.js @@ -25,9 +25,9 @@ Blacklight.onLoad(function () { $('ul.pagination li').addClass('disabled'); var map = L.map($el[0].id).setView([0, 0], 1); - var basemap = L.tileLayer($el.data().basemap, { - attribution: '© OpenStreetMap contributors, © CartoDB', - }).addTo(map); + var basemap = BlacklightHeatmaps.selectBasemap( + $el.data().basemap + ).addTo(map); var solrLayer = L.solrHeatmap(requestUrl, { field: geometryField, diff --git a/app/helpers/blacklight/maps_helper.rb b/app/helpers/blacklight/maps_helper.rb index 1c0113d..2e8d620 100644 --- a/app/helpers/blacklight/maps_helper.rb +++ b/app/helpers/blacklight/maps_helper.rb @@ -48,7 +48,7 @@ def document_path def index_map_data_attributes { index_map: true, - basemap: blacklight_config.basemap, + basemap: blacklight_config.basemap_provider, search_url: request.url, geometry_field: blacklight_config.geometry_field, sidebar_template: sidebar_template, diff --git a/lib/generators/blacklight_heatmaps/install_generator.rb b/lib/generators/blacklight_heatmaps/install_generator.rb index 5a1f7e1..9a2a954 100644 --- a/lib/generators/blacklight_heatmaps/install_generator.rb +++ b/lib/generators/blacklight_heatmaps/install_generator.rb @@ -17,7 +17,8 @@ def configuration inject_into_file 'app/controllers/catalog_controller.rb', after: 'configure_blacklight do |config|' do "\n # BlacklightHeatmaps configuration values" \ "\n config.geometry_field = :geo_srpt" \ - "\n config.basemap = 'http://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png'" \ + "\n # Basemaps configured include: 'positron', 'darkMatter', 'OpenStreetMap.HOT'" \ + "\n config.basemap_provider = 'positron'" \ "\n config.show.partials.insert(1, :show_leaflet_map)" \ "\n config.view.heatmaps.partials = []" \ "\n #Heatmap color ramp. For best results, use http://colorbrewer2.org or http://tristen.ca/hcl-picker/#/hlc/5/1" \ diff --git a/spec/features/configurable_basemap_spec.rb b/spec/features/configurable_basemap_spec.rb new file mode 100644 index 0000000..c7c0700 --- /dev/null +++ b/spec/features/configurable_basemap_spec.rb @@ -0,0 +1,27 @@ +require 'spec_helper' + +feature 'Configurable basemap', js: true do + scenario 'defaults to positron' do + visit search_catalog_path(q: ' ', view: 'heatmaps', search_field: 'all_fields') + expect(page).to have_css "img[src*='light_all']" + end + feature 'without configured basemap' do + before do + CatalogController.blacklight_config.basemap_provider = nil + end + scenario 'defaults to positron' do + visit search_catalog_path(q: ' ', view: 'heatmaps', search_field: 'all_fields') + expect(page).to have_css "img[src*='light_all']" + end + end + feature 'with alterate configured basemap' do + before do + CatalogController.blacklight_config.basemap_provider = 'darkMatter' + end + scenario 'defaults to positron' do + visit search_catalog_path(q: ' ', view: 'heatmaps', search_field: 'all_fields') + expect(page).to have_css "img[src*='dark_all']" + end + end +end + diff --git a/spec/helpers/blacklight/maps_helper_spec.rb b/spec/helpers/blacklight/maps_helper_spec.rb index d524f2a..886466b 100644 --- a/spec/helpers/blacklight/maps_helper_spec.rb +++ b/spec/helpers/blacklight/maps_helper_spec.rb @@ -3,7 +3,7 @@ describe Blacklight::MapsHelper do let(:blacklight_config) do Blacklight::Configuration.new( - basemap: 'http://www.example.com/{z}/{x}/{y}.png', + basemap_provider: 'positron', geometry_field: 'geo_srpt', index: Blacklight::OpenStructWithHashAccess.new( title_field: 'title_display' @@ -24,7 +24,7 @@ expect(helper.index_map_div) .to have_css '[data-geometry-field="geo_srpt"]' expect(helper.index_map_div) - .to have_css '[data-basemap="http://www.example.com/{z}/{x}/{y}.png"]' + .to have_css '[data-basemap-provider="positron"]' expect(helper.index_map_div).to have_css '[data-sidebar-template]' expect(helper.index_map_div).to have_css '[data-color-ramp]' end