From: Andrea A. <and...@ge...> - 2011-09-19 14:05:19
|
2011/9/19 Håvard Nesse <hav...@ge...>: > Hi! > > I'm having a hard time using the StreamingRenderer (GeoTools 2.7.2). It > throws an exception: > > SEVERE: Could not find 'rotation' in the FeatureType > (http://www.opengis.net/gml:Flag) > org.geotools.filter.IllegalFilterException: Could not find 'rotation' in the > FeatureType (http://www.opengis.net/gml:Flag) > at > org.geotools.renderer.lite.StreamingRenderer.createBBoxFilters(StreamingRenderer.java:1508) > at > org.geotools.renderer.lite.StreamingRenderer.queryLayer(StreamingRenderer.java:1005) > at > org.geotools.renderer.lite.StreamingRenderer.processStylers(StreamingRenderer.java:1919) > at > org.geotools.renderer.lite.StreamingRenderer.paint(StreamingRenderer.java:773) > at > org.geotools.renderer.lite.StreamingRenderer.paint(StreamingRenderer.java:581) > > To explain what I've done. > > I parse a GeoJSON string and creates a FeatureCollection from it. The > collection is created using the SimpleFeatureBuilder (creating > SimpleFeatures with a SimpleFeatureType). The type is also created by > looking at the properties in my GeoJSON. The style used for rendering is > read from an SLD file. > > The problem seems to be that StreamingRenderer throws this Exception if the > GeoJSON (or in this case the Feature I want to render) is missing any > attributes defined in the SLD. > > The part of the SLD which makes this crash and burn is: > > <Rule> > <ogc:Filter> > <ogc:PropertyIsEqualTo> > <ogc:PropertyName>type</ogc:PropertyName> > <ogc:Literal>arrow_end</ogc:Literal> > </ogc:PropertyIsEqualTo> > </ogc:Filter> > <PointSymbolizer> > <Graphic> > <ExternalGraphic> > <OnlineResource xlink:type="simple" > xlink:href="images/arrow_end.png"/> > <Format>image/png</Format> > </ExternalGraphic> > > <Rotation><ogc:PropertyName>rotation</ogc:PropertyName></Rotation> > </Graphic> > </PointSymbolizer> > </Rule> > > I parse and try to render the following feature: > > {"type":"FeatureCollection","features":[{"type":"Feature","id":"OpenLayers.Feature.Vector_207", > "properties":{"type":"pnt_pumpe"},"geometry":{"type":"Point","coordinates":[486483.61761134,6479993.5908865]}}]} > > This makes the StreamingRenderer throw this Exception and exit. Adding > 'rotation' to the JSON above sort of solves the problem, but the main > question remains: > > Why do the features sent to the StreamingRenderer have to contain every > property defined in the SLD (or so it seems)? The rule above doesn't even > apply to the feature I'm trying to render. The requirement that a property used in the SLD has to be there seems obvious to me, it's like asking why a column has to be there if it's used in a sql query. The GeoTools code is written so that it should work if the attribute is known, but its value is null, but does not work if you don't follow the expected structure. This is done primarily to inform people about typos in their SLD (a very common error, people flooded us with complaints that GeoTools/GeoServer were not working just because they mistyped or used the wrong case in attribute names). We don't have a way to deal with data whose structure varies between one feature and the next at the moment. I guess we could add a flag to avoid those basic validity checks that are making it throw an exception. I don't have unstructured data handy though, patches welcomed :-) Cheers Andrea -- ------------------------------------------------------- Ing. Andrea Aime GeoSolutions S.A.S. Tech lead Via Poggio alle Viti 1187 55054 Massarosa (LU) Italy phone: +39 0584 962313 fax: +39 0584 962313 http://www.geo-solutions.it http://geo-solutions.blogspot.com/ http://www.youtube.com/user/GeoSolutionsIT http://www.linkedin.com/in/andreaaime http://twitter.com/geowolf ------------------------------------------------------- |