Search in sources :

Example 41 with Vertex

use of com.revolsys.geometry.model.vertex.Vertex in project com.revolsys.open by revolsys.

the class AbstractRecordLayerRenderer method getPointWithOrientation.

public static PointDoubleXYOrientation getPointWithOrientation(final Viewport2D viewport, final Geometry geometry, final String placementType) {
    if (viewport == null) {
        return new PointDoubleXYOrientation(0.0, 0.0, 0);
    } else {
        final GeometryFactory viewportGeometryFactory2d = viewport.getGeometryFactory2dFloating();
        if (viewportGeometryFactory2d != null && geometry != null && !geometry.isEmpty()) {
            Point point = null;
            double orientation = 0;
            if (geometry instanceof Point) {
                point = (Point) geometry;
            } else {
                final Matcher vertexIndexMatcher = PATTERN_VERTEX_INDEX.matcher(placementType);
                if (vertexIndexMatcher.matches()) {
                    final int vertexCount = geometry.getVertexCount();
                    final int vertexIndex = getIndex(vertexIndexMatcher);
                    if (vertexIndex >= -vertexCount && vertexIndex < vertexCount) {
                        final Vertex vertex = geometry.getVertex(vertexIndex);
                        orientation = vertex.getOrientaton(viewportGeometryFactory2d);
                        point = vertex.convertGeometry(viewportGeometryFactory2d);
                    }
                } else {
                    final Matcher segmentIndexMatcher = PATTERN_SEGMENT_INDEX.matcher(placementType);
                    if (segmentIndexMatcher.matches()) {
                        final int segmentCount = geometry.getSegmentCount();
                        if (segmentCount > 0) {
                            final int index = getIndex(segmentIndexMatcher);
                            LineSegment segment = geometry.getSegment(index);
                            segment = segment.convertGeometry(viewportGeometryFactory2d);
                            if (segment != null) {
                                point = segment.midPoint();
                                orientation = segment.getOrientaton();
                            }
                        }
                    } else {
                        PointDoubleXYOrientation pointDoubleXYOrientation = getPointWithOrientationCentre(viewportGeometryFactory2d, geometry);
                        if (!viewport.getBoundingBox().covers(pointDoubleXYOrientation)) {
                            try {
                                final Geometry clippedGeometry = viewport.getBoundingBox().toPolygon().intersection(geometry);
                                if (!clippedGeometry.isEmpty()) {
                                    double maxArea = 0;
                                    double maxLength = 0;
                                    for (int i = 0; i < clippedGeometry.getGeometryCount(); i++) {
                                        final Geometry part = clippedGeometry.getGeometry(i);
                                        if (part instanceof Polygon) {
                                            final double area = part.getArea();
                                            if (area > maxArea) {
                                                maxArea = area;
                                                pointDoubleXYOrientation = getPointWithOrientationCentre(viewportGeometryFactory2d, part);
                                            }
                                        } else if (part instanceof LineString) {
                                            if (maxArea == 0 && "auto".equals(placementType)) {
                                                final double length = part.getLength();
                                                if (length > maxLength) {
                                                    maxLength = length;
                                                    pointDoubleXYOrientation = getPointWithOrientationCentre(viewportGeometryFactory2d, part);
                                                }
                                            }
                                        } else if (part instanceof Point) {
                                            if (maxArea == 0 && maxLength == 0 && "auto".equals(placementType)) {
                                                pointDoubleXYOrientation = getPointWithOrientationCentre(viewportGeometryFactory2d, part);
                                            }
                                        }
                                    }
                                }
                            } catch (final Throwable t) {
                            }
                        }
                        return pointDoubleXYOrientation;
                    }
                }
            }
            if (Property.hasValue(point)) {
                if (viewport.getBoundingBox().covers(point)) {
                    point = point.convertPoint2d(viewportGeometryFactory2d);
                    return new PointDoubleXYOrientation(point, orientation);
                }
            }
        }
        return null;
    }
}
Also used : Geometry(com.revolsys.geometry.model.Geometry) Vertex(com.revolsys.geometry.model.vertex.Vertex) PointDoubleXYOrientation(com.revolsys.geometry.model.impl.PointDoubleXYOrientation) GeometryFactory(com.revolsys.geometry.model.GeometryFactory) Matcher(java.util.regex.Matcher) LineString(com.revolsys.geometry.model.LineString) Point(com.revolsys.geometry.model.Point) Polygon(com.revolsys.geometry.model.Polygon) Point(com.revolsys.geometry.model.Point) LineSegment(com.revolsys.geometry.model.segment.LineSegment)

Example 42 with Vertex

use of com.revolsys.geometry.model.vertex.Vertex in project com.revolsys.open by revolsys.

the class EditRecordGeometryOverlay method modeAddGeometryUpdateXorGeometry.

protected void modeAddGeometryUpdateXorGeometry() {
    final Point point = getOverlayPoint();
    if (!hasSnapPoint()) {
        setMapCursor(CURSOR_NODE_ADD);
    }
    final int[] firstVertexId = Geometry.newVertexId(this.addGeometryPartIndex, 0);
    Geometry xorGeometry = null;
    if (DataTypes.POINT.equals(this.addGeometryPartDataType)) {
    } else {
        final Vertex firstVertex = this.addGeometryEditor.getVertex(firstVertexId);
        final Vertex toVertex = this.addGeometryEditor.getToVertex(firstVertexId);
        final GeometryFactory geometryFactory = this.addLayer.getGeometryFactory();
        if (toVertex != null && !toVertex.isEmpty()) {
            if (DataTypes.LINE_STRING.equals(this.addGeometryPartDataType)) {
                xorGeometry = newXorLine(geometryFactory, toVertex, point);
            } else if (DataTypes.POLYGON.equals(this.addGeometryPartDataType)) {
                if (toVertex.equals(firstVertex)) {
                    xorGeometry = newXorLine(geometryFactory, toVertex, point);
                } else {
                    final Point p1 = geometryFactory.point(toVertex);
                    final Point p3 = geometryFactory.point(firstVertex);
                    final GeometryFactory viewportGeometryFactory = getViewportGeometryFactory2d();
                    xorGeometry = viewportGeometryFactory.lineString(p1, point, p3);
                }
            }
        }
    }
    setXorGeometry(xorGeometry);
}
Also used : Geometry(com.revolsys.geometry.model.Geometry) Vertex(com.revolsys.geometry.model.vertex.Vertex) GeometryFactory(com.revolsys.geometry.model.GeometryFactory) Point(com.revolsys.geometry.model.Point)

Aggregations

Vertex (com.revolsys.geometry.model.vertex.Vertex)42 Point (com.revolsys.geometry.model.Point)18 Geometry (com.revolsys.geometry.model.Geometry)16 GeometryFactory (com.revolsys.geometry.model.GeometryFactory)14 LineString (com.revolsys.geometry.model.LineString)10 Polygon (com.revolsys.geometry.model.Polygon)6 Segment (com.revolsys.geometry.model.segment.Segment)6 ArrayList (java.util.ArrayList)6 GeometryEditor (com.revolsys.geometry.model.editor.GeometryEditor)4 AbstractVertex (com.revolsys.geometry.model.vertex.AbstractVertex)4 LineStringVertex (com.revolsys.geometry.model.vertex.LineStringVertex)4 BaseCloseable (com.revolsys.io.BaseCloseable)4 CloseLocation (com.revolsys.swing.map.overlay.CloseLocation)4 DataType (com.revolsys.datatype.DataType)3 LinearRing (com.revolsys.geometry.model.LinearRing)3 PointDoubleXY (com.revolsys.geometry.model.impl.PointDoubleXY)3 LineSegment (com.revolsys.geometry.model.segment.LineSegment)3 MapPanel (com.revolsys.swing.map.MapPanel)3 WebColors (com.revolsys.awt.WebColors)2 Maps (com.revolsys.collection.map.Maps)2