From 16a21bf14d41737faf764b7203a4d7a63c515779 Mon Sep 17 00:00:00 2001 From: qGYdXbY2 <47661341+qGYdXbY2@users.noreply.github.com> Date: Tue, 28 Nov 2023 14:13:43 +0100 Subject: [PATCH 1/5] tilling: shrink tile (top,right) Signed-off-by: qGYdXbY2 <47661341+qGYdXbY2@users.noreply.github.com> --- .../com/here/xyz/models/geojson/HQuad.java | 7 +++-- .../xyz/models/geojson/WebMercatorTile.java | 4 +-- .../xyz/models/geojson/coordinates/BBox.java | 10 +++++++ .../here/xyz/models/geojson/HQuadTest.java | 2 +- .../com/here/xyz/psql/DatabaseMaintainer.java | 2 +- .../src/main/resources/xyz_ext.sql | 30 +++++++++++++++++-- 6 files changed, 46 insertions(+), 9 deletions(-) diff --git a/xyz-models/src/main/java/com/here/xyz/models/geojson/HQuad.java b/xyz-models/src/main/java/com/here/xyz/models/geojson/HQuad.java index 276d67afd3..185fe52270 100644 --- a/xyz-models/src/main/java/com/here/xyz/models/geojson/HQuad.java +++ b/xyz-models/src/main/java/com/here/xyz/models/geojson/HQuad.java @@ -95,8 +95,7 @@ private void validate() { throw new IllegalArgumentException("Quadkey '"+quadkey+"' is invalid!"); } - - public BBox getBoundingBox() { + private BBox _getBoundingBox() { double width = 360.0 / (1L << level); double heigth = level == 0 ? 180 : 360.0 / (1L << level); @@ -108,6 +107,10 @@ public BBox getBoundingBox() { return new BBox(west, south, east, north); } + public BBox getBoundingBox() { + return BBox.tile_shrink( _getBoundingBox() ); + } + @Override public String toString() { diff --git a/xyz-models/src/main/java/com/here/xyz/models/geojson/WebMercatorTile.java b/xyz-models/src/main/java/com/here/xyz/models/geojson/WebMercatorTile.java index ed26a58421..362808c435 100644 --- a/xyz-models/src/main/java/com/here/xyz/models/geojson/WebMercatorTile.java +++ b/xyz-models/src/main/java/com/here/xyz/models/geojson/WebMercatorTile.java @@ -503,7 +503,7 @@ public BBox getBBox(boolean clone) { double minLat = 90.0 - 360.0 * Math.atan(Math.exp(-y1 * 2.0 * Math.PI)) / Math.PI; double maxLon = 360.0 * x1; - bbox = new BBox(minLon, minLat, maxLon, maxLat); + bbox = BBox.tile_shrink( new BBox(minLon, minLat, maxLon, maxLat) ); } if (clone) { return new BBox(bbox.minLon(), bbox.minLat(), bbox.maxLon(), bbox.maxLat()); @@ -551,7 +551,7 @@ public BBox getExtendedBBox(int buffer) { double maxLon = 360.0 * x1; eBuffer = buffer; - eBbox = new BBox(minLon, minLat, maxLon, maxLat); + eBbox = BBox.tile_shrink(new BBox(minLon, minLat, maxLon, maxLat) ); return eBbox; } diff --git a/xyz-models/src/main/java/com/here/xyz/models/geojson/coordinates/BBox.java b/xyz-models/src/main/java/com/here/xyz/models/geojson/coordinates/BBox.java index 91a3d536c3..e867851639 100644 --- a/xyz-models/src/main/java/com/here/xyz/models/geojson/coordinates/BBox.java +++ b/xyz-models/src/main/java/com/here/xyz/models/geojson/coordinates/BBox.java @@ -248,4 +248,14 @@ public double heightInDegree() { // Must not be, but lets fix it anyway: return (min + 90d) - (max + 90d); } + + public static BBox tile_shrink(BBox bbox) + { double delta = 0.000000001f; + return new BBox( bbox.getWest(), + bbox.getSouth(), + bbox.getEast() < 180.0 ? bbox.getEast() - delta : bbox.getEast(), + bbox.getNorth() < 90.0 ? bbox.getNorth() - delta : bbox.getNorth() + ); + } + } diff --git a/xyz-models/src/test/java/com/here/xyz/models/geojson/HQuadTest.java b/xyz-models/src/test/java/com/here/xyz/models/geojson/HQuadTest.java index a236d30774..750c7a5644 100644 --- a/xyz-models/src/test/java/com/here/xyz/models/geojson/HQuadTest.java +++ b/xyz-models/src/test/java/com/here/xyz/models/geojson/HQuadTest.java @@ -6,7 +6,7 @@ import static org.junit.Assert.assertEquals; public class HQuadTest { - BBox bbox = new BBox().withEast(13.38134765625).withNorth(52.53662109375).withWest(13.359375).withSouth(52.5146484375); + BBox bbox = BBox.tile_shrink( new BBox().withEast(13.38134765625).withNorth(52.53662109375).withWest(13.359375).withSouth(52.5146484375) ); String base4QK = "12201203120220"; String base10QK = "377894440"; diff --git a/xyz-psql-connector/src/main/java/com/here/xyz/psql/DatabaseMaintainer.java b/xyz-psql-connector/src/main/java/com/here/xyz/psql/DatabaseMaintainer.java index 20bb54a21b..7b86d27445 100644 --- a/xyz-psql-connector/src/main/java/com/here/xyz/psql/DatabaseMaintainer.java +++ b/xyz-psql-connector/src/main/java/com/here/xyz/psql/DatabaseMaintainer.java @@ -49,7 +49,7 @@ public class DatabaseMaintainer { private static final Logger logger = LogManager.getLogger(); /** Is used to check against xyz_ext_version() */ - public static final int XYZ_EXT_VERSION = 183; + public static final int XYZ_EXT_VERSION = 184; public static final int H3_CORE_VERSION = 108; diff --git a/xyz-psql-connector/src/main/resources/xyz_ext.sql b/xyz-psql-connector/src/main/resources/xyz_ext.sql index 19b88b765a..40b6b5818f 100644 --- a/xyz-psql-connector/src/main/resources/xyz_ext.sql +++ b/xyz-psql-connector/src/main/resources/xyz_ext.sql @@ -140,7 +140,7 @@ DROP FUNCTION IF EXISTS qk_s_get_fc_of_tiles_txt_v4( CREATE OR REPLACE FUNCTION xyz_ext_version() RETURNS integer AS $BODY$ - select 183 + select 184 $BODY$ LANGUAGE sql IMMUTABLE; ---------- @@ -2783,12 +2783,29 @@ END; $$ LANGUAGE plpgsql IMMUTABLE; ------------------------------------------------ ------------------------------------------------ -CREATE OR REPLACE FUNCTION xyz_qk_lrc2bbox(rowY integer, colX integer, level integer) +CREATE OR REPLACE FUNCTION _xyz_qk_lrc2bbox(rowY integer, colX integer, level integer) RETURNS geometry AS $$ select st_transform(ST_TileEnvelope(level, colX, rowY), 4326) $$ LANGUAGE sql IMMUTABLE; + +create or replace function htile_shrink( tile geometry ) returns geometry + language sql immutable strict +as $$ + select ST_MakeEnvelope( st_xmin( tile ), st_ymin( tile ), + case st_xmax(tile) < 180.0 when true then st_xmax(tile) - 0.000000001 else 180.0 end, + case st_ymax(tile) < 90.0 when true then st_ymax(tile) - 0.000000001 else 90.0 end, + 4326) +$$; + +CREATE OR REPLACE FUNCTION xyz_qk_lrc2bbox(rowY integer, colX integer, level integer) + RETURNS geometry AS +$$ + select htile_shrink( _xyz_qk_lrc2bbox(rowY, colX, level) ) +$$ +LANGUAGE sql IMMUTABLE; + ------------------------------------------------ ------------------------------------------------ CREATE OR REPLACE FUNCTION xyz_qk_qk2bbox( qid text ) @@ -3181,7 +3198,7 @@ end $$; ------------------------------------------------ ------------------------------------------------ -CREATE OR REPLACE FUNCTION htile_bbox(rowy integer, colx integer, lev integer) RETURNS public.geometry +CREATE OR REPLACE FUNCTION _htile_bbox(rowy integer, colx integer, lev integer) RETURNS geometry LANGUAGE plpgsql IMMUTABLE STRICT AS $$ declare @@ -3208,6 +3225,13 @@ begin return st_setsrid(ST_MakeEnvelope( minX, minY, maxX, maxY ),4326); end $$; + +create or replace function htile_bbox(rowy integer, colx integer, lev integer) returns geometry + language sql immutable strict +as $$ + select htile_shrink( _htile_bbox( rowy, colx, lev ) ) +$$; + ------------------------------------------------ ------------------------------------------------ CREATE OR REPLACE FUNCTION htile_number_to_base(num bigint, base integer) RETURNS text From 4a8497ab492b0ff8827b352d256acb6954fa2460 Mon Sep 17 00:00:00 2001 From: qGYdXbY2 <47661341+qGYdXbY2@users.noreply.github.com> Date: Tue, 28 Nov 2023 16:04:02 +0100 Subject: [PATCH 2/5] fix test readByTileWithQuadbinClustering Signed-off-by: qGYdXbY2 <47661341+qGYdXbY2@users.noreply.github.com> --- .../here/xyz/psql/query/GetFeaturesByBBoxClustered.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/xyz-psql-connector/src/main/java/com/here/xyz/psql/query/GetFeaturesByBBoxClustered.java b/xyz-psql-connector/src/main/java/com/here/xyz/psql/query/GetFeaturesByBBoxClustered.java index 7d02008543..49e2b8de9d 100644 --- a/xyz-psql-connector/src/main/java/com/here/xyz/psql/query/GetFeaturesByBBoxClustered.java +++ b/xyz-psql-connector/src/main/java/com/here/xyz/psql/query/GetFeaturesByBBoxClustered.java @@ -282,7 +282,14 @@ public SQLQuery buildQuadbinClusteringQuery(GetFeaturesByBBoxEvent event, PSQLXy boolean isTileRequest = (event instanceof GetFeaturesByTileEvent) && ((GetFeaturesByTileEvent) event).getMargin() == 0, clippedOnBbox = (!isTileRequest && event.getClip()); - final WebMercatorTile tile = getTileFromBbox(bbox); + final WebMercatorTile tile; + + if( isTileRequest ) + { GetFeaturesByTileEvent tevnt = (GetFeaturesByTileEvent) event; + tile = WebMercatorTile.forWeb(tevnt.getLevel(),tevnt.getX(),tevnt.getY()); + } + else + tile = getTileFromBbox(bbox); if( (absResolution - tile.level) >= 0 ) // case of valid absResolution convert it to a relative resolution and add both resolutions relResolution = Math.min( relResolution + (absResolution - tile.level), 5); From 62d0b2b7fde5cb7f6790a16ad56799ba90b750ee Mon Sep 17 00:00:00 2001 From: qGYdXbY2 <47661341+qGYdXbY2@users.noreply.github.com> Date: Tue, 28 Nov 2023 17:34:58 +0100 Subject: [PATCH 3/5] fix test testGetTileWithVersion Signed-off-by: qGYdXbY2 <47661341+qGYdXbY2@users.noreply.github.com> --- .../java/com/here/xyz/hub/rest/VersioningGetFeaturesIT.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xyz-hub-test/src/test/java/com/here/xyz/hub/rest/VersioningGetFeaturesIT.java b/xyz-hub-test/src/test/java/com/here/xyz/hub/rest/VersioningGetFeaturesIT.java index f598ef738f..0bbc4bdb96 100644 --- a/xyz-hub-test/src/test/java/com/here/xyz/hub/rest/VersioningGetFeaturesIT.java +++ b/xyz-hub-test/src/test/java/com/here/xyz/hub/rest/VersioningGetFeaturesIT.java @@ -111,7 +111,7 @@ public void testGetTileWithVersion() { given() .headers(getAuthHeaders(AuthProfile.ACCESS_ALL)) .when() - .get(getSpacesPath() + "/" + SPACE_ID + "/tile/quadkey/03333?version=0") + .get(getSpacesPath() + "/" + SPACE_ID + "/tile/quadkey/12222?version=0") .then() .statusCode(OK.code()) .body("features.size()", equalTo(1)) @@ -130,7 +130,7 @@ public void testGetTileWithVersion() { given() .headers(getAuthHeaders(AuthProfile.ACCESS_ALL)) .when() - .get(getSpacesPath() + "/" + SPACE_ID + "/tile/quadkey/03333?version=1") + .get(getSpacesPath() + "/" + SPACE_ID + "/tile/quadkey/12222?version=1") .then() .statusCode(OK.code()) .body("features.size()", equalTo(0)); From 0c4693b5d0f976894a397286af70c709137d3224 Mon Sep 17 00:00:00 2001 From: qGYdXbY2 <47661341+qGYdXbY2@users.noreply.github.com> Date: Mon, 26 Aug 2024 16:38:53 +0200 Subject: [PATCH 4/5] adapt test data to tile Signed-off-by: qGYdXbY2 <47661341+qGYdXbY2@users.noreply.github.com> --- xyz-hub-test/src/test/resources/xyz/hub/processedData.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xyz-hub-test/src/test/resources/xyz/hub/processedData.json b/xyz-hub-test/src/test/resources/xyz/hub/processedData.json index 63e078a0e2..f93b7de81f 100644 --- a/xyz-hub-test/src/test/resources/xyz/hub/processedData.json +++ b/xyz-hub-test/src/test/resources/xyz/hub/processedData.json @@ -1668,7 +1668,7 @@ "geometry": { "type": "Point", "coordinates": [ - -75.16845703125, + -75.16845703225, 39.9014 ] }, From f82149019823f597ed505e579df980c2bd935545 Mon Sep 17 00:00:00 2001 From: qGYdXbY2 <47661341+qGYdXbY2@users.noreply.github.com> Date: Mon, 26 Aug 2024 18:13:33 +0200 Subject: [PATCH 5/5] test Signed-off-by: qGYdXbY2 <47661341+qGYdXbY2@users.noreply.github.com> --- .../java/com/here/xyz/hub/rest/ReadFeatureApiIT.java | 11 ++++++----- .../src/test/resources/xyz/hub/processedData.json | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/xyz-hub-test/src/test/java/com/here/xyz/hub/rest/ReadFeatureApiIT.java b/xyz-hub-test/src/test/java/com/here/xyz/hub/rest/ReadFeatureApiIT.java index 0d826744ec..70edbf047c 100644 --- a/xyz-hub-test/src/test/java/com/here/xyz/hub/rest/ReadFeatureApiIT.java +++ b/xyz-hub-test/src/test/java/com/here/xyz/hub/rest/ReadFeatureApiIT.java @@ -438,7 +438,7 @@ public void testReadingFeatureByHereTileId() { accept(APPLICATION_GEO_JSON). headers(getAuthHeaders(AuthProfile.ACCESS_OWNER_1_ADMIN)). when(). - get(getSpacesPath() + "/x-psql-test/tile/here/5148795631.geojson"). + get(getSpacesPath() + "/x-psql-test/tile/here/5148795642.geojson"). then(). statusCode(OK.code()). body("features.size()", equalTo(1)). @@ -453,12 +453,13 @@ public void testReadingFeatureByHereTileIdFalse() { accept(APPLICATION_GEO_JSON). headers(getAuthHeaders(AuthProfile.ACCESS_OWNER_1_ADMIN)). when(). - get(getSpacesPath() + "/x-psql-test/tile/here/5148795642.geojson"). + get(getSpacesPath() + "/x-psql-test/tile/here/5148795631.geojson"). then(). statusCode(OK.code()). - body("features.size()", equalTo(1)). - body("features[0].id", equalTo("Q2390739")). - body("features[0].properties.name", equalTo("John F. Kennedy Stadium")); + body("features.size()", equalTo(0)); +// .body("features.size()", equalTo(1)) +// .body("features[0].id", equalTo("Q2390739")). +// .body("features[0].properties.name", equalTo("John F. Kennedy Stadium")); } diff --git a/xyz-hub-test/src/test/resources/xyz/hub/processedData.json b/xyz-hub-test/src/test/resources/xyz/hub/processedData.json index f93b7de81f..63e078a0e2 100644 --- a/xyz-hub-test/src/test/resources/xyz/hub/processedData.json +++ b/xyz-hub-test/src/test/resources/xyz/hub/processedData.json @@ -1668,7 +1668,7 @@ "geometry": { "type": "Point", "coordinates": [ - -75.16845703225, + -75.16845703125, 39.9014 ] },