Migration from OpenLayers 3.4.0 to v3.5.0 - openlayers-3

I followed the migration guidelines specified here.
I converted my various ol.source layers as specified from:
var source = new ol.source.GeoJSON({
url: 'features.json',
projection: 'EPSG:3857'
});
to the new form:
var source = new ol.source.Vector({
url: 'features.json',
format: new ol.format.GeoJSON()
});
My feature extents are fine, zoom and position of the map are correct, but I do not see any points/areas on the map (invisible features ?). Could it be related to the vector styles or the render-time loading ?
It worked with 3.4.0 and the old way using ol.source.GeoJSON.

Related

Raster Reprojection - request raster on different projection

Im trying to make a WMS Request using OpenLayers3, with a OSM Base map (EPSG:3857).
The raster data on geoserver is on EPSG:32629.
Somehow(?!) my setup worked fine till recently.
The raster image correctly appeared on the map even with different projections.
After the update to 2.15.2 my layers are no longer displayed.
I traced the problem to a reprojection issue but couldn't quite figure it out.
my request is basically:
var untiled = new ol.layer.Image({
source: new ol.source.ImageWMS({
ratio: 1,
url: 'http://mygeo/geoserver/ws/wms',
params: {
'FORMAT': 'image/png',
'VERSION': '1.1.1',
"LAYERS": 'ws:myraster'
}
})
});
i've tried setting the 'SRS' parameter on the request (adding it to the params) but OL forces the 3857.
On the geoserver, the raster layer is configured with both native and declared SRS with 32629 and "Force Declared".
Any Thoughts that might help ?
Regards

points not showing on map using a source.Vector loader function

I am having a problem showing a few points on the map where the geojson file is loaded from the server. The geojson file changes so I want a good way to refresh the map layer. To do this, I created the source.Vector (Version 3.17.1 of OpenLayers)
var locationSource = new ol.source.Vector({
format: new ol.format.GeoJSON({
defaultDataProjection :'EPSG:4326'
}),
loader: vectorLoader,
strategy: ol.loadingstrategy.all
});
function vectorLoader which executes a XHR call to retrieve the latest version of the geojson file. This has been simulated in the jsfiddle below
jsfiddle
The geojson file has valid json because the points on the map show if I use a source.Vector object which uses the url property instead of a loader like this:
var locationSource = new ol.source.Vector({
url: '/openlayers/location.geojson',
format: new ol.format.GeoJSON({
defaultDataProjection :'EPSG:4326'
})
});
I would use this but it is horrible about using cached versions of the geojson file when a new file is available. I want something that is more reliable which is why I'm trying to get this to work with a loader.
The jsfiddle link above has all the code and it seems to run fine but the the points never show up on the map after addFeatures, located here:
onSuccess: function(response) {
var format = new ol.format.GeoJSON();
var features = format.readFeatures(response, {
featureProjection: 'EPSG:4326'
});
source.addFeatures(features);
console.info(source.getFeatures());
map.updateSize();
source.changed();
You will see that no points show on the map for the data provided in the jsfiddle. I feel like I am missing something basic here but after finding many solutions, none work..I seems like the style function needs to be executed again after the 'addFeatures` load completes. This can be seen in the console log for the jsfiddle above.
Indeed this is just a minor issue you were missing.
First of all radius was not defined, this is probably pulled from a variable which you haven't copied to your fiddle.
The main issue though is the wrong projection used when you read your features featureProjection: 'EPSG:4326', it should be changed to featureProjection: 'EPSG:3857', since the default projection in an OpenLayers view is Web Mercator. It could also be the case, that you wanted to define the data projection explicitly while reading your GeoJSON, for this you should set dataProjection: 'EPSG:4326'.
A working example can be found in this fiddle: https://jsfiddle.net/9oukr51t/

Does OL3 support Vector Tiles on WebGL?

Does OpenLayers 3 support LineString and Polygon rendering on WebGL? I have set renderer to 'webgl' and tried to render a TopoJSON format Vector Tile but got the following error: "Uncaught TypeError: vectorSource.loadFeatures is not a function".
The following example from the OL3 web site only works if i remove the 'renderer' attribute from the map properties so the map is rendered using an HTML5 canvas:
var map = new ol.Map({
renderer: 'webgl',
layers: [
new ol.layer.VectorTile({
source: new ol.source.VectorTile({
attributions: [new ol.Attribution({
html: '© Mapbox ' +
'© ' +
'OpenStreetMap contributors'
})],
format: new ol.format.MVT(),
tileGrid: ol.tilegrid.createXYZ({maxZoom: 22}),
tilePixelRatio: 16,
url: 'http://{a-d}.tiles.mapbox.com/v4/mapbox.mapbox-streets-v6/' +
'{z}/{x}/{y}.vector.pbf?access_token=' + key
})
})
],
target: 'map',
view: new ol.View({
center: [0, 0],
zoom: 2
})
});
Only the canvas renderer supports vector tiles with ol.layer.VectorTile.
As already mentioned, only points are currently supported for WebGL rendering, but there certainly appears to be a desire to expand this out to lines and polygons. With the VectorTile support (granted canvas only) already being there, I couldn't imagine them not including full WebGL.
There was a code sprint last year where they did a proof of concept. There were a number of limitations, but it proved it was possible.
http://www.camptocamp.com/en/actualite/openlayers-3-towards-drawing-lines-and-polygons-with-webgl/
renderer ol.renderer.Type | Array.<ol.renderer.Type> | undefined
Renderer. By default, Canvas and WebGL renderers are tested for support in that order, and the first supported used. Specify a ol.renderer.Type here to use a specific renderer. Note that the Canvas renderer fully supports vector data, but WebGL can only render Point geometries.
http://openlayers.org/en/latest/apidoc/ol.Map.html

Adding multiple layers in OpenLayers 3

I am populating OpenLayer 3 features by loading the array multipointCoords from multiple GeoJSON features separately in turn. I reuse the following function each time I load a GeoJSON feature:
function makeLineString(multipointCoords) {
var trackSource = new ol.source.Vector();
var lineString = new ol.geom.LineString([ // create a linestring geometry from the GeoJSON data for the tracks
ol.proj.fromLonLat(multipointCoords[0][0])
]);
var trackFeature = new ol.Feature({ // create a feature with the linestring geometry
geometry: lineString
});
trackSource.addFeature(trackFeature); // add the feature to the sourc
var trackLayer = new ol.layer.Vector({ // create a layer with that source
source: trackSource
});
map.addLayer(trackLayer); // add the layer to the map
};
Am I loading all of the features, regardless of which data set they came from, onto the same layer or are multiple "trackLayers" being created? Is there a way to address the layers and features by which data set they came from?
Yes, you are creating a new source (with a single feature) and a new layer for each invocation of makeLineString.
You generally want to put all features from a given dataset into the same source (and consequently the same layer). The most common way to do so is to configure a source with an url and a format representing the remote data set.
An example of loading all features from a GeoJSON file into the same source and displaying them in a single layer from the official examples:
var vector = new ol.layer.Vector({
source: new ol.source.Vector({
url: 'data/geojson/countries.geojson',
format: new ol.format.GeoJSON(),
wrapX: false
})
});

OpenLayers3 change Layer source URL (or replace features loaded from another URL)

I have a map with a Vector layer, containing features from a GeoJSON source:
var map = new ol.Map({
layers: [new ol.layer.Tile({
source: new ol.source.OSM()
}),
new ol.layer.Vector({
source: new ol.source.Vector({
url: 'http://example.com:5000/geo/data/zones/1',
format: new ol.format.GeoJSON()
}),
})],
renderer: 'canvas',
target: 'map',
view: new ol.View({
center: [737514.438475665, 5864533.629390752],
zoom: 13
})
});
I have multiple URLs that returns s GeoJSON string:
http://example.com:5000/geo/data/zones/1
http://example.com:5000/geo/data/zones/2
http://example.com:5000/geo/data/zones/n
I need to be able to switch the URL of my Layer source (or fetch and display features from another URL).
I have tried to find the 'url' property on the ol.Layer.Vector instance:
l=m.getLayers().getArray()[1]
l.getProperties()
and on the ol.source.Vector instance:
s = l.getSource()
s.getProperties()
but I haven't found anything about the 'url' property.
Could you provide a way to do that ?
is it possible to simply update the source URL (and automagically refresh the layer features) ?
shall I remove existing features, load new features using my own logic and add the loaded ones ?
shall I remove the whole Layer, re-create it, and re-add it ?
is it possible to simply update the source URL (and automagically refresh the layer features) ?
You can create a new source and set it on the target layer using ol.layer.Layer.setSource.
s=new ol.source.Vector(/* your source config goes here */);
l=m.getLayers().getArray()[1];
l.setSource(s);
If both layers are visible, the map will automagically refresh the features.
shall I remove existing features, load new features using my own logic and add the loaded ones ?
You can add or remove features on your Vector Layer using:
ol.layer.Vector.addFeature
ol.layer.Vector.addFeatures
ol.layer.Vector.removeFeature
See also: ol.Feature and ol.layer.Vector.forEachFeature
var feature = new ol.Feature({
geometry: new ol.geom.Polygon(polyCoords),
labelPoint: new ol.geom.Point(labelCoords),
name: 'My Polygon'
});
l=m.getLayers().getArray()[1];
s=l.getSource();
s.addFeature(feature);
s.addFeatures(/* array of features */);
s.removeFeature(feature);
shall I remove the whole Layer, re-create it, and re-add it ?
You can do that using ol.Map.addLayer and ol.Map.removeLayer.
// m is your map variable
v = new ol.layer.Vector(cfg);
m.addLayer(v);
m.removeLayer(v);
Final answer
All options listed above will switch the URL of your Layer. Each option triggers its own set of events and works with different parameters and objects. Based on my personal understanding, I would suggest:
Use option 1, if you are loading a new layer with the same properties of your old layer, but with new data.
Use option 2, if you have very few changes regarding some features on a Vector layer.
Use option 3, if you have a whole new layer, with different properties than your previous layer.

Resources