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

Reply via email to