diff --git a/deegree-core/deegree-core-rendering-2d/src/main/java/org/deegree/rendering/r2d/GeometryClipper.java b/deegree-core/deegree-core-rendering-2d/src/main/java/org/deegree/rendering/r2d/GeometryClipper.java index fbbc50cea3..70a3f6f0c5 100644 --- a/deegree-core/deegree-core-rendering-2d/src/main/java/org/deegree/rendering/r2d/GeometryClipper.java +++ b/deegree-core/deegree-core-rendering-2d/src/main/java/org/deegree/rendering/r2d/GeometryClipper.java @@ -44,18 +44,26 @@ Occam Labs UG (haftungsbeschränkt) import static org.deegree.commons.utils.math.MathUtils.isZero; import static org.deegree.rendering.r2d.OrientationFixer.fixOrientation; +import org.deegree.commons.tom.TypedObjectNode; import org.deegree.geometry.Envelope; import org.deegree.geometry.Geometries; import org.deegree.geometry.Geometry; +import org.deegree.geometry.GeometryFactory; +import org.deegree.geometry.multi.MultiPoint; +import org.deegree.geometry.multi.MultiPolygon; import org.deegree.geometry.primitive.Point; import org.deegree.geometry.primitive.Polygon; import org.deegree.geometry.standard.AbstractDefaultGeometry; import org.deegree.geometry.standard.DefaultEnvelope; import org.deegree.geometry.standard.primitive.DefaultPoint; +import org.deegree.geometry.standard.primitive.DefaultSurface; import org.deegree.style.styling.LineStyling; import org.deegree.style.styling.PolygonStyling; import org.deegree.style.styling.components.Stroke; +import java.util.ArrayList; +import java.util.List; + /** * Responsible for clipping geometries to the area of the viewport. * @@ -66,9 +74,12 @@ Occam Labs UG (haftungsbeschränkt) */ class GeometryClipper { + private final Envelope viewPort; + private final Polygon clippingArea; GeometryClipper( final Envelope viewPort, final int width ) { + this.viewPort = viewPort; this.clippingArea = calculateClippingArea( viewPort, width ); } @@ -92,6 +103,37 @@ private Polygon calculateClippingArea( final Envelope bbox, final int width ) { * @return the clipped geometry or the original geometry if the geometry lays completely in the drawing area. */ Geometry clipGeometry( final Geometry geom ) { + return clipGeometry( geom, clippingArea ); + } + + /** + * Calculates the points inside the geometry and inside the view port. First the passed geometry is clipped + * by the view port. A multipolygon may result. For each of the polygon in this multipolygon one interior point + * is created + * + * @param geom to create labels for, must not be null and in the same CRS as the viewPort + * @return a MultiPoint with all calculated labels + */ + MultiPoint calculateInteriorPoints( final Geometry geom ) { + if ( geom == null ) + return null; + Geometry clippedGeometry = clipGeometry( geom, viewPort ); + List points = new ArrayList(); + if ( clippedGeometry != null && clippedGeometry instanceof DefaultSurface ) { + points.add( ( (DefaultSurface) clippedGeometry ).getInteriorPoint() ); + } + if ( clippedGeometry != null && clippedGeometry instanceof MultiPolygon ) { + for ( Polygon p : ( (MultiPolygon) clippedGeometry ) ) { + if ( p instanceof DefaultSurface ) { + points.add( ( (DefaultSurface) p ).getInteriorPoint() ); + } + } + } + return new GeometryFactory().createMultiPoint( null, geom.getCoordinateSystem(), points ); + } + + + Geometry clipGeometry( final Geometry geom, Geometry clippingArea ) { if ( clippingArea != null && !clippingArea.contains( geom ) ) { try { Geometry clippedGeometry = clippingArea.getIntersection( geom ); @@ -106,7 +148,7 @@ Geometry clipGeometry( final Geometry geom ) { if ( isInvertedOrientation( jtsOrig ) ) { return clippedGeometry; } - + return fixOrientation( clippedGeometry, clippedGeometry.getCoordinateSystem() ); } catch ( UnsupportedOperationException e ) { // use original geometry if intersection not supported by JTS @@ -115,7 +157,7 @@ Geometry clipGeometry( final Geometry geom ) { } return geom; } - + /** * Check if the passed Geometry is a Polygon (or the first Geometry of a Collection) and the exterior Ring has CW orientation * diff --git a/deegree-core/deegree-core-rendering-2d/src/main/java/org/deegree/rendering/r2d/Java2DLabelRenderer.java b/deegree-core/deegree-core-rendering-2d/src/main/java/org/deegree/rendering/r2d/Java2DLabelRenderer.java index 5c6bd62bf4..4b0ec84ec3 100644 --- a/deegree-core/deegree-core-rendering-2d/src/main/java/org/deegree/rendering/r2d/Java2DLabelRenderer.java +++ b/deegree-core/deegree-core-rendering-2d/src/main/java/org/deegree/rendering/r2d/Java2DLabelRenderer.java @@ -65,10 +65,7 @@ Occam Labs UG (haftungsbeschränkt) import org.deegree.geometry.multi.MultiGeometry; import org.deegree.geometry.multi.MultiLineString; import org.deegree.geometry.multi.MultiPoint; -import org.deegree.geometry.primitive.Curve; -import org.deegree.geometry.primitive.GeometricPrimitive; -import org.deegree.geometry.primitive.Point; -import org.deegree.geometry.primitive.Surface; +import org.deegree.geometry.primitive.*; import org.deegree.rendering.r2d.strokes.OffsetStroke; import org.deegree.rendering.r2d.strokes.TextStroke; import org.deegree.style.styling.TextStyling; @@ -76,22 +73,21 @@ Occam Labs UG (haftungsbeschränkt) /** * Responsible for creating and rendering of labels. Based on Java2DTextRenderer - * + * * @author Florian Bingel * @author last edited by: $Author: stranger $ - * * @version $Revision: $, $Date: $ */ public class Java2DLabelRenderer implements LabelRenderer { static final Logger LOG = getLogger( Java2DLabelRenderer.class ); - + private Java2DRenderer renderer; private RendererContext context; - + private Java2DTextRenderer textRenderer; - + private ArrayList