]> git.argeo.org Git - gpl/argeo-slc.git/blob - eclipse/plugins/org.argeo.slc.ui.gis.rap/src/main/java/org/argeo/slc/ui/gis/rap/openlayers/OpenLayersView.java
Move GIS to commons
[gpl/argeo-slc.git] / eclipse / plugins / org.argeo.slc.ui.gis.rap / src / main / java / org / argeo / slc / ui / gis / rap / openlayers / OpenLayersView.java
1 package org.argeo.slc.ui.gis.rap.openlayers;
2
3 import java.util.HashMap;
4
5 import org.argeo.slc.ui.gis.views.AbstractMapView;
6 import org.eclipse.rwt.graphics.Graphics;
7 import org.eclipse.swt.SWT;
8 import org.eclipse.swt.graphics.Image;
9 import org.eclipse.swt.layout.FillLayout;
10 import org.eclipse.swt.layout.GridData;
11 import org.eclipse.swt.layout.GridLayout;
12 import org.eclipse.swt.widgets.Composite;
13 import org.geotools.map.MapContext;
14 import org.polymap.openlayers.rap.widget.OpenLayersWidget;
15 import org.polymap.openlayers.rap.widget.base.OpenLayersEventListener;
16 import org.polymap.openlayers.rap.widget.base.OpenLayersObject;
17 import org.polymap.openlayers.rap.widget.base_types.Bounds;
18 import org.polymap.openlayers.rap.widget.base_types.Icon;
19 import org.polymap.openlayers.rap.widget.base_types.LonLat;
20 import org.polymap.openlayers.rap.widget.base_types.OpenLayersMap;
21 import org.polymap.openlayers.rap.widget.base_types.Pixel;
22 import org.polymap.openlayers.rap.widget.base_types.Size;
23 import org.polymap.openlayers.rap.widget.base_types.Style;
24 import org.polymap.openlayers.rap.widget.controls.ButtonControl;
25 import org.polymap.openlayers.rap.widget.controls.Control;
26 import org.polymap.openlayers.rap.widget.controls.EditingToolbarControl;
27 import org.polymap.openlayers.rap.widget.controls.KeyboardDefaultsControl;
28 import org.polymap.openlayers.rap.widget.controls.LayerSwitcherControl;
29 import org.polymap.openlayers.rap.widget.controls.MouseDefaultsControl;
30 import org.polymap.openlayers.rap.widget.controls.OverviewMapControl;
31 import org.polymap.openlayers.rap.widget.controls.PanZoomBarControl;
32 import org.polymap.openlayers.rap.widget.controls.PanelControl;
33 import org.polymap.openlayers.rap.widget.controls.ScaleControl;
34 import org.polymap.openlayers.rap.widget.controls.ScaleLineControl;
35 import org.polymap.openlayers.rap.widget.controls.SelectFeatureControl;
36 import org.polymap.openlayers.rap.widget.controls.SnappingControl;
37 import org.polymap.openlayers.rap.widget.controls.ToggleButtonControl;
38 import org.polymap.openlayers.rap.widget.features.VectorFeature;
39 import org.polymap.openlayers.rap.widget.geometry.LineStringGeometry;
40 import org.polymap.openlayers.rap.widget.geometry.LinearRingGeometry;
41 import org.polymap.openlayers.rap.widget.geometry.PointGeometry;
42 import org.polymap.openlayers.rap.widget.geometry.PolygonGeometry;
43 import org.polymap.openlayers.rap.widget.layers.BoxLayer;
44 import org.polymap.openlayers.rap.widget.layers.ImageLayer;
45 import org.polymap.openlayers.rap.widget.layers.MarkersLayer;
46 import org.polymap.openlayers.rap.widget.layers.OSMLayer;
47 import org.polymap.openlayers.rap.widget.layers.VectorLayer;
48 import org.polymap.openlayers.rap.widget.layers.WMSLayer;
49 import org.polymap.openlayers.rap.widget.marker.BoxMarker;
50 import org.polymap.openlayers.rap.widget.marker.IconMarker;
51
52 public class OpenLayersView extends AbstractMapView implements
53 OpenLayersEventListener {
54 private MapContext mapContext;
55
56 private OpenLayersWidget openLayersWidget;
57 private OpenLayersMap map;
58
59 @Override
60 public void createPartControl(Composite parent) {
61 parent.setLayout(new FillLayout());
62 // openLayersWidget = new OpenLayersWidget(parent, SWT.NONE);
63 Composite top = new Composite(parent, SWT.NONE);
64 GridLayout layout = new GridLayout();
65 layout.marginHeight = 0;
66 layout.marginWidth = 0;
67 top.setLayout(layout);
68
69 openLayersWidget = new OpenLayersWidget(top, SWT.MULTI | SWT.WRAP,
70 "/js_lib/OpenLayers/OpenLayers.js");
71 openLayersWidget.setLayoutData(new GridData(GridData.FILL_BOTH));
72
73 map = openLayersWidget.getMap();
74
75 map.addControl(new LayerSwitcherControl());
76 map.addControl(new MouseDefaultsControl());
77 map.addControl(new KeyboardDefaultsControl());
78 map.addControl(new PanZoomBarControl());
79 map.addControl(new ScaleControl());
80
81 // OSMLayer osm = new OSMLayer("OSM",
82 // "http://tile.openstreetmap.org/${z}/${x}/${y}.png", 19);
83 // map.addLayer(osm);
84
85 WMSLayer wms_layer = new WMSLayer("argeo",
86 "https://dev.argeo.org/geoserver/wms?",
87 "mbaudier-trips-2010");
88 map.addLayer(wms_layer);
89 // createUI(map);
90 }
91
92 @Override
93 public void setFocus() {
94 openLayersWidget.setFocus();
95 }
96
97 public MapContext getMapContext() {
98 return mapContext;
99 }
100
101 // HACKED from Simple Example
102 private VectorLayer edit_layer;
103 private EditingToolbarControl edit_toolbar;
104 private VectorLayer selectable_boxes_layer;
105
106 OverviewMapControl overview = null;
107 WMSLayer wms_layer2;
108
109 public void createUI(OpenLayersMap map) {
110 HashMap<String, String> payload_map = new HashMap<String, String>();
111 payload_map.put("layername", "event.layer.name");
112
113 map.events.register(this, "changebaselayer", payload_map);
114
115 payload_map.put("property", "event.property");
116 payload_map.put("visibility", "event.layer.visibility");
117
118 map.events.register(this, "changelayer", payload_map);
119
120 // create and add a WMS layer
121 WMSLayer wms_layer = new WMSLayer("polymap WMS",
122 "http://www.polymap.de/geoserver/wms?",
123 "states,tasmania_state_boundaries,tasmania_roads,tasmania_water_bodies");
124
125 map.addLayer(wms_layer);
126
127 // create and add a WMS layer with opacity
128 wms_layer2 = new WMSLayer("OpenLayers WMS",
129 "http://labs.metacarta.com/wms/vmap0", "basic");
130 // wms_layer2.setIsBaseLayer(false);
131 wms_layer2.setOpacity(0.2);
132 map.addLayer(wms_layer2);
133
134 // add a ImageLayer with external URL
135 Bounds bounds = new Bounds(-180, -88.759, 180, 88.759);
136 Size size = new Size(580, 288);
137 ImageLayer image_layer = new ImageLayer("image layer ext",
138 "http://earthtrends.wri.org/images/maps/4_m_citylights_lg.gif",
139 bounds, size);
140 map.addLayer(image_layer);
141
142 // add a ImageLayer with internal URL
143 Image image = Graphics.getImage("res/polymap_logo.png", getClass()
144 .getClassLoader());
145 ImageLayer image_layer_int = new ImageLayer("image layer int", image,
146 bounds);
147 map.addLayer(image_layer_int);
148
149 // set Zoom and Center
150 map.zoomTo(3);
151 map.setCenter(-100.0, 40.0);
152
153 // add some controls
154 LayerSwitcherControl layer_switcher = new LayerSwitcherControl();
155
156 map.addControl(layer_switcher);
157 layer_switcher.maximizeControl();
158
159 // map.addControl(new MouseDefaultsControl());
160 map.addControl(new KeyboardDefaultsControl());
161 // map.addControl(new PanZoomBarControl());
162 map.addControl(new ScaleControl());
163
164 ScaleLineControl scale_line = new ScaleLineControl();
165 scale_line.setBottomOutUnits("");
166 scale_line.setBottomInUnits("");
167 map.addControl(scale_line);
168
169 // overview = new OverviewMapControl( wms_layer2);
170 // map.addControl(overview);
171
172 /*
173 *
174 * overview.destroy(); //map.removeControl(overview );
175 *
176 * overview = new OverviewMapControl(image_layer_int);
177 * map.addControl(overview);
178 *
179 *
180 *
181 * overview.addLayer(wms_layer2 );
182 */
183
184 // overview.maximizeControl();
185
186 // add vector layer to have a layer the user can edit
187 edit_layer = new VectorLayer("edit layer");
188
189 // map.addControl(new EditingToolbarControl(edit_layer) );
190
191 PanelControl pc = new PanelControl();
192
193 ToggleButtonControl tbc = new ToggleButtonControl("class_for_tbc");
194 ButtonControl bc = new ButtonControl("class_for_bc", "alert('foo');");
195
196 pc.addControls(new Control[] { bc, tbc });
197
198 tbc.setStyle("background-color:red;", "background-color:green;");
199 bc.setStyle("background-color:yellow; ");
200
201 pc.setStyle(
202 " width: 100px; height: 24px; right: 23px; top: 5px; position: relative; border-width:1px; border-style:solid;",
203 " display:block; width: 24px; height: 24px; float:left;");
204 map.addControl(pc);
205
206 tbc.events.register(this, "activate", null);
207 edit_layer.events.register(this, "beforefeatureadded", null);
208
209 map.addLayer(edit_layer);
210 edit_layer.setVisibility(false);
211
212 // add vector layer with some boxes to demonstrate the modify feature
213 // feature
214 selectable_boxes_layer = new VectorLayer("selectable boxes");
215
216 selectable_boxes_layer.events.register(this, "featureselected", null);
217
218 selectable_boxes_layer.events.register(this, "featuremodified", null);
219
220 map.addLayer(selectable_boxes_layer);
221
222 OSMLayer osm = new OSMLayer("OSM",
223 "http://tile.openstreetmap.org/${z}/${x}/${y}.png", 19);
224 map.addLayer(osm);
225
226 // map.events.register(this, "click", new HashMap<String,String>() {{
227 // put("x",selectable_boxes_layer.getJSObjRef()+".getFeatureFromEvent(event)");
228 // }});
229
230 VectorFeature vector_feature = new VectorFeature(new Bounds(-100, 40,
231 -80, 60).toGeometry());
232 selectable_boxes_layer.addFeatures(vector_feature);
233 vector_feature = new VectorFeature(
234 new Bounds(-90, 70, -60, 80).toGeometry());
235 selectable_boxes_layer.addFeatures(vector_feature);
236
237 selectable_boxes_layer.setVisibility(false);
238
239 // add vector layer to show how to style a feature
240 VectorLayer styled_features_layer = new VectorLayer("styled Features");
241 map.addLayer(styled_features_layer);
242
243 Style point_style_red = new Style();
244 point_style_red.setAttribute("fillColor", "#FF0000");
245
246 vector_feature = new VectorFeature(new PointGeometry(-85, 50),
247 point_style_red);
248 styled_features_layer.addFeatures(vector_feature);
249
250 Style poly_style = new Style();
251 poly_style.setAttribute("fillColor", "blue");
252 poly_style.setAttribute("strokeColor", "black");
253 poly_style.setAttribute("strokeDashstyle", "dashdot");
254
255 vector_feature = new VectorFeature(
256 new Bounds(-120, 23, -100, 42).toGeometry(), poly_style);
257 styled_features_layer.addFeatures(vector_feature);
258
259 Style point_style_green = new Style();
260 point_style_green.setAttribute("fillColor", "#00FF00");
261 point_style_green.setAttribute("pointRadius", 20);
262
263 vector_feature = new VectorFeature(new PointGeometry(-95, 65),
264 point_style_green);
265 styled_features_layer.addFeatures(vector_feature);
266
267 // show some geometry
268 VectorLayer geometry_features_layer = new VectorLayer(
269 "Geometry Features");
270 map.addLayer(geometry_features_layer);
271 geometry_features_layer.setVisibility(false);
272
273 PointGeometry[] point_list = { new PointGeometry(-99, 60),
274 new PointGeometry(-107, 64), new PointGeometry(-130, 70) };
275 VectorFeature linestring_feature = new VectorFeature(
276 new LineStringGeometry(point_list));
277 geometry_features_layer.addFeatures(linestring_feature);
278
279 PointGeometry[] poly_point_list = { new PointGeometry(-99, 30),
280 new PointGeometry(-107, 44), new PointGeometry(-130, 50) };
281 VectorFeature poly_feature = new VectorFeature(new PolygonGeometry(
282 new LinearRingGeometry(poly_point_list)));
283 geometry_features_layer.addFeatures(poly_feature);
284
285 /*
286 * // setting up the Modify Feature Control ModifyFeatureControl mfc =
287 * new ModifyFeatureControl( selectable_boxes_layer);
288 *
289 * mfc.addMode(MooverdifyFeatureControl.DRAG);
290 * mfc.addMode(ModifyFeatureControl.RESHAPE);
291 * mfc.addMode(ModifyFeatureControl.ROTATE);
292 *
293 * mfc.activate(); map.addControl(mfc);
294 */
295 // setting up the Modify Feature Control
296
297 /*
298 * mfc.addMode(ModifyFeatureControl.DRAG);
299 * mfc.addMode(ModifyFeatureControl.RESHAPE);
300 * mfc.addMode(ModifyFeatureControl.ROTATE);
301 */
302 // mfc.setHover(true);
303
304 SelectFeatureControl mfc = new SelectFeatureControl(
305 selectable_boxes_layer, SelectFeatureControl.FLAG_HOVER);
306
307 map.addControl(mfc);
308 mfc.setHighlightOnly(true);
309 mfc.setRenderIntent("temporary");
310 // mfc.activate();
311
312 // mfc.setHover(false);
313 /*
314 * SelectFeatureControl mfc2 = new SelectFeatureControl(
315 * selectable_boxes_layer,true); //SelectFeatureControl.FLAG_BOX);
316 *
317 * mfc.addMode(ModifyFeatureControl.DRAG);
318 * mfc.addMode(ModifyFeatureControl.RESHAPE);
319 * mfc.addMode(ModifyFeatureControl.ROTATE);
320 *
321 * // mfc.setHover(true);
322 *
323 *
324 * map.addControl(mfc2); mfc2.setBox(true); mfc2.setMultiple(false);
325 * //mfc2.activate();
326 */
327 // mfc2.setHover(false);
328
329 // showing box_layer
330 BoxMarker bm = new BoxMarker(new Bounds(-120, 23, -100, 42));
331 BoxLayer bl = new BoxLayer("box layer");
332 bl.addMarker(bm);
333 map.addLayer(bl);
334 bl.setVisibility(false);
335
336 // show IconMarkers
337 MarkersLayer ml = new MarkersLayer("icon markers");
338 map.addLayer(ml);
339 ml.setVisibility(false);
340
341 // icon marker with default icon-image
342 IconMarker im = new IconMarker(new LonLat(-100, 50));
343 ml.addMarker(im);
344
345 // icon marker with custom image
346 Icon ico = new Icon("http://www.mensus.net/img/icons/google/aqua.png",
347 new Size(10, 17), new Pixel(0, 0));
348 IconMarker im2 = new IconMarker(new LonLat(-110, 60), ico);
349 ml.addMarker(im2);
350
351 }
352
353 public void process_event(OpenLayersObject obj, String event_name,
354 HashMap<String, String> payload) {
355 System.out.println("event from" + obj);
356 if (event_name.equals("changebaselayer")) {
357 System.out
358 .println("client changed baselayer to '"
359 + payload.get("layername") + "' "
360 + payload.get("property"));
361
362 // if (overview != null)
363 // map.removeControl(overview);
364
365 // overview = new OverviewMapControl(wms_layer2);
366 // overview.addLayer( selectable_boxes_layer);
367
368 // map.addControl(overview);
369 // overview.addLayer( selectable_boxes_layer);
370 } else if (event_name.equals("changelayer")) {
371 System.out.println("client changed layer '"
372 + payload.get("layername") + "' " + payload.get("property")
373 + "' " + payload.get("visibility"));
374 if (payload.get("property").equals("visibility")) {
375 Boolean visible = payload.get("visibility").equals("true");
376 if (payload.get("layername").equals(edit_layer.getName())) {
377 OpenLayersMap map = openLayersWidget.getMap();
378 if (visible) {
379 // adding edit control for the vector layer created
380 // above
381 edit_toolbar = new EditingToolbarControl(edit_layer);
382 map.addControl(edit_toolbar);
383 VectorLayer[] snapping_layers = { edit_layer,
384 selectable_boxes_layer };
385 SnappingControl snap_ctrl = new SnappingControl(
386 edit_layer, snapping_layers, false);
387 snap_ctrl.activate();
388 map.addControl(snap_ctrl);
389
390 } else {
391 edit_toolbar.deactivate();
392 map.removeControl(edit_toolbar);
393 }
394 }
395 }
396 } else
397 System.out.println("unknown event " + event_name);
398 }
399
400 }