Package org.locationtech.udig.render.wms.basic.test

Source Code of org.locationtech.udig.render.wms.basic.test.BasicWMSRenderer2Test

/*
*    uDig - User Friendly Desktop Internet GIS client
*    http://udig.refractions.net
*    (C) 2012, Refractions Research Inc.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* (http://www.eclipse.org/legal/epl-v10.html), and the Refractions BSD
* License v1.0 (http://udig.refractions.net/files/bsd3-v10.html).
*/
package org.locationtech.udig.render.wms.basic.test;

import static org.junit.Assert.assertEquals;

import java.awt.Dimension;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.locationtech.udig.AbstractProjectUITestCase;
import org.locationtech.udig.catalog.IGeoResource;
import org.locationtech.udig.catalog.IService;
import org.locationtech.udig.project.internal.Map;
import org.locationtech.udig.project.tests.support.MapTests;
import org.locationtech.udig.render.internal.wms.basic.BasicWMSRenderer2;

import org.eclipse.core.runtime.NullProgressMonitor;
import org.geotools.data.ows.Layer;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.referencing.CRS;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.junit.Before;
import org.junit.Test;
import org.opengis.referencing.crs.CoordinateReferenceSystem;

import com.vividsolutions.jts.geom.Envelope;

public class BasicWMSRenderer2Test extends AbstractProjectUITestCase {

    private static final double ACCURACY = 0.0000001;
    private List< ? extends IGeoResource> members;
    private List<Layer> wmsLayers;
    private CoordinateReferenceSystem viewportCRS;
    private Envelope viewportBBox;
    private ReferencedEnvelope viewport;
    private Map map;

    @Before
    public void setUp() throws Exception {
        IService service = WMSRenderMetricsTest.createService(new URL(
                "http://BasicWMSRenderer2Test"), false); //$NON-NLS-1$
        members = service.resources(new NullProgressMonitor());
        map = MapTests.createNonDynamicMapAndRenderer(members.get(0), new Dimension(1024, 1024));
        viewportBBox = new Envelope(-180, 180, -90, 90);
        viewportCRS = DefaultGeographicCRS.WGS84;
        viewport = new ReferencedEnvelope(viewportBBox, viewportCRS);
        wmsLayers = Arrays.asList(members.get(0).resolve(Layer.class, new NullProgressMonitor()));
    }

    @Test
    public void testGetLayersBoundingBox() {
        // TODO
    }

    @Test
    public void testFindRequestCRS() {
        // TODO
    }

    @Test
    public void testCalculateRequestBBox_reprojecting() throws Exception {
        Layer world = new Layer("world"); //$NON-NLS-1$
        world.setBoundingBoxes(WMSRenderMetricsTest.BBOXES3);
        world.setSrs(WMSRenderMetricsTest.BBOXES3.keySet());
        List<Layer> wmsLayers = new ArrayList<Layer>();
        wmsLayers.add(world);

        viewportCRS = CRS.decode("EPSG:3005");
        // arbitrary viewport with bc in top left corner, US in center, s. america on bottom right
        viewportBBox = new Envelope(-737102.342, 7752070.309, -2520851.926, 1758412.392);
        // the request originates in 4326, so a good chunk of the world is requested and reprojected
        viewport = new ReferencedEnvelope(viewportBBox, viewportCRS);
        CoordinateReferenceSystem requestCRS = DefaultGeographicCRS.WGS84;

        // request the bc albers viewport in wgs 84
        ReferencedEnvelope result = BasicWMSRenderer2.calculateRequestBBox(wmsLayers, viewport,
                requestCRS);
        assertEquals("Reprojected MinX wrong", -155.8, result.getMinX(), 0.1);
        assertEquals("Reprojected MaxX wrong", -51.6, result.getMaxX(), 0.1);
        assertEquals("Reprojected MinY wrong", -5.4, result.getMinY(), 0.1);
        assertEquals("Reprojected MaxY wrong", 60.6, result.getMaxY(), 0.1);
    }

    @Test
    public void testCalculateRequestBBox_LayerContained() throws Exception {
        // Test viewport is larger than layer
        ReferencedEnvelope bbox = BasicWMSRenderer2.calculateRequestBBox(wmsLayers, viewport,
                viewportCRS);
        assertEquals(DefaultGeographicCRS.WGS84, bbox.getCoordinateReferenceSystem());
       
        assertEquals(0.0, bbox.getMinX(), ACCURACY);
        assertEquals(0.0, bbox.getMinY(), ACCURACY);
        assertEquals(100.0, bbox.getMaxX(), ACCURACY);
        assertEquals(20.0, bbox.getMaxY(), ACCURACY);
    }

    @Test
    public void testCalculateRequestBBox_ViewportContained() throws Exception {
        Envelope bboxInEnv = new Envelope(10, 40, 5, 15);
        ReferencedEnvelope bboxIn = new ReferencedEnvelope(bboxInEnv, viewportCRS);
        ReferencedEnvelope bbox = BasicWMSRenderer2.calculateRequestBBox(wmsLayers, bboxIn,
                viewportCRS);
        assertEquals(DefaultGeographicCRS.WGS84, bbox.getCoordinateReferenceSystem());
        assertEquals(10.0, bbox.getMinX(), ACCURACY);
        assertEquals(5.0, bbox.getMinY(), ACCURACY);
        assertEquals(40.0, bbox.getMaxX(), ACCURACY);
        assertEquals(15.0, bbox.getMaxY(), ACCURACY);
    }

    @Test
    public void testCalculateImageDimensions() throws Exception {
        // everything in WGS84
        Dimension displaySize = new Dimension(400, 300);
        Dimension maxDimensions = new Dimension(0, 0); // usually not specified
        viewport = new ReferencedEnvelope(viewportBBox, viewportCRS);

        // viewport = world, request = middle 50% W, 50% H
        Envelope request = new Envelope(-90, 90, -45, 45);
        Dimension result = BasicWMSRenderer2.calculateImageDimensions(displaySize, maxDimensions,
                viewport, request);
        // width and height of request is 50% each, so we expect half the pixels in each direction
        // to be requested
        assertEquals("request width is different", 200, result.getWidth(), ACCURACY);
        assertEquals("request height is different", 150, result.getHeight(), ACCURACY);

        // apply a max dim and try again
        maxDimensions = new Dimension(100, 110);
        result = BasicWMSRenderer2.calculateImageDimensions(displaySize, maxDimensions, viewport,
                request);
        assertEquals("request width is different", 100, result.getWidth(), ACCURACY);
        assertEquals("request height is different", 110, result.getHeight(), ACCURACY);

        // viewport = chunk, request = same chunk
        viewportBBox = new Envelope(-135, -115, 49, 55); // 20, 6
        viewport = new ReferencedEnvelope(viewportBBox, viewportCRS);
        maxDimensions = new Dimension(1024, 768); // typical bounds which we won't hit
        result = BasicWMSRenderer2.calculateImageDimensions(displaySize, maxDimensions, viewport,
                viewportBBox);
        assertEquals("request width is different", 400, result.getWidth(), ACCURACY);
        assertEquals("request height is different", 300, result.getHeight(), ACCURACY);
    }

    @Test
    public void testCalculateImageDimensions_reprojecting() throws Exception {
        // everything in BC albers 3005
        viewportCRS = CRS.decode("EPSG:3005");
        // arbitrary viewport with bc in top left corner, US in center, s. america on bottom right
        viewportBBox = new Envelope(-737102.342, 7752070.309, -2520851.926, 1758412.392);
        // the request originates in 4326, so a good chunk of the world is requested and reprojected
        Envelope request = new Envelope(-3333263.569, 10181883.642, -4929356.875, 3697429.13);
        viewport = new ReferencedEnvelope(viewportBBox, viewportCRS);

        Dimension displaySize = new Dimension(1224, 612);
        Dimension maxDimensions = new Dimension(0, 0); // usually not specified
        Dimension result = BasicWMSRenderer2.calculateImageDimensions(displaySize, maxDimensions,
                viewport, request);
        assertEquals("request width is different", 1948, result.getWidth(), ACCURACY);
        assertEquals("request height is different", 1233, result.getHeight(), ACCURACY);
        // we request 1948x1233 pixels and reproject to 1224x612 on the screen
    }

}
TOP

Related Classes of org.locationtech.udig.render.wms.basic.test.BasicWMSRenderer2Test

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.