Last active
March 1, 2016 11:39
-
-
Save cmadsen/3342328008de73602cb8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package dk.navicon.openmap.geotools; | |
import java.awt.Color; | |
import java.awt.Graphics2D; | |
import java.awt.GraphicsEnvironment; | |
import java.awt.Rectangle; | |
import java.awt.Transparency; | |
import java.awt.geom.Point2D; | |
import java.awt.image.BufferedImage; | |
import java.io.File; | |
import java.util.HashMap; | |
import java.util.Map; | |
import org.geotools.data.FileDataStore; | |
import org.geotools.data.FileDataStoreFinder; | |
import org.geotools.data.simple.SimpleFeatureSource; | |
import org.geotools.geometry.Envelope2D; | |
import org.geotools.geometry.jts.ReferencedEnvelope; | |
import org.geotools.grid.Grids; | |
import org.geotools.map.FeatureLayer; | |
import org.geotools.map.MapContent; | |
import org.geotools.referencing.CRS; | |
import org.geotools.referencing.crs.DefaultGeographicCRS; | |
import org.geotools.renderer.GTRenderer; | |
import org.geotools.renderer.label.LabelCacheImpl; | |
import org.geotools.renderer.lite.LabelCache; | |
import org.geotools.renderer.lite.StreamingRenderer; | |
import org.geotools.styling.SLD; | |
import org.geotools.styling.Style; | |
import org.opengis.referencing.crs.CoordinateReferenceSystem; | |
import org.slf4j.Logger; | |
import org.slf4j.LoggerFactory; | |
import com.bbn.openmap.layer.OMGraphicHandlerLayer; | |
import com.bbn.openmap.omGraphics.OMGraphicList; | |
import com.bbn.openmap.omGraphics.OMRaster; | |
import com.bbn.openmap.omGraphics.OMRasterObject; | |
import com.bbn.openmap.proj.Projection; | |
public class GeoToolsLayer extends OMGraphicHandlerLayer { | |
private static final Logger log = LoggerFactory | |
.getLogger(GeoToolsLayer.class); | |
private OMRaster mapImage = new OMRaster(); | |
private GTRenderer renderer; | |
private BufferedImage baseImage; | |
private Graphics2D baseImageGraphics; | |
private MapContent mapContent; | |
private LabelCache labelCache; | |
private ReferencedEnvelope fullExtent; | |
private OMGraphicList list = new OMGraphicList(); | |
public GeoToolsLayer() { | |
try { | |
FileDataStore store = FileDataStoreFinder.getDataStore(new File( | |
"/opt/worldwind-1.2/testData/shapefiles/TM_WORLD_BORDERS-0.2.shp")); | |
SimpleFeatureSource featureSource = store.getFeatureSource(); | |
mapContent = new MapContent(); | |
mapContent.setTitle("World Borders"); | |
Style style = SLD.createSimpleStyle(featureSource.getSchema()); | |
Style shpStyle = SLD.createPolygonStyle(Color.YELLOW, Color.GREEN, | |
1.0f); | |
FeatureLayer layer = new FeatureLayer(featureSource, shpStyle); | |
mapContent.addLayer(layer); | |
ReferencedEnvelope gridBounds = new ReferencedEnvelope(-180.0, | |
180.0, -90.0, 90.0, DefaultGeographicCRS.WGS84); | |
SimpleFeatureSource grid = Grids.createSquareGrid(gridBounds, 5.0); | |
Style gridStyle = SLD.createLineStyle(Color.MAGENTA, 1.0f); | |
FeatureLayer gridLayer = new FeatureLayer(grid, gridStyle); | |
mapContent.addLayer(gridLayer); | |
// mapContent.getViewport().setCoordinateReferenceSystem( | |
// CRS.decode("EPSG:3857", false)); | |
// Mercator m; | |
// | |
String wkt = "PROJCS[\"WGS 84 / Mercator\",\n" | |
+ " GEOGCS[\"WGS 84\",\n" | |
+ " DATUM[\"World Geodetic System 1984\",\n" | |
+ " SPHEROID[\"WGS 84\", 6378137.0, 298.257223563,\n" | |
+ "AUTHORITY[\"EPSG\",\"7030\"]],\n" | |
+ " AUTHORITY[\"EPSG\",\"6326\"]],\n" | |
+ " PRIMEM[\"Greenwich\", 0.0, AUTHORITY[\"EPSG\",\"8901\"]],\n" | |
+ " UNIT[\"degree\", 0.017453292519943295],\n" | |
+ " AXIS[\"Geodetic latitude\", NORTH],\n" | |
+ " AXIS[\"Geodetic longitude\", EAST],\n" | |
+ " AUTHORITY[\"EPSG\",\"4326\"]],\n" | |
+ " PROJECTION[\"Mercator_1SP\", AUTHORITY[\"EPSG\",\"9804\"]],\n" | |
+ " UNIT[\"m\", 1.0],\n" + " AXIS[\"Easting\", EAST],\n" | |
+ " AXIS[\"Northing\", NORTH]]\n" + ""; | |
CoordinateReferenceSystem example = CRS.parseWKT(wkt); | |
// | |
mapContent.getViewport().setCoordinateReferenceSystem(example); | |
// mapContent.getViewport() | |
// .setCoordinateReferenceSystem(DefaultGeographicCRS.WGS84); | |
mapContent.getViewport().setMatchingAspectRatio(true); | |
mapImage.setRenderType(OMRasterObject.RENDERTYPE_XY); | |
list.add(mapImage); | |
} catch (Exception e) { | |
log.error("", e); | |
} | |
} | |
@Override | |
public synchronized OMGraphicList prepare() { | |
Projection proj = getProjection(); | |
int w = proj.getWidth(); | |
int h = proj.getHeight(); | |
Rectangle screenArea = new Rectangle(w, h); | |
Envelope2D newMapArea = new Envelope2D(); | |
// newMapArea.setFrameFromDiagonal(proj.getLowerRight(), | |
// proj.getUpperLeft()); | |
newMapArea.setFrameFromCenter(proj.getCenter(), proj.getUpperLeft()); | |
// // getUpperLeft | |
// LatLonPoint ul = proj.inverse(0, 0, new LatLonPoint.Double()); | |
// // getUpperRight | |
// LatLonPoint ur = proj.inverse(w - 1, 0, new LatLonPoint.Double()); | |
// // getLowerRight | |
// LatLonPoint lr = proj.inverse(w - 1, h - 1, new | |
// LatLonPoint.Double()); | |
// // getLowerLeft | |
// LatLonPoint ll = proj.inverse(0, h - 1, new LatLonPoint.Double()); | |
// // new Envelope() | |
ReferencedEnvelope refEnv = new ReferencedEnvelope( | |
newMapArea.getMinimum(0), newMapArea.getMaximum(0), | |
newMapArea.getMinimum(1), newMapArea.getMaximum(1), | |
mapContent.getCoordinateReferenceSystem()); | |
// ReferencedEnvelope refEnv = new ReferencedEnvelope( | |
// proj.getUpperLeft().getX(), proj.getLowerRight().getX(), | |
// proj.getUpperLeft().getY(), proj.getLowerRight().getY(), | |
// mapContent.getCoordinateReferenceSystem()); | |
mapContent.getViewport().setBounds(refEnv); | |
mapContent.getViewport().setScreenArea(screenArea); | |
Point2D ul = mapContent.getViewport().getScreenToWorld() | |
.transform(new Point2D.Double(0.0, 0.0), null); | |
Point2D lr = mapContent.getViewport().getScreenToWorld() | |
.transform(new Point2D.Double(w, h), null); | |
log.error( | |
"\nul={} trans ul={}\nlr={} trans lr={}\n diff-ul lat={} lon={}\n diff-lr lat={} lon={}", | |
proj.getUpperLeft(), ul, proj.getLowerRight(), lr, | |
proj.getUpperLeft().getY() - ul.getY(), | |
proj.getUpperLeft().getX() - ul.getX(), | |
proj.getLowerRight().getY() - lr.getY(), | |
proj.getLowerRight().getX() - lr.getX()); | |
log.error("\nOM center=({},{})\nGT center={}", proj.getCenter().getX(), | |
proj.getCenter().getY(), refEnv.centre()); | |
if (mapContent != null && !mapContent.getViewport().isEmpty()) { | |
if (baseImage == null || baseImage.getWidth() != w | |
|| baseImage.getHeight() != h) { | |
baseImage = GraphicsEnvironment.getLocalGraphicsEnvironment() | |
.getDefaultScreenDevice().getDefaultConfiguration() | |
.createCompatibleImage(w, h, Transparency.TRANSLUCENT); | |
if (baseImageGraphics != null) { | |
baseImageGraphics.dispose(); | |
} | |
baseImageGraphics = baseImage.createGraphics(); | |
// clearLabelCache.set(true); | |
} else { | |
baseImageGraphics.setBackground(getBackground()); | |
baseImageGraphics.clearRect(0, 0, w, h); | |
} | |
if (mapContent != null && !mapContent.layers().isEmpty()) { | |
log.error("\nPainting screen={} world={} w={} h={}", screenArea, | |
refEnv, baseImage.getWidth(), baseImage.getHeight()); | |
getRenderer().paint(baseImageGraphics, screenArea, refEnv); | |
mapImage.setImage(baseImage); | |
mapImage.generate(getProjection()); | |
} | |
} | |
return list; | |
} | |
public GTRenderer getRenderer() { | |
if (renderer == null) { | |
doSetRenderer(new StreamingRenderer()); | |
} | |
return renderer; | |
} | |
public void setRenderer(GTRenderer renderer) { | |
doSetRenderer(renderer); | |
} | |
private void doSetRenderer(GTRenderer newRenderer) { | |
if (newRenderer != null) { | |
Map<Object, Object> hints = newRenderer.getRendererHints(); | |
if (hints == null) { | |
hints = new HashMap<>(); | |
} | |
if (newRenderer instanceof StreamingRenderer) { | |
if (hints.containsKey(StreamingRenderer.LABEL_CACHE_KEY)) { | |
labelCache = (LabelCache) hints | |
.get(StreamingRenderer.LABEL_CACHE_KEY); | |
} else { | |
labelCache = new LabelCacheImpl(); | |
hints.put(StreamingRenderer.LABEL_CACHE_KEY, labelCache); | |
} | |
} | |
newRenderer.setRendererHints(hints); | |
if (mapContent != null) { | |
newRenderer.setMapContent(mapContent); | |
} | |
} | |
renderer = newRenderer; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package dk.navicon.openmap.geoserver.test; | |
import static javax.swing.SwingUtilities.*; | |
import java.awt.event.WindowAdapter; | |
import java.awt.event.WindowEvent; | |
import java.util.Locale; | |
import java.util.Properties; | |
import com.bbn.openmap.Environment; | |
import com.bbn.openmap.InformationDelegator; | |
import com.bbn.openmap.LayerHandler; | |
import com.bbn.openmap.MapBean; | |
import com.bbn.openmap.MapHandler; | |
import com.bbn.openmap.MouseDelegator; | |
import com.bbn.openmap.event.NavMouseMode; | |
import com.bbn.openmap.event.OMMouseMode; | |
import com.bbn.openmap.gui.EmbeddedNavPanel; | |
import com.bbn.openmap.gui.EmbeddedScaleDisplayPanel; | |
import com.bbn.openmap.gui.LayersPanel; | |
import com.bbn.openmap.gui.MapPanel; | |
import com.bbn.openmap.gui.MouseModeButtonPanel; | |
import com.bbn.openmap.gui.OpenMapFrame; | |
import com.bbn.openmap.gui.OverlayMapPanel; | |
import com.bbn.openmap.gui.ToolPanel; | |
import com.bbn.openmap.layer.GraticuleLayer; | |
import com.bbn.openmap.layer.shape.ShapeLayer; | |
import com.bbn.openmap.proj.Mercator; | |
import com.bbn.openmap.proj.coords.LatLonPoint; | |
import dk.navicon.openmap.geotools.GeoToolsLayer; | |
public class GeoToolsLayerTest { | |
public static void main(String args[]) { | |
Locale.setDefault(Locale.ENGLISH); | |
invokeLater(() -> { | |
Environment.set(Environment.OpenMapPrefix + ".Projection", | |
"com.bbn.openmap.proj.LLXY"); | |
// com.bbn.openmap.proj.LambertConformal , | |
// com.bbn.openmap.proj.Mercator | |
MapPanel mapPanel = new OverlayMapPanel(); | |
MapHandler mapHandler = mapPanel.getMapHandler(); | |
MapBean mapBean = mapPanel.getMapBean(); | |
mapHandler.add(new LayerHandler()); | |
ShapeLayer shapeLayer = new ShapeLayer(); | |
Properties shapeLayerProps = new Properties(); | |
shapeLayerProps.put("prettyName", "Political Solid"); | |
shapeLayerProps.put("lineColor", "000000"); | |
// shapeLayerProps.put("fillColor", "BDDE83"); | |
shapeLayerProps.put("shapeFile", | |
"/opt/worldwind-1.2/testData/shapefiles/TM_WORLD_BORDERS-0.2.shp"); | |
shapeLayer.setProperties(shapeLayerProps); | |
GeoToolsLayer geoToolsLayer = new GeoToolsLayer(); | |
mapHandler.add(geoToolsLayer); | |
mapHandler.add(new NavMouseMode()); | |
mapHandler.add(new MouseModeButtonPanel()); | |
mapHandler.add(shapeLayer); | |
mapHandler.add(new GraticuleLayer()); | |
mapHandler.add(new EmbeddedNavPanel()); | |
mapHandler.add(new EmbeddedScaleDisplayPanel()); | |
mapHandler.add(new MouseDelegator()); | |
mapHandler.add(new OMMouseMode()); | |
mapHandler.add(new ToolPanel()); | |
mapHandler.add(new LayersPanel()); | |
mapHandler.add(new InformationDelegator()); | |
OpenMapFrame frame = new OpenMapFrame("GeoTools demo"); | |
frame.setSize(800, 600); | |
mapHandler.add(frame); | |
mapHandler.add(new InformationDelegator()); | |
// mapBean.setProjection(new LLXY(new LatLonPoint.Double(56.21, | |
// 8.99), | |
// 500, 300, 500)); | |
mapBean.setProjection(new Mercator( | |
new LatLonPoint.Double(56.21, 8.99), 500, 300, 500)); | |
mapBean.setCenter(new LatLonPoint.Double(56.21, 8.99)); | |
mapBean.setScale(1200000f); | |
frame.setVisible(true); | |
frame.addWindowListener(new WindowAdapter() { | |
@Override | |
public void windowClosing(WindowEvent e) { | |
System.exit(0); | |
} | |
}); | |
frame.pack(); | |
frame.setVisible(true); | |
}); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment