X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=gis%2Fplugins%2Forg.argeo.gis.ui.rcp.swing%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fgis%2Fui%2Frcp%2Fswing%2FSwingMapViewer.java;h=32d03c19285d656e6b99a0a3fa9c119c83ed87fa;hb=29e52f028cae17c2918fd3f5c691bce26090e969;hp=dd272b45a695b0f7d4ac908421c8669426b76a53;hpb=78a52c7ee4e476b3fe366346ed26315f7237a6bb;p=lgpl%2Fargeo-commons.git diff --git a/gis/plugins/org.argeo.gis.ui.rcp.swing/src/main/java/org/argeo/gis/ui/rcp/swing/SwingMapViewer.java b/gis/plugins/org.argeo.gis.ui.rcp.swing/src/main/java/org/argeo/gis/ui/rcp/swing/SwingMapViewer.java index dd272b45a..32d03c192 100644 --- a/gis/plugins/org.argeo.gis.ui.rcp.swing/src/main/java/org/argeo/gis/ui/rcp/swing/SwingMapViewer.java +++ b/gis/plugins/org.argeo.gis.ui.rcp.swing/src/main/java/org/argeo/gis/ui/rcp/swing/SwingMapViewer.java @@ -2,26 +2,43 @@ package org.argeo.gis.ui.rcp.swing; import java.awt.Color; import java.awt.Frame; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import javax.jcr.Node; +import org.argeo.ArgeoException; import org.argeo.geotools.jcr.GeoJcrMapper; +import org.argeo.geotools.styling.StylingUtils; import org.argeo.gis.ui.AbstractMapViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.awt.SWT_AWT; import org.eclipse.swt.widgets.Composite; import org.geotools.data.FeatureSource; +import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.map.DefaultMapContext; +import org.geotools.map.DefaultMapLayer; +import org.geotools.map.MapContext; +import org.geotools.map.MapLayer; +import org.geotools.referencing.CRS; import org.geotools.renderer.lite.StreamingRenderer; +import org.geotools.styling.Style; import org.geotools.swing.JMapPane; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; +import org.opengis.referencing.crs.CoordinateReferenceSystem; +/** Map viewer implementation based on GeoTools Swing components. */ public class SwingMapViewer extends AbstractMapViewer { private Composite embedded; private JMapPane mapPane; private VersatileZoomTool versatileZoomTool; + private Map mapLayers = Collections + .synchronizedMap(new HashMap()); + public SwingMapViewer(Node context, GeoJcrMapper geoJcrMapper, Composite parent) { super(context, geoJcrMapper); @@ -29,22 +46,72 @@ public class SwingMapViewer extends AbstractMapViewer { embedded = new Composite(parent, SWT.EMBEDDED | SWT.NO_BACKGROUND); Frame frame = SWT_AWT.new_Frame(embedded); - mapPane = new JMapPane(new StreamingRenderer(), new DefaultMapContext()); + MapContext mapContext = new DefaultMapContext(); + // dummy call to make sure that the layers are initialized + mapContext.layers(); + mapPane = new JMapPane(new StreamingRenderer(), mapContext); versatileZoomTool = new VersatileZoomTool(); mapPane.setCursorTool(versatileZoomTool); mapPane.setBackground(Color.WHITE); - frame.add(mapPane); setControl(embedded); } @Override - protected void addFeatureSource(String path, - FeatureSource featureSource) { - // TODO: deal with style and rasters - mapPane.getMapContext().addLayer(featureSource, null); - mapPane.reset(); + protected void addFeatureSource(String layerId, + FeatureSource featureSource, + Object style) { + if (style == null) + style = StylingUtils.createLineStyle("BLACK", 1); + + MapLayer mapLayer = new DefaultMapLayer(featureSource, (Style) style); + addMapLayer(layerId, mapLayer); + } + + protected void addMapLayer(String layerId, MapLayer mapLayer) { + mapLayers.put(layerId, mapLayer); + mapPane.getMapContext().addLayer(mapLayer); + } + + public void addLayer(String layerId, Collection collection, Object style) { + if (style == null) + style = StylingUtils.createLineStyle("BLACK", 1); + MapLayer mapLayer = new DefaultMapLayer(collection, (Style) style); + addMapLayer(layerId, mapLayer); + } + + public void setStyle(String layerId, Object style) { + mapLayers.get(layerId).setStyle((Style) style); + } + + public void setAreaOfInterest(ReferencedEnvelope areaOfInterest) { + // mapPane.getMapContext().setAreaOfInterest(areaOfInterest); + CoordinateReferenceSystem crs = mapPane.getMapContext() + .getCoordinateReferenceSystem(); + + ReferencedEnvelope toDisplay; + if (crs != null) + try { + toDisplay = areaOfInterest.transform(crs, true); + } catch (Exception e) { + throw new ArgeoException("Cannot reproject " + areaOfInterest, + e); + } + else + toDisplay = areaOfInterest; + mapPane.setDisplayArea(toDisplay); + } + + public void setCoordinateReferenceSystem(String crs) { + try { + CoordinateReferenceSystem crsObj = CRS.decode(crs); + mapPane.getMapContext().setCoordinateReferenceSystem(crsObj); + mapPane.repaint(); + } catch (Exception e) { + throw new ArgeoException("Cannot set CRS '" + crs + "'", e); + } + } }