Skip to content

Commit

Permalink
fix(fastisochrones): use correct edge filter fast-isochrones snapping
Browse files Browse the repository at this point in the history
(cherry picked from commit f4d9909)
  • Loading branch information
MichaelsJP committed Oct 18, 2023
1 parent d3a0b67 commit 5b94591
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 12 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<Snap> snaps = new ArrayList<>(1);
snaps.add(res);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -325,7 +336,7 @@ private List<Double> createCoordinateListFromGeometry(Geometry preprocessedGeome
continue;
}

LinearRing ring = ((Polygon) preprocessedGeometry.getGeometryN(j)).getExteriorRing();
LinearRing ring = (LinearRing) ((Polygon) preprocessedGeometry.getGeometryN(j)).getExteriorRing();
for (int i = 0; i < ring.getNumPoints(); i++) {
contourCoordinates.add(ring.getCoordinateN(i).y);
contourCoordinates.add(ring.getCoordinateN(i).x);
Expand Down Expand Up @@ -400,8 +411,8 @@ private void createPolyFromPoints(Set<Geometry> isochroneGeometries, GeometryCol
try {
ConcaveHullOpenSphere ch = new ConcaveHullOpenSphere(points, convertSmoothingFactorToDistance(smoothingFactor, maxRadius), false);
concaveHull = ch.getConcaveHull();
if (concaveHull instanceof Polygon polygon) {
ring = polygon.getExteriorRing();
if (concaveHull instanceof Polygon) {
ring = (LinearRing) ((Polygon) concaveHull).getExteriorRing();
List<Coordinate> coordinates = new ArrayList<>(ring.getNumPoints());
for (int i = 0; i < ring.getNumPoints(); i++) {
coordinates.add(ring.getCoordinateN(i));
Expand Down Expand Up @@ -731,9 +742,9 @@ private String printCell(List<Double> coordinates, int cellId) {
statement.append("{\"type\": \"Feature\",\"properties\": {\"name\": \"").append(cellId).append("\"},\"geometry\": {\"type\": \"Polygon\",\"coordinates\": [[");
int i;
for (i = coordinates.size() - 2; i > 0; i -= 2) {
statement.append("[").append(String.valueOf(coordinates.get(i + 1)), 0, Math.min(8, String.valueOf(coordinates.get(i + 1)).length())).append(",").append(String.valueOf(coordinates.get(i)), 0, Math.min(8, String.valueOf(coordinates.get(i)).length())).append("],");
statement.append("[").append(String.valueOf(coordinates.get(i + 1)).substring(0, Math.min(8, String.valueOf(coordinates.get(i + 1)).length()))).append(",").append(String.valueOf(coordinates.get(i)).substring(0, Math.min(8, String.valueOf(coordinates.get(i)).length()))).append("],");
}
statement.append("[").append(String.valueOf(coordinates.get(coordinates.size() - 1)), 0, Math.min(8, String.valueOf(coordinates.get(coordinates.size() - 1)).length())).append(",").append(String.valueOf(coordinates.get(coordinates.size() - 2)), 0, Math.min(8, String.valueOf(coordinates.get(coordinates.size() - 2)).length())).append("]");
statement.append("[").append(String.valueOf(coordinates.get(coordinates.size() - 1)).substring(0, Math.min(8, String.valueOf(coordinates.get(coordinates.size() - 1)).length()))).append(",").append(String.valueOf(coordinates.get(coordinates.size() - 2)).substring(0, Math.min(8, String.valueOf(coordinates.get(coordinates.size() - 2)).length()))).append("]");

statement.append("]]}},");
statement.append(System.lineSeparator());
Expand Down Expand Up @@ -782,7 +793,7 @@ private PointList expandAndBufferPointList(PointList list, double bufferSize, do
double dy2 = dx * scale;
extendedList.add(lat0 + dy2, lon0 + dx2);
extendedList.add(lat0 - dy2, lon0 - dx2);
if (i == list.size() - 2) {
if(i == list.size() - 2) {
extendedList.add(lat1 + dy2, lon1 + dx2);
extendedList.add(lat1 - dy2, lon1 - dx2);
}
Expand Down

0 comments on commit 5b94591

Please sign in to comment.