From 60e3e0ad25a1f1a1bfa3d62a4b9ddc4431a47e95 Mon Sep 17 00:00:00 2001 From: Julian Psotta Date: Tue, 17 Oct 2023 16:13:29 +0200 Subject: [PATCH] fix(fastisochrones): use correct edge filter fast-isochrones snapping (cherry picked from commit f4d9909c809813e988fb3ad3815584959957885d) --- CHANGELOG.md | 1 + .../fast/FastIsochroneMapBuilder.java | 23 ++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd2bf87fea..395920d8e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -86,6 +86,7 @@ RELEASING: - Fix the max visited nodes bug for fast-isochrones ([#1538](https://github.com/GIScience/openrouteservice/pull/1538)) - adjust weighting of heat stress routing to avoid large detours - fix isochrones snapping ([#1566](https://github.com/GIScience/openrouteservice/pull/1566)) +- fix fast-isochrones snapping ([#1572](https://github.com/GIScience/openrouteservice/pull/1572)) ## [7.1.0] - 2023-06-13 ### Added diff --git a/ors-engine/src/main/java/org/heigit/ors/isochrones/builders/fast/FastIsochroneMapBuilder.java b/ors-engine/src/main/java/org/heigit/ors/isochrones/builders/fast/FastIsochroneMapBuilder.java index 2da9392c87..a61c97c82b 100644 --- a/ors-engine/src/main/java/org/heigit/ors/isochrones/builders/fast/FastIsochroneMapBuilder.java +++ b/ors-engine/src/main/java/org/heigit/ors/isochrones/builders/fast/FastIsochroneMapBuilder.java @@ -16,18 +16,22 @@ import com.carrotsearch.hppc.IntHashSet; import com.carrotsearch.hppc.IntObjectMap; import com.carrotsearch.hppc.cursors.IntObjectCursor; +import com.graphhopper.GraphHopper; import com.graphhopper.coll.GHIntObjectHashMap; import com.graphhopper.routing.SPTEntry; +import com.graphhopper.routing.ev.Subnetwork; import com.graphhopper.routing.querygraph.QueryGraph; -import com.graphhopper.routing.util.EdgeFilter; -import com.graphhopper.routing.util.HikeFlagEncoder; -import com.graphhopper.routing.util.TraversalMode; +import com.graphhopper.routing.util.*; import com.graphhopper.routing.weighting.Weighting; import com.graphhopper.storage.Graph; import com.graphhopper.storage.GraphHopperStorage; import com.graphhopper.storage.index.Snap; import com.graphhopper.util.*; import com.graphhopper.util.shapes.GHPoint3D; +import org.heigit.ors.util.ProfileTools; +import org.locationtech.jts.geom.*; +import org.locationtech.jts.index.quadtree.Quadtree; +import org.locationtech.jts.operation.union.UnaryUnionOp; import org.apache.log4j.Logger; import org.heigit.ors.common.TravelRangeType; import org.heigit.ors.exceptions.InternalServerException; @@ -135,8 +139,15 @@ public IsochroneMap compute(IsochroneSearchParameters parameters) throws Excepti Weighting weighting = ORSWeightingFactory.createIsochroneWeighting(searchcontext, parameters.getRangeType()); Coordinate loc = parameters.getLocation(); + + FlagEncoder encoder = searchcontext.getEncoder(); + String profileName = ProfileTools.makeProfileName(encoder.toString(), weighting.getName(), false); + GraphHopper gh = searchcontext.getGraphHopper(); + GraphHopperStorage graphHopperStorage = gh.getGraphHopperStorage(); + EdgeFilter defaultSnapFilter = new DefaultSnapFilter(weighting, graphHopperStorage.getEncodingManager().getBooleanEncodedValue(Subnetwork.key(profileName))); + ORSEdgeFilterFactory edgeFilterFactory = new ORSEdgeFilterFactory(); - EdgeFilterSequence edgeFilterSequence = getEdgeFilterSequence(edgeFilterFactory); + EdgeFilterSequence edgeFilterSequence = getEdgeFilterSequence(edgeFilterFactory, defaultSnapFilter); Snap res = searchcontext.getGraphHopper().getLocationIndex().findClosest(loc.y, loc.x, edgeFilterSequence); List snaps = new ArrayList<>(1); snaps.add(res); @@ -255,9 +266,9 @@ public IsochroneMap compute(IsochroneSearchParameters parameters) throws Excepti return isochroneMap; } - private EdgeFilterSequence getEdgeFilterSequence(ORSEdgeFilterFactory edgeFilterFactory) throws Exception { + private EdgeFilterSequence getEdgeFilterSequence(ORSEdgeFilterFactory edgeFilterFactory, EdgeFilter prependFilter) throws Exception { EdgeFilterSequence edgeFilterSequence = new EdgeFilterSequence(); - EdgeFilter edgeFilter = edgeFilterFactory.createEdgeFilter(searchcontext.getProperties(), searchcontext.getEncoder(), searchcontext.getGraphHopper().getGraphHopperStorage()); + EdgeFilter edgeFilter = edgeFilterFactory.createEdgeFilter(searchcontext.getProperties(), searchcontext.getEncoder(), searchcontext.getGraphHopper().getGraphHopperStorage(), prependFilter); edgeFilterSequence.add(edgeFilter); edgeFilterSequence.add(new AvoidFeaturesEdgeFilter(AvoidFeatureFlags.FERRIES, searchcontext.getGraphHopper().getGraphHopperStorage())); return edgeFilterSequence;