Problem/Motivation

I would like to be able to provide layers from views based on views_geojson.

Proposed resolution

Change the view filter in Openlayers and create Layers from views having the style plugin 'views_geojson'.
Technically, I modified the function openlayers_views_openlayers_layers_info() in the openlayers_views.module file.
I've added a new condition based on 3 checks:

  1. Is the style_plugin of the display 'views_geojson' ?
  2. Is the display 'page' ?
  3. Is the path set ?

If all those conditions are met, a new layer is constructed programmatically.
You can use that feature on any map you want and enjoy :-)

Remaining tasks

You tell me.

User interface changes

No change.

API changes

No change.

Original report by Pol

Support from Acquia helps fund testing for Drupal Acquia logo

Comments

Pol’s picture

Pol’s picture

Status: Active » Needs review
nod_’s picture

Status: Needs review » Needs work

I can't speak about the functionality but try to keep code indentation and style consistent please.

I guess you could put the if as an elseif after the check for display_plugin. Like that i'm not sure it's going to work all the time. What about a view with several geojson display ?

maybe we should look at making a hook somewhere to avoid having to change the function at every new display_plugin

nod_’s picture

Actually it should already be pluggable, have you tried to implement hook_openlayers_layers() in views_geojson module to declare layers from there ? I think it should be the way to go.

Pol’s picture

Status: Needs work » Closed (fixed)

Thanks @Nod_, I wasn't aware of that hook.

This is closed and a new patch has been rolled for views_geojson.

nod_’s picture

Cool, sorry haven't thought about it yesterday night :)

zzolo’s picture

Title: Enable GeoJSON Layer from Views (using views_geojson) » Provide GeoJSON Layers from Views (integrating with views_geojson)
Status: Closed (fixed) » Active

Hey @Pol and @nod_.

I think this would be better in this module, as I think we should move to having this method of providing Drupal data (views_geojson) as the preferred way. It seems more appropriate for the integration to be here, as we should be managing display. Overall, there's not a great argument either way, but I would rather have it here so that we can make it robust.

So, in that regard, @Pol, you patch is pretty good. There are some minor formatting things, like spaces, and your array strucutres, but otherwise its the right direction. I'll need to test it out a bit before committing though.

Pol’s picture

Here's a new patch with a correct indentation, I hope :)

Pol’s picture

Status: Active » Needs review
Pol’s picture

Last patch had an error, it has been pasted 2 lines after the braces, so => error.
Here's a reroll of the patch corrected.

Pol’s picture

dasjo’s picture

coming from #915708: Context Background and Overview of the mapping module
http://drupal.org/node/915708#comment-5485792

i will look into that, maybe i can do the same for views integration of the leaflet module #1338326: Added support for views and some configuration options

dasjo’s picture

Status: Needs review » Reviewed & tested by the community

yay, just tested this and it works!

  1. create a view with the geojson plugin
  2. assign the automatically created geojson layer to your openlayers map of choice

just a side note:
while testing i used (the old fashioned openlayers way) the same view for both generating geojson (display 1) and displaying the map (display 2). as i forgot to check to override the format setting for one of the displays, it changed the geojson format to map and therefor produced the following error

Notice: Trying to get property of non-object in _openlayers_layers_process_sort() (line 60 of /.../modules/openlayers/includes/openlayers.render.inc).
Warning: usort() [function.usort]: Array was modified by the user comparison function in _openlayers_layers_process() (line 34 of /.../modules/openlayers/includes/openlayers.render.inc).

Pol’s picture

Weird error, can you reproduce it ?

Do you think it's related to my patch ?

jeffschuler’s picture

Status: Reviewed & tested by the community » Needs work

Working great for me so far; thanks Pol!

Layer names weren't showing up properly for me, and this helped:

         $layer->api_version = 1;
         $layer->name = $view->name . '_' . $display;
         $layer->title =
-          !empty($view->display['default']->handler->options['title']) ?
-            $view->display['default']->handler->options['title'] :
+          !empty($data->display_title) ?
+            $data->display_title :
             $view->name;
-        $layer->description = $view->description . ' - ' . $layer->title;
+        $layer->description = $view->description . ' - ' . $data->display_title;
         $layer->data = array(
           'layer_type' => 'openlayers_layer_type_geojson',
           'url' => url($view->display_handler->get_option('path'), array('absolute' => TRUE)),
Pol’s picture

Status: Needs work » Needs review
FileSize
1.71 KB

Thanks for testing it ;-)

Patch updated with recommandations from @jeffschuler.

jeffschuler’s picture

Status: Needs review » Reviewed & tested by the community

Great, thanks!
Back to RTBC.

jeffschuler’s picture

I'm not going to mess with RTBC status here at the moment, but I'm working on adding support for BBOX filtering that's now in Views GeoJSON 7.x-1.x-dev.

The bbox string is being queried and dealt with properly in the first request for the map (and upon enabling other layers,) but dragging/zooming around doesn't re-request data as I'd expect it to.

This diff is against OL + patch in #16:

diff --git a/plugins/layer_types/openlayers_layer_type_geojson.js b/plugins/layer_types/openlayers_layer_type_geojson.js
index a2eb38e..f9750cf 100644
--- a/plugins/layer_types/openlayers_layer_type_geojson.js
+++ b/plugins/layer_types/openlayers_layer_type_geojson.js
@@ -12,7 +12,6 @@ Drupal.openlayers.layer.geojson = function(title, map, options) {
   var features = null;
   options.projection = 'EPSG:' + options.projection;
   options.styleMap = Drupal.openlayers.getStyleMap(map, options.drupalID);
-  var layer = new OpenLayers.Layer.Vector(title, options);
 
   // GeoJSON Projection handling
   var geojson_options = {
@@ -20,6 +19,15 @@ Drupal.openlayers.layer.geojson = function(title, map, options) {
     'externalProjection': new OpenLayers.Projection(options.projection)
   };
 
+  // Use BBOX strategy.
+  options.strategies = [ new OpenLayers.Strategy.BBOX() ];
+  options.protocol = new OpenLayers.Protocol.HTTP({
+    url: options.url,
+    format: new OpenLayers.Format.GeoJSON(geojson_options),
+  });
+
+  var layer = new OpenLayers.Layer.Vector(title, options);
+
   // If GeoJSON data is provided with the layer, use that
   if (options.geojson_data) {
     // Read data in.

Thoughts appreciated!

zzolo’s picture

Status: Reviewed & tested by the community » Fixed

Thanks for the patch and reviews! Committed:
http://drupalcode.org/project/openlayers.git/commit/b25cd7f

Let's move the BBOX strategy to a new issue.

zzolo’s picture

Status: Fixed » Closed (fixed)

Automatically closed -- issue fixed for 2 weeks with no activity.

Anonymous’s picture

Issue summary: View changes

Updates.