/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package de.cismet.cismap.commons.gui.layerwidget;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryCollection;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.PrecisionModel;
import org.apache.log4j.Logger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.SwingWorker;
import de.cismet.cismap.commons.CrsTransformer;
import de.cismet.cismap.commons.XBoundingBox;
import de.cismet.cismap.commons.features.Feature;
import de.cismet.cismap.commons.interaction.CismapBroker;
/**
* DOCUMENT ME!
*
* @author therter
* @version $Revision$, $Date$
*/
public class ZoomToFeaturesWorker extends SwingWorker<Geometry, Geometry> {
//~ Static fields/initializers ---------------------------------------------
private static final Logger LOG = Logger.getLogger(ZoomToFeaturesWorker.class);
//~ Instance fields --------------------------------------------------------
private Feature[] features;
/** buffer in percent.* */
private int buffer;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new ZoomToLayerWorker object.
*
* @param features tps DOCUMENT ME!
*/
public ZoomToFeaturesWorker(final Feature[] features) {
this(features, 0);
}
/**
* Creates a new ZoomToLayerWorker object.
*
* @param features tps DOCUMENT ME!
* @param buffer DOCUMENT ME!
*/
public ZoomToFeaturesWorker(final Feature[] features, final int buffer) {
this.features = features;
this.buffer = buffer;
}
//~ Methods ----------------------------------------------------------------
@Override
protected Geometry doInBackground() throws Exception {
boolean first = true;
int srid = 0;
final List<Geometry> geomList = new ArrayList<Geometry>(features.length);
for (final Feature f : features) {
Geometry g = f.getGeometry();
if (g != null) {
g = g.getEnvelope();
if (first) {
srid = g.getSRID();
first = false;
} else {
if (g.getSRID() != srid) {
g = CrsTransformer.transformToGivenCrs(g, CrsTransformer.createCrsFromSrid(srid));
}
}
geomList.add(g);
}
}
final GeometryFactory factory = new GeometryFactory(new PrecisionModel(PrecisionModel.FLOATING), srid);
Geometry union = factory.buildGeometry(geomList);
if (union instanceof GeometryCollection) {
union = ((GeometryCollection)union).union();
}
return union;
}
@Override
protected void done() {
try {
final Geometry geom = get();
if (geom != null) {
final XBoundingBox boundingBox = new XBoundingBox(geom);
if (buffer != 0) {
boundingBox.increase(buffer);
}
CismapBroker.getInstance().getMappingComponent().gotoBoundingBoxWithHistory(boundingBox);
}
} catch (Exception e) {
LOG.error("Error while zooming to selected features", e);
}
}
}