From 1b4aa636739d10b00edcb98d6f7f5d9d4c6e032c Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Thu, 20 Mar 2014 12:18:17 -0600 Subject: [PATCH] Separate test example from modify example --- examples/modify-features.html | 8 +- examples/modify-features.js | 246 +-------------------------------- examples/modify-test.html | 57 ++++++++ examples/modify-test.js | 248 ++++++++++++++++++++++++++++++++++ 4 files changed, 313 insertions(+), 246 deletions(-) create mode 100644 examples/modify-test.html create mode 100644 examples/modify-test.js diff --git a/examples/modify-features.html b/examples/modify-features.html index 9be79fe94a..9130c5d411 100644 --- a/examples/modify-features.html +++ b/examples/modify-features.html @@ -26,10 +26,6 @@
-
@@ -37,9 +33,9 @@

Modify features example

-

Example of using the Modify interaction.

+

Editing features with the modify interaction.

-

Select a feature on the Test Data layer and drag the circle that appears when the cursor gets close to the selected geometry. On the Real data (topology) layer, editing adjacent countries that are selected preserves the topology.

+

This example demonstrates how the modify and select interactions can be used together. Zoom in to an area of interest and select a feature for editing. Then drag points around to modify the feature. You can preserve topology by selecting multiple features before editing (Shift+click to select multiple features).

See the modify-features.js source to see how this is done.

modify, edit, vector
diff --git a/examples/modify-features.js b/examples/modify-features.js index b71537ca89..ff26883ca4 100644 --- a/examples/modify-features.js +++ b/examples/modify-features.js @@ -8,10 +8,6 @@ goog.require('ol.layer.Tile'); goog.require('ol.layer.Vector'); goog.require('ol.source.GeoJSON'); goog.require('ol.source.MapQuest'); -goog.require('ol.style.Circle'); -goog.require('ol.style.Fill'); -goog.require('ol.style.Stroke'); -goog.require('ol.style.Style'); var raster = new ol.layer.Tile({ @@ -21,243 +17,24 @@ var raster = new ol.layer.Tile({ }) }); -var styleFunction = (function() { - var styles = {}; - var image = new ol.style.Circle({ - radius: 5, - fill: null, - stroke: new ol.style.Stroke({color: 'orange', width: 2}) - }); - styles['Point'] = [new ol.style.Style({image: image})]; - styles['Polygon'] = [new ol.style.Style({ - stroke: new ol.style.Stroke({ - color: 'blue', - width: 3 - }), - fill: new ol.style.Fill({ - color: 'rgba(0, 0, 255, 0.1)' - }) - })]; - styles['MultiLinestring'] = [new ol.style.Style({ - stroke: new ol.style.Stroke({ - color: 'green', - width: 3 - }) - })]; - styles['MultiPolygon'] = [new ol.style.Style({ - stroke: new ol.style.Stroke({ - color: 'yellow', - width: 1 - }), - fill: new ol.style.Fill({ - color: 'rgba(255, 255, 0, 0.1)' - }) - })]; - styles['default'] = [new ol.style.Style({ - stroke: new ol.style.Stroke({ - color: 'red', - width: 3 - }), - fill: new ol.style.Fill({ - color: 'rgba(255, 0, 0, 0.1)' - }), - image: image - })]; - return function(feature, resolution) { - return styles[feature.getGeometry().getType()] || styles['default']; - }; -})(); - -var testDataSource = new ol.source.GeoJSON( - /** @type {olx.source.GeoJSONOptions} */ ({ - object: { - 'type': 'FeatureCollection', - 'crs': { - 'type': 'name', - 'properties': { - 'name': 'EPSG:3857' - } - }, - 'features': [ - { - 'type': 'Feature', - 'geometry': { - 'type': 'Point', - 'coordinates': [0, 0] - } - }, - { - 'type': 'Feature', - 'geometry': { - 'type': 'MultiPoint', - 'coordinates': [[-2e6, 0], [0, -2e6]] - } - }, - { - 'type': 'Feature', - 'geometry': { - 'type': 'LineString', - 'coordinates': [[4e6, -2e6], [8e6, 2e6], [9e6, 2e6]] - } - }, - { - 'type': 'Feature', - 'geometry': { - 'type': 'LineString', - 'coordinates': [[4e6, -2e6], [8e6, 2e6], [8e6, 3e6]] - } - }, - { - 'type': 'Feature', - 'geometry': { - 'type': 'Polygon', - 'coordinates': [[[-5e6, -1e6], [-4e6, 1e6], - [-3e6, -1e6], [-5e6, -1e6]], [[-4.5e6, -0.5e6], - [-3.5e6, -0.5e6], [-4e6, 0.5e6], [-4.5e6, -0.5e6]]] - } - }, - { - 'type': 'Feature', - 'geometry': { - 'type': 'MultiLineString', - 'coordinates': [ - [[-1e6, -7.5e5], [-1e6, 7.5e5]], - [[1e6, -7.5e5], [1e6, 7.5e5]], - [[-7.5e5, -1e6], [7.5e5, -1e6]], - [[-7.5e5, 1e6], [7.5e5, 1e6]] - ] - } - }, - { - 'type': 'Feature', - 'geometry': { - 'type': 'MultiPolygon', - 'coordinates': [ - [[[-5e6, 6e6], [-5e6, 8e6], [-3e6, 8e6], - [-3e6, 6e6], [-5e6, 6e6]]], - [[[-2e6, 6e6], [-2e6, 8e6], [0e6, 8e6], - [0e6, 6e6], [-2e6, 6e6]]], - [[[1e6, 6e6], [1e6, 8e6], [3e6, 8e6], - [3e6, 6e6], [1e6, 6e6]]] - ] - } - }, - { - 'type': 'Feature', - 'geometry': { - 'type': 'GeometryCollection', - 'geometries': [ - { - 'type': 'LineString', - 'coordinates': [[-5e6, -5e6], [0e6, -5e6]] - }, - { - 'type': 'Point', - 'coordinates': [4e6, -5e6] - }, - { - 'type': 'Polygon', - 'coordinates': [ - [[1e6, -6e6], [2e6, -4e6], [3e6, -6e6], [1e6, -6e6]] - ] - } - ] - } - } - ] - } - })); - -var testDataLayer = new ol.layer.Vector({ - source: testDataSource, - style: styleFunction -}); - -var realDataSource = new ol.source.GeoJSON({ +var source = new ol.source.GeoJSON({ projection: 'EPSG:3857', url: 'data/geojson/countries.geojson' }); -var realDataLayer = new ol.layer.Vector({ - source: realDataSource, - style: styleFunction +var vector = new ol.layer.Vector({ + source: source }); -var overlayStyle = (function() { - var styles = {}; - styles['Polygon'] = [ - new ol.style.Style({ - fill: new ol.style.Fill({ - color: [255, 255, 255, 0.5] - }) - }), - new ol.style.Style({ - stroke: new ol.style.Stroke({ - color: [255, 255, 255, 1], - width: 5 - }) - }), - new ol.style.Style({ - stroke: new ol.style.Stroke({ - color: [0, 153, 255, 1], - width: 3 - }) - }) - ]; - styles['MultiPolygon'] = styles['Polygon']; - - styles['LineString'] = [ - new ol.style.Style({ - stroke: new ol.style.Stroke({ - color: [255, 255, 255, 1], - width: 5 - }) - }), - new ol.style.Style({ - stroke: new ol.style.Stroke({ - color: [0, 153, 255, 1], - width: 3 - }) - }) - ]; - styles['MultiLineString'] = styles['LineString']; - - styles['Point'] = [ - new ol.style.Style({ - image: new ol.style.Circle({ - radius: 7, - fill: new ol.style.Fill({ - color: [0, 153, 255, 1] - }), - stroke: new ol.style.Stroke({ - color: [255, 255, 255, 0.75], - width: 1.5 - }) - }), - zIndex: 100000 - }) - ]; - styles['MultiPoint'] = styles['Point']; - - styles['GeometryCollection'] = styles['Polygon'].concat(styles['Point']); - - return function(feature, resolution) { - return styles[feature.getGeometry().getType()]; - }; -})(); - -var select = new ol.interaction.Select({ - style: overlayStyle -}); +var select = new ol.interaction.Select({}); var modify = new ol.interaction.Modify({ - features: select.getFeatures(), - style: overlayStyle + features: select.getFeatures() }); var map = new ol.Map({ interactions: ol.interaction.defaults().extend([select, modify]), - layers: [raster, testDataLayer, realDataLayer], + layers: [raster, vector], renderer: 'canvas', target: 'map', view: new ol.View2D({ @@ -265,14 +42,3 @@ var map = new ol.Map({ zoom: 2 }) }); - -$('#layer-select').change(function() { - select.getFeatures().clear(); - var index = $(this).children().index($(this).find(':selected')); - var layers = [testDataLayer, realDataLayer]; - var i, ii; - for (i = 0, ii = layers.length; i < ii; ++i) { - layers[i].setVisible(index == i); - } -}); -$('#layer-select').trigger('change'); diff --git a/examples/modify-test.html b/examples/modify-test.html new file mode 100644 index 0000000000..e892368e0e --- /dev/null +++ b/examples/modify-test.html @@ -0,0 +1,57 @@ + + + + + + + + + + + + Modify features test + + + + + + +
+ +
+
+
+
+
+ +
+ +
+

Modify features test

+

Example for testing feature modification.

+
+

See the modify-test.js source to see how this is done.

+
+
modify, edit, vector
+
+ +
+ +
+ + + + + + + diff --git a/examples/modify-test.js b/examples/modify-test.js new file mode 100644 index 0000000000..96c5c5d5a4 --- /dev/null +++ b/examples/modify-test.js @@ -0,0 +1,248 @@ +goog.require('ol.Collection'); +goog.require('ol.Map'); +goog.require('ol.View2D'); +goog.require('ol.interaction'); +goog.require('ol.interaction.Modify'); +goog.require('ol.interaction.Select'); +goog.require('ol.layer.Vector'); +goog.require('ol.source.GeoJSON'); +goog.require('ol.style.Circle'); +goog.require('ol.style.Fill'); +goog.require('ol.style.Stroke'); +goog.require('ol.style.Style'); + + +var styleFunction = (function() { + var styles = {}; + var image = new ol.style.Circle({ + radius: 5, + fill: null, + stroke: new ol.style.Stroke({color: 'orange', width: 2}) + }); + styles['Point'] = [new ol.style.Style({image: image})]; + styles['Polygon'] = [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'blue', + width: 3 + }), + fill: new ol.style.Fill({ + color: 'rgba(0, 0, 255, 0.1)' + }) + })]; + styles['MultiLinestring'] = [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'green', + width: 3 + }) + })]; + styles['MultiPolygon'] = [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'yellow', + width: 1 + }), + fill: new ol.style.Fill({ + color: 'rgba(255, 255, 0, 0.1)' + }) + })]; + styles['default'] = [new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: 'red', + width: 3 + }), + fill: new ol.style.Fill({ + color: 'rgba(255, 0, 0, 0.1)' + }), + image: image + })]; + return function(feature, resolution) { + return styles[feature.getGeometry().getType()] || styles['default']; + }; +})(); + +var source = new ol.source.GeoJSON( + /** @type {olx.source.GeoJSONOptions} */ ({ + object: { + 'type': 'FeatureCollection', + 'crs': { + 'type': 'name', + 'properties': { + 'name': 'EPSG:3857' + } + }, + 'features': [ + { + 'type': 'Feature', + 'geometry': { + 'type': 'Point', + 'coordinates': [0, 0] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'MultiPoint', + 'coordinates': [[-2e6, 0], [0, -2e6]] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'LineString', + 'coordinates': [[4e6, -2e6], [8e6, 2e6], [9e6, 2e6]] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'LineString', + 'coordinates': [[4e6, -2e6], [8e6, 2e6], [8e6, 3e6]] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'Polygon', + 'coordinates': [[[-5e6, -1e6], [-4e6, 1e6], + [-3e6, -1e6], [-5e6, -1e6]], [[-4.5e6, -0.5e6], + [-3.5e6, -0.5e6], [-4e6, 0.5e6], [-4.5e6, -0.5e6]]] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'MultiLineString', + 'coordinates': [ + [[-1e6, -7.5e5], [-1e6, 7.5e5]], + [[1e6, -7.5e5], [1e6, 7.5e5]], + [[-7.5e5, -1e6], [7.5e5, -1e6]], + [[-7.5e5, 1e6], [7.5e5, 1e6]] + ] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'MultiPolygon', + 'coordinates': [ + [[[-5e6, 6e6], [-5e6, 8e6], [-3e6, 8e6], + [-3e6, 6e6], [-5e6, 6e6]]], + [[[-2e6, 6e6], [-2e6, 8e6], [0e6, 8e6], + [0e6, 6e6], [-2e6, 6e6]]], + [[[1e6, 6e6], [1e6, 8e6], [3e6, 8e6], + [3e6, 6e6], [1e6, 6e6]]] + ] + } + }, + { + 'type': 'Feature', + 'geometry': { + 'type': 'GeometryCollection', + 'geometries': [ + { + 'type': 'LineString', + 'coordinates': [[-5e6, -5e6], [0e6, -5e6]] + }, + { + 'type': 'Point', + 'coordinates': [4e6, -5e6] + }, + { + 'type': 'Polygon', + 'coordinates': [ + [[1e6, -6e6], [2e6, -4e6], [3e6, -6e6], [1e6, -6e6]] + ] + } + ] + } + } + ] + } + })); + +var layer = new ol.layer.Vector({ + source: source, + style: styleFunction +}); + +var overlayStyle = (function() { + var styles = {}; + styles['Polygon'] = [ + new ol.style.Style({ + fill: new ol.style.Fill({ + color: [255, 255, 255, 0.5] + }) + }), + new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: [255, 255, 255, 1], + width: 5 + }) + }), + new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: [0, 153, 255, 1], + width: 3 + }) + }) + ]; + styles['MultiPolygon'] = styles['Polygon']; + + styles['LineString'] = [ + new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: [255, 255, 255, 1], + width: 5 + }) + }), + new ol.style.Style({ + stroke: new ol.style.Stroke({ + color: [0, 153, 255, 1], + width: 3 + }) + }) + ]; + styles['MultiLineString'] = styles['LineString']; + + styles['Point'] = [ + new ol.style.Style({ + image: new ol.style.Circle({ + radius: 7, + fill: new ol.style.Fill({ + color: [0, 153, 255, 1] + }), + stroke: new ol.style.Stroke({ + color: [255, 255, 255, 0.75], + width: 1.5 + }) + }), + zIndex: 100000 + }) + ]; + styles['MultiPoint'] = styles['Point']; + + styles['GeometryCollection'] = styles['Polygon'].concat(styles['Point']); + + return function(feature, resolution) { + return styles[feature.getGeometry().getType()]; + }; +})(); + +var select = new ol.interaction.Select({ + style: overlayStyle +}); + +var modify = new ol.interaction.Modify({ + features: select.getFeatures(), + style: overlayStyle +}); + +var map = new ol.Map({ + interactions: ol.interaction.defaults().extend([select, modify]), + layers: [layer], + renderer: 'canvas', + target: 'map', + view: new ol.View2D({ + center: [0, 1000000], + zoom: 2 + }) +});