Hello all!
I'm pretty unsure which kind of information is required to really understand my
problem and to answer my question but maybe this one is so general that the
following suffices:
Currently I'm working on a proof-of-concept application based on geotools 14
which displays
1. some static shape file based vector (line or point) layers constituting a
cadastral map as well as
2. a dynamic layer that shows the user's location (plus course, trace, and so
on) which is derived from the output of a GNSS receiver.
So far I've got the map layers and the dynamic position display working.
To display e.g. the "location trace" and other information in that dynamic
layer I thought I would just implement the MarkFactory interface.
However the Feature argument of MarkFactory.getShape() gives me a feature that
only contains the feature location but none of the other attributes I've added
when I created that Feature before.
So it seems the Feature object received is just a copy of the original one
where all attributes (except for location) seems to be considered irrelevant.
Where does the copying take place and how can I influence it in a way that my
custom attributes are copied as well?
Thanks in advance!
Thomas
Here's where the feature (plus the layer) is created and my MarkFactory
implementation:
public class CurrentPositionFeatureLayer extends FeatureLayer{
private Coordinate coord = null;
private SimpleFeature feat_loc = null;
private int history_size = 15;
private LinkedList<Coordinate> coord_history = new
LinkedList<Coordinate>();
private Double azimuth = new Double( Math.PI ); //just to be able to
distinguish it from target_heading at first,...
private Double target_direction = new Double( 0 );
private CurrentPositionFeatureLayer( ListFeatureCollection collection,
Style style) {
super( collection, style );
coord = new Coordinate( 4439138.7714, 5522681.2760 );
GeometryFactory geometryFactory =
JTSFactoryFinder.getGeometryFactory();
SimpleFeatureBuilder fb_point = new SimpleFeatureBuilder(
(SimpleFeatureType) collection.getSchema() );
com.vividsolutions.jts.geom.Point my_loc = geometryFactory.createPoint(
coord );
fb_point.add( my_loc );
fb_point.add( coord_history );
fb_point.add( azimuth );
fb_point.add( target_direction );
feat_loc = fb_point.buildFeature( null );
feat_loc.setAttribute( "location_history", coord_history );
feat_loc.setAttribute( "azimuth", azimuth );
feat_loc.setAttribute( "target_direction", target_direction );
collection.add( feat_loc );
System.out.println( "feature.toString()=" + feat_loc ); //displays
four attributes:
//feature.toString()=SimpleFeatureImpl:Location=[SimpleFeatureImpl.Attribute:
location<location id=fid-5363c5b7_1528d3b0c7e_-8000>=POINT
// (4439138.7714 5522681.276), SimpleFeatureImpl.Attribute:
location_history<location_history id=fid-5363c5b7_1528d3b0c7e_-8000>=[],
// SimpleFeatureImpl.Attribute: azimuth<azimuth
id=fid-5363c5b7_1528d3b0c7e_-8000>=3.141592653589793,
SimpleFeatureImpl.Attribute: target_heading<target_heading
id=fid-5363c5b7_1528d3b0c7e_-8000>=0.0]
List<Object> attrs = feat_loc.getAttributes();
System.out.println( "attrlistsize=" + attrs.size() ); // attrlistsize=4
fireMapLayerListenerLayerChanged( 0 );
setTitle( "CurrentPositionFeatureLayer" );
}
public static CurrentPositionFeatureLayer create() throws
SchemaException{
SimpleFeatureTypeBuilder sft_builder = new
SimpleFeatureTypeBuilder();
sft_builder.setName( "Location" );
sft_builder.add( "location", Point.class );
sft_builder.add( "location_history", List.class );
sft_builder.add( "azimuth", Double.class );
sft_builder.add( "target_direction", Double.class );
SimpleFeatureType ft_location = sft_builder.buildFeatureType();
ListFeatureCollection collection = new ListFeatureCollection(
ft_location );
StyleFactory sf = CommonFactoryFinder.getStyleFactory();
FilterFactory ff = CommonFactoryFinder.getFilterFactory();
StyleBuilder builder = new StyleBuilder();
Graphic gr = builder.createGraphic(null,
builder.createMark("gpsrcv"), null);
PointSymbolizer ps = builder.createPointSymbolizer( gr );
Rule point_rule = sf.createRule();
point_rule.symbolizers().add( ps );
FeatureTypeStyle fts_point = sf.createFeatureTypeStyle( new
Rule[] { point_rule } );
Style style = sf.createStyle();
style.featureTypeStyles().add( fts_point );
return(new CurrentPositionFeatureLayer( collection, style ) );
}
// public double getOrdinate( int index ){
// return( coord.getOrdinate( index ) );
// }
public void updateCoordinate( double x, double y ){
Coordinate new_coord = new Coordinate( x, y );
enqueueToHistory( new_coord );
coord.setCoordinate( new_coord );
feat_loc.setAttribute( "azimuth", azimuth );
this.fireMapLayerListenerLayerChanged(
MapLayerEvent.DATA_CHANGED );
}
private void enqueueToHistory( Coordinate coord ){
coord_history.add( coord );
while( coord_history.size() > history_size ){
coord_history.removeFirst();
}
}
private ReferencedEnvelope envelope = null;
@Override
public ReferencedEnvelope getBounds(){
try{
if( envelope == null ){
envelope = new ReferencedEnvelope( 4437422,
4441958, 5522097, 5523412, CRS.decode( "EPSG:5678" ) );
}
return( envelope );
}catch( MismatchedDimensionException e ){
e.printStackTrace();
}catch( NoSuchAuthorityCodeException e ){
e.printStackTrace();
}catch( FactoryException e ){
e.printStackTrace();
}
return( null );
}
}
public class PositionMarkFactory implements MarkFactory{
public Shape getShape(Graphics2D graphics, Expression symbolUrl,
Feature feature) throws Exception {
if (symbolUrl == null) {
return null;
}
String wellKnownName = symbolUrl.evaluate(feature, String.class);
if (wellKnownName != null &&
wellKnownName.equalsIgnoreCase("gpsrcv")) {
System.out.println( "feature.toString()=" + feature ); //here
I get
//
feature.toString()=SimpleFeatureImpl:Location=[SimpleFeatureImpl.Attribute:
location<location id=fid-5363c5b7_1528d3b0c7e_-8000>=POINT (4439138.7714
5522681.276)]
SimpleFeature feat = (SimpleFeature)feature;
@SuppressWarnings("unchecked")
List<Coordinate> location_history = (List<Coordinate>)
feat.getAttribute( "location_history" );
List attrs = feat.getAttributes();
System.out.println( "attrlistsize=" + attrs.size() ); //
attrlistsize=4
System.out.println( attrs.get( 0 ).getClass().getName() ); //
com.vividsolutions.jts.geom.Point
GeneralPath shape = new GeneralPath();
shape.moveTo( -1, 0 );
shape.lineTo( 1, 0.33f );
shape.lineTo( 1, -0.33f );
shape.closePath();
//shape.closePath();
//AffineTransform trans = new AffineTransform();
//trans.rotate( -Math.PI/3.0f );
//shape.transform( trans );
return( shape );
}
return null; // we do not know this one
}
}
------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140
_______________________________________________
GeoTools-GT2-Users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users