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
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-devel