com.vividsolutions.jts.noding.snapround.MCIndexPointSnapper Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of JTSplus Show documentation
Show all versions of JTSplus Show documentation
JTS Topology Suite 1.14 with additional functions for GeoSpark
/*
* The JTS Topology Suite is a collection of Java classes that
* implement the fundamental operations required to validate a given
* geo-spatial data set to a known topological specification.
*
* Copyright (C) 2001 Vivid Solutions
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; 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.jts.noding.snapround;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.index.ItemVisitor;
import com.vividsolutions.jts.index.SpatialIndex;
import com.vividsolutions.jts.index.chain.MonotoneChain;
import com.vividsolutions.jts.index.chain.MonotoneChainSelectAction;
import com.vividsolutions.jts.index.strtree.STRtree;
import com.vividsolutions.jts.noding.NodedSegmentString;
import com.vividsolutions.jts.noding.SegmentString;
/**
* "Snaps" all {@link SegmentString}s in a {@link SpatialIndex} containing
* {@link MonotoneChain}s to a given {@link HotPixel}.
*
* @version 1.7
*/
public class MCIndexPointSnapper
{
//public static final int nSnaps = 0;
private STRtree index;
public MCIndexPointSnapper(SpatialIndex index) {
this.index = (STRtree) index;
}
/**
* Snaps (nodes) all interacting segments to this hot pixel.
* The hot pixel may represent a vertex of an edge,
* in which case this routine uses the optimization
* of not noding the vertex itself
*
* @param hotPixel the hot pixel to snap to
* @param parentEdge the edge containing the vertex, if applicable, or null
* @param hotPixelVertexIndex the index of the hotPixel vertex, if applicable, or -1
* @return true
if a node was added for this pixel
*/
public boolean snap(HotPixel hotPixel, SegmentString parentEdge, int hotPixelVertexIndex)
{
final Envelope pixelEnv = hotPixel.getSafeEnvelope();
final HotPixelSnapAction hotPixelSnapAction = new HotPixelSnapAction(hotPixel, parentEdge, hotPixelVertexIndex);
index.query(pixelEnv, new ItemVisitor() {
public void visitItem(Object item) {
MonotoneChain testChain = (MonotoneChain) item;
testChain.select(pixelEnv, hotPixelSnapAction);
}
}
);
return hotPixelSnapAction.isNodeAdded();
}
public boolean snap(HotPixel hotPixel)
{
return snap(hotPixel, null, -1);
}
public class HotPixelSnapAction
extends MonotoneChainSelectAction
{
private HotPixel hotPixel;
private SegmentString parentEdge;
// is -1 if hotPixel is not a vertex
private int hotPixelVertexIndex;
private boolean isNodeAdded = false;
public HotPixelSnapAction(HotPixel hotPixel, SegmentString parentEdge, int hotPixelVertexIndex)
{
this.hotPixel = hotPixel;
this.parentEdge = parentEdge;
this.hotPixelVertexIndex = hotPixelVertexIndex;
}
public boolean isNodeAdded() { return isNodeAdded; }
public void select(MonotoneChain mc, int startIndex)
{
NodedSegmentString ss = (NodedSegmentString) mc.getContext();
/**
* Check to avoid snapping a hotPixel vertex to the same vertex.
* This method is called for segments which intersects the
* hot pixel,
* so need to check if either end of the segment is equal to the hot pixel
* and if so, do not snap.
*
* Sep 22 2012 - MD - currently do need to snap to every vertex,
* since otherwise the testCollapse1 test in SnapRoundingTest fails.
*/
if (parentEdge != null) {
if (ss == parentEdge &&
(startIndex == hotPixelVertexIndex
))
return;
}
isNodeAdded = hotPixel.addSnappedNode(ss, startIndex);
}
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy