/*
* The Unified Mapping Platform (JUMP) is an extensible, interactive GUI
* for visualizing and manipulating spatial features with geometry and attributes.
*
* Copyright (C) 2003 Vivid Solutions
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* For more information, contact:
*
* Vivid Solutions
* Suite #1A
* 2328 Government Street
* Victoria BC V8T 5G5
* Canada
*
* (250)385-6040
* www.vividsolutions.com
*/
package com.vividsolutions.jump.geom;
import java.util.*;
import com.vividsolutions.jts.geom.*;
import com.vividsolutions.jump.util.CoordinateArrays;
/**
* Magnifies a given area of a set of Geometry's.
*/
public class GeometryMicroscope {
private List geomList;
private Envelope env;
private double minSep;
public GeometryMicroscope(List geomList, Envelope env, double minSep) {
this.geomList = geomList;
this.env = env;
this.minSep = minSep;
}
public List getAdjusted() {
List segList = getSegList();
MicroscopePointAdjuster mpa = new MicroscopePointAdjuster(segList, env,
minSep);
Map ptMap = mpa.getAdjustedPointMap();
applyAdjustment(ptMap);
return geomList;
}
private void applyAdjustment(Map ptMap) {
CoordinateAdjusterFilter coordAdjFilter = new CoordinateAdjusterFilter(ptMap);
for (Iterator i = geomList.iterator(); i.hasNext();) {
Geometry geom = (Geometry) i.next();
geom.apply(coordAdjFilter);
}
}
private List getSegList() {
List segList = new ArrayList();
for (Iterator i = geomList.iterator(); i.hasNext();) {
Geometry geom = (Geometry) i.next();
List coordArrayList = CoordinateArrays.toCoordinateArrays(geom,
false);
addSegments(coordArrayList, segList);
}
return segList;
}
private void addSegments(List coordArrayList, List segList) {
LineSegmentEnvelopeIntersector linesegEnvInt = new LineSegmentEnvelopeIntersector();
// for now just return all segs
// in future, only return segs which intersect env
for (Iterator i = coordArrayList.iterator(); i.hasNext();) {
Coordinate[] coord = (Coordinate[]) i.next();
for (int j = 0; j < (coord.length - 1); j++) {
LineSegment seg = new LineSegment(coord[j], coord[j + 1]);
if (linesegEnvInt.touches(seg, env)) {
segList.add(seg);
}
}
}
}
public class CoordinateAdjusterFilter implements CoordinateFilter {
Map ptMap;
CoordinateAdjusterFilter(Map ptMap) {
this.ptMap = ptMap;
}
public void filter(Coordinate p) {
Coordinate adj = (Coordinate) ptMap.get(p);
if (adj != null) {
p.x = adj.x;
p.y = adj.y;
}
}
}
}