package com.revolsys.swing.map.layer.geonames;
import java.awt.image.BufferedImage;
import java.util.List;
import java.util.Map;
import com.revolsys.geometry.cs.CoordinateSystem;
import com.revolsys.geometry.cs.GeographicCoordinateSystem;
import com.revolsys.geometry.cs.ProjectedCoordinateSystem;
import com.revolsys.geometry.model.BoundingBox;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.geometry.model.Point;
import com.revolsys.record.Record;
import com.revolsys.swing.Icons;
import com.revolsys.swing.map.layer.record.BoundingBoxRecordLayer;
import com.revolsys.swing.map.layer.record.LayerRecord;
import com.revolsys.swing.map.layer.record.renderer.MarkerStyleRenderer;
import com.revolsys.swing.map.layer.record.style.MarkerStyle;
import com.revolsys.swing.map.layer.record.style.marker.ImageMarker;
import com.revolsys.swing.parallel.AbstractSwingWorker;
public class GeoNamesBoundingBoxLayerWorker extends AbstractSwingWorker<List<LayerRecord>, Void> {
public static BoundingBoxRecordLayer newLayer(final Map<String, Object> properties) {
final GeometryFactory wgs84 = GeometryFactory.floating3(4326);
final BoundingBoxRecordLayer layer = new BoundingBoxRecordLayer("geoname", "Geo Names",
GeoNamesBoundingBoxLayerWorker.class, wgs84);
final BufferedImage image = Icons.getImage("world");
final ImageMarker marker = new ImageMarker(image);
final MarkerStyle style = new MarkerStyle();
style.setMarker(marker);
layer.setRenderer(new MarkerStyleRenderer(layer, style));
layer.setProperties(properties);
return layer;
}
private final BoundingBox boundingBox;
private final GeometryFactory geometryFactory;
private final GeoNamesService geoNamesService = new GeoNamesService();
private final BoundingBoxRecordLayer layer;
public GeoNamesBoundingBoxLayerWorker(final BoundingBoxRecordLayer layer,
final BoundingBox boundingBox) {
this.layer = layer;
this.boundingBox = boundingBox;
this.geometryFactory = boundingBox.getGeometryFactory();
}
@Override
protected List<LayerRecord> handleBackground() {
BoundingBox boundingBox = this.boundingBox;
GeometryFactory geometryFactory = this.geometryFactory;
final CoordinateSystem coordinateSystem = geometryFactory.getCoordinateSystem();
if (coordinateSystem instanceof ProjectedCoordinateSystem) {
final ProjectedCoordinateSystem projCs = (ProjectedCoordinateSystem)coordinateSystem;
final GeographicCoordinateSystem geoCs = projCs.getGeographicCoordinateSystem();
geometryFactory = geoCs.getGeometryFactory();
boundingBox = boundingBox.convert(geometryFactory);
}
final List<LayerRecord> results = (List)this.geoNamesService.getNames(boundingBox);
for (final Record record : results) {
final String name = record.getValue("name");
final Point point = record.getGeometry();
final String text = "<html><b>" + name + "</b><br /></html>";
// if (viewport instanceof ComponentViewport2D) {
// final ComponentViewport2D componentViewport =
// (ComponentViewport2D)viewport;
// componentViewport.addHotSpot(geometryFactory, point, text, null);
// }
}
return results;
}
@Override
protected void handleCancelled() {
this.layer.setIndexRecords(this.boundingBox, null);
}
@Override
protected void handleDone(final List<LayerRecord> records) {
this.layer.setIndexRecords(this.boundingBox, records);
}
@Override
protected void handleException(final Throwable exception) {
super.handleException(exception);
this.layer.setIndexRecords(this.boundingBox, null);
}
@Override
public String toString() {
return "Load Geo Names";
}
}