A few more notes to the general community (unless I'm the only one running into these problems; please correct me if I'm mistaken on any of this):
- Point feature types are dependent upon a "location" attribute that is an instance of com.vividsolutions.jts.geom.Point - LineString feature types are dependent upon a "route" attribute that is an instance of com.vividsolutions.jts.geom.LineString I was able to get my line features to display by putting them on another layer with a new style (essentially a cut-paste of the Rule/Filter from the primary Point style). I'm starting to wonder if there is some sort of constraint on Rules that they can only be applied to one geometry type. I realize that thought may not make sense, and Michael's previous email states otherwise, but I just haven't found a way to have Rules for features of different geometry types in the same Style on the same MapLayer. I struggled with Michael's suggestion for a short while before taking the "new layer" approach, but I'd still like to do things the "right way," or at least a little bit closer to the "good enough" way. Might get back to that in a bit now that I've got something to show for now. (gotta love software for that, huh?) Ciao for now, Brian On Thu, May 13, 2010 at 10:14 AM, Brian Ghigiarelli <briang...@gmail.com>wrote: > Thanks, Michael!! This provided a great deal of insight into how filters > and rules work with styles. > > I didn't wind up going with the geometry type direction, since I have > multiple types of points that will require different icons (thus, I used a > PropertyIsEqualTo filter on one of the custom featureType properties to > perform the comparison). > > I seem to be in the same situation with the display of the lines, however. > All of the rules appear to be set up and functioning properly; however, > LineString features still do not display on the map. I picked up the > dependency on the "route" attribute that contains the LineString.class > instance, but still to no avail. > > Below is the rule that I'm adding to the Rule[] for the FeatureTypeStyle. > Anything blatantly wrong with this, or should I perhaps be looking > elsewhere for the bug? > > Rule lineRule = sf.createRule(); > PropertyIsEqualTo edgeFilter = ff.equal(ff.property("myCustomType"), > ff.literal(MyCustomTypes.EDGE), false); // MyCustomTypes is an ENUM, set via > the SimpleFeatureBuilder > lineRule.setFilter(edgeFilter); > Stroke stroke = sf.createStroke(ff.literal(Color.BLUE), > ff.literal(1.0f)); > LineSymbolizer lineSym = sf.createLineSymbolizer(stroke, > geomPropertyName); //geomPropertyName is set to null to use the default > geometry > lineRule.symbolizers().add(lineSym); > > I was able to verify that the line features (and all expected attributes) > are being added to the FeatureCollections for the displayed map layers. I > may wind up testing this style concept out on Polygons, in order to see if I > can find some sort of difference in how I'm supposed to deal with points vs. > lines vs. anything else. > > Thanks, > Brian > > On Wed, May 12, 2010 at 10:58 PM, Michael Bedward < > michael.bedw...@gmail.com> wrote: > >> Hello Brian, >> >> I think each of your rules also needs a filter to specify which >> geometry type it is applied to. >> >> The code snippet below is an example of one way in which you might do >> this. >> >> Hope this helps. >> >> Michael >> >> // Danger ! Completely untested code >> >> // this can be null if it is the default feature geometry >> String geomPropertyName = ... >> >> // external graphic URL >> URL url = ... >> >> StyleFactory sf = CommonFactoryFinder.getStyleFactory(null); >> FilterFactory2 ff = CommonFactoryFinder.getFilterFactory2(null); >> >> // create the point rule and give it a filter to identify Point geometry >> type >> Rule pointRule = sf.createRule(); >> Function getGeomFn = ff.function("geometryType", >> ff.property(geomPropertyName)); >> Filter pointFilter = ff.equals(getGeomFn, ff.literal("Point")); >> pointRule.setFilter(pointFilter); >> pointRule.setElseFilter(false); >> >> // symbolizer for the point rule >> Graphic graphic = sf.getDefaultGraphic(); >> graphic.graphicalSymbols().clear(); >> ExternalGraphic eGr = sf.createExternalGraphic(url, "image/png"); >> graphic.graphicalSymbols().add(eGr); >> Symbolizer sym = sf.createPointSymbolizer(graphic, geomPropertyName); >> pointRule.symbolizers().add(sym); >> >> // create the line rule which doesn't need a filter - it just >> // processes anything skipped by the point rule >> Rule lineRule = sf.createRule(); >> lineRule.setIsElseFilter(true); >> Stroke stroke = sf.createStroke(ff.literal(Color.BLUE), ff.literal(1.0f)); >> Symbolizer lineSym = sf.createLineSymbolizer(stroke, geomPropertyName); >> lineRule.symbolizers().add(lineSym); >> >> // wrap the rules into a Style >> FeatureTypeStyle fts = sf.createFeatureTypeStyle(new Rule[]{pointRule, >> lineRule}); >> Style style = sf.createStyle(); >> style.featureTypeStyles().add(fts); >> >> The imports for the above are... >> >> import java.awt.Color; >> import java.net.URL; >> import org.geotools.factory.CommonFactoryFinder; >> import org.geotools.styling.ExternalGraphic; >> import org.geotools.styling.FeatureTypeStyle; >> import org.geotools.styling.Graphic; >> import org.geotools.styling.Rule; >> import org.geotools.styling.Stroke; >> import org.geotools.styling.Style; >> import org.geotools.styling.StyleFactory; >> import org.geotools.styling.Symbolizer; >> import org.opengis.filter.Filter; >> import org.opengis.filter.FilterFactory2; >> import org.opengis.filter.expression.Function; >> > > > > -- > Brian Ghigiarelli > 570-878-9139 > -- Brian Ghigiarelli 570-878-9139
------------------------------------------------------------------------------
_______________________________________________ Geotools-gt2-users mailing list Geotools-gt2-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users