diff --git a/CHANGELOG.md b/CHANGELOG.md index 510318a3..59c6e3aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ Adheres to [Semantic Versioning](http://semver.org/). * sqlite-jdbc version 3.45.1.0 * Get abstract User DAO by table name * Set User Custom DAO contents +* Feature Tiles geodesic draw support +* Feature Index Manager, RTree Index, Feature Table Index, and Manual query geodesic support ## [6.6.4](https://github.com/ngageoint/geopackage-java/releases/tag/6.6.4) (11-29-2023) diff --git a/src/main/java/mil/nga/geopackage/extension/nga/index/FeatureTableIndex.java b/src/main/java/mil/nga/geopackage/extension/nga/index/FeatureTableIndex.java index 98ca5198..51deaf50 100644 --- a/src/main/java/mil/nga/geopackage/extension/nga/index/FeatureTableIndex.java +++ b/src/main/java/mil/nga/geopackage/extension/nga/index/FeatureTableIndex.java @@ -59,8 +59,24 @@ public class FeatureTableIndex extends FeatureTableCoreIndex { * feature dao */ public FeatureTableIndex(GeoPackage geoPackage, FeatureDao featureDao) { + this(geoPackage, featureDao, false); + } + + /** + * Constructor + * + * @param geoPackage + * GeoPackage + * @param featureDao + * feature dao + * @param geodesic + * index using geodesic bounds + * @since 6.6.5 + */ + public FeatureTableIndex(GeoPackage geoPackage, FeatureDao featureDao, + boolean geodesic) { super(geoPackage, featureDao.getTableName(), - featureDao.getGeometryColumnName()); + featureDao.getGeometryColumnName(), geodesic); this.featureDao = featureDao; } diff --git a/src/main/java/mil/nga/geopackage/extension/rtree/RTreeIndexExtension.java b/src/main/java/mil/nga/geopackage/extension/rtree/RTreeIndexExtension.java index 65e1bcbf..9bf7cf7b 100644 --- a/src/main/java/mil/nga/geopackage/extension/rtree/RTreeIndexExtension.java +++ b/src/main/java/mil/nga/geopackage/extension/rtree/RTreeIndexExtension.java @@ -41,6 +41,19 @@ public RTreeIndexExtension(GeoPackage geoPackage) { super(geoPackage); } + /** + * Constructor + * + * @param geoPackage + * GeoPackage + * @param geodesic + * index using geodesic bounds + * @since 6.6.5 + */ + public RTreeIndexExtension(GeoPackage geoPackage, boolean geodesic) { + super(geoPackage, geodesic); + } + /** * {@inheritDoc} */ @@ -126,6 +139,10 @@ public Object execute(GeoPackageGeometryData data) { Object value = null; GeometryEnvelope envelope = getEnvelope(data); if (envelope != null) { + int srsId = data.getSrsId(); + if (srsId > 0) { + envelope = geodesicEnvelope(envelope, srsId); + } value = envelope.getMinY(); } return value; @@ -144,6 +161,10 @@ public Object execute(GeoPackageGeometryData data) { Object value = null; GeometryEnvelope envelope = getEnvelope(data); if (envelope != null) { + int srsId = data.getSrsId(); + if (srsId > 0) { + envelope = geodesicEnvelope(envelope, srsId); + } value = envelope.getMaxY(); } return value; diff --git a/src/main/java/mil/nga/geopackage/features/index/FeatureIndexManager.java b/src/main/java/mil/nga/geopackage/features/index/FeatureIndexManager.java index eb23ef9d..f9378c30 100644 --- a/src/main/java/mil/nga/geopackage/features/index/FeatureIndexManager.java +++ b/src/main/java/mil/nga/geopackage/features/index/FeatureIndexManager.java @@ -81,6 +81,11 @@ public class FeatureIndexManager { */ private boolean continueOnError = true; + /** + * Index geometries using geodesic lines + */ + private boolean geodesic = false; + /** * Constructor * @@ -102,12 +107,46 @@ public FeatureIndexManager(GeoPackage geoPackage, String featureTable) { * feature DAO */ public FeatureIndexManager(GeoPackage geoPackage, FeatureDao featureDao) { + this(geoPackage, featureDao, false); + } + + /** + * Constructor + * + * @param geoPackage + * GeoPackage + * @param featureTable + * feature table + * @param geodesic + * index using geodesic bounds + * @since 6.6.5 + */ + public FeatureIndexManager(GeoPackage geoPackage, String featureTable, + boolean geodesic) { + this(geoPackage, geoPackage.getFeatureDao(featureTable), geodesic); + } + + /** + * Constructor + * + * @param geoPackage + * GeoPackage + * @param featureDao + * feature DAO + * @param geodesic + * index using geodesic bounds + * @since 6.6.5 + */ + public FeatureIndexManager(GeoPackage geoPackage, FeatureDao featureDao, + boolean geodesic) { this.featureDao = featureDao; - featureTableIndex = new FeatureTableIndex(geoPackage, featureDao); - RTreeIndexExtension rTreeExtension = new RTreeIndexExtension( - geoPackage); + this.geodesic = geodesic; + featureTableIndex = new FeatureTableIndex(geoPackage, featureDao, + geodesic); + RTreeIndexExtension rTreeExtension = new RTreeIndexExtension(geoPackage, + geodesic); rTreeIndexTableDao = rTreeExtension.getTableDao(featureDao); - manualFeatureQuery = new ManualFeatureQuery(featureDao); + manualFeatureQuery = new ManualFeatureQuery(featureDao, geodesic); // Set the default indexed check and query order indexLocationQueryOrder.add(FeatureIndexType.RTREE); @@ -189,6 +228,30 @@ public void setContinueOnError(boolean continueOnError) { this.continueOnError = continueOnError; } + /** + * Geometries indexed using geodesic lines + * + * @return geodesic flag + * @since 6.6.5 + */ + public boolean isGeodesic() { + return geodesic; + } + + /** + * Set the geodestic flag, true to index geodesic geometries + * + * @param geodesic + * index geodesic geometries flag + * @since 6.6.5 + */ + public void setGeodesic(boolean geodesic) { + this.geodesic = geodesic; + featureTableIndex.setGeodesic(geodesic); + rTreeIndexTableDao.getRTreeIndexExtension().setGeodesic(geodesic); + manualFeatureQuery.setGeodesic(geodesic); + } + /** * Prioritize the query location order. All types are placed at the front of * the query order in the order they are given. Omitting a location leaves diff --git a/src/main/java/mil/nga/geopackage/features/user/ManualFeatureQuery.java b/src/main/java/mil/nga/geopackage/features/user/ManualFeatureQuery.java index 4a4527b4..88554e0a 100644 --- a/src/main/java/mil/nga/geopackage/features/user/ManualFeatureQuery.java +++ b/src/main/java/mil/nga/geopackage/features/user/ManualFeatureQuery.java @@ -10,6 +10,7 @@ import mil.nga.proj.Projection; import mil.nga.sf.GeometryEnvelope; import mil.nga.sf.proj.GeometryTransform; +import mil.nga.sf.proj.ProjectionGeometryUtils; /** * Performs manual brute force queries against feature rows. See @@ -35,6 +36,11 @@ public class ManualFeatureQuery { */ protected double tolerance = .00000000000001; + /** + * Index geometries using geodesic lines + */ + private boolean geodesic = false; + /** * Constructor * @@ -42,7 +48,21 @@ public class ManualFeatureQuery { * feature DAO */ public ManualFeatureQuery(FeatureDao featureDao) { + this(featureDao, false); + } + + /** + * Constructor + * + * @param featureDao + * feature DAO + * @param geodesic + * index using geodesic bounds + * @since 6.6.5 + */ + public ManualFeatureQuery(FeatureDao featureDao, boolean geodesic) { this.featureDao = featureDao; + this.geodesic = geodesic; } /** @@ -92,6 +112,27 @@ public void setTolerance(double tolerance) { this.tolerance = tolerance; } + /** + * Geometries indexed using geodesic lines + * + * @return geodesic flag + * @since 6.6.5 + */ + public boolean isGeodesic() { + return geodesic; + } + + /** + * Set the geodestic flag, true to index geodesic geometries + * + * @param geodesic + * index geodesic geometries flag + * @since 6.6.5 + */ + public void setGeodesic(boolean geodesic) { + this.geodesic = geodesic; + } + /** * Query for features * @@ -561,6 +602,12 @@ public BoundingBox getBoundingBox() { .getGeometryEnvelope(); if (featureEnvelope != null) { + if (geodesic) { + featureEnvelope = ProjectionGeometryUtils + .geodesicEnvelope(featureEnvelope, + featureDao.getProjection()); + } + if (envelope == null) { envelope = featureEnvelope; } else { @@ -2144,6 +2191,11 @@ public ManualFeatureQueryResults query(boolean distinct, String[] columns, .getGeometryEnvelope(); if (envelope != null) { + if (geodesic) { + envelope = ProjectionGeometryUtils.geodesicEnvelope( + envelope, featureDao.getProjection()); + } + double minXMax = Math.max(minX, envelope.getMinX()); double maxXMin = Math.min(maxX, envelope.getMaxX()); double minYMax = Math.max(minY, envelope.getMinY()); @@ -3596,6 +3648,11 @@ public ManualFeatureQueryResults queryForChunk(boolean distinct, .getGeometryEnvelope(); if (envelope != null) { + if (geodesic) { + envelope = ProjectionGeometryUtils.geodesicEnvelope( + envelope, featureDao.getProjection()); + } + double minXMax = Math.max(minX, envelope.getMinX()); double maxXMin = Math.min(maxX, envelope.getMaxX()); double minYMax = Math.max(minY, envelope.getMinY()); diff --git a/src/main/java/mil/nga/geopackage/tiles/features/DefaultFeatureTiles.java b/src/main/java/mil/nga/geopackage/tiles/features/DefaultFeatureTiles.java index a8731366..c6659a52 100644 --- a/src/main/java/mil/nga/geopackage/tiles/features/DefaultFeatureTiles.java +++ b/src/main/java/mil/nga/geopackage/tiles/features/DefaultFeatureTiles.java @@ -95,6 +95,19 @@ public DefaultFeatureTiles(FeatureDao featureDao) { super(featureDao); } + /** + * Constructor + * + * @param featureDao + * feature dao + * @param geodesic + * draw geometries using geodesic lines + * @since 6.6.5 + */ + public DefaultFeatureTiles(FeatureDao featureDao, boolean geodesic) { + super(featureDao, geodesic); + } + /** * Constructor * @@ -108,6 +121,22 @@ public DefaultFeatureTiles(FeatureDao featureDao, float scale) { super(featureDao, scale); } + /** + * Constructor + * + * @param featureDao + * feature dao + * @param scale + * scale factor + * @param geodesic + * draw geometries using geodesic lines + * @since 6.6.5 + */ + public DefaultFeatureTiles(FeatureDao featureDao, float scale, + boolean geodesic) { + super(featureDao, scale, geodesic); + } + /** * Constructor * @@ -123,6 +152,24 @@ public DefaultFeatureTiles(FeatureDao featureDao, int width, int height) { super(featureDao, width, height); } + /** + * Constructor + * + * @param featureDao + * feature dao + * @param width + * drawn tile width + * @param height + * drawn tile height + * @param geodesic + * draw geometries using geodesic lines + * @since 6.6.5 + */ + public DefaultFeatureTiles(FeatureDao featureDao, int width, int height, + boolean geodesic) { + super(featureDao, width, height, geodesic); + } + /** * Constructor, auto creates the index manager for indexed tables and * feature styles for styled tables @@ -137,6 +184,23 @@ public DefaultFeatureTiles(GeoPackage geoPackage, FeatureDao featureDao) { super(geoPackage, featureDao); } + /** + * Constructor, auto creates the index manager for indexed tables and + * feature styles for styled tables + * + * @param geoPackage + * GeoPackage + * @param featureDao + * feature dao + * @param geodesic + * draw geometries using geodesic lines + * @since 6.6.5 + */ + public DefaultFeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, + boolean geodesic) { + super(geoPackage, featureDao, geodesic); + } + /** * Constructor, auto creates the index manager for indexed tables and * feature styles for styled tables @@ -154,6 +218,25 @@ public DefaultFeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, super(geoPackage, featureDao, scale); } + /** + * Constructor, auto creates the index manager for indexed tables and + * feature styles for styled tables + * + * @param geoPackage + * GeoPackage + * @param featureDao + * feature dao + * @param scale + * scale factor + * @param geodesic + * draw geometries using geodesic lines + * @since 6.6.5 + */ + public DefaultFeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, + float scale, boolean geodesic) { + super(geoPackage, featureDao, scale, geodesic); + } + /** * Constructor, auto creates the index manager for indexed tables and * feature styles for styled tables @@ -173,6 +256,27 @@ public DefaultFeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, super(geoPackage, featureDao, width, height); } + /** + * Constructor, auto creates the index manager for indexed tables and + * feature styles for styled tables + * + * @param geoPackage + * GeoPackage + * @param featureDao + * feature dao + * @param width + * drawn tile width + * @param height + * drawn tile height + * @param geodesic + * draw geometries using geodesic lines + * @since 6.6.5 + */ + public DefaultFeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, + int width, int height, boolean geodesic) { + super(geoPackage, featureDao, width, height, geodesic); + } + /** * Constructor, auto creates the index manager for indexed tables and * feature styles for styled tables @@ -194,6 +298,29 @@ public DefaultFeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, super(geoPackage, featureDao, scale, width, height); } + /** + * Constructor, auto creates the index manager for indexed tables and + * feature styles for styled tables + * + * @param geoPackage + * GeoPackage + * @param featureDao + * feature dao + * @param scale + * scale factor + * @param width + * drawn tile width + * @param height + * drawn tile height + * @param geodesic + * draw geometries using geodesic lines + * @since 6.6.5 + */ + public DefaultFeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, + float scale, int width, int height, boolean geodesic) { + super(geoPackage, featureDao, scale, width, height, geodesic); + } + /** * Is caching geometries enabled? * @@ -621,6 +748,9 @@ private Path2D getPath(double simplifyTolerance, BoundingBox boundingBox, List lineStringPoints = simplifyPoints(simplifyTolerance, lineString.getPoints()); + // Create a geodesic path of points if needed + lineStringPoints = geodesicPath(simplifyTolerance, lineStringPoints); + for (Point point : lineStringPoints) { Point projectedPoint = transform.transform(point); diff --git a/src/main/java/mil/nga/geopackage/tiles/features/FeatureTiles.java b/src/main/java/mil/nga/geopackage/tiles/features/FeatureTiles.java index 4eed908c..00dcb6d4 100644 --- a/src/main/java/mil/nga/geopackage/tiles/features/FeatureTiles.java +++ b/src/main/java/mil/nga/geopackage/tiles/features/FeatureTiles.java @@ -41,6 +41,7 @@ import mil.nga.sf.GeometryType; import mil.nga.sf.Point; import mil.nga.sf.proj.GeometryTransform; +import mil.nga.sf.proj.ProjectionGeometryUtils; import mil.nga.sf.util.GeometryUtils; /** @@ -57,12 +58,6 @@ public abstract class FeatureTiles { private static final Logger LOGGER = Logger .getLogger(FeatureTiles.class.getName()); - /** - * WGS84 Projection - */ - protected static final Projection WGS_84_PROJECTION = ProjectionFactory - .getProjection(ProjectionConstants.EPSG_WORLD_GEODETIC_SYSTEM); - /** * Web Mercator Projection */ @@ -191,6 +186,11 @@ public abstract class FeatureTiles { */ protected boolean simplifyGeometries = true; + /** + * Draw geometries using geodesic lines + */ + protected boolean geodesic = false; + /** * Scale factor */ @@ -203,7 +203,20 @@ public abstract class FeatureTiles { * feature dao */ public FeatureTiles(FeatureDao featureDao) { - this(null, featureDao); + this(featureDao, false); + } + + /** + * Constructor + * + * @param featureDao + * feature dao + * @param geodesic + * draw geometries using geodesic lines + * @since 6.6.5 + */ + public FeatureTiles(FeatureDao featureDao, boolean geodesic) { + this(null, featureDao, geodesic); } /** @@ -216,7 +229,22 @@ public FeatureTiles(FeatureDao featureDao) { * @since 3.2.0 */ public FeatureTiles(FeatureDao featureDao, float scale) { - this(null, featureDao, scale); + this(featureDao, scale, false); + } + + /** + * Constructor + * + * @param featureDao + * feature dao + * @param scale + * scale factor + * @param geodesic + * draw geometries using geodesic lines + * @since 6.6.5 + */ + public FeatureTiles(FeatureDao featureDao, float scale, boolean geodesic) { + this(null, featureDao, scale, geodesic); } /** @@ -231,7 +259,25 @@ public FeatureTiles(FeatureDao featureDao, float scale) { * @since 3.2.0 */ public FeatureTiles(FeatureDao featureDao, int width, int height) { - this(null, featureDao, width, height); + this(featureDao, width, height, false); + } + + /** + * Constructor + * + * @param featureDao + * feature dao + * @param width + * drawn tile width + * @param height + * drawn tile height + * @param geodesic + * draw geometries using geodesic lines + * @since 6.6.5 + */ + public FeatureTiles(FeatureDao featureDao, int width, int height, + boolean geodesic) { + this(null, featureDao, width, height, geodesic); } /** @@ -245,8 +291,25 @@ public FeatureTiles(FeatureDao featureDao, int width, int height) { * @since 3.2.0 */ public FeatureTiles(GeoPackage geoPackage, FeatureDao featureDao) { + this(geoPackage, featureDao, false); + } + + /** + * Constructor, auto creates the index manager for indexed tables and + * feature styles for styled tables + * + * @param geoPackage + * GeoPackage + * @param featureDao + * feature dao + * @param geodesic + * draw geometries using geodesic lines + * @since 6.6.5 + */ + public FeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, + boolean geodesic) { this(geoPackage, featureDao, TileUtils.TILE_PIXELS_HIGH, - TileUtils.TILE_PIXELS_HIGH); + TileUtils.TILE_PIXELS_HIGH, geodesic); } /** @@ -263,8 +326,27 @@ public FeatureTiles(GeoPackage geoPackage, FeatureDao featureDao) { */ public FeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, float scale) { + this(geoPackage, featureDao, scale, false); + } + + /** + * Constructor, auto creates the index manager for indexed tables and + * feature styles for styled tables + * + * @param geoPackage + * GeoPackage + * @param featureDao + * feature dao + * @param scale + * scale factor + * @param geodesic + * draw geometries using geodesic lines + * @since 6.6.5 + */ + public FeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, + float scale, boolean geodesic) { this(geoPackage, featureDao, scale, TileUtils.tileLength(scale), - TileUtils.tileLength(scale)); + TileUtils.tileLength(scale), geodesic); } /** @@ -283,8 +365,29 @@ public FeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, */ public FeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, int width, int height) { + this(geoPackage, featureDao, width, height, false); + } + + /** + * Constructor, auto creates the index manager for indexed tables and + * feature styles for styled tables + * + * @param geoPackage + * GeoPackage + * @param featureDao + * feature dao + * @param width + * drawn tile width + * @param height + * drawn tile height + * @param geodesic + * draw geometries using geodesic lines + * @since 6.6.5 + */ + public FeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, int width, + int height, boolean geodesic) { this(geoPackage, featureDao, TileUtils.tileScale(width, height), width, - height); + height, geodesic); } /** @@ -305,6 +408,29 @@ public FeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, int width, */ public FeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, float scale, int width, int height) { + this(geoPackage, featureDao, scale, width, height, false); + } + + /** + * Constructor, auto creates the index manager for indexed tables and + * feature styles for styled tables + * + * @param geoPackage + * GeoPackage + * @param featureDao + * feature dao + * @param scale + * scale factor + * @param width + * drawn tile width + * @param height + * drawn tile height + * @param geodesic + * draw geometries using geodesic lines + * @since 6.6.5 + */ + public FeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, + float scale, int width, int height, boolean geodesic) { this.featureDao = featureDao; if (featureDao != null) { @@ -316,6 +442,8 @@ public FeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, tileWidth = width; tileHeight = height; + this.geodesic = geodesic; + compressFormat = GeoPackageJavaProperties.getProperty( JavaPropertyConstants.FEATURE_TILES, JavaPropertyConstants.FEATURE_TILES_COMPRESS_FORMAT); @@ -351,7 +479,8 @@ public FeatureTiles(GeoPackage geoPackage, FeatureDao featureDao, if (geoPackage != null) { - indexManager = new FeatureIndexManager(geoPackage, featureDao); + indexManager = new FeatureIndexManager(geoPackage, featureDao, + geodesic); if (!indexManager.isIndexed()) { indexManager.close(); indexManager = null; @@ -943,6 +1072,27 @@ public void setSimplifyGeometries(boolean simplifyGeometries) { this.simplifyGeometries = simplifyGeometries; } + /** + * Are geometries drawn using geodesic lines? Default is false + * + * @return geodesic flag + * @since 6.6.5 + */ + public boolean isGeodesic() { + return geodesic; + } + + /** + * Set the geodestic flag, true to draw geodesic geometries + * + * @param geodesic + * draw geodesic geometries flag + * @since 6.6.5 + */ + public void setGeodesic(boolean geodesic) { + this.geodesic = geodesic; + } + /** * Draw the tile and get the bytes from the x, y, and zoom level * @@ -1358,6 +1508,27 @@ protected List simplifyPoints(double simplifyTolerance, return simplifiedPoints; } + /** + * When geodesic is enabled, create a geodesic path of points + * + * @param maxDistance + * max distance allowed between path points + * @param points + * ordered points + * @return geodesic path points + * @since 6.6.5 + */ + protected List geodesicPath(double maxDistance, List points) { + + List geodesicPath = points; + if (geodesic) { + geodesicPath = ProjectionGeometryUtils.geodesicPath(points, + maxDistance, projection); + } + + return geodesicPath; + } + /** * Get the feature style for the feature row and geometry type * diff --git a/src/test/java/mil/nga/geopackage/extension/nga/index/FeatureTableIndexCreateTest.java b/src/test/java/mil/nga/geopackage/extension/nga/index/FeatureTableIndexCreateTest.java index 7331793d..dee88620 100644 --- a/src/test/java/mil/nga/geopackage/extension/nga/index/FeatureTableIndexCreateTest.java +++ b/src/test/java/mil/nga/geopackage/extension/nga/index/FeatureTableIndexCreateTest.java @@ -29,7 +29,20 @@ public FeatureTableIndexCreateTest() { @Test public void testIndex() throws Exception { - FeatureTableIndexUtils.testIndex(geoPackage); + FeatureTableIndexUtils.testIndex(geoPackage, false); + + } + + /** + * Test index + * + * @throws Exception + * upon error + */ + @Test + public void testIndexGeodesic() throws Exception { + + FeatureTableIndexUtils.testIndex(geoPackage, true); } diff --git a/src/test/java/mil/nga/geopackage/extension/nga/index/FeatureTableIndexImportTest.java b/src/test/java/mil/nga/geopackage/extension/nga/index/FeatureTableIndexImportTest.java index 07af0780..9ec635ca 100644 --- a/src/test/java/mil/nga/geopackage/extension/nga/index/FeatureTableIndexImportTest.java +++ b/src/test/java/mil/nga/geopackage/extension/nga/index/FeatureTableIndexImportTest.java @@ -29,7 +29,20 @@ public FeatureTableIndexImportTest() { @Test public void testIndex() throws Exception { - FeatureTableIndexUtils.testIndex(geoPackage); + FeatureTableIndexUtils.testIndex(geoPackage, false); + + } + + /** + * Test index + * + * @throws Exception + * upon error + */ + @Test + public void testIndexGeodesic() throws Exception { + + FeatureTableIndexUtils.testIndex(geoPackage, true); } diff --git a/src/test/java/mil/nga/geopackage/extension/nga/index/FeatureTableIndexUtils.java b/src/test/java/mil/nga/geopackage/extension/nga/index/FeatureTableIndexUtils.java index 0cdf06f0..69729c89 100644 --- a/src/test/java/mil/nga/geopackage/extension/nga/index/FeatureTableIndexUtils.java +++ b/src/test/java/mil/nga/geopackage/extension/nga/index/FeatureTableIndexUtils.java @@ -24,6 +24,7 @@ import mil.nga.sf.GeometryEnvelope; import mil.nga.sf.Point; import mil.nga.sf.proj.GeometryTransform; +import mil.nga.sf.proj.ProjectionGeometryUtils; public class FeatureTableIndexUtils { @@ -31,9 +32,13 @@ public class FeatureTableIndexUtils { * Test index * * @param geoPackage + * GeoPackage + * @param geodesic + * index using geodesic bounds * @throws Exception */ - public static void testIndex(GeoPackage geoPackage) throws Exception { + public static void testIndex(GeoPackage geoPackage, boolean geodesic) + throws Exception { // Test indexing each feature table List featureTables = geoPackage.getFeatureTables(); @@ -41,7 +46,7 @@ public static void testIndex(GeoPackage geoPackage) throws Exception { FeatureDao featureDao = geoPackage.getFeatureDao(featureTable); FeatureTableIndex featureTableIndex = new FeatureTableIndex( - geoPackage, featureDao); + geoPackage, featureDao, geodesic); // Determine how many features have geometry envelopes or geometries int expectedCount = 0; @@ -100,7 +105,8 @@ public static void testIndex(GeoPackage geoPackage) throws Exception { .query(); while (featureTableResults.hasNext()) { GeometryIndex geometryIndex = featureTableResults.next(); - validateGeometryIndex(featureTableIndex, geometryIndex); + validateGeometryIndex(featureTableIndex, geometryIndex, + geodesic); resultCount++; } featureTableResults.close(); @@ -126,7 +132,8 @@ public static void testIndex(GeoPackage geoPackage) throws Exception { featureTableResults = featureTableIndex.query(envelope); while (featureTableResults.hasNext()) { GeometryIndex geometryIndex = featureTableResults.next(); - validateGeometryIndex(featureTableIndex, geometryIndex); + validateGeometryIndex(featureTableIndex, geometryIndex, + geodesic); if (geometryIndex.getGeomId() == testFeatureRow.getId()) { featureFound = true; } @@ -165,7 +172,8 @@ public static void testIndex(GeoPackage geoPackage) throws Exception { .query(transformedBoundingBox, projection); while (featureTableResults.hasNext()) { GeometryIndex geometryIndex = featureTableResults.next(); - validateGeometryIndex(featureTableIndex, geometryIndex); + validateGeometryIndex(featureTableIndex, geometryIndex, + geodesic); if (geometryIndex.getGeomId() == testFeatureRow.getId()) { featureFound = true; } @@ -194,7 +202,8 @@ public static void testIndex(GeoPackage geoPackage) throws Exception { featureTableResults = featureTableIndex.query(envelope); while (featureTableResults.hasNext()) { GeometryIndex geometryIndex = featureTableResults.next(); - validateGeometryIndex(featureTableIndex, geometryIndex); + validateGeometryIndex(featureTableIndex, geometryIndex, + geodesic); if (geometryIndex.getGeomId() == testFeatureRow.getId()) { featureFound = true; } @@ -353,13 +362,18 @@ public static void testDeleteAll(GeoPackage geoPackage) * @param geometryIndex */ private static void validateGeometryIndex( - FeatureTableIndex featureTableIndex, GeometryIndex geometryIndex) { + FeatureTableIndex featureTableIndex, GeometryIndex geometryIndex, + boolean geodesic) { FeatureRow featureRow = featureTableIndex.getFeatureRow(geometryIndex); TestCase.assertNotNull(featureRow); TestCase.assertEquals(featureTableIndex.getTableName(), geometryIndex.getTableName()); TestCase.assertEquals(geometryIndex.getGeomId(), featureRow.getId()); GeometryEnvelope envelope = featureRow.getGeometryEnvelope(); + if (geodesic) { + envelope = ProjectionGeometryUtils.geodesicEnvelope(envelope, + featureTableIndex.getProjection()); + } TestCase.assertNotNull(envelope); diff --git a/src/test/java/mil/nga/geopackage/extension/rtree/RTreeIndexExtensionCreateTest.java b/src/test/java/mil/nga/geopackage/extension/rtree/RTreeIndexExtensionCreateTest.java index 17b238ca..f8fb902d 100644 --- a/src/test/java/mil/nga/geopackage/extension/rtree/RTreeIndexExtensionCreateTest.java +++ b/src/test/java/mil/nga/geopackage/extension/rtree/RTreeIndexExtensionCreateTest.java @@ -29,7 +29,20 @@ public RTreeIndexExtensionCreateTest() { @Test public void testRTree() throws SQLException { - RTreeIndexExtensionUtils.testRTree(geoPackage); + RTreeIndexExtensionUtils.testRTree(geoPackage, false); + + } + + /** + * Test RTree with geodesic + * + * @throws SQLException + * upon error + */ + @Test + public void testRTreeGeodesic() throws SQLException { + + RTreeIndexExtensionUtils.testRTree(geoPackage, true); } diff --git a/src/test/java/mil/nga/geopackage/extension/rtree/RTreeIndexExtensionImportTest.java b/src/test/java/mil/nga/geopackage/extension/rtree/RTreeIndexExtensionImportTest.java index c531bfff..40195d94 100644 --- a/src/test/java/mil/nga/geopackage/extension/rtree/RTreeIndexExtensionImportTest.java +++ b/src/test/java/mil/nga/geopackage/extension/rtree/RTreeIndexExtensionImportTest.java @@ -22,14 +22,27 @@ public RTreeIndexExtensionImportTest() { /** * Test RTree - * + * * @throws SQLException * upon error */ @Test public void testRTree() throws SQLException { - RTreeIndexExtensionUtils.testRTree(geoPackage); + RTreeIndexExtensionUtils.testRTree(geoPackage, false); + + } + + /** + * Test RTree with geodesic + * + * @throws SQLException + * upon error + */ + @Test + public void testRTreeGeodesic() throws SQLException { + + RTreeIndexExtensionUtils.testRTree(geoPackage, true); } diff --git a/src/test/java/mil/nga/geopackage/extension/rtree/RTreeIndexExtensionUtils.java b/src/test/java/mil/nga/geopackage/extension/rtree/RTreeIndexExtensionUtils.java index 68a0566e..95fe3739 100644 --- a/src/test/java/mil/nga/geopackage/extension/rtree/RTreeIndexExtensionUtils.java +++ b/src/test/java/mil/nga/geopackage/extension/rtree/RTreeIndexExtensionUtils.java @@ -29,12 +29,16 @@ public class RTreeIndexExtensionUtils { * * @param geoPackage * GeoPackage + * @param geodesic + * index using geodesic bounds * @throws SQLException * upon error */ - public static void testRTree(GeoPackage geoPackage) throws SQLException { + public static void testRTree(GeoPackage geoPackage, boolean geodesic) + throws SQLException { - RTreeIndexExtension extension = new RTreeIndexExtension(geoPackage); + RTreeIndexExtension extension = new RTreeIndexExtension(geoPackage, + geodesic); List featureTables = geoPackage.getFeatureTables(); for (String featureTable : featureTables) { diff --git a/src/test/java/mil/nga/geopackage/tiles/features/FeatureTileGeneratorTest.java b/src/test/java/mil/nga/geopackage/tiles/features/FeatureTileGeneratorTest.java index 1292416a..52ffc093 100644 --- a/src/test/java/mil/nga/geopackage/tiles/features/FeatureTileGeneratorTest.java +++ b/src/test/java/mil/nga/geopackage/tiles/features/FeatureTileGeneratorTest.java @@ -42,7 +42,7 @@ public FeatureTileGeneratorTest() { */ @Test public void testTileGenerator() throws IOException, SQLException { - testTileGenerator(false, false, false); + testTileGenerator(false, false, false, false); } /** @@ -53,7 +53,7 @@ public void testTileGenerator() throws IOException, SQLException { */ @Test public void testTileGeneratorWithIndex() throws IOException, SQLException { - testTileGenerator(true, false, false); + testTileGenerator(true, false, false, false); } /** @@ -64,7 +64,7 @@ public void testTileGeneratorWithIndex() throws IOException, SQLException { */ @Test public void testTileGeneratorWithIcon() throws IOException, SQLException { - testTileGenerator(false, true, false); + testTileGenerator(false, true, false, false); } /** @@ -76,7 +76,19 @@ public void testTileGeneratorWithIcon() throws IOException, SQLException { @Test public void testTileGeneratorWithMaxFeatures() throws IOException, SQLException { - testTileGenerator(false, false, true); + testTileGenerator(false, false, true, false); + } + + /** + * Test tile generator + * + * @throws java.io.IOException + * @throws java.sql.SQLException + */ + @Test + public void testTileGeneratorWithGeodesic() + throws IOException, SQLException { + testTileGenerator(false, false, false, true); } /** @@ -88,7 +100,19 @@ public void testTileGeneratorWithMaxFeatures() @Test public void testTileGeneratorWithIndexAndIcon() throws IOException, SQLException { - testTileGenerator(true, true, false); + testTileGenerator(true, true, false, false); + } + + /** + * Test tile generator + * + * @throws java.io.IOException + * @throws java.sql.SQLException + */ + @Test + public void testTileGeneratorWithIndexAndIconAndGeodesic() + throws IOException, SQLException { + testTileGenerator(true, true, false, true); } /** @@ -100,21 +124,41 @@ public void testTileGeneratorWithIndexAndIcon() @Test public void testTileGeneratorWithIndexAndIconAndMaxFeatures() throws IOException, SQLException { - testTileGenerator(true, true, true); + testTileGenerator(true, true, true, false); + } + + /** + * Test tile generator + * + * @throws java.io.IOException + * @throws java.sql.SQLException + */ + @Test + public void testTileGeneratorWithIndexAndIconAndMaxFeaturesAndGeodesic() + throws IOException, SQLException { + testTileGenerator(true, true, true, true); } /** * Test tile generator * * @param index + * index features * @param useIcon + * true to use an icon instead of the default point * @param maxFeatures + * set max features + * @param geodesic + * draw geometries using geodesic lines * * @throws java.io.IOException + * upon error * @throws java.sql.SQLException + * upon error */ public void testTileGenerator(boolean index, boolean useIcon, - boolean maxFeatures) throws IOException, SQLException { + boolean maxFeatures, boolean geodesic) + throws IOException, SQLException { int minZoom = 0; int maxZoom = 4; @@ -124,11 +168,11 @@ public void testTileGenerator(boolean index, boolean useIcon, int num = FeatureTileUtils.insertFeatures(geoPackage, featureDao); FeatureTiles featureTiles = FeatureTileUtils - .createFeatureTiles(geoPackage, featureDao, useIcon); + .createFeatureTiles(geoPackage, featureDao, useIcon, geodesic); if (index) { FeatureIndexManager indexManager = new FeatureIndexManager( - geoPackage, featureDao); + geoPackage, featureDao, geodesic); featureTiles.setIndexManager(indexManager); indexManager.setIndexLocation(FeatureIndexType.GEOPACKAGE); int indexed = indexManager.index(); @@ -194,8 +238,9 @@ public void testTileGenerator(boolean index, boolean useIcon, TestCase.assertEquals(expectedTiles, tiles); - // TileWriter.writeTiles(geoPackage, "gen_feature_tiles", new File( - // "/Users/osbornb/Documents/generator/tiles"), null, null, true); + // TileWriter.writeTiles(geoPackage, "gen_feature_tiles", + // new File("/Users/osbornb/Documents/generator/tiles"), null, + // null, null, TileFormatType.XYZ, true); } diff --git a/src/test/java/mil/nga/geopackage/tiles/features/FeatureTileUtils.java b/src/test/java/mil/nga/geopackage/tiles/features/FeatureTileUtils.java index eddcffe1..c5c4262d 100644 --- a/src/test/java/mil/nga/geopackage/tiles/features/FeatureTileUtils.java +++ b/src/test/java/mil/nga/geopackage/tiles/features/FeatureTileUtils.java @@ -104,15 +104,20 @@ public static int insertFeatures(GeoPackage geoPackage, * Create a new feature tiles * * @param geoPackage + * GeoPackage * @param featureDao + * feature DAO * @param useIcon * true to use an icon instead of the default point + * @param geodesic + * draw geometries using geodesic lines * @return feature tiles */ public static FeatureTiles createFeatureTiles(GeoPackage geoPackage, - FeatureDao featureDao, boolean useIcon) { + FeatureDao featureDao, boolean useIcon, boolean geodesic) { - FeatureTiles featureTiles = new DefaultFeatureTiles(featureDao); + FeatureTiles featureTiles = new DefaultFeatureTiles(featureDao, + geodesic); if (useIcon) { BufferedImage icon = new BufferedImage(5, 5, diff --git a/src/test/java/mil/nga/geopackage/tiles/features/FeatureTilesTest.java b/src/test/java/mil/nga/geopackage/tiles/features/FeatureTilesTest.java index a80959ad..c597ad73 100644 --- a/src/test/java/mil/nga/geopackage/tiles/features/FeatureTilesTest.java +++ b/src/test/java/mil/nga/geopackage/tiles/features/FeatureTilesTest.java @@ -33,7 +33,17 @@ public FeatureTilesTest() { */ @Test public void testFeatureTiles() throws SQLException { - testFeatureTiles(false); + testFeatureTiles(false, false); + } + + /** + * Test feature tiles + * + * @throws java.sql.SQLException + */ + @Test + public void testFeatureTilesWithGeodesic() throws SQLException { + testFeatureTiles(false, true); } /** @@ -43,29 +53,43 @@ public void testFeatureTiles() throws SQLException { */ @Test public void testFeatureTilesWithIcon() throws SQLException { - testFeatureTiles(true); + testFeatureTiles(true, false); + } + + /** + * Test feature tiles + * + * @throws java.sql.SQLException + */ + @Test + public void testFeatureTilesWithIconGeodesic() throws SQLException { + testFeatureTiles(true, true); } /** * Test feature tiles * * @param useIcon + * true to use an icon instead of the default point + * @param geodesic + * draw geometries using geodesic lines * * @throws java.sql.SQLException */ - public void testFeatureTiles(boolean useIcon) throws SQLException { + public void testFeatureTiles(boolean useIcon, boolean geodesic) + throws SQLException { FeatureDao featureDao = FeatureTileUtils.createFeatureDao(geoPackage); int num = FeatureTileUtils.insertFeatures(geoPackage, featureDao); FeatureTiles featureTiles = FeatureTileUtils - .createFeatureTiles(geoPackage, featureDao, useIcon); + .createFeatureTiles(geoPackage, featureDao, useIcon, geodesic); try { FeatureIndexManager indexManager = new FeatureIndexManager( - geoPackage, featureDao); + geoPackage, featureDao, geodesic); featureTiles.setIndexManager(indexManager); indexManager.setIndexLocation(FeatureIndexType.GEOPACKAGE);