/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2010, Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotoolkit.display2d.service; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.LinearRing; import com.vividsolutions.jts.geom.Polygon; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Shape; import java.awt.geom.AffineTransform; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.sis.feature.builder.AttributeRole; import org.apache.sis.feature.builder.FeatureTypeBuilder; import org.geotoolkit.data.FeatureStoreUtilities; import org.geotoolkit.data.FeatureCollection; import org.geotoolkit.display2d.canvas.AbstractGraphicVisitor; import org.geotoolkit.display2d.canvas.RenderingContext2D; import org.geotoolkit.display2d.primitive.ProjectedCoverage; import org.geotoolkit.display2d.primitive.ProjectedFeature; import org.geotoolkit.display2d.primitive.SearchAreaJ2D; import org.apache.sis.geometry.GeneralEnvelope; import org.geotoolkit.coverage.grid.GridCoverageBuilder; import org.geotoolkit.map.CoverageMapLayer; import org.geotoolkit.map.MapBuilder; import org.geotoolkit.map.MapContext; import org.geotoolkit.map.MapLayer; import org.apache.sis.referencing.CommonCRS; import org.geotoolkit.style.DefaultStyleFactory; import org.geotoolkit.style.MutableStyleFactory; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.opengis.filter.identity.FeatureId; import static org.junit.Assert.*; import org.opengis.feature.Feature; import org.opengis.feature.FeatureType; /** * * @author Johann Sorel (Geomatys) * @module */ public class VisitorTest extends org.geotoolkit.test.TestBase { public VisitorTest() { } @BeforeClass public static void setUpClass() throws Exception { } @AfterClass public static void tearDownClass() throws Exception { } /** * Feature visitor test. * * @throws Exception */ @Test public void intersectionFeatureTest() throws Exception { final MutableStyleFactory sf = new DefaultStyleFactory(); final FeatureTypeBuilder sftb = new FeatureTypeBuilder(); sftb.setName("testingIntersect"); sftb.addAttribute(String.class).setName("id").addRole(AttributeRole.IDENTIFIER_COMPONENT); sftb.addAttribute(Polygon.class).setName("geom").setCRS(CommonCRS.WGS84.normalizedGeographic()).addRole(AttributeRole.DEFAULT_GEOMETRY); final FeatureType sft = sftb.build(); final FeatureCollection collection = FeatureStoreUtilities.collection("id", sft); final Feature f = sft.newInstance(); final GeometryFactory gf = new GeometryFactory(); LinearRing ring = gf.createLinearRing(new Coordinate[]{ new Coordinate(10, 10), new Coordinate(20, 10), new Coordinate(20, 20), new Coordinate(10, 20), new Coordinate(10, 10),}); Polygon pol = gf.createPolygon(ring, new LinearRing[0]); f.setPropertyValue("id", "id-0"); f.setPropertyValue("geom", pol); collection.add(f); assertTrue(collection.size() == 1); MapLayer layer = MapBuilder.createFeatureLayer(collection, sf.style(sf.polygonSymbolizer())); layer.setSelectable(true); layer.setVisible(true); MapContext context = MapBuilder.createContext(CommonCRS.WGS84.normalizedGeographic()); context.layers().add(layer); final GeneralEnvelope env = new GeneralEnvelope(CommonCRS.WGS84.normalizedGeographic()); env.setRange(0, -180, 180); env.setRange(1, -90, 90); final Dimension dim = new Dimension(360, 180); Shape shparea = new Rectangle(195, 75, 2, 2); //starting at top left corner ListVisitor visitor = new ListVisitor(); //ensure we can paint image DefaultPortrayalService.portray(context, env, dim, true); DefaultPortrayalService.visit(context, env, dim, true, null, shparea, visitor); assertEquals(1, visitor.features.size()); assertEquals("id-0", visitor.features.get(0).getID()); shparea = new Rectangle(30, 12, 2, 2); //starting at top left corner visitor = new ListVisitor(); //ensure we can paint image DefaultPortrayalService.portray(context, env, dim, true); DefaultPortrayalService.visit(context, env, dim, true, null, shparea, visitor); assertTrue(visitor.features.size() == 0); } /** * Coverage visitor test */ @Test public void intersectionCoverageTest() throws Exception { final float[][] data = new float[180][360]; for(int i=0;i<180;i++)Arrays.fill(data[i], 15f); final GridCoverageBuilder gcb = new GridCoverageBuilder(); gcb.setName("coverage"); gcb.setRenderedImage(data); gcb.setCoordinateReferenceSystem(CommonCRS.WGS84.normalizedGeographic()); final AffineTransform trs = new AffineTransform(1,0,0,-1,-180,90); gcb.setGridToCRS(trs); final CoverageMapLayer cml = MapBuilder.createCoverageLayer(gcb.build()); cml.setSelectable(true); MapContext context = MapBuilder.createContext(CommonCRS.WGS84.normalizedGeographic()); context.layers().add(cml); final GeneralEnvelope env = new GeneralEnvelope(CommonCRS.WGS84.normalizedGeographic()); env.setRange(0, -180, 180); env.setRange(1, -90, 90); final Dimension dim = new Dimension(360, 180); final Shape shparea = new Rectangle(195, 75, 2, 2); //starting at top left corner final ListVisitor visitor = new ListVisitor(); DefaultPortrayalService.visit(context, env, dim, true, null, shparea, visitor); assertTrue(visitor.coverages.size() != 0); } private static class ListVisitor extends AbstractGraphicVisitor { public List<FeatureId> features = new ArrayList<>(); public List<ProjectedCoverage> coverages = new ArrayList<>(); @Override public void visit(final ProjectedFeature feature, final RenderingContext2D context, final SearchAreaJ2D queryArea) { features.add(feature.getFeatureId()); } @Override public void visit(final ProjectedCoverage coverage, final RenderingContext2D context, final SearchAreaJ2D queryArea) { coverages.add(coverage); } } }