Andrew Kane пре 9 година
родитељ
комит
3cc0ca617b

+ 10 - 0
README.md

@@ -230,6 +230,16 @@ SELECT date_trunc('week', created_at), gender, COUNT(*) FROM users GROUP BY 1, 2
 SELECT gender, COUNT(*) FROM users GROUP BY 1
 ```
 
+### Maps [master]
+
+Columns named `latitude` and `longitude` or `lat` and `lon`.
+
+```sql
+SELECT name, latitude, longtitude FROM cities
+```
+
+To enable, get an access token from [Mapbox](https://www.mapbox.com/) and set `ENV["MAPBOX_ACCESS_TOKEN"]`.
+
 ## Dashboards
 
 Create a dashboard with multiple queries. [Example](https://blazerme.herokuapp.com/dashboards/1-movielens)

+ 16 - 0
app/controllers/blazer/queries_controller.rb

@@ -105,6 +105,22 @@ module Blazer
         end
 
         @linked_columns = @data_source.linked_columns
+
+        @markers = []
+        [["latitude", "longitude"], ["lat", "lon"]].each do |keys|
+          if (keys - (@rows.first || {}).keys).empty?
+            @markers =
+              @rows.select do |r|
+                r[keys.first] && r[keys.last]
+              end.map do |r|
+                {
+                  title: r.except(*keys).map{ |k, v| "<strong>#{k}:</strong> #{v}" }.join("<br />").truncate(140),
+                  latitude: r[keys.first],
+                  longitude: r[keys.last]
+                }
+              end
+          end
+        end
       end
 
       respond_to do |format|

+ 4 - 0
app/helpers/blazer/base_helper.rb

@@ -15,5 +15,9 @@ module Blazer
         value
       end
     end
+
+    def blazer_maps?
+      ENV["MAPBOX_ACCESS_TOKEN"].present?
+    end
   end
 end

+ 29 - 0
app/views/blazer/queries/run.html.erb

@@ -34,6 +34,35 @@
       <%= line_chart @rows.group_by { |v| v[keys[1]] }.map { |name, v| {name: name, data: v.map { |v2| [v2[keys[0]], v2[keys[2]]] } } }, id: chart_id, min: nil %>
     <% elsif values.size == 2 && values.first.is_a?(String) && values.last.is_a?(Numeric) %>
       <%= pie_chart @rows.map(&:values), library: {sliceVisibilityThreshold: 1 / 40.0}, id: chart_id %>
+    <% elsif blazer_maps? && @markers.any? %>
+      <div id="map" style="height: 300px;"></div>
+      <script>
+        L.mapbox.accessToken = '<%= ENV["MAPBOX_ACCESS_TOKEN"] %>';
+        var map = L.mapbox.map('map', 'ankane.ioo8nki0');
+        var markers = <%= json_escape(@markers.to_json).html_safe %>;
+        var featureLayer = L.mapbox.featureLayer().addTo(map);
+        var geojson = [];
+        for (var i = 0; i < markers.length; i++) {
+          var marker = markers[i];
+          geojson.push({
+            type: 'Feature',
+            geometry: {
+              type: 'Point',
+              coordinates: [
+                marker.longitude,
+                marker.latitude
+              ]
+            },
+            properties: {
+              description: marker.title,
+              'marker-color': '#f86767',
+              'marker-symbol': 'star'
+            }
+          });
+        }
+        featureLayer.setGeoJSON(geojson);
+        map.fitBounds(featureLayer.getBounds());
+      </script>
     <% elsif @only_chart %>
       <% if @rows.size == 1 && @rows.first.size == 1 %>
         <p style="font-size: 160px;"><%= format_value(@rows.first.keys.first, @rows.first.values.first) %></p>

+ 4 - 0
app/views/layouts/blazer/application.html.erb

@@ -7,6 +7,10 @@
 
     <%= stylesheet_link_tag "blazer/application" %>
     <%= javascript_include_tag "//www.google.com/jsapi", "blazer/application" %>
+    <% if blazer_maps? %>
+      <%= stylesheet_link_tag "https://api.mapbox.com/mapbox.js/v2.2.2/mapbox.css" %>
+      <%= javascript_include_tag "https://api.mapbox.com/mapbox.js/v2.2.2/mapbox.js" %>
+    <% end %>
     <%= csrf_meta_tags %>
   </head>
   <body>