Error when using option "memoryPreloadingEnabled" and use SLD filter --------------------------------------------------------------------
Key: GEOT-1256 URL: http://jira.codehaus.org/browse/GEOT-1256 Project: GeoTools Issue Type: Bug Affects Versions: 2.3.0 Environment: Windows Reporter: Miguel Angel Vega Pabon Priority: Critical Fix For: 2.4.0 Attachments: BUGs.zip I'm developing some libraries, that make easier the handle of geotools, but i've got the next error: java.lang.ClassCastException: org.geotools.filter.Filter$1 cannot be cast to org.geotools.filter.AbstractFilter at org.geotools.filter.SQLEncoder.visit(SQLEncoder.java:376) at org.geotools.filter.FilterVisitorFilterWrapper.visitLogicFilter(FilterVisitorFilterWrapper.java:64) at org.geotools.filter.FilterVisitorFilterWrapper.visit(FilterVisitorFilterWrapper.java:96) at org.geotools.filter.AndImpl.accept(AndImpl.java:49) at org.geotools.filter.AbstractFilter.accept(AbstractFilter.java:200) at org.geotools.filter.SQLEncoder.encode(SQLEncoder.java:213) at org.geotools.filter.SQLEncoder.encode(SQLEncoder.java:237) at org.geotools.data.postgis.PostgisSQLBuilder.sqlWhere(PostgisSQLBuilder.java:155) at org.geotools.data.jdbc.DefaultSQLBuilder.buildSQLQuery(DefaultSQLBuilder.java:223) at org.geotools.data.jdbc.JDBC1DataStore.constructQuery(JDBC1DataStore.java:744) at org.geotools.data.jdbc.JDBC1DataStore.getFeatureReader(JDBC1DataStore.java:664) at org.geotools.data.jdbc.JDBCFeatureCollection.reader(JDBCFeatureCollection.java:78) at org.geotools.renderer.lite.IndexedFeatureResults.<init>(IndexedFeatureResults.java:58) at org.geotools.renderer.lite.StreamingRenderer.queryLayer(StreamingRenderer.java:891) at org.geotools.renderer.lite.StreamingRenderer.processStylers(StreamingRenderer.java:1447) at org.geotools.renderer.lite.StreamingRenderer.paint(StreamingRenderer.java:687) at test.base.MapContextDemo.generateImage(MapContextDemo.java:137) at test.base.MapContextDemo.main(MapContextDemo.java:228) This happens when i'm using Postgis connection and StreamingRenderer with the property "memoryPreloadingEnabled" as true. This bug doesn't seems to occurs when i use shapefiles. The code of the program is the next: /* * MapContextDemo.java * * Created on 28 de marzo de 2007, 10:55 AM * */ package test.base; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.util.HashMap; import java.util.Map; import javax.imageio.ImageIO; import org.dacorp.geobeans.style.LineStyleFeatures; import org.dacorp.geobeans.style.MyStyleBuilder; import org.dacorp.geobeans.style.PolygonStyleFeatures; import org.dacorp.geobeans.style.StyleFeatures; import org.geotools.data.DataStore; import org.geotools.data.DataStoreFinder; import org.geotools.data.FeatureSource; import org.geotools.data.shapefile.ShapefileDataStore; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.map.DefaultMapContext; import org.geotools.map.DefaultMapLayer; import org.geotools.map.MapContext; import org.geotools.map.MapLayer; import org.geotools.referencing.FactoryFinder; import org.geotools.renderer.lite.StreamingRenderer; import org.geotools.styling.Style; import org.opengis.referencing.FactoryException; import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * This class * @author Miguel Angel Vega Pabon * @version 1.0, Developed with netbeans 5.5 */ public class MapContextDemo { private MapContext mapContext; private RenderingHints j2dhints; private BufferedImage bufferedImage; private AffineTransform affineTransform; private CoordinateReferenceSystem crs=null; public static final String EPSG19s="EPSG:32719"; private StreamingRenderer streamingRenderer; private ReferencedEnvelope envelope; private int width=500, height=400; private Color bgColor=new Color(153, 179, 204); /** *This zoomFactor, means the padidng of the image and the features when drawing a map. *Set 1d, if want no padding in the bounds of the image to produce. */ //este valor depende de la relacion entre el ancho y el alto del envelope total public static final double DRAWING_ZOOM_FACTOR=1.0d; /** Creates a new instance of MapContextDemo */ public MapContextDemo() throws FactoryException { this.crs = FactoryFinder.getCRSAuthorityFactory("EPSG",null). createCoordinateReferenceSystem(EPSG19s); mapContext = new DefaultMapContext(crs); // //all layer were added, now instance of the StreamingRenderer streamingRenderer=new StreamingRenderer(); streamingRenderer.setContext(mapContext); // Map rendererParams = new HashMap(); rendererParams.put("optimizedDataLoadingEnabled", true); rendererParams.put("memoryPreloadingEnabled", new Boolean(true)); j2dhints= new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); j2dhints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); streamingRenderer.setJava2DHints(j2dhints); streamingRenderer.setRendererHints(rendererParams); affineTransform = new AffineTransform(); // envelope = new ReferencedEnvelope(crs); } public void addLayer(MapLayer layer) throws IOException{ mapContext.addLayer(layer); getEnvelope().expandToInclude(layer.getFeatureSource().getFeatures().getBounds()); } private AlphaComposite makeComposite(float alpha) { int type = AlphaComposite.SRC_OVER; return(AlphaComposite.getInstance(type, alpha)); } public void generateImage(){ //* BufferedImage curImage = new BufferedImage(width, height,BufferedImage.TYPE_4BYTE_ABGR); final Graphics2D g2d = curImage.createGraphics(); g2d.setRenderingHints(j2dhints); //build a transparent image g2d.setPaint(this.bgColor); g2d.fillRect(0, 0, width, height); g2d.setComposite(makeComposite(1.0f)); g2d.fillRect(0, 0, width, height); Rectangle paintArea = new Rectangle(width, height); //affineTransform = RendererUtilities.worldToScreenTransform(getEnvelope(), paintArea); final double scaleFactor = (Math.min ((getWidth() / envelope.getWidth()), (getHeight() / envelope.getHeight())) * DRAWING_ZOOM_FACTOR); // Translate to the center of the JPanel. //affineTransform.translate((getWidth() / 2), (getHeight() / 2));//this line generates problems affineTransform.setToTranslation((getWidth() / 2), (getHeight() / 2)); // Scale with negative y factor to correct the orientation. affineTransform.scale(scaleFactor, - scaleFactor); // Translate to the center of the feature collection. affineTransform.translate(- envelope.centre().x, - envelope.centre().y); // streamingRenderer.paint(g2d, paintArea, getEnvelope(), affineTransform); this.bufferedImage = curImage; g2d.dispose(); System.out.println("LAYERS=="+mapContext.getLayerCount()); } public void zoomToPoint(double x, double y, int expand){ envelope.init(x, x, y, y); envelope.expandBy(expand); } public void save(String file){ //save to disk try { ImageIO.write(bufferedImage, "png", new File(file)); } catch (final IOException e) { e.printStackTrace(); } } public static void main(String args[]) throws MalformedURLException, FactoryException, IOException{ MapContextDemo mcd=new MapContextDemo(); Map params = new HashMap(); params.put("dbtype", "postgis"); //must be postgis params.put("host", "localhost"); //the name or ip address of the machine running PostGIS params.put("port", new Integer(5432)); //the port that PostGIS is running on (generally 5432) params.put("database", "geobase"); //the name of the database to connect to. params.put("user", "postgres"); //the user to connect with params.put("passwd", "postgres"); //the password of the user. DataStore dataStore = DataStoreFinder.getDataStore(params); //one layer FeatureSource fsC = dataStore.getFeatureSource("calles_lpz"); Style style2=null; StyleFeatures sf2=new LineStyleFeatures(); sf2.setLineColor(new Color(242, 191, 36));sf2.setLineOpacity(1.0f); sf2.setLineWidth(1.0f); style2=MyStyleBuilder.createStyle(new StyleFeatures[]{sf2}); MapLayer l2=new DefaultMapLayer(fsC, style2); /*THE ERROR OCCURS HERE, WHEN TRYING TO LOAD AN EXTERNAL SLD, EVEN WHEN I CREATE AN STYLE WIDTH A *"FILTER" BY USING GEOTOOLS OWN STYLE CLASSES */ style2=MyStyleBuilder.createStyleFromFile("E:/confStyleXml/calles.xml"); l2.setStyle(style2); mcd.addLayer(l2); mcd.zoomToPoint(594819, 8172894, 500); mcd.generateImage(); mcd.save("d:/map2.png"); mcd.zoomToPoint(594819, 8172894, 10000); long ti=System.currentTimeMillis(); mcd.generateImage(); mcd.save("d:/map3.png"); System.out.println("map 1 time = "+(System.currentTimeMillis()-ti)); } public ReferencedEnvelope getEnvelope() { return envelope; } public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } } SLD File used: <!--<sld:StyledLayerDescriptor version="1.0.0" xmlns="http://www.opengis.net/sld" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengeospatial.net/sld/1.0.0/StyledLayerDescriptor.xsd">--> <sld:StyledLayerDescriptor xmlns:sld="http://www.opengis.net/sld" xmlns:java="java" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:wfs="http://www.opengis.net/wfs" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xslutil="de.latlon.deejump.data.util.XSLUtility" xmlns:deegreewfs="http://www.deegree.org/wfs" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:gml="http://www.opengis.net/gml" xmlns:ogc="http://www.opengis.net/ogc" xmlns="http://www.opengis.net/sld" version="1.0.0"> <sld:NamedLayer> <sld:Name>Calles</sld:Name> <sld:UserStyle> <sld:FeatureTypeStyle> <!-- Rule 1 --> <Rule> <MaxScaleDenominator>10000</MaxScaleDenominator> <Name>Calles</Name> <Title>Calles</Title> <Abstract>A green line with a 2 pixel width</Abstract> <ogc:Filter> <ogc:PropertyIsEqualTo> <ogc:PropertyName>TYPE</ogc:PropertyName> <ogc:Literal>CALLE</ogc:Literal> </ogc:PropertyIsEqualTo> </ogc:Filter> <!-- <LineSymbolizer> <Stroke> <CssParameter name="stroke">#FFFFFF</CssParameter> <CssParameter name="stroke-width">2</CssParameter> </Stroke> <Stroke> <CssParameter name="stroke">#FFFFFF</CssParameter> <CssParameter name="stroke-width">4</CssParameter> <CssParameter name="stroke-end-arrow-style">solid_arrow</CssParameter> </Stroke> </LineSymbolizer> --> <TextSymbolizer> <Label> <ogc:PropertyName>NAME</ogc:PropertyName> </Label> <Font> <CssParameter name="font-family">SansSerif</CssParameter> <CssParameter name="font-style">Normal</CssParameter> <CssParameter name="font-size">9</CssParameter> <CssParameter name="font-weight">bold</CssParameter> </Font> <LabelPlacement> <LinePlacement> <PerpendicularOffset> 1 </PerpendicularOffset> </LinePlacement> </LabelPlacement> <Fill> <CssParameter name="fill">#005A9C</CssParameter> </Fill> <!--When YES means that label repeat is not allowed--> <VendorOption name="group">yes</VendorOption> <!-- add a little extra space around the labels so the map isnt cluttered --> <VendorOption name="spaceAround">5</VendorOption> </TextSymbolizer> </Rule> <Rule> <MaxScaleDenominator>20000</MaxScaleDenominator> <Name>Avenidas</Name> <Title>Avenidas</Title> <Abstract>A gray outline and white fill, with a 8 pixel width</Abstract> <ogc:Filter> <ogc:PropertyIsEqualTo> <ogc:PropertyName>TYPE</ogc:PropertyName> <ogc:Literal>AVENIDA</ogc:Literal> </ogc:PropertyIsEqualTo> </ogc:Filter> <!-- <LineSymbolizer> <Stroke> <CssParameter name="stroke">#FFFFFF</CssParameter> <CssParameter name="stroke-width">2</CssParameter> </Stroke> </LineSymbolizer> <LineSymbolizer> <Stroke> <CssParameter name="stroke">#AAAA77</CssParameter> <CssParameter name="stroke-width">8</CssParameter> </Stroke> </LineSymbolizer> --> <TextSymbolizer> <Label> <ogc:PropertyName>NAME</ogc:PropertyName> </Label> <Font> <CssParameter name="font-family">SansSerif</CssParameter> <CssParameter name="font-style">Normal</CssParameter> <CssParameter name="font-size">10</CssParameter> <CssParameter name="font-weight">bold</CssParameter> </Font> <LabelPlacement> <LinePlacement> <PerpendicularOffset> 1 </PerpendicularOffset> </LinePlacement> </LabelPlacement> <Halo> <Radius> <ogc:Literal>2</ogc:Literal> </Radius> <Fill> <CssParameter name="fill">#FFFFFF</CssParameter> <CssParameter name="fill-opacity">0.85</CssParameter> </Fill> </Halo> <Fill> <CssParameter name="fill">#990000</CssParameter> </Fill> <VendorOption name="group">yes</VendorOption> <VendorOption name="spaceAround">5</VendorOption> </TextSymbolizer> </Rule> <Rule> <MaxScaleDenominator>1000000</MaxScaleDenominator> <Name>Carretera</Name> <Title>Carretera</Title> <Abstract>A gray line with a 8 pixel width</Abstract> <ogc:Filter> <ogc:PropertyIsEqualTo> <ogc:PropertyName>TYPE</ogc:PropertyName> <ogc:Literal>CARRETERA</ogc:Literal> </ogc:PropertyIsEqualTo> </ogc:Filter> <LineSymbolizer> <Stroke> <CssParameter name="stroke">#999999</CssParameter> <CssParameter name="stroke-width">8</CssParameter> </Stroke> </LineSymbolizer> <LineSymbolizer> <Stroke> <CssParameter name="stroke">#D9E0E8</CssParameter> <CssParameter name="stroke-width">6</CssParameter> </Stroke> </LineSymbolizer> <TextSymbolizer> <Label> <ogc:PropertyName>NAME</ogc:PropertyName> </Label> <Font> <CssParameter name="font-family">SansSerif</CssParameter> <CssParameter name="font-style">Normal</CssParameter> <CssParameter name="font-size">11</CssParameter> <CssParameter name="font-weight">bold</CssParameter> </Font> <LabelPlacement> <LinePlacement> <PerpendicularOffset> 1 </PerpendicularOffset> </LinePlacement> </LabelPlacement> <Fill> <CssParameter name="fill">#0000ff</CssParameter> </Fill> <VendorOption name="group">no</VendorOption> <VendorOption name="spaceAround">2</VendorOption> <Halo> <Radius> <ogc:Literal>2</ogc:Literal> </Radius> <Fill> <CssParameter name="fill">#FFF88B</CssParameter> <CssParameter name="fill-opacity">0.85</CssParameter> </Fill> </Halo> </TextSymbolizer> </Rule> </sld:FeatureTypeStyle> </sld:UserStyle> </sld:NamedLayer> </sld:StyledLayerDescriptor> -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://jira.codehaus.org/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ Geotools-devel mailing list Geotools-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/geotools-devel