Skip to content

Commit 17d1200

Browse files
committed
feat: optimize tiling process.
1 parent a2df747 commit 17d1200

2 files changed

Lines changed: 46 additions & 14 deletions

File tree

mago-terrainer/src/main/java/com/gaia3d/terrain/tile/TerrainElevationData.java

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ public class TerrainElevationData {
5454
private int rasterHeight = -1;
5555
private boolean hasCoverageNoData = false;
5656
private double coverageNoDataValue = Double.NaN;
57+
private double inverseLongitudeRange = Double.NaN;
58+
private double inverseLatitudeRange = Double.NaN;
5759
private boolean rasterInitializationLogged = false;
5860
private boolean useDirectRasterAccess = false;
5961
private int rasterDataKind = 0;
@@ -96,6 +98,8 @@ public void deleteCoverage() {
9698
this.rasterSampleModelTranslateY = 0;
9799
this.hasCoverageNoData = false;
98100
this.coverageNoDataValue = Double.NaN;
101+
this.inverseLongitudeRange = Double.NaN;
102+
this.inverseLatitudeRange = Double.NaN;
99103
this.rasterInitializationLogged = false;
100104
this.useDirectRasterAccess = false;
101105
this.rasterDataKind = RASTER_KIND_GENERIC;
@@ -189,8 +193,9 @@ public double getElevation(double lonDeg, double latDeg, boolean[] intersects) {
189193
}
190194
Vector2i size = gridCoverage2DSize;
191195

192-
double unitaryX = (lonDeg - this.geographicExtension.getMinLongitudeDeg()) / this.geographicExtension.getLongitudeRangeDegree();
193-
double unitaryY = 1.0 - (latDeg - this.geographicExtension.getMinLatitudeDeg()) / this.geographicExtension.getLatitudeRangeDegree();
196+
ensureGeographicScaleInitialized();
197+
double unitaryX = (lonDeg - this.geographicExtension.getMinLongitudeDeg()) * this.inverseLongitudeRange;
198+
double unitaryY = 1.0 - (latDeg - this.geographicExtension.getMinLatitudeDeg()) * this.inverseLatitudeRange;
194199

195200
int geoTiffRasterHeight = size.y;
196201
int geoTiffRasterWidth = size.x;
@@ -251,10 +256,10 @@ private double calcBilinearInterpolation(double x, double y, int geoTiffWidth, i
251256
rowNext = geoTiffHeight - 1;
252257
}
253258

254-
double value00 = readGridValueDirect(column, row);
255-
double value01 = readGridValueDirect(column, rowNext);
256-
double value10 = readGridValueDirect(columnNext, row);
257-
double value11 = readGridValueDirect(columnNext, rowNext);
259+
double value00 = readGridValueFast(column, row);
260+
double value01 = readGridValueFast(column, rowNext);
261+
double value10 = readGridValueFast(columnNext, row);
262+
double value11 = readGridValueFast(columnNext, rowNext);
258263

259264
// Ignore noDataValue samples.
260265
double noDataValue = globalOptions.getNoDataValue();
@@ -273,6 +278,17 @@ private double calcBilinearInterpolation(double x, double y, int geoTiffWidth, i
273278
return value0 + factorX * (value1 - value0);
274279
}
275280

281+
private void ensureGeographicScaleInitialized() {
282+
if (!Double.isNaN(this.inverseLongitudeRange) && !Double.isNaN(this.inverseLatitudeRange)) {
283+
return;
284+
}
285+
286+
double longitudeRange = this.geographicExtension.getLongitudeRangeDegree();
287+
double latitudeRange = this.geographicExtension.getLatitudeRangeDegree();
288+
this.inverseLongitudeRange = longitudeRange != 0.0 ? 1.0 / longitudeRange : 0.0;
289+
this.inverseLatitudeRange = latitudeRange != 0.0 ? 1.0 / latitudeRange : 0.0;
290+
}
291+
276292
private boolean ensureRasterInitialized() {
277293
if (this.raster != null) {
278294
return true;
@@ -404,6 +420,17 @@ private double readGridValueDirect(int x, int y) {
404420
return value;
405421
}
406422

423+
private double readGridValueFast(int x, int y) {
424+
double value = useDirectRasterAccess ? readSampleUnchecked(x, y) : raster.getSampleDouble(x, y, 0);
425+
if (Double.isNaN(value)) {
426+
return globalOptions.getNoDataValue();
427+
}
428+
if (hasCoverageNoData && value == coverageNoDataValue) {
429+
return globalOptions.getNoDataValue();
430+
}
431+
return value;
432+
}
433+
407434
private double readSample(int x, int y) {
408435
if (!useDirectRasterAccess) {
409436
return raster.getSampleDouble(x, y, 0);

mago-terrainer/src/main/java/com/gaia3d/terrain/tile/TileMatrix.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -947,7 +947,7 @@ public boolean mustRefineTriangle(TerrainTriangle triangle) throws TransformExce
947947
double equatorialRadius = GlobalOptions.getInstance().getCelestialBody().getEquatorialRadius();
948948
double bboxMaxLengthInMeters = Math.toRadians(bboxMaxLength) * equatorialRadius;
949949

950-
int currL = triangle.getOwnerTileIndices().getL();
950+
int currL = tileIndices.getL();
951951

952952
double tileSize = TileWgs84Utils.getTileSizeInMetersByDepth(currL);
953953
double scale = bboxMaxLengthInMeters / tileSize;
@@ -962,18 +962,16 @@ public boolean mustRefineTriangle(TerrainTriangle triangle) throws TransformExce
962962

963963
// if the triangle size is very small, then do not refine**********************
964964
// Calculate the maxLength of the triangle in meters
965-
this.listVertices.clear();
966-
this.listHalfEdges.clear();
967-
double triangleMaxLengthMeters = triangle.getTriangleMaxSizeInMeters(this.listVertices, this.listHalfEdges);
968-
double minTriangleSizeForDepth = this.manager.getMinTriangleSizeForTileDepth(triangle.getOwnerTileIndices().getL());
965+
double triangleMaxLengthMeters = Math.toRadians(Math.max(bboxTriangle.getLengthX(), bboxTriangle.getLengthY())) * equatorialRadius;
966+
double minTriangleSizeForDepth = this.manager.getMinTriangleSizeForTileDepth(currL);
969967

970968
if (triangleMaxLengthMeters < minTriangleSizeForDepth) {
971969
triangle.setRefineChecked(true);
972970
log.debug("Filtered by Min Triangle Size : L : " + tileIndices.getL() + " # triangleMaxLengthMeters : " + triangleMaxLengthMeters + " # minTriangleSizeForDepth : " + minTriangleSizeForDepth);
973971
return false;
974972
}
975973

976-
double maxTriangleSizeForDepth = this.manager.getMaxTriangleSizeForTileDepth(triangle.getOwnerTileIndices().getL());
974+
double maxTriangleSizeForDepth = this.manager.getMaxTriangleSizeForTileDepth(currL);
977975
if (triangleMaxLengthMeters > maxTriangleSizeForDepth) {
978976
log.debug("Filtered by Max Triangle Size : L : " + tileIndices.getL() + " # triangleMaxLengthMeters : " + triangleMaxLengthMeters + " # maxTriangleSizeForDepth : " + maxTriangleSizeForDepth);
979977
return true;
@@ -1070,6 +1068,11 @@ public boolean mustRefineTriangle(TerrainTriangle triangle) throws TransformExce
10701068
int deltaXAC = rasterTriangleP1.x - rasterTriangleP3.x;
10711069

10721070
double denominator = deltaYBC * deltaXAC + deltaXCB * deltaYAC;
1071+
if (denominator == 0.0) {
1072+
triangle.setRefineChecked(true);
1073+
return false;
1074+
}
1075+
double inverseDenominator = 1.0 / denominator;
10731076

10741077
double startLonDeg = tileRaster.getLonDeg(startCol); // here contains the semiDeltaLonDeg, for the pixel center
10751078
double startLatDeg = tileRaster.getLatDeg(startRow); // here contains the semiDeltaLatDeg, for the pixel center
@@ -1087,6 +1090,7 @@ public boolean mustRefineTriangle(TerrainTriangle triangle) throws TransformExce
10871090
for (int col = startCol; col <= endCol; col++) {
10881091
rowAux = 0;
10891092
posX = startLonDeg + colAux * deltaLonDeg;
1093+
int colOffsetFromP3 = col - rasterTriangleP3.x;
10901094
for (int row = startRow; row <= endRow; row++) {
10911095

10921096
// skip the 4 corners of the triangle's bounding rectangle
@@ -1106,12 +1110,13 @@ public boolean mustRefineTriangle(TerrainTriangle triangle) throws TransformExce
11061110

11071111
// check if the pixel (col, row) intersects the rasterTriangle
11081112
intersects = false;
1109-
double alpha = (deltaYBC * (col - rasterTriangleP3.x) + deltaXCB * (row - rasterTriangleP3.y)) / denominator;
1113+
int rowOffsetFromP3 = row - rasterTriangleP3.y;
1114+
double alpha = (deltaYBC * colOffsetFromP3 + deltaXCB * rowOffsetFromP3) * inverseDenominator;
11101115
if (alpha < 0 || alpha > 1) {
11111116
rowAux++;
11121117
continue;
11131118
}
1114-
double beta = (deltaYCA * (col - rasterTriangleP3.x) + deltaXAC * (row - rasterTriangleP3.y)) / denominator;
1119+
double beta = (deltaYCA * colOffsetFromP3 + deltaXAC * rowOffsetFromP3) * inverseDenominator;
11151120
if (beta < 0 || beta > 1) {
11161121
rowAux++;
11171122
continue;

0 commit comments

Comments
 (0)