use of com.revolsys.geometry.graph.Edge in project com.revolsys.open by revolsys.
the class EqualTypeAndLineEdgeCleanupVisitor method accept.
@Override
public void accept(final Edge<Record> edge) {
if (edge.getProperty(EDGE_PROCESSED) == null) {
final String typePath = edge.getTypeName();
final Graph<Record> graph = edge.getGraph();
final LineString line = edge.getLineString();
Predicate<Edge<Record>> attributeAndGeometryFilter = new EdgeTypeNameFilter<>(typePath);
final Predicate<Edge<Record>> filter = getPredicate();
if (filter != null) {
attributeAndGeometryFilter = attributeAndGeometryFilter.and(filter);
}
final Predicate<Record> equalLineFilter = new RecordGeometryFilter<>(new LineEqualIgnoreDirectionFilter(line, 2));
final EdgeObjectFilter<Record> edgeFilter = new EdgeObjectFilter<>(equalLineFilter);
attributeAndGeometryFilter = attributeAndGeometryFilter.and(edgeFilter);
final List<Edge<Record>> equalEdges;
if (getComparator() == null) {
equalEdges = graph.getEdges(line, attributeAndGeometryFilter);
} else {
equalEdges = graph.getEdges(line, attributeAndGeometryFilter, getComparator());
}
processEqualEdges(equalEdges);
}
}
use of com.revolsys.geometry.graph.Edge in project com.revolsys.open by revolsys.
the class RemoveBothDuplicateEdgeVisitor method accept.
@Override
public void accept(final Edge<T> edge) {
final LineString line = edge.getLineString();
final Node<T> fromNode = edge.getFromNode();
final Node<T> toNode = edge.getToNode();
final Set<Edge<T>> edges = fromNode.getEdgesTo(toNode);
edges.remove(edge);
boolean hasDuplicate = false;
for (final Edge<T> edge2 : edges) {
final LineString line2 = edge2.getLineString();
if (LineStringUtil.equalsIgnoreDirection(line, line2, 2)) {
edge2.remove();
hasDuplicate = true;
}
}
if (hasDuplicate) {
edge.remove();
}
}
use of com.revolsys.geometry.graph.Edge in project com.revolsys.open by revolsys.
the class SplitCrossingEdgesVisitor method accept.
@Override
public void accept(final Edge<T> edge) {
final IdObjectIndex<Edge<T>> edgeIndex = this.graph.getEdgeIndex();
final LineString line = edge.getLineString();
final List<Edge<T>> crossings = queryCrosses(edgeIndex, line);
crossings.remove(edge);
for (final Edge<T> crossEdge : crossings) {
if (!crossEdge.isRemoved()) {
final LineString crossLine = crossEdge.getLineString();
final Point intersection = LineStringUtil.getCrossingIntersection(line, crossLine);
if (intersection != null) {
final Point point = this.graph.getPrecisionModel().getPreciseCoordinates(intersection);
final Node<T> node = this.graph.getNode(point);
this.splitEdgesCloseToNodeVisitor.accept(node);
}
}
}
}
use of com.revolsys.geometry.graph.Edge in project com.revolsys.open by revolsys.
the class SplitCrossingEdgesVisitor method queryCrosses.
public List<Edge<T>> queryCrosses(final IdObjectIndex<Edge<T>> edgeIndex, final LineString line) {
final Geometry preparedLine = line.prepare();
final BoundingBox envelope = line.getBoundingBox();
final List<Edge<T>> edges = edgeIndex.query(envelope);
// TODO change to use an visitor
for (final Iterator<Edge<T>> iterator = edges.iterator(); iterator.hasNext(); ) {
final Edge<T> edge = iterator.next();
final LineString matchLine = edge.getLineString();
if (!preparedLine.crosses(matchLine)) {
iterator.remove();
}
}
return edges;
}
use of com.revolsys.geometry.graph.Edge in project com.revolsys.open by revolsys.
the class MergeRecordsDialog method run.
public void run() {
try {
final List<LayerRecord> originalRecords = this.layer.getMergeableSelectedRecords();
String errorMessage = "";
final DataType geometryType = this.layer.getGeometryType();
this.mergedRecords = new HashMap<>();
if (originalRecords.size() < 2) {
errorMessage = " at least two records must be selected to merge.";
} else if (!DataTypes.LINE_STRING.equals(geometryType) && !DataTypes.MULTI_LINE_STRING.equals(geometryType)) {
errorMessage = "Merging " + geometryType + " not currently supported";
} else {
final RecordGraph graph = new RecordGraph();
for (final LayerRecord originalRecord : originalRecords) {
Geometry geometry = originalRecord.getGeometry();
if (geometry != null && !geometry.isEmpty()) {
geometry = this.layer.getGeometryFactory().geometry(LineString.class, geometry);
if (geometry instanceof LineString) {
final Record mergeableRecord = new ArrayRecord(originalRecord);
mergeableRecord.setGeometryValue(geometry);
this.mergeableToOiginalRecordMap.put(mergeableRecord, originalRecord);
graph.addEdge(mergeableRecord);
}
}
}
for (final Node<Record> node : graph.nodes()) {
if (node != null) {
final List<Edge<Record>> edges = node.getEdges();
if (edges.size() == 2) {
final Edge<Record> edge1 = edges.get(0);
final Record record1 = edge1.getObject();
final Edge<Record> edge2 = edges.get(1);
final Record record2 = edge2.getObject();
if (record1 != record2) {
final Record mergedRecord = this.layer.getMergedRecord(node, record1, record2);
graph.addEdge(mergedRecord);
edge1.remove();
edge2.remove();
final Set<LayerRecord> sourceRecords = new LinkedHashSet<>();
// TODO verify orientation to ensure they are in the correct
// order
// and see if they are reversed
CollectionUtil.addIfNotNull(sourceRecords, this.mergeableToOiginalRecordMap.get(record1));
CollectionUtil.addAllIfNotNull(sourceRecords, this.mergedRecords.remove(record1));
CollectionUtil.addIfNotNull(sourceRecords, this.mergeableToOiginalRecordMap.get(record2));
CollectionUtil.addAllIfNotNull(sourceRecords, this.mergedRecords.remove(record2));
this.mergedRecords.put(mergedRecord, sourceRecords);
replaceRecord(mergedRecord, record1);
replaceRecord(mergedRecord, record2);
}
}
}
}
}
final String message = errorMessage;
Invoke.later(() -> setMergedRecords(message, this.mergedRecords));
} catch (final Throwable e) {
Logs.error(this, "Error " + this, e);
}
}
Aggregations