Search in sources :

Example 36 with Edge

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);
    }
}
Also used : EdgeObjectFilter(com.revolsys.geometry.graph.filter.EdgeObjectFilter) LineEqualIgnoreDirectionFilter(com.revolsys.geometry.filter.LineEqualIgnoreDirectionFilter) LineString(com.revolsys.geometry.model.LineString) RecordGeometryFilter(com.revolsys.record.filter.RecordGeometryFilter) LineString(com.revolsys.geometry.model.LineString) Record(com.revolsys.record.Record) EdgeTypeNameFilter(com.revolsys.geometry.graph.filter.EdgeTypeNameFilter) Edge(com.revolsys.geometry.graph.Edge)

Example 37 with Edge

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();
    }
}
Also used : LineString(com.revolsys.geometry.model.LineString) Edge(com.revolsys.geometry.graph.Edge)

Example 38 with Edge

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);
            }
        }
    }
}
Also used : LineString(com.revolsys.geometry.model.LineString) Point(com.revolsys.geometry.model.Point) Edge(com.revolsys.geometry.graph.Edge)

Example 39 with Edge

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;
}
Also used : Geometry(com.revolsys.geometry.model.Geometry) LineString(com.revolsys.geometry.model.LineString) BoundingBox(com.revolsys.geometry.model.BoundingBox) Edge(com.revolsys.geometry.graph.Edge)

Example 40 with Edge

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);
    }
}
Also used : RecordGraph(com.revolsys.geometry.graph.RecordGraph) HashSet(java.util.HashSet) LinkedHashSet(java.util.LinkedHashSet) Set(java.util.Set) ArrayRecord(com.revolsys.record.ArrayRecord) Node(com.revolsys.geometry.graph.Node) LineString(com.revolsys.geometry.model.LineString) Geometry(com.revolsys.geometry.model.Geometry) LineString(com.revolsys.geometry.model.LineString) DataType(com.revolsys.datatype.DataType) Record(com.revolsys.record.Record) ArrayRecord(com.revolsys.record.ArrayRecord) LayerRecord(com.revolsys.swing.map.layer.record.LayerRecord) List(java.util.List) LayerRecord(com.revolsys.swing.map.layer.record.LayerRecord) Edge(com.revolsys.geometry.graph.Edge)

Aggregations

Edge (com.revolsys.geometry.graph.Edge)40 LineString (com.revolsys.geometry.model.LineString)22 Point (com.revolsys.geometry.model.Point)21 LineSegment (com.revolsys.geometry.model.segment.LineSegment)19 ArrayList (java.util.ArrayList)14 BoundingBox (com.revolsys.geometry.model.BoundingBox)10 PointOnLineSegment (com.revolsys.geometry.model.coordinates.filter.PointOnLineSegment)9 Node (com.revolsys.geometry.graph.Node)8 Geometry (com.revolsys.geometry.model.Geometry)8 LinkedHashSet (java.util.LinkedHashSet)7 Record (com.revolsys.record.Record)6 CreateListVisitor (com.revolsys.visitor.CreateListVisitor)6 HashSet (java.util.HashSet)6 EdgeAttributeValueComparator (com.revolsys.geometry.graph.comparator.EdgeAttributeValueComparator)5 List (java.util.List)5 EdgeObjectFilter (com.revolsys.geometry.graph.filter.EdgeObjectFilter)4 GeometryFactory (com.revolsys.geometry.model.GeometryFactory)4 LineSegmentDoubleGF (com.revolsys.geometry.model.segment.LineSegmentDoubleGF)4 EdgeTypeNameFilter (com.revolsys.geometry.graph.filter.EdgeTypeNameFilter)2 LineStringGraph (com.revolsys.geometry.graph.linestring.LineStringGraph)2