Skip to content

Commit 924e733

Browse files
committed
fixing nasa worldwind as good as possible. Layers active again
1 parent b32d7ed commit 924e733

File tree

11 files changed

+207
-13
lines changed

11 files changed

+207
-13
lines changed

apps/pom.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,16 @@
5353
<dependency>
5454
<groupId>com.github.pcmehlitz</groupId>
5555
<artifactId>worldwind-pcm</artifactId>
56-
<version>2.1.0.202</version>
56+
<version>2.1.0.206</version>
57+
<!--
58+
5759
<exclusions>
5860
<exclusion>
5961
<groupId>org.jogamp.jogl</groupId>
6062
<artifactId>h2</artifactId>
6163
</exclusion>
6264
</exclusions>
65+
-->
6366
</dependency>
6467

6568
<dependency>

apps/src/main/java/org/hortonmachine/geopaparazzi/GeopaparazziController.java

Lines changed: 45 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@
3737
import java.io.File;
3838
import java.sql.Connection;
3939
import java.sql.DriverManager;
40+
import java.sql.PreparedStatement;
4041
import java.sql.ResultSet;
42+
import java.sql.SQLException;
4143
import java.sql.Statement;
4244
import java.util.ArrayList;
4345
import java.util.Arrays;
@@ -76,6 +78,7 @@
7678
import org.hortonmachine.dbs.compat.IHMStatement;
7779
import org.hortonmachine.dbs.log.Logger;
7880
import org.hortonmachine.dbs.spatialite.hm.SqliteDb;
81+
import org.hortonmachine.dbs.utils.SqlName;
7982
import org.hortonmachine.gears.io.geopaparazzi.GeopaparazziUtilities;
8083
import org.hortonmachine.gears.io.geopaparazzi.geopap4.DaoGpsLog;
8184
import org.hortonmachine.gears.io.geopaparazzi.geopap4.DaoGpsLog.GpsLog;
@@ -338,6 +341,7 @@ public void valueChanged( TreeSelectionEvent evt ) {
338341
_nwwHolder.setLayout(new BorderLayout());
339342
_nwwHolder.add(wwjPanelComponent, BorderLayout.CENTER);
340343
wwjPanel = (NwwPanel) wwjPanelComponent;
344+
wwjPanel.setFlatGlobe(true);
341345
wwjPanel.addOsmLayer();
342346
geopapDataLayer = new RenderableLayer();
343347
wwjPanel.addLayer(geopapDataLayer);
@@ -355,9 +359,11 @@ private List<ProjectInfo> readProjectInfos( File[] projectFiles ) throws Excepti
355359
for( File geopapDatabaseFile : projectFiles ) {
356360
try (SqliteDb db = new SqliteDb()) {
357361
db.open(geopapDatabaseFile.getAbsolutePath());
362+
363+
boolean hasMetadata = db.hasTable(SqlName.m(TABLE_METADATA));
358364

359365
ProjectInfo resInfo = db.execOnConnection(connection -> {
360-
String projectInfo = GeopaparazziUtilities.getProjectInfo(connection, true);
366+
String projectInfo = hasMetadata ? GeopaparazziUtilities.getProjectInfo(connection, true): " - nv - ";
361367
ProjectInfo info = new ProjectInfo();
362368
info.databaseFile = geopapDatabaseFile;
363369
info.fileName = geopapDatabaseFile.getName();
@@ -879,6 +885,22 @@ private void loadGpsLogChart( GpsLog log, File dbFile ) throws Exception {
879885
}
880886
}
881887

888+
889+
public static boolean hasColumn(Connection conn, String tableName, String columnName) throws SQLException {
890+
String sql = "PRAGMA table_info(" + tableName + ")";
891+
try (PreparedStatement stmt = conn.prepareStatement(sql);
892+
ResultSet rs = stmt.executeQuery()) {
893+
894+
while (rs.next()) {
895+
String colName = rs.getString("name");
896+
if (columnName.equalsIgnoreCase(colName)) {
897+
return true;
898+
}
899+
}
900+
}
901+
return false;
902+
}
903+
882904
/**
883905
* Extract data from the db and add them to the map view.
884906
*
@@ -894,6 +916,7 @@ public void loadProjectData( ProjectInfo currentSelectedProject, boolean zoomTo
894916

895917
File dbFile = currentSelectedProject.databaseFile;
896918
try (Connection connection = DriverManager.getConnection("jdbc:sqlite:" + dbFile.getAbsolutePath())) {
919+
boolean hasFilteredCoords = hasColumn(connection, "gpslogsdata", "flitered_lat");
897920

898921
// NOTES
899922
List<String[]> noteDataList = GeopaparazziUtilities.getNotesText(connection);
@@ -973,10 +996,15 @@ public void loadProjectData( ProjectInfo currentSelectedProject, boolean zoomTo
973996
String endDateTimeString = ETimeUtilities.INSTANCE.TIME_FORMATTER_LOCAL.format(new Date(endDateTime));
974997
String text = rs.getString(4);
975998

999+
1000+
String latColumn = hasFilteredCoords ? GpsLogsDataTableFields.COLUMN_DATA_FILTERED_LAT.getFieldName()
1001+
: GpsLogsDataTableFields.COLUMN_DATA_LAT.getFieldName();
1002+
String lonColumn = hasFilteredCoords ? GpsLogsDataTableFields.COLUMN_DATA_FILTERED_LON.getFieldName()
1003+
: GpsLogsDataTableFields.COLUMN_DATA_LON.getFieldName();
9761004
// points
9771005
String query = "select " //
978-
+ GpsLogsDataTableFields.COLUMN_DATA_LAT.getFieldName() + ","
979-
+ GpsLogsDataTableFields.COLUMN_DATA_LON.getFieldName() + ","
1006+
+ latColumn + ","
1007+
+ lonColumn + ","
9801008
+ GpsLogsDataTableFields.COLUMN_DATA_ALTIM.getFieldName() + ","
9811009
+ GpsLogsDataTableFields.COLUMN_DATA_TS.getFieldName()//
9821010
+ " from " + TABLE_GPSLOG_DATA + " where " + //
@@ -1027,6 +1055,16 @@ public void loadProjectData( ProjectInfo currentSelectedProject, boolean zoomTo
10271055

10281056
Color color = Color.RED;
10291057
try {
1058+
if(colorStr.contains("@")) {
1059+
// trim away colortable part
1060+
colorStr = colorStr.split("@")[0];
1061+
// format is #AARRGGBB, need to remove the AA
1062+
if(colorStr.length() == 9) {
1063+
colorStr = "#" + colorStr.substring(3);
1064+
}
1065+
1066+
1067+
}
10301068
color = Color.decode(colorStr);
10311069
} catch (Exception e) {
10321070
// ignore Logger.INSTANCE.insertError("","Could not convert color: " +
@@ -1063,6 +1101,10 @@ protected void editProjectData( ProjectInfo project ) throws Exception {
10631101
LinkedHashMap<String, String> metadataMap = new LinkedHashMap<>();
10641102
try (SqliteDb db = new SqliteDb()) {
10651103
db.open(currentSelectedProject.databaseFile.getAbsolutePath());
1104+
if (!db.hasTable(SqlName.m(TABLE_METADATA))) {
1105+
GuiUtilities.showWarningMessage(null, "The selected project has no metadata table.");
1106+
return;
1107+
}
10661108

10671109
db.execOnConnection(connection -> {
10681110
String sql = "select " + MetadataTableFields.COLUMN_KEY.getFieldName() + ", " + //

apps/src/main/java/org/hortonmachine/nww/SimpleNwwViewer.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.hortonmachine.nww.gui.NwwPanel;
1919
import org.hortonmachine.nww.gui.ToolsPanelController;
2020
import org.hortonmachine.nww.gui.ViewControlsLayer;
21+
import org.hortonmachine.nww.layers.defaults.raster.EsriSatellite;
2122
import org.hortonmachine.nww.layers.defaults.raster.OepnvkarteLayer;
2223
import org.hortonmachine.nww.layers.defaults.raster.OpenTopoLayer;
2324

@@ -68,9 +69,12 @@ public static ToolsPanelController openNww( String appName, int onCloseAction )
6869
OpenTopoLayer openTopoLayer = new OpenTopoLayer();
6970
openTopoLayer.setEnabled(false);
7071
wwjPanel.addLayer(openTopoLayer);
71-
OepnvkarteLayer oepnvLayer = new OepnvkarteLayer();
72-
oepnvLayer.setEnabled(false);
73-
wwjPanel.addLayer(oepnvLayer);
72+
// OepnvkarteLayer oepnvLayer = new OepnvkarteLayer();
73+
// oepnvLayer.setEnabled(false);
74+
// wwjPanel.addLayer(oepnvLayer);
75+
EsriSatellite esriLayer = new EsriSatellite();
76+
esriLayer.setEnabled(false);
77+
wwjPanel.addLayer(esriLayer);
7478
ViewControlsLayer viewControls = wwjPanel.addViewControls();
7579
viewControls.setScale(1.5);
7680

apps/src/main/java/org/hortonmachine/nww/layers/defaults/raster/BasicMercatorTiledImageLayer.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
import javax.imageio.ImageIO;
1919

20+
import org.hortonmachine.utils.HmHttpRetriever;
21+
2022
import com.jogamp.opengl.util.texture.TextureData;
2123

2224
import gov.nasa.worldwind.Configuration;
@@ -215,7 +217,7 @@ protected void downloadTexture( final MercatorTextureTile tile ) {
215217
Retriever retriever;
216218

217219
if (url.getProtocol().toLowerCase().startsWith("http")) {
218-
retriever = new HTTPRetriever(url, new DownloadPostProcessor(tile, this));
220+
retriever = new HmHttpRetriever(url, new DownloadPostProcessor(tile, this));
219221
retriever.setValue(URLRetriever.EXTRACT_ZIP_ENTRY, "true"); // supports legacy layers
220222
} else if ("file".equalsIgnoreCase(url.getProtocol())) {
221223
retriever = new FileRetriever(url, new DownloadPostProcessor(tile, this));
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* Copyright (C) 2012 United States Government as represented by the Administrator of the
3+
* National Aeronautics and Space Administration.
4+
* All Rights Reserved.
5+
*/
6+
package org.hortonmachine.nww.layers.defaults.raster;
7+
8+
import java.net.MalformedURLException;
9+
import java.net.URL;
10+
11+
import org.hortonmachine.utils.HmHttpRetriever;
12+
13+
import gov.nasa.worldwind.avlist.AVKey;
14+
import gov.nasa.worldwind.avlist.AVList;
15+
import gov.nasa.worldwind.avlist.AVListImpl;
16+
import gov.nasa.worldwind.geom.Angle;
17+
import gov.nasa.worldwind.geom.LatLon;
18+
import gov.nasa.worldwind.layers.mercator.MercatorSector;
19+
import gov.nasa.worldwind.retrieve.HTTPRetriever;
20+
import gov.nasa.worldwind.util.LevelSet;
21+
import gov.nasa.worldwind.util.Tile;
22+
import gov.nasa.worldwind.util.TileUrlBuilder;
23+
24+
/**
25+
* @version $Id: OSMMapnikLayer.java 1171 2013-02-11 21:45:02Z dcollins $
26+
*/
27+
public class EsriSatellite extends BasicMercatorTiledImageLayer {
28+
public EsriSatellite() {
29+
super(makeLevels());
30+
}
31+
32+
private static LevelSet makeLevels() {
33+
AVList params = new AVListImpl();
34+
35+
params.setValue(AVKey.TILE_WIDTH, 256);
36+
params.setValue(AVKey.TILE_HEIGHT, 256);
37+
params.setValue(AVKey.DATA_CACHE_NAME, "Earth/Esri/Satellite");
38+
params.setValue(AVKey.SERVICE, "https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/");
39+
params.setValue(AVKey.DATASET_NAME, "h");
40+
params.setValue(AVKey.FORMAT_SUFFIX, ".png");
41+
params.setValue(AVKey.NUM_LEVELS, 22);
42+
params.setValue(AVKey.NUM_EMPTY_LEVELS, 0);
43+
params.setValue(AVKey.LEVEL_ZERO_TILE_DELTA, new LatLon(Angle.fromDegrees(22.5d), Angle.fromDegrees(45d)));
44+
params.setValue(AVKey.SECTOR, new MercatorSector(-1.0, 1.0, Angle.NEG180, Angle.POS180));
45+
params.setValue(AVKey.TILE_URL_BUILDER, new URLBuilder());
46+
params.setValue(AVKey.TILE_RETRIEVER, HmHttpRetriever.class);
47+
48+
return new LevelSet(params);
49+
}
50+
51+
private static class URLBuilder implements TileUrlBuilder {
52+
public URL getURL( Tile tile, String imageFormat ) throws MalformedURLException {
53+
int zoom = tile.getLevelNumber() + 3;
54+
int x = tile.getColumn();
55+
int y = (1 << (tile.getLevelNumber()) + 3) - 1 - tile.getRow();
56+
57+
return new URL(tile.getLevel().getService() + zoom + "/" + y + "/" + x );
58+
}
59+
}
60+
61+
@Override
62+
public String toString() {
63+
return "Esri-Satellite";
64+
}
65+
}

apps/src/main/java/org/hortonmachine/nww/layers/defaults/raster/OSMMapnikLayer.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,15 @@
88
import java.net.MalformedURLException;
99
import java.net.URL;
1010

11+
import org.hortonmachine.utils.HmHttpRetriever;
12+
1113
import gov.nasa.worldwind.avlist.AVKey;
1214
import gov.nasa.worldwind.avlist.AVList;
1315
import gov.nasa.worldwind.avlist.AVListImpl;
1416
import gov.nasa.worldwind.geom.Angle;
1517
import gov.nasa.worldwind.geom.LatLon;
1618
import gov.nasa.worldwind.layers.mercator.MercatorSector;
19+
import gov.nasa.worldwind.retrieve.HTTPRetriever;
1720
import gov.nasa.worldwind.util.LevelSet;
1821
import gov.nasa.worldwind.util.Tile;
1922
import gov.nasa.worldwind.util.TileUrlBuilder;
@@ -31,7 +34,7 @@ private static LevelSet makeLevels() {
3134

3235
params.setValue(AVKey.TILE_WIDTH, 256);
3336
params.setValue(AVKey.TILE_HEIGHT, 256);
34-
params.setValue(AVKey.DATA_CACHE_NAME, "Earth/OSM-Mercator/OpenStreetMap OpentopoMap");
37+
params.setValue(AVKey.DATA_CACHE_NAME, "Earth/OSM-Mercator/OpenStreetMap");
3538
params.setValue(AVKey.SERVICE, "https://tile.openstreetmap.org/");
3639
params.setValue(AVKey.DATASET_NAME, "h");
3740
params.setValue(AVKey.FORMAT_SUFFIX, ".png");
@@ -40,6 +43,7 @@ private static LevelSet makeLevels() {
4043
params.setValue(AVKey.LEVEL_ZERO_TILE_DELTA, new LatLon(Angle.fromDegrees(22.5d), Angle.fromDegrees(45d)));
4144
params.setValue(AVKey.SECTOR, new MercatorSector(-1.0, 1.0, Angle.NEG180, Angle.POS180));
4245
params.setValue(AVKey.TILE_URL_BUILDER, new URLBuilder());
46+
params.setValue(AVKey.TILE_RETRIEVER, HmHttpRetriever.class);
4347

4448
return new LevelSet(params);
4549
}

apps/src/main/java/org/hortonmachine/nww/layers/defaults/raster/OepnvkarteLayer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ private static LevelSet makeLevels() {
3232
params.setValue(AVKey.TILE_WIDTH, 256);
3333
params.setValue(AVKey.TILE_HEIGHT, 256);
3434
params.setValue(AVKey.DATA_CACHE_NAME, "Earth/OSM-Mercator/Oepnvkarte");
35-
params.setValue(AVKey.SERVICE, "http://tile.memomaps.de/tilegen//");
35+
params.setValue(AVKey.SERVICE, "http://tile.memomaps.de/tilegen/");
3636
params.setValue(AVKey.DATASET_NAME, "h");
3737
params.setValue(AVKey.FORMAT_SUFFIX, ".png");
3838
params.setValue(AVKey.NUM_LEVELS, 22);

apps/src/main/java/org/hortonmachine/nww/layers/defaults/raster/OpenTopoLayer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ private static LevelSet makeLevels() {
3131

3232
params.setValue(AVKey.TILE_WIDTH, 256);
3333
params.setValue(AVKey.TILE_HEIGHT, 256);
34-
params.setValue(AVKey.DATA_CACHE_NAME, "Earth/OSM-Mercator/OpenStreetMap Mapnik");
35-
params.setValue(AVKey.SERVICE, "https://a.tile.opentopomap.org/");
34+
params.setValue(AVKey.DATA_CACHE_NAME, "Earth/OSM-Mercator/Opentopomap");
35+
params.setValue(AVKey.SERVICE, "https://tile.opentopomap.org/");
3636
params.setValue(AVKey.DATASET_NAME, "h");
3737
params.setValue(AVKey.FORMAT_SUFFIX, ".png");
3838
params.setValue(AVKey.NUM_LEVELS, 22);

apps/src/main/java/org/hortonmachine/nww/utils/NwwUtilities.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public class NwwUtilities {
6363

6464
public static double DEFAULT_ELEV = 10000.0;
6565

66-
public static List<String> LAYERS_TO_KEEP_FROM_ORIGNALNWW = Arrays.asList("Scale bar", "Compass", "Bing Imagery");
66+
public static List<String> LAYERS_TO_KEEP_FROM_ORIGNALNWW = Arrays.asList("Scale bar", "Compass");
6767

6868
public static LatLon getEnvelopeCenter( Envelope bounds ) {
6969
Coordinate centre = bounds.centre();
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package org.hortonmachine.utils;
2+
3+
import gov.nasa.worldwind.retrieve.RetrievalPostProcessor;
4+
import gov.nasa.worldwind.retrieve.URLRetriever;
5+
6+
import java.io.IOException;
7+
import java.net.HttpURLConnection;
8+
import java.net.URL;
9+
import java.net.URLConnection;
10+
11+
public class HmHttpRetriever extends URLRetriever {
12+
private int responseCode;
13+
private String responseMessage;
14+
15+
public HmHttpRetriever(URL url, RetrievalPostProcessor postProcessor) {
16+
super(url, postProcessor);
17+
}
18+
19+
@Override
20+
protected URLConnection openConnection() throws IOException {
21+
// Let the base class handle proxy, SSL, timeouts, etc.
22+
URLConnection conn = super.openConnection();
23+
24+
// Add your User-Agent (and any other headers) here:
25+
if (conn instanceof HttpURLConnection) {
26+
conn.setRequestProperty("User-Agent", "HortonMachine-NWW/1.0 (info@hortonmachine.org)");
27+
// Optionally:
28+
// conn.setRequestProperty("Referer", "https://your.app/");
29+
// conn.setRequestProperty("From", "contact@example.com");
30+
}
31+
return conn;
32+
}
33+
34+
public int getResponseCode() {
35+
return this.responseCode;
36+
}
37+
38+
public String getResponseMessage() {
39+
return this.responseMessage;
40+
}
41+
42+
@Override
43+
protected java.nio.ByteBuffer doRead(URLConnection connection) throws Exception {
44+
if (connection == null) {
45+
String msg = gov.nasa.worldwind.util.Logging.getMessage("nullValue.ConnectionIsNull");
46+
gov.nasa.worldwind.util.Logging.logger().severe(msg);
47+
throw new IllegalArgumentException(msg);
48+
}
49+
50+
HttpURLConnection htpc = (HttpURLConnection) connection;
51+
this.responseCode = htpc.getResponseCode();
52+
this.responseMessage = htpc.getResponseMessage();
53+
String contentType = connection.getContentType();
54+
55+
gov.nasa.worldwind.util.Logging.logger().log(
56+
java.util.logging.Level.FINE, "HTTPRetriever.ResponseInfo",
57+
new Object[]{ this.responseCode, connection.getContentLength(),
58+
contentType != null ? contentType : "content type not returned",
59+
connection.getURL() });
60+
61+
if (this.responseCode == HttpURLConnection.HTTP_OK)
62+
return super.doRead(connection);
63+
64+
return null;
65+
}
66+
}

0 commit comments

Comments
 (0)