/* * This is part of Geomajas, a GIS framework, http://www.geomajas.org/. * * Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium. * * The program is available in open source according to the GNU Affero * General Public License. All contributions in this program are covered * by the Geomajas Contributors License Agreement. For full licensing * details, see LICENSE.txt in the project root. */ package org.geomajas.gwt2.example.client.sample.rendering; import org.geomajas.geometry.Coordinate; import org.geomajas.geometry.Geometry; import org.geomajas.geometry.Matrix; import org.geomajas.geometry.service.GeometryService; import org.geomajas.geometry.service.WktException; import org.geomajas.geometry.service.WktService; import org.geomajas.gwt2.client.GeomajasImpl; import org.geomajas.gwt2.client.GeomajasServerExtension; import org.geomajas.gwt2.client.event.MapInitializationEvent; import org.geomajas.gwt2.client.event.MapInitializationHandler; import org.geomajas.gwt2.client.gfx.GfxUtil; import org.geomajas.gwt2.client.gfx.VectorContainer; import org.geomajas.gwt2.client.map.MapPresenter; import org.geomajas.gwt2.example.base.client.sample.SamplePanel; import org.vaadin.gwtgraphics.client.VectorObject; import org.vaadin.gwtgraphics.client.shape.Circle; import org.vaadin.gwtgraphics.client.shape.Rectangle; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.uibinder.client.UiHandler; import com.google.gwt.user.client.ui.DecoratorPanel; import com.google.gwt.user.client.ui.ResizeLayoutPanel; import com.google.gwt.user.client.ui.Widget; /** * ContentPanel that demonstrates rendering abilities in world space. * * @author Pieter De Graef */ public class WorldSpaceRenderingPanel implements SamplePanel { /** * UI binder for this widget. * * @author Pieter De Graef */ interface MyUiBinder extends UiBinder<Widget, WorldSpaceRenderingPanel> { } private static final MyUiBinder UI_BINDER = GWT.create(MyUiBinder.class); private MapPresenter mapPresenter; private VectorContainer container; @UiField protected ResizeLayoutPanel mapPanel; public Widget asWidget() { Widget layout = UI_BINDER.createAndBindUi(this); // Create the MapPresenter and add an InitializationHandler: mapPresenter = GeomajasImpl.getInstance().createMapPresenter(); mapPresenter.setSize(480, 480); mapPresenter.getEventBus().addMapInitializationHandler(new MyMapInitializationHandler()); // Define the whole layout: DecoratorPanel mapDecorator = new DecoratorPanel(); mapDecorator.add(mapPresenter.asWidget()); mapPanel.add(mapDecorator); // Initialize the map, and return the layout: GeomajasServerExtension.getInstance().initializeMap(mapPresenter, "gwt-app", "mapOsm"); return layout; } @UiHandler("circleBtn") public void onCircleBtnClicked(ClickEvent event) { Circle circle = new Circle(0, 0, 3000000); circle.setFillColor("#66CC66"); circle.setFillOpacity(0.4); container.add(circle); } @UiHandler("rectangleBtn") public void onRectangleBtnClicked(ClickEvent event) { Rectangle rectangle = new Rectangle(1000000, 1000000, 2000000, 1000000); rectangle.setFillColor("#CC9900"); rectangle.setFillOpacity(0.4); container.add(rectangle); } @UiHandler("geometryBtn") public void onGeometryBtnClicked(ClickEvent event) { try { Geometry polygon = WktService .toGeometry("POLYGON ((0 0, 0 0.7, 0.7 0.7, 0 0),(0.1 0.2, 0.1 0.4, 0.3 0.4, 0.1 0.2))"); Geometry line = WktService.toGeometry("LINESTRING (-2 0, -2 0.7, -1.3 0, -1.3 0.7)"); Geometry point = WktService.toGeometry("POINT (-3.5 0.5)"); Geometry multiPolygon = new Geometry(Geometry.MULTI_POLYGON, 0, 5); Matrix m1 = new Matrix(1, 0, 0, 1, -0.5, -2); Matrix m2 = new Matrix(1, 0, 0, 1, 0.5, -2); Matrix m3 = new Matrix(1, 0, 0, 1, 0, -1); multiPolygon.setGeometries(new Geometry[] { transform(polygon, m1), transform(polygon, m2), transform(polygon, m3), }); Geometry multiLinestring = new Geometry(Geometry.MULTI_LINE_STRING, 0, 5); multiLinestring.setGeometries(new Geometry[] { transform(line, m1), transform(line, m2), transform(line, m3), }); Geometry mp = new Geometry(Geometry.MULTI_POINT, 0, 5); mp.setGeometries(new Geometry[] { transform(point, m1), transform(point, m2), transform(point, m3), }); container.add(scaleAndStyle(polygon)); container.add(scaleAndStyle(line)); container.add(scaleAndStyle(point)); container.add(scaleAndStyle(multiPolygon)); container.add(scaleAndStyle(multiLinestring)); container.add(scaleAndStyle(mp)); } catch (WktException e) { // not possible } } private VectorObject scaleAndStyle(Geometry geom) { Matrix scale = new Matrix(1000000, 0, 0, 1000000, 0, 0); GfxUtil util = GeomajasImpl.getInstance().getGfxUtil(); VectorObject shape = util.toShape(transform(geom, scale)); util.applyStroke(shape, "#CC9900", 0.8, 1, "2 5"); util.applyFill(shape, "#CC9900", geom.getGeometryType().endsWith("String") ? 0f : 0.5f); return shape; } public Geometry transform(Geometry geometry, Matrix matrix) { Geometry copy = GeometryService.clone(geometry); transformInplace(copy, matrix); return copy; } private void transformInplace(Geometry geometry, Matrix matrix) { if (geometry.getGeometries() != null) { for (Geometry g : geometry.getGeometries()) { transformInplace(g, matrix); } } else if (geometry.getCoordinates() != null) { for (Coordinate c : geometry.getCoordinates()) { double x = c.getX() * matrix.getXx() + c.getY() * matrix.getXy() + matrix.getDx(); double y = c.getX() * matrix.getYx() + c.getY() * matrix.getYy() + matrix.getDy(); c.setX(x); c.setY(y); } } } @UiHandler("deleteBtn") public void onDeleteAllBtnClicked(ClickEvent event) { container.clear(); } /** * Map initialization handler that adds a CheckBox to the layout for every layer. With these CheckBoxes, the user * can toggle the layer's visibility. * * @author Pieter De Graef */ private class MyMapInitializationHandler implements MapInitializationHandler { public void onMapInitialized(MapInitializationEvent event) { container = mapPresenter.getContainerManager().addWorldContainer(); } } }