/* * 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.plugin.rasterizing.client.image; import java.util.Set; import org.geomajas.configuration.FeatureStyleInfo; import org.geomajas.configuration.FontStyleInfo; import org.geomajas.configuration.SymbolInfo; import org.geomajas.configuration.client.ClientMapInfo; import org.geomajas.configuration.client.ClientRasterLayerInfo; import org.geomajas.configuration.client.ClientVectorLayerInfo; import org.geomajas.geometry.Coordinate; import org.geomajas.gwt.client.command.AbstractCommandCallback; import org.geomajas.gwt.client.command.GwtCommand; import org.geomajas.gwt.client.command.GwtCommandDispatcher; import org.geomajas.gwt.client.gfx.WorldPaintable; import org.geomajas.gwt.client.gfx.paintable.Circle; import org.geomajas.gwt.client.gfx.paintable.GfxGeometry; import org.geomajas.gwt.client.gfx.paintable.Image; import org.geomajas.gwt.client.gfx.paintable.Rectangle; import org.geomajas.gwt.client.gfx.paintable.Text; import org.geomajas.gwt.client.gfx.style.FontStyle; import org.geomajas.gwt.client.gfx.style.PictureStyle; import org.geomajas.gwt.client.gfx.style.ShapeStyle; import org.geomajas.gwt.client.map.MapView; import org.geomajas.gwt.client.map.layer.Layer; import org.geomajas.gwt.client.map.layer.RasterLayer; import org.geomajas.gwt.client.map.layer.VectorLayer; import org.geomajas.gwt.client.spatial.Bbox; import org.geomajas.gwt.client.spatial.geometry.Geometry; import org.geomajas.gwt.client.util.GeometryConverter; import org.geomajas.gwt.client.util.StyleUtil; import org.geomajas.gwt.client.widget.MapWidget; import org.geomajas.layer.LayerType; import org.geomajas.plugin.rasterizing.command.dto.ClientWorldPaintableLayerInfo; import org.geomajas.plugin.rasterizing.command.dto.LegendRasterizingInfo; import org.geomajas.plugin.rasterizing.command.dto.MapRasterizingInfo; import org.geomajas.plugin.rasterizing.command.dto.RasterLayerRasterizingInfo; import org.geomajas.plugin.rasterizing.command.dto.RasterizeMapRequest; import org.geomajas.plugin.rasterizing.command.dto.RasterizeMapResponse; import org.geomajas.plugin.rasterizing.command.dto.VectorLayerRasterizingInfo; import org.geomajas.plugin.rasterizing.command.dto.WorldEllipseInfo; import org.geomajas.plugin.rasterizing.command.dto.WorldGeometryInfo; import org.geomajas.plugin.rasterizing.command.dto.WorldImageInfo; import org.geomajas.plugin.rasterizing.command.dto.WorldRectangleInfo; import org.geomajas.plugin.rasterizing.command.dto.WorldTextInfo; import org.geomajas.sld.PolygonSymbolizerInfo; import org.geomajas.sld.RuleInfo; import org.geomajas.sld.SymbolizerTypeInfo; import org.geomajas.sld.TextSymbolizerInfo; /** * Implementation for {@link ImageUrlService}. * * @author Jan De Moerloose */ public class ImageUrlServiceImpl implements ImageUrlService { public void createImageUrl(MapWidget map, ImageUrlCallback imageCallBack, boolean makeRasterizable) { if (makeRasterizable) { makeRasterizable(map); } GwtCommand commandRequest = new GwtCommand(RasterizeMapRequest.COMMAND); RasterizeMapRequest request = new RasterizeMapRequest(); request.setClientMapInfo(map.getMapModel().getMapInfo()); commandRequest.setCommandRequest(request); final ImageUrlCallback callBack = imageCallBack; GwtCommandDispatcher.getInstance().execute(commandRequest, new AbstractCommandCallback<RasterizeMapResponse>() { public void execute(RasterizeMapResponse response) { callBack.onImageUrl(response.getMapUrl(), response.getLegendUrl()); } }); } public void createImageUrl(MapWidget map, ImageUrlCallback imageCallBack) { createImageUrl(map, imageCallBack, true); } public void makeRasterizable(MapWidget map) { ClientMapInfo mapInfo = map.getMapModel().getMapInfo(); MapRasterizingInfo mapRasterizingInfo = new MapRasterizingInfo(); MapView mapView = map.getMapModel().getMapView(); mapRasterizingInfo.setBounds(GeometryConverter.toDto(map.getMapModel().getMapView().getBounds())); mapRasterizingInfo.setScale(mapView.getCurrentScale()); mapRasterizingInfo.setTransparent(true); LegendRasterizingInfo legendRasterizingInfo = new LegendRasterizingInfo(); legendRasterizingInfo.setTitle("Legend"); FontStyleInfo font = new FontStyleInfo(); font.applyDefaults(); legendRasterizingInfo.setFont(font); mapRasterizingInfo.setLegendRasterizingInfo(legendRasterizingInfo); mapInfo.getWidgetInfo().put(MapRasterizingInfo.WIDGET_KEY, mapRasterizingInfo); for (Layer<?> layer : map.getMapModel().getLayers()) { if (layer instanceof VectorLayer) { VectorLayer vectorLayer = (VectorLayer) layer; VectorLayerRasterizingInfo vectorRasterizingInfo = new VectorLayerRasterizingInfo(); vectorRasterizingInfo.setPaintGeometries(true); vectorRasterizingInfo.setPaintLabels(layer.isLabelsShowing()); vectorRasterizingInfo.setShowing(layer.isShowing()); ClientVectorLayerInfo layerInfo = vectorLayer.getLayerInfo(); vectorRasterizingInfo.setStyle(layerInfo.getNamedStyleInfo()); vectorRasterizingInfo.setFilter(vectorLayer.getFilter()); if (vectorLayer.getSelectedFeatures().size() > 0) { Set<String> selectedFeatures = vectorLayer.getSelectedFeatures(); vectorRasterizingInfo.setSelectedFeatureIds(selectedFeatures.toArray(new String[selectedFeatures .size()])); FeatureStyleInfo selectStyle; switch (layerInfo.getLayerType()) { case GEOMETRY: case LINESTRING: case MULTILINESTRING: selectStyle = mapInfo.getLineSelectStyle(); break; case MULTIPOINT: case POINT: selectStyle = mapInfo.getPointSelectStyle(); break; case MULTIPOLYGON: case POLYGON: selectStyle = mapInfo.getPolygonSelectStyle(); break; default: throw new IllegalArgumentException("Unknown layer type " + layerInfo.getLayerType()); } selectStyle.applyDefaults(); RuleInfo selectionRule = StyleUtil.createRule(layerInfo.getLayerType(), selectStyle); vectorRasterizingInfo.setSelectionRule(selectionRule); } layerInfo.getWidgetInfo().put(VectorLayerRasterizingInfo.WIDGET_KEY, vectorRasterizingInfo); } else if (layer instanceof RasterLayer) { RasterLayerRasterizingInfo rasterInfo = new RasterLayerRasterizingInfo(); ClientRasterLayerInfo layerInfo = (ClientRasterLayerInfo) layer.getLayerInfo(); rasterInfo.setShowing(layer.isShowing()); rasterInfo.setCssStyle(layerInfo.getStyle()); layerInfo.getWidgetInfo().put(RasterLayerRasterizingInfo.WIDGET_KEY, rasterInfo); } } mapRasterizingInfo.getExtraLayers().clear(); if (!map.getWorldPaintables().isEmpty()) { ClientWorldPaintableLayerInfo layer = new ClientWorldPaintableLayerInfo(); layer.setLabel(mapInfo.getId() + ":world-paintables"); for (WorldPaintable worldPaintable : map.getWorldPaintables().values()) { if (worldPaintable instanceof GfxGeometry) { GfxGeometry geometry = (GfxGeometry) worldPaintable; WorldGeometryInfo w = new WorldGeometryInfo(); w.setGeometrySymbolizerInfo(createSymbolizer(geometry)); w.setGeometry(GeometryConverter.toDto((Geometry) geometry.getOriginalLocation())); w.setLabel(geometry.getId()); layer.getPaintables().add(w); } else if (worldPaintable instanceof Circle) { Circle circle = (Circle) worldPaintable; WorldEllipseInfo w = new WorldEllipseInfo(); w.setGeometrySymbolizerInfo(createSymbolizer(circle.getStyle())); w.setBbox(GeometryConverter.toDto((Bbox) circle.getOriginalLocation())); w.setLabel(circle.getId()); layer.getPaintables().add(w); } else if (worldPaintable instanceof Rectangle) { Rectangle rectangle = (Rectangle) worldPaintable; WorldRectangleInfo w = new WorldRectangleInfo(); w.setGeometrySymbolizerInfo(createSymbolizer(rectangle.getStyle())); w.setBbox(GeometryConverter.toDto((Bbox) rectangle.getOriginalLocation())); w.setLabel(rectangle.getId()); layer.getPaintables().add(w); } else if (worldPaintable instanceof Image) { Image image = (Image) worldPaintable; WorldImageInfo w = new WorldImageInfo(); w.setBbox(GeometryConverter.toDto((Bbox) image.getOriginalLocation())); w.setGeometrySymbolizerInfo(createSymbolizer(image.getStyle())); w.setUrl(image.getHref()); w.setLabel(image.getId()); layer.getPaintables().add(w); } else if (worldPaintable instanceof Text) { Text text = (Text) worldPaintable; WorldTextInfo w = new WorldTextInfo(); w.setAnchor((Coordinate) text.getOriginalLocation()); w.setLabelSymbolizerInfo(createTextSymbolizer(text.getStyle())); w.setLabel(text.getContent()); layer.getPaintables().add(w); } } mapRasterizingInfo.getExtraLayers().add(layer); } } private SymbolizerTypeInfo createSymbolizer(PictureStyle style) { PolygonSymbolizerInfo symbolizerInfo = new PolygonSymbolizerInfo(); symbolizerInfo.setFill(StyleUtil.createFill("#FFFFF", (float) style.getOpacity())); return symbolizerInfo; } private SymbolizerTypeInfo createSymbolizer(GfxGeometry geometry) { ShapeStyle shapeStyle = geometry.getStyle(); SymbolInfo symbol = geometry.getSymbolInfo(); FeatureStyleInfo fs = new FeatureStyleInfo(); fs.setFillColor(shapeStyle.getFillColor()); fs.setStrokeColor(shapeStyle.getStrokeColor()); fs.setFillOpacity(shapeStyle.getFillOpacity()); fs.setStrokeOpacity(shapeStyle.getStrokeOpacity()); fs.setStrokeWidth((int) shapeStyle.getStrokeWidth()); fs.setSymbol(symbol); fs.setName(geometry.getId()); return StyleUtil.createSymbolizer(geometry.getGeometry().getLayerType(), fs); } private PolygonSymbolizerInfo createSymbolizer(ShapeStyle shapeStyle) { FeatureStyleInfo fs = new FeatureStyleInfo(); fs.setFillColor(shapeStyle.getFillColor()); fs.setStrokeColor(shapeStyle.getStrokeColor()); fs.setFillOpacity(shapeStyle.getFillOpacity()); fs.setStrokeOpacity(shapeStyle.getStrokeOpacity()); fs.setStrokeWidth((int) shapeStyle.getStrokeWidth()); fs.setName(""); return (PolygonSymbolizerInfo) StyleUtil.createSymbolizer(LayerType.POLYGON, fs); } private TextSymbolizerInfo createTextSymbolizer(FontStyle style) { FontStyleInfo font = new FontStyleInfo(); font.setColor(style.getFillColor()); font.setFamily(style.getFontFamily()); font.setSize(style.getFontSize()); font.setStyle(style.getFontStyle()); font.setOpacity(1f); font.setWeight(style.getFontWeight()); return StyleUtil.createSymbolizer(font); } }