package com.revolsys.swing.map.layer.elevation.gridded;
import java.awt.Graphics2D;
import com.revolsys.collection.map.MapEx;
import com.revolsys.elevation.gridded.GriddedElevationModel;
import com.revolsys.elevation.gridded.GriddedElevationModelImage;
import com.revolsys.elevation.gridded.HillShadeConfiguration;
import com.revolsys.geometry.model.BoundingBox;
import com.revolsys.swing.map.Viewport2D;
import com.revolsys.swing.map.layer.AbstractLayerRenderer;
import com.revolsys.swing.map.layer.raster.GeoreferencedImageLayerRenderer;
import com.revolsys.util.Cancellable;
public class GriddedElevationModelLayerRenderer
extends AbstractLayerRenderer<GriddedElevationModelLayer> {
private GriddedElevationModelImage image;
private Thread worker;
public GriddedElevationModelLayerRenderer(final GriddedElevationModelLayer layer) {
super("raster", layer);
final GriddedElevationModel elevationModel = layer.getElevationModel();
if (elevationModel != null) {
this.image = new GriddedElevationModelImage(elevationModel);
layer.addPropertyChangeListener("refresh", this.image = null);
}
}
@Override
public void render(final Viewport2D viewport, final Cancellable cancellable,
final GriddedElevationModelLayer layer) {
// TODO cancel
final double scaleForVisible = viewport.getScaleForVisible();
if (layer.isVisible(scaleForVisible)) {
if (!layer.isEditable()) {
final GriddedElevationModel elevationModel = layer.getElevationModel();
if (elevationModel != null) {
if (this.image == null) {
synchronized (this) {
if (this.worker == null) {
this.worker = new Thread(() -> {
final GriddedElevationModelImage image = new GriddedElevationModelImage(
elevationModel);
image.refresh(new HillShadeConfiguration(elevationModel));
// image.refresh(elevationModel);
this.image = image;
layer.refresh();
});
this.worker.start();
}
}
} else {
final BoundingBox boundingBox = layer.getBoundingBox();
final Graphics2D graphics = viewport.getGraphics();
if (graphics != null) {
GeoreferencedImageLayerRenderer.renderAlpha(viewport, graphics, this.image, true,
layer.getOpacity() / 255.0);
GeoreferencedImageLayerRenderer.renderDifferentCoordinateSystem(viewport, graphics,
boundingBox);
}
}
}
}
}
}
@Override
public MapEx toMap() {
return MapEx.EMPTY;
}
}