use of org.opengis.feature.FeatureType in project geotoolkit by Geomatys.
the class MeridianTest method createFeatureLayer.
private static <T extends Geometry> MapLayers createFeatureLayer(T geometry, Class<T> geomClass) {
final FeatureTypeBuilder ftb = new FeatureTypeBuilder();
ftb.setName("test");
ftb.addAttribute(geomClass).setName("geom").setCRS(CommonCRS.WGS84.normalizedGeographic()).addRole(AttributeRole.DEFAULT_GEOMETRY);
final FeatureType type = ftb.build();
final Feature feature = type.newInstance();
JTS.setCRS(geometry, CommonCRS.WGS84.normalizedGeographic());
feature.setPropertyValue("geom", geometry);
final FeatureSet col = new InMemoryFeatureSet(type, Arrays.asList(feature));
final PolygonSymbolizer symbol = SF.polygonSymbolizer(SF.stroke(Color.BLACK, 0), SF.fill(Color.RED), null);
final MutableStyle style = SF.style(symbol);
final MapLayer layer = MapBuilder.createLayer(col);
layer.setStyle(style);
final MapLayers context = MapBuilder.createContext();
context.getComponents().add(layer);
return context;
}
use of org.opengis.feature.FeatureType in project geotoolkit by Geomatys.
the class PortrayalServiceTest method testPropertyPreservation.
@Test
public void testPropertyPreservation() throws Exception {
final Point location = GO2Utilities.JTS_FACTORY.createPoint(new Coordinate(2, 3));
final FeatureTypeBuilder builder = new FeatureTypeBuilder().setName("Donaldville");
builder.addAttribute(Point.class).setName("geometry");
builder.addAttribute(String.class).setName("firstName");
builder.addAttribute(String.class).setName("lastName");
final FeatureType duckType = builder.build();
final Feature duck = duckType.newInstance();
duck.setPropertyValue("firstName", "Donald");
duck.setPropertyValue("lastName", "Duck");
duck.setPropertyValue("geometry", location);
final MapLayer layer = MapBuilder.createLayer(new InMemoryFeatureSet(duckType, Collections.singleton(duck)));
final CanvasDef canvas = new CanvasDef(new Dimension(16, 16), new Envelope2D(CommonCRS.defaultGeographic(), 0, 0, 16, 16));
final MapLayers ctx = MapBuilder.createContext();
ctx.getComponents().add(layer);
final SceneDef scene = new SceneDef(ctx);
scene.getHints().put(GO2Hints.KEY_PRESERVE_PROPERTIES, true);
final List<Presentation> result = DefaultPortrayalService.present(canvas, scene).collect(Collectors.toList());
assertEquals(1, result.size());
final Presentation presentation = result.get(0);
final Feature picked = (Feature) presentation.getCandidate();
assertNotNull(picked);
Map<String, Object> expectedProperties = new HashMap<>();
expectedProperties.put("firstName", "Donald");
expectedProperties.put("lastName", "Duck");
expectedProperties.put("geometry", location);
final Map<String, Object> properties = picked.getType().getProperties(true).stream().filter(p -> p instanceof AttributeType).map(attr -> attr.getName().tip().toString()).collect(Collectors.toMap(Function.identity(), name -> picked.getPropertyValue(name)));
assertEquals(String.format("Returned values do not match.%nExpected: %s%nActual: %s%n", expectedProperties.entrySet().stream().map(entry -> String.format("%s -> %s", entry.getKey(), entry.getValue())).collect(Collectors.joining(", ")), properties.entrySet().stream().map(entry -> String.format("%s -> %s", entry.getKey(), entry.getValue())).collect(Collectors.joining(", "))), expectedProperties, properties);
// By default, don't load un-necessary properties
scene.getHints().remove(GO2Hints.KEY_PRESERVE_PROPERTIES);
final List<Object> geometries = DefaultPortrayalService.present(canvas, scene).map(p -> (Feature) p.getCandidate()).peek(Assert::assertNotNull).peek(f -> assertEquals(1, f.getType().getProperties(true).stream().filter(p -> p instanceof AttributeType).count())).map(f -> f.getPropertyValue("geometry")).collect(Collectors.toList());
assertEquals(1, geometries.size());
assertEquals(geometries.get(0), location);
}
use of org.opengis.feature.FeatureType in project geotoolkit by Geomatys.
the class PortrayalServiceTest method testCoveragePropertyRendering.
/**
* Test rendering of a coverage inside a feature property.
*/
@Test
public void testCoveragePropertyRendering() throws Exception {
final FeatureTypeBuilder ftb = new FeatureTypeBuilder();
ftb.setName("test");
ftb.addAttribute(GridCoverage.class).setName("coverage");
final FeatureType ft = ftb.build();
final BufferedImage img = new BufferedImage(90, 90, BufferedImage.TYPE_INT_ARGB);
final Graphics2D g = img.createGraphics();
g.setColor(Color.GREEN);
g.fillRect(0, 0, 90, 90);
g.dispose();
final GridCoverageBuilder gcb = new GridCoverageBuilder();
gcb.setDomain(new GridGeometry(null, PixelInCell.CELL_CENTER, new AffineTransform2D(1, 0, 0, 1, 0.5, 0.5), CommonCRS.WGS84.normalizedGeographic()));
gcb.setValues(img);
final Feature f = ft.newInstance();
f.setPropertyValue("coverage", gcb.build());
final FeatureSet collection = new InMemoryFeatureSet(ft, Arrays.asList(f));
final String name = "mySymbol";
final Description desc = DEFAULT_DESCRIPTION;
final String geometry = "coverage";
final Unit unit = Units.POINT;
final Expression opacity = LITERAL_ONE_FLOAT;
final ChannelSelection channels = null;
final OverlapBehavior overlap = null;
final ColorMap colormap = null;
final ContrastEnhancement enhance = null;
final ShadedRelief relief = null;
final Symbolizer outline = null;
final RasterSymbolizer symbol = SF.rasterSymbolizer(name, geometry, desc, unit, opacity, channels, overlap, colormap, enhance, relief, outline);
final MutableStyle style = SF.style(symbol);
final MapLayer layer = MapBuilder.createLayer(collection);
layer.setStyle(style);
final MapLayers context = MapBuilder.createContext();
context.getComponents().add(layer);
final SceneDef sdef = new SceneDef(context);
final GeneralEnvelope env = new GeneralEnvelope(CommonCRS.WGS84.normalizedGeographic());
env.setRange(0, -180, +180);
env.setRange(1, -90, +90);
final CanvasDef cdef = new CanvasDef(new Dimension(360, 180), env);
final BufferedImage result = DefaultPortrayalService.portray(cdef, sdef);
final Raster raster = result.getData();
final int[] pixel = new int[4];
final int[] trans = new int[] { 0, 0, 0, 0 };
final int[] green = new int[] { 0, 255, 0, 255 };
assertNotNull(result);
raster.getPixel(0, 0, pixel);
assertArrayEquals(trans, pixel);
raster.getPixel(179, 45, pixel);
assertArrayEquals(trans, pixel);
raster.getPixel(181, 45, pixel);
assertArrayEquals(green, pixel);
}
use of org.opengis.feature.FeatureType in project geotoolkit by Geomatys.
the class CategoryStyleBuilder method analyze.
public void analyze(final MapLayer layer) {
Resource resource = layer.getData();
if (!(resource instanceof FeatureSet)) {
throw new IllegalArgumentException("Layer resource must be a FeatureSet");
}
this.layer = layer;
fts.rules().clear();
properties.clear();
if (layer != null) {
FeatureType schema;
try {
schema = ((FeatureSet) resource).getType();
} catch (DataStoreException ex) {
throw new FeatureStoreRuntimeException(ex.getMessage(), ex);
}
for (PropertyType desc : schema.getProperties(true)) {
if (desc instanceof AttributeType) {
Class<?> type = ((AttributeType) desc).getValueClass();
if (!Geometry.class.isAssignableFrom(type)) {
properties.add(ff.property(desc.getName().tip().toString()));
}
}
}
// find the geometry class for template
Class<?> geoClass = null;
try {
PropertyType geo = FeatureExt.getDefaultGeometry(schema);
geoClass = Features.toAttribute(geo).map(AttributeType::getValueClass).orElse(null);
} catch (PropertyNotFoundException ex) {
LOGGER.log(Level.FINE, "No sis:geometry property found", ex);
}
if (geoClass == null) {
return;
}
if (Polygon.class.isAssignableFrom(geoClass) || MultiPolygon.class.isAssignableFrom(geoClass)) {
Stroke stroke = sf.stroke(Color.BLACK, 1);
Fill fill = sf.fill(Color.BLUE);
template = sf.polygonSymbolizer(stroke, fill, null);
expectedType = PolygonSymbolizer.class;
} else if (LineString.class.isAssignableFrom(geoClass) || MultiLineString.class.isAssignableFrom(geoClass)) {
Stroke stroke = sf.stroke(Color.BLUE, 2);
template = sf.lineSymbolizer(stroke, null);
expectedType = LineSymbolizer.class;
} else {
Stroke stroke = sf.stroke(Color.BLACK, 1);
Fill fill = sf.fill(Color.BLUE);
List<GraphicalSymbol> symbols = new ArrayList<>();
symbols.add(sf.mark(StyleConstants.MARK_CIRCLE, fill, stroke));
Graphic gra = sf.graphic(symbols, ff.literal(1), ff.literal(12), ff.literal(0), sf.anchorPoint(), sf.displacement());
template = sf.pointSymbolizer(gra, null);
expectedType = PointSymbolizer.class;
}
// try to rebuild the previous analyze if it was one
List<? extends FeatureTypeStyle> ftss = layer.getStyle().featureTypeStyles();
if (ftss.size() == 1) {
FeatureTypeStyle fts = ftss.get(0);
// defensive copy avoid synchronization
List<? extends Rule> candidateRules = new ArrayList<>(fts.rules());
for (Rule r : candidateRules) {
// defensive copy avoid synchronization
List<? extends Symbolizer> candidateSymbols = new ArrayList<>(r.symbolizers());
if (candidateSymbols.size() != 1)
break;
Symbolizer symbol = candidateSymbols.get(0);
if (expectedType.isInstance(symbol)) {
if (r.isElseFilter()) {
// it looks like it's a valid classification "other" rule
this.fts.rules().add((MutableRule) r);
template = symbol;
other = true;
} else {
Filter f = r.getFilter();
if (f != null && f.getOperatorType() == ComparisonOperatorName.PROPERTY_IS_EQUAL_TO) {
BinaryComparisonOperator equal = (BinaryComparisonOperator) f;
Expression exp1 = equal.getOperand1();
Expression exp2 = equal.getOperand2();
if (exp1 instanceof ValueReference && exp2 instanceof Literal) {
if (properties.contains(exp1)) {
// it looks like it's a valid classification property rule
this.fts.rules().add((MutableRule) r);
template = symbol;
currentProperty = (ValueReference) exp1;
} else {
// property is not in the schema
break;
}
} else if (exp2 instanceof ValueReference && exp1 instanceof Literal) {
if (properties.contains(exp2)) {
// it looks like it's a valid classification property rule
this.fts.rules().add((MutableRule) r);
template = symbol;
currentProperty = (ValueReference) exp2;
} else {
// property is not in the schema
break;
}
} else {
// mismatch analyze structure
break;
}
}
}
} else {
break;
}
}
}
}
}
use of org.opengis.feature.FeatureType in project geotoolkit by Geomatys.
the class AbstractSymbolizerRendererService method mimicObject.
protected Object mimicObject(MapLayer layer) {
if (layer == null)
return null;
final Resource resource = layer.getData();
if (resource instanceof FeatureSet) {
try {
FeatureType ft = ((FeatureSet) resource).getType();
if (ft.isAbstract()) {
final FeatureTypeBuilder ftb = new FeatureTypeBuilder();
ftb.setSuperTypes(ft);
ftb.setName(ft.getName());
ft = ftb.build();
}
return ft.newInstance();
} catch (DataStoreException ex) {
return null;
}
} else {
return null;
}
}
Aggregations