package org.argeo.gis.ui.rap.openlayers; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.geotools.data.FeatureSource; import org.geotools.feature.FeatureCollection; import org.geotools.feature.FeatureIterator; import org.geotools.map.MapContext; import org.geotools.map.event.MapLayerListEvent; import org.geotools.map.event.MapLayerListListener; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import org.polymap.openlayers.rap.widget.base.OpenLayersEventListener; import org.polymap.openlayers.rap.widget.base.OpenLayersObject; import org.polymap.openlayers.rap.widget.base_types.OpenLayersMap; import org.polymap.openlayers.rap.widget.features.VectorFeature; import org.polymap.openlayers.rap.widget.geometry.LineStringGeometry; import org.polymap.openlayers.rap.widget.geometry.PointGeometry; import org.polymap.openlayers.rap.widget.layers.VectorLayer; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.MultiPolygon; public class MapContextAdapter implements MapLayerListListener, OpenLayersEventListener { private final static Log log = LogFactory.getLog(MapContextAdapter.class); private final MapContext mapContext; private final OpenLayersMap openLayersMap; public MapContextAdapter(MapContext mapContext, OpenLayersMap openLayersMap) { this.mapContext = mapContext; this.openLayersMap = openLayersMap; mapContext.addMapLayerListListener(this); HashMap payloadMap = new HashMap(); payloadMap.put("layername", "event.layer.name"); this.openLayersMap.events.register(this, "changebaselayer", payloadMap); payloadMap.put("property", "event.property"); payloadMap.put("visibility", "event.layer.visibility"); this.openLayersMap.events.register(this, "changelayer", payloadMap); } /* * MAP CONTEXT */ @SuppressWarnings("unchecked") public void layerAdded(MapLayerListEvent event) { if (log.isDebugEnabled()) log.debug("Map context layer added " + event); try { FeatureSource featureSource = (FeatureSource) event .getLayer().getFeatureSource(); VectorLayer vectorLayer = new VectorLayer(featureSource.getName() .toString()); FeatureCollection featureCollection = featureSource .getFeatures(); FeatureIterator fit = featureCollection.features(); while (fit.hasNext()) { SimpleFeature feature = fit.next(); Geometry geom = (Geometry) feature.getDefaultGeometry(); log.debug("Feature " + feature.getID()); // log.debug(" Geom: " + geom.getClass() + ", centroid=" // + geom.getCentroid()); if (geom instanceof MultiPolygon) { MultiPolygon mp = (MultiPolygon) geom; List points = new ArrayList(); for (Coordinate coo : mp.getCoordinates()) { points.add(new PointGeometry(coo.x, coo.y)); } VectorFeature vf = new VectorFeature( new LineStringGeometry( points.toArray(new PointGeometry[points .size()]))); vectorLayer.addFeatures(vf); } } openLayersMap.addLayer(vectorLayer); } catch (IOException e) { log.error("Cannot add layer " + event.getLayer(), e); } } public void layerRemoved(MapLayerListEvent event) { if (log.isDebugEnabled()) log.debug("Map context layer removed " + event); } public void layerChanged(MapLayerListEvent event) { if (log.isDebugEnabled()) log.debug("Map context layer changed " + event); } public void layerMoved(MapLayerListEvent event) { if (log.isDebugEnabled()) log.debug("Map context layer moved " + event); } /* * OPENLAYERS MAP */ public void process_event(OpenLayersObject source, String eventName, HashMap payload) { if (log.isDebugEnabled()) log.debug("openlayers event from" + source); if (eventName.equals("changebaselayer")) { if (log.isDebugEnabled()) log.debug("client changed baselayer to '" + payload.get("layername") + "' " + payload.get("property")); } else if (eventName.equals("changelayer")) { if (log.isDebugEnabled()) log.debug("client changed layer '" + payload.get("layername") + "' " + payload.get("property") + "' " + payload.get("visibility")); if (payload.get("property").equals("visibility")) { Boolean visible = payload.get("visibility").equals("true"); VectorLayer edit_layer = new VectorLayer("edit layer"); if (payload.get("layername").equals(edit_layer.getName())) { if (visible) { } else { } } } } else if (log.isDebugEnabled()) log.debug("unknown event " + eventName); } }