Skip to content

Instantly share code, notes, and snippets.

@cmadsen
Last active March 1, 2016 11:39
Show Gist options
  • Save cmadsen/3342328008de73602cb8 to your computer and use it in GitHub Desktop.
Save cmadsen/3342328008de73602cb8 to your computer and use it in GitHub Desktop.
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;
}
}
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