On 26/04/10 19:09, Andrea Aime wrote:
Just curious if you looked into the question at all. A WKT based mark
factory is fine by me 
That I did, including some tests (patches at the end of this message); of course, some user doc will have to be written too. By the way, the source code includes some more well-known shapes that I've found useful.
As per SVG, I've found out some "orphan" code that may be of interest (http://www.mail-archive.com/batik-users@anonymised.com/msg04729.html).
If you deem it worthy, I may try to adapt it to GeoTools.
Regards,
--------------------
Luca Morandini
www.lucamorandini.it
--------------------
### Eclipse Workspace Patch 1.0
#P geotools-2.6.x
Index: modules/library/render/src/main/java/org/geotools/renderer/style/ShapeMarkFactory.java
--- modules/library/render/src/main/java/org/geotools/renderer/style/ShapeMarkFactory.java (revision 35265)
+++ modules/library/render/src/main/java/org/geotools/renderer/style/ShapeMarkFactory.java (working copy)
@@ -27,12 +27,16 @@
import java.util.logging.Logger;
import org.geotools.renderer.style.shape.ExplicitBoundsShape;
+
+import org.geotools.geometry.jts.LiteShape;
+import org.geotools.geometry.jts.WKTReader2;
import org.opengis.feature.Feature;
import org.opengis.filter.expression.Expression;
public class ShapeMarkFactory implements MarkFactory {
private static final String SHAPE_PREFIX = "shape://";
+ private static final String WKT_PREFIX = "wkt://";
/** The logger for the rendering module. */
private static final Logger LOGGER = org.geotools.util.logging.Logging.getLogger(
@@ -63,20 +67,74 @@
gp.moveTo(-0.5f, -0.5f);
gp.lineTo(0.5f, 0.5f);
shapes.put("times", gp);
+
+ gp = new GeneralPath();
+ gp.moveTo(-0.5f, -0.125f);
+ gp.lineTo(-0.125f, -0.125f);
+ gp.lineTo(0.0f, 0.125f);
+ gp.lineTo(0.125f, -0.125f);
+ gp.lineTo(0.5f, -0.125f);
+ gp.closePath();
+ shapes.put("triangle", gp);
+
+ gp = new GeneralPath();
+ gp.moveTo(-0.5f, -0.125f);
+ gp.lineTo(-0.125f, -0.125f);
+
+ for (float i=8.0f; i >= 0.0f; i=i -1.0f ) {
+ gp.lineTo(
+ (float)(0.0f + Math.cos(Math.PI * i / 8.0f) * 0.25f),
+ (float)(-0.125f + Math.sin(Math.PI * i / 8.0f) * 0.25f)
+ );
+ }
+
+ gp.lineTo(0.5f, -0.125f);
+ gp.closePath();
+ shapes.put("semicircle", gp);
+
+ gp = new GeneralPath();
+ gp.moveTo(-0.5f, -0.125f);
+ gp.lineTo(-0.375f, -0.125f);
+
+ for (float i=8.0f; i >= 0.0f; i=i -1.0f ) {
+ gp.lineTo(
+ (float)(-0.25f + Math.cos(Math.PI * i / 8.0f) * 0.125f),
+ (float)(-0.125f + Math.sin(Math.PI * i / 8.0f) * 0.125f)
+ );
+ }
+
+ gp.lineTo(0.125f, -0.125f);
+ gp.lineTo(0.25f, -0.375f);
+ gp.lineTo(0.375f, -0.125f);
+ gp.lineTo(0.5f, -0.125f);
+ gp.closePath();
+ shapes.put("trianglesemicircle", gp);
}
public Shape getShape(Graphics2D graphics, Expression symbolUrl, Feature feature) throws Exception {
+
// cannot handle a null url
- if(symbolUrl == null)
+ if(symbolUrl == null) {
return null;
+ }
- // see if it's a shape://
- String wellKnownName = symbolUrl.evaluate(feature, String.class);
- if(!wellKnownName.startsWith(SHAPE_PREFIX))
- return null;
+ // see if it's a shape
+ String wellKnown = symbolUrl.evaluate(feature, String.class);
+ if ( wellKnown.startsWith(SHAPE_PREFIX)) {
- String name = wellKnownName.substring(SHAPE_PREFIX.length());
- return shapes.get(name);
+ String wellKnownName = wellKnown.substring(SHAPE_PREFIX.length());
+ return shapes.get(wellKnownName);
+ }
+
+ // Otherwise, See if it is a WKT
+ if ( wellKnown.startsWith(WKT_PREFIX)) {
+ String wellKnownText = wellKnown.substring(WKT_PREFIX.length());
+ WKTReader2 reader= new WKTReader2();
+ LiteShape shape= new LiteShape(reader.read(wellKnownText), null, false);
+ return shape;
+ }
+
+ return null;
}
-}
+}
\ No newline at end of file
### Eclipse Workspace Patch 1.0
#P geotools-2.6.x
Index: modules/library/render/src/test/java/org/geotools/renderer/style/ShapeMarkFactoryTest.java
--- modules/library/render/src/test/java/org/geotools/renderer/style/ShapeMarkFactoryTest.java (revision 0)
+++ modules/library/render/src/test/java/org/geotools/renderer/style/ShapeMarkFactoryTest.java (revision 0)
@@ -0,0 +1,148 @@
+/*
+ * GeoTools - The Open Source Java GIS Toolkit
+ * http://geotools.org
+ *
+ * (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ */
+
+package org.geotools.renderer.style;
+
+import org.opengis.feature.simple.SimpleFeature;
+import org.opengis.feature.simple.SimpleFeatureType;
+import org.opengis.filter.expression.Expression;
+import org.geotools.factory.CommonFactoryFinder;
+import org.geotools.feature.simple.SimpleFeatureBuilder;
+import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
+import org.opengis.filter.FilterFactory;
+import org.geotools.referencing.crs.DefaultGeographicCRS;
+
+import com.vividsolutions.jts.geom.LineString;
+
+import junit.framework.TestCase;
+
+/**
+ * Unit tests for shape mark factory
+ *
+ * @author Luca Morandini lmorandini@anonymised.com
+ *
+ * @source $URL:$
+ */
+public class ShapeMarkFactoryTest extends TestCase {
+
+ private SimpleFeature feature;
+ private Expression exp;
+ private FilterFactory ff;
+
+ {
+ try {
+ ff = CommonFactoryFinder.getFilterFactory(null);
+ SimpleFeatureTypeBuilder featureTypeBuilder = new SimpleFeatureTypeBuilder();
+ featureTypeBuilder.setName("TestType");
+ featureTypeBuilder.add("geom", LineString.class,
+ DefaultGeographicCRS.WGS84);
+ SimpleFeatureType featureType = featureTypeBuilder
+ .buildFeatureType();
+ SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(
+ featureType);
+ this.feature = featureBuilder.buildFeature(null);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void testWellKnownName() {
+ ShapeMarkFactory smf = new ShapeMarkFactory();
+ try {
+ this.exp = ff.literal("shape://plus");
+ smf.getShape(null, this.exp, this.feature);
+ } catch (Exception e) {
+ assertTrue(false);
+ return;
+ }
+
+ assertTrue(true);
+ }
+
+ public void testWellKnownTextLineString() {
+ ShapeMarkFactory smf = new ShapeMarkFactory();
+ try {
+ this.exp = ff
+ .literal("wkt://LINESTRING(0.0 0.25, 0.25 0.25, 0.5 0.75, 0.75 0.25, 1.00 0.25)");
+ smf.getShape(null, this.exp, this.feature);
+ } catch (Exception e) {
+ assertTrue(false);
+ return;
+ }
+
+ assertTrue(true);
+ }
+
+ public void testWellKnownTextMultiLineString() {
+ ShapeMarkFactory smf = new ShapeMarkFactory();
+ try {
+ this.exp = ff
+ .literal("wkt://MULTILINESTRING((0.25 0.25, 0.5 0.75, 0.75 0.25, 0.25 0.25), (0.25 0.75, 0.5 0.25, 0.75 0.75, 0.25 0.75))");
+ smf.getShape(null, this.exp, this.feature);
+ } catch (Exception e) {
+ assertTrue(false);
+ return;
+ }
+
+ assertTrue(true);
+ }
+
+ public void testWellKnownTextPolygon() {
+ ShapeMarkFactory smf = new ShapeMarkFactory();
+ try {
+ this.exp = ff
+ .literal("wkt://POLYGON((0.25 0.25, 0.5 0.75, 0.75 0.25, 0.25 0.25))");
+ smf.getShape(null, this.exp, this.feature);
+ } catch (Exception e) {
+ assertTrue(false);
+ return;
+ }
+
+ assertTrue(true);
+ }
+
+ public void testWellKnownTextPolygonError() {
+ ShapeMarkFactory smf = new ShapeMarkFactory();
+ try {
+ this.exp = ff
+ .literal("wkt://POLYGON((0.25 0.25, 0.5 0.75, 0.75 0.25, ))");
+ smf.getShape(null, this.exp, this.feature);
+ } catch (Exception e) {
+ assertTrue(true);
+ return;
+ }
+
+ assertTrue(false);
+ }
+
+ public void testUnknownProtocol() {
+ ShapeMarkFactory smf = new ShapeMarkFactory();
+ try {
+ this.exp = ff
+ .literal("xxx://POLYGON((0.25 0.25, 0.5 0.75, 0.75 0.25,))");
+ if (smf.getShape(null, this.exp, this.feature) == null) {
+ assertTrue(true);
+ return;
+ }
+ } catch (Exception e) {
+ assertTrue(false);
+ return;
+ }
+
+ assertTrue(false);
+ }
+}
Property changes on: modules/library/render/src/test/java/org/geotools/renderer/style/ShapeMarkFactoryTest.java
___________________________________________________________________
Added: svn:keywords
+ Id