From a3c3b1e17bf57b61089d238c07e50766a827ee85 Mon Sep 17 00:00:00 2001 From: afischerdev Date: Sat, 15 Mar 2025 15:36:08 +0100 Subject: [PATCH] exclude some areas from collection --- .../main/java/btools/router/AreaReader.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/brouter-core/src/main/java/btools/router/AreaReader.java b/brouter-core/src/main/java/btools/router/AreaReader.java index b302eb2..86e5be7 100644 --- a/brouter-core/src/main/java/btools/router/AreaReader.java +++ b/brouter-core/src/main/java/btools/router/AreaReader.java @@ -26,16 +26,17 @@ public class AreaReader { int used = 0; for (int idxLat = -scale; idxLat <= scale; idxLat++) { for (int idxLon = -scale; idxLon <= scale; idxLon++) { + if (ignoreCenter(maxscale, idxLon, idxLat)) continue; int tmplon = wp.ilon + cellsize * idxLon; int tmplat = wp.ilat + cellsize * idxLat; - if (getDirectData(tmplon, tmplat, rc, expctxWay, searchRect, ais)) used++; + if (getDirectData(tmplon, tmplat, rc, expctxWay, searchRect, ais, maxscale > 7)) used++; count++; } } } - public boolean getDirectData(int inlon, int inlat, RoutingContext rc, BExpressionContextWay expctxWay, OsmNogoPolygon searchRect, List ais) { + public boolean getDirectData(int inlon, int inlat, RoutingContext rc, BExpressionContextWay expctxWay, OsmNogoPolygon searchRect, List ais, boolean checkBorder) { int lonDegree = inlon / 1000000; int latDegree = inlat / 1000000; int lonMod5 = (int) lonDegree % 5; @@ -96,7 +97,13 @@ public class AreaReader { tmplat2 = lat + cellsize * (subLatIdx + 1); dataRect.addVertex(tmplon2, tmplat2); - boolean intersects = searchRect.intersects(dataRect.points.get(0).x, dataRect.points.get(0).y, dataRect.points.get(2).x, dataRect.points.get(2).y); + // check for quadrant border + boolean intersects = checkBorder && dataRect.intersects(searchRect.points.get(0).x, searchRect.points.get(0).y, searchRect.points.get(2).x, searchRect.points.get(2).y); + if (!intersects && checkBorder) intersects = dataRect.intersects(searchRect.points.get(1).x, searchRect.points.get(1).y, searchRect.points.get(2).x, searchRect.points.get(3).y); + if (intersects) { + return false; + } + intersects = searchRect.intersects(dataRect.points.get(0).x, dataRect.points.get(0).y, dataRect.points.get(2).x, dataRect.points.get(2).y); if (!intersects) intersects = searchRect.intersects(dataRect.points.get(1).x, dataRect.points.get(1).y, dataRect.points.get(3).x, dataRect.points.get(3).y); if (!intersects) @@ -151,6 +158,14 @@ public class AreaReader { return false; } + boolean ignoreCenter(int maxscale, int idxLon, int idxLat) { + int centerScale = (int) Math.round(maxscale * .2) -1; + if (centerScale < 0) return false; + if (idxLon >= -centerScale && idxLon <= centerScale && + idxLat >= -centerScale && idxLat <= centerScale) return true; + return false; + } + /* in this case the polygon is 'only' a rectangle */