/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.eas.client.controls.mappane.map; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.Point; import com.vividsolutions.jts.io.ParseException; import com.vividsolutions.jts.io.WKTReader; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JFrame; import javax.swing.JPanel; import org.geotools.data.collection.ListFeatureCollection; import org.geotools.feature.FeatureCollection; import org.geotools.feature.simple.SimpleFeatureBuilder; import org.geotools.feature.simple.SimpleFeatureTypeBuilder; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.map.FeatureLayer; import org.geotools.map.Layer; import org.geotools.map.MapContent; import org.geotools.referencing.CRS; import org.geotools.renderer.GTRenderer; import org.geotools.renderer.lite.StreamingRenderer; import org.geotools.styling.LineSymbolizer; import org.geotools.styling.Style; import org.geotools.styling.StyleBuilder; import org.junit.Test; import org.opengis.feature.simple.SimpleFeature; import org.opengis.feature.simple.SimpleFeatureType; import org.opengis.referencing.FactoryException; import org.opengis.referencing.crs.CoordinateReferenceSystem; /** * * @author mg */ public class MapGraphicTest { public static final String MERCATOR_WKT = "" + "PROJCS[\"WGS84 / Google Mercator\", GEOGCS[\"WGS 84\", DATUM[\"World Geodetic System 1984\", SPHEROID[\"WGS 84\", 6378137.0, 298.257223563, AUTHORITY[\"EPSG\",\"7030\"]], AUTHORITY[\"EPSG\",\"6326\"]], PRIMEM[\"Greenwich\", 0.0, AUTHORITY[\"EPSG\",\"8901\"]], UNIT[\"degree\", 0.017453292519943295], AXIS[\"Longitude\", EAST], AXIS[\"Latitude\", NORTH], AUTHORITY[\"EPSG\",\"4326\"]], PROJECTION[\"Mercator_1SP\"], PARAMETER[\"semi_minor\", 6378137.0], PARAMETER[\"latitude_of_origin\", 0.0], PARAMETER[\"central_meridian\", 0.0], PARAMETER[\"scale_factor\", 1.0], PARAMETER[\"false_easting\", 0.0], PARAMETER[\"false_northing\", 0.0], UNIT[\"m\", 1.0], AXIS[\"x\", EAST], AXIS[\"y\", NORTH], AUTHORITY[\"EPSG\",\"900913\"]]"; public static final String ORTHOGRAPHIC_WKT = "" + "PROJCS[\"WGS84 / Spheric sample\", GEOGCS[\"WGS 84\", DATUM[\"World Geodetic System 1984\", SPHEROID[\"WGS 84\", 6378137.0, 298.257223563, AUTHORITY[\"EPSG\",\"7030\"]], AUTHORITY[\"EPSG\",\"6326\"]], PRIMEM[\"Greenwich\", 0.0, AUTHORITY[\"EPSG\",\"8901\"]], UNIT[\"degree\", 0.017453292519943295], AXIS[\"Longitude\", EAST], AXIS[\"Latitude\", NORTH], AUTHORITY[\"EPSG\",\"4326\"]], PROJECTION[\"Orthographic\"], PARAMETER[\"semi_minor\", 6378137.0], PARAMETER[\"latitude_of_origin\", 0.0], PARAMETER[\"central_meridian\", 0.0], PARAMETER[\"scale_factor\", 1.0], PARAMETER[\"false_easting\", 0.0], PARAMETER[\"false_northing\", 0.0], UNIT[\"m\", 1.0], AXIS[\"x\", EAST], AXIS[\"y\", NORTH], AUTHORITY[\"EPSG\",\"900913\"]]"; public static final String DATA_WKT = "" + "GEOGCS[\"WGS 84\", DATUM[\"World Geodetic System 1984\", SPHEROID[\"WGS 84\", 6378137.0, 298.257223563, AUTHORITY[\"EPSG\",\"7030\"]], AUTHORITY[\"EPSG\",\"6326\"]], PRIMEM[\"Greenwich\", 0.0, AUTHORITY[\"EPSG\",\"8901\"]], UNIT[\"degree\", 0.017453292519943295], AXIS[\"Longitude\", EAST], AXIS[\"Latitude\", NORTH], AUTHORITY[\"EPSG\",\"4326\"]]"; public static final Set<Geometry> points = new HashSet<>(); public static final Set<Geometry> polies = new HashSet<>(); protected static final double precision = 1e-2; static { GeometryFactory factory = new GeometryFactory(); Point point = null; point = factory.createPoint(new Coordinate(0 * precision, 0 * precision)); points.add(point); point = factory.createPoint(new Coordinate(10 * precision, -8 * precision)); points.add(point); point = factory.createPoint(new Coordinate(5 * precision, -20 * precision)); points.add(point); point = factory.createPoint(new Coordinate(13 * precision, 25 * precision)); points.add(point); Coordinate[] coords1 = new Coordinate[4]; coords1[0] = new Coordinate(-10 * precision, -21 * precision); coords1[1] = new Coordinate(-20 * precision, 32 * precision); coords1[2] = new Coordinate(-30 * precision, 16 * precision); coords1[3] = coords1[0]; polies.add(factory.createPolygon(factory.createLinearRing(coords1), null)); Coordinate[] coords2 = new Coordinate[5]; coords2[0] = new Coordinate(22 * precision, 17 * precision); coords2[1] = new Coordinate(4 * precision, 8 * precision); coords2[2] = new Coordinate(34 * precision, 12 * precision); coords2[3] = new Coordinate(21 * precision, 6 * precision); coords2[4] = coords2[0]; polies.add(factory.createPolygon(factory.createLinearRing(coords2), null)); } protected static final Set<LineString> lineStrings = new HashSet<>(); //feature instance creation protected static final WKTReader wktReader = new WKTReader(); protected static final StyleBuilder sb = new StyleBuilder(); protected static CoordinateReferenceSystem dataCrs; protected static CoordinateReferenceSystem projectedCrs; static { try { dataCrs = CRS.parseWKT(DATA_WKT); projectedCrs = CRS.parseWKT(MERCATOR_WKT); lineStrings.add((LineString) wktReader.read("LINESTRING (-1 -1, 1 1)")); lineStrings.add((LineString) wktReader.read("LINESTRING (-1 1, 1 -1)")); lineStrings.add((LineString) wktReader.read("LINESTRING (1 -1, 3 1)")); lineStrings.add((LineString) wktReader.read("LINESTRING (1 1, 3 -1)")); lineStrings.add((LineString) wktReader.read("LINESTRING (3 -1, 5 1)")); lineStrings.add((LineString) wktReader.read("LINESTRING (3 1, 5 -1)")); } catch (FactoryException | ParseException ex) { Logger.getLogger(SyncMapTest.class.getName()).log(Level.SEVERE, null, ex); } } @Test public void geoToolsBaseSettingsTest() throws InterruptedException, FactoryException, ParseException { // cartesian view point Point2D.Double viewPoint = new Point2D.Double(2 * 111313.83923667614, 0); JFrame fr = new JFrame(); fr.setTitle("geoToolsBaseSettingsTest"); Container container = fr.getContentPane(); container.setLayout(new BorderLayout()); // Prepare styles // Create line symbolizer LineSymbolizer lineSymb = sb.createLineSymbolizer(Color.green, 1); Style lineStyle = sb.createStyle(lineSymb); ReferencedEnvelope aoi = new ReferencedEnvelope(new Rectangle2D.Double(viewPoint.x - 100, viewPoint.y - 100, 4 * 111000, 200), projectedCrs); // meters SimpleFeatureTypeBuilder typeBuilder = new SimpleFeatureTypeBuilder(); typeBuilder.setCRS(dataCrs); typeBuilder.setName("Line type"); typeBuilder.add("graphicRepresentation", LineString.class); typeBuilder.add("name", String.class); SimpleFeatureType featureType = typeBuilder.buildFeatureType(); List<SimpleFeature> lst = new ArrayList<>(); Object[] attrs = new Object[2]; int lNo = 0; for (LineString line : lineStrings) { attrs[0] = line; String lStringId = String.valueOf(lNo++); attrs[1] = "line " + lStringId; SimpleFeature feature = SimpleFeatureBuilder.build(featureType, attrs, lStringId); lst.add(feature); } FeatureCollection fcollection = new ListFeatureCollection(featureType, lst); final MapContent mainContent = new MapContent(projectedCrs); mainContent.getViewport().setBounds(aoi); Layer layer1 = new FeatureLayer(fcollection, lineStyle, "Main layer"); mainContent.addLayer(layer1); final GTRenderer renderer = new StreamingRenderer(); renderer.setMapContent(mainContent); final AffineTransform transform = new AffineTransform(); transform.scale(8e-4, 8e-4); transform.translate(-viewPoint.x, -viewPoint.y); JPanel panel = new JPanel() { @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Dimension size = getSize(); Graphics2D g2d = (Graphics2D) g; g2d.translate(size.width / 2, size.height / 2); Rectangle screenArea = new Rectangle(-200, -200, 400, 400); renderer.paint(g2d, new Rectangle(-200, -200, 400, 400), mainContent.getViewport().getBounds(), transform); //renderer.paint(g2d, screenArea, mainContext.getLayerBounds(), transform); g2d.draw(screenArea); } }; container.add(panel, BorderLayout.CENTER); fr.setSize(600, 600); fr.setVisible(true); Thread.sleep(1000); fr.dispose(); } }