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