Skip to content

Commit c181d59

Browse files
committed
Merge branch 'release/5.1.0'
2 parents b3e1193 + 83b6768 commit c181d59

File tree

17 files changed

+307
-16
lines changed

17 files changed

+307
-16
lines changed

client-hc/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
<parent>
2828
<groupId>com.stuart.platform.graphhopper</groupId>
2929
<artifactId>graphhopper-parent</artifactId>
30-
<version>5.0.2</version>
30+
<version>5.1.0</version>
3131
</parent>
3232

3333
<dependencies>

core/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<parent>
1313
<groupId>com.stuart.platform.graphhopper</groupId>
1414
<artifactId>graphhopper-parent</artifactId>
15-
<version>5.0.2</version>
15+
<version>5.1.0</version>
1616
</parent>
1717

1818
<properties>

core/src/main/java/com/graphhopper/GraphHopper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import com.graphhopper.routing.util.parsers.*;
4646
import com.graphhopper.routing.weighting.Weighting;
4747
import com.graphhopper.routing.weighting.custom.CustomWeighting;
48+
import com.graphhopper.speeds.WaySpeedsProvider;
4849
import com.graphhopper.storage.*;
4950
import com.graphhopper.storage.index.LocationIndex;
5051
import com.graphhopper.storage.index.LocationIndexTree;
@@ -63,6 +64,7 @@
6364
import java.nio.file.Paths;
6465
import java.text.DateFormat;
6566
import java.util.*;
67+
import java.util.concurrent.TimeUnit;
6668
import java.util.stream.Collectors;
6769

6870
import static com.graphhopper.util.GHUtility.readCountries;
@@ -136,7 +138,6 @@ public class GraphHopper {
136138
private String encodedValuesString = "";
137139
private String vehiclesString = "";
138140

139-
140141
public GraphHopper setEncodedValuesString(String encodedValuesString) {
141142
this.encodedValuesString = encodedValuesString;
142143
return this;
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package com.graphhopper;
2+
3+
import com.graphhopper.config.Profile;
4+
import com.graphhopper.routing.ev.*;
5+
import com.graphhopper.routing.util.AllEdgesIterator;
6+
import com.graphhopper.speeds.SpeedKmByHour;
7+
import com.graphhopper.speeds.WaySpeedsProvider;
8+
import org.slf4j.Logger;
9+
import org.slf4j.LoggerFactory;
10+
11+
import java.util.List;
12+
import java.util.Optional;
13+
import java.util.concurrent.TimeUnit;
14+
import java.util.stream.Collectors;
15+
16+
public class GraphHopperCustomSpeeds extends GraphHopper {
17+
18+
private static final Logger logger = LoggerFactory.getLogger(GraphHopperCustomSpeeds.class);
19+
20+
private WaySpeedsProvider speedsProvider;
21+
22+
public GraphHopperCustomSpeeds(WaySpeedsProvider speedsProvider) {
23+
24+
this.speedsProvider = speedsProvider;
25+
}
26+
27+
@Override
28+
protected void importPublicTransit() {
29+
30+
logger.info("Start Custom Speeds Provider");
31+
long startTime = System.nanoTime();
32+
33+
List<String> vehicles = this.getProfiles().stream().map(Profile::getVehicle).distinct().collect(Collectors.toList());
34+
35+
List<DecimalEncodedValue> speedEncoders = vehicles.stream().map(
36+
vehicle -> this.getEncodingManager().getDecimalEncodedValue(VehicleSpeed.key(vehicle))).collect(Collectors.toList());
37+
setSpeedsFor(speedEncoders);
38+
39+
long endTime = System.nanoTime();
40+
long elapsed = (endTime - startTime);
41+
long durationInMillis = TimeUnit.NANOSECONDS.toMillis(elapsed);
42+
logger.info("End Custom Speeds Provider : Graph processed in " + durationInMillis);
43+
}
44+
45+
private Optional<Double> speedFor(int osmWayId, RoadClass roadClass) {
46+
47+
Optional<Double> waySpeed = speedsProvider.speedForWay(osmWayId).map(SpeedKmByHour::getSpeed);
48+
49+
if (waySpeed.isPresent()) {
50+
return waySpeed;
51+
} else {
52+
return speedsProvider.speedForRoadClass(roadClass).map(SpeedKmByHour::getSpeed);
53+
}
54+
}
55+
56+
private void setSpeedsFor(List<DecimalEncodedValue> speedEncoders) {
57+
IntEncodedValue OSMWayIDEncoder = this.getEncodingManager().getIntEncodedValue(OSMWayID.KEY);
58+
DecimalEncodedValue maxSpeedEncoder = this.getEncodingManager().getDecimalEncodedValue(MaxSpeed.KEY);
59+
EnumEncodedValue<RoadClass> roadClassEncoder = this.getEncodingManager().getEnumEncodedValue(RoadClass.KEY, RoadClass.class);
60+
61+
AllEdgesIterator iter = this.getBaseGraph().getAllEdges();
62+
while (iter.next()) {
63+
64+
int edge = iter.getEdge();
65+
66+
//Normal Direction
67+
double maxSpeed = iter.get(maxSpeedEncoder);
68+
int osmWayId = iter.get(OSMWayIDEncoder);
69+
RoadClass roadClass = iter.get(roadClassEncoder);
70+
Optional<Double> maybeCustomSpeed = speedFor(osmWayId, roadClass);
71+
72+
if (maybeCustomSpeed.isPresent()) {
73+
double customSpeed = maybeCustomSpeed.get();
74+
if (customSpeed < maxSpeed) {
75+
speedEncoders.forEach(encoder -> {
76+
double speed = iter.get(encoder);
77+
logger.debug("Replace " + speed + " with " + customSpeed + " for edge " + edge);
78+
iter.set(encoder, customSpeed);
79+
});
80+
} else {
81+
logger.warn("Custom Speed (" + customSpeed + ") > MaxSpeed ( " + maxSpeed + ") for edge " + edge + ",so it will be ignored");
82+
}
83+
}
84+
85+
//Reverse Direction
86+
int osmWayIdReverse = iter.getReverse(OSMWayIDEncoder);
87+
double maxSpeedReverse = iter.getReverse(maxSpeedEncoder);
88+
RoadClass roadClassReverse = iter.getReverse(roadClassEncoder);
89+
Optional<Double> maybeCustomSpeedReverse = speedFor(osmWayIdReverse, roadClassReverse);
90+
91+
if (maybeCustomSpeedReverse.isPresent()) {
92+
double customSpeedReverse = maybeCustomSpeedReverse.get();
93+
if (customSpeedReverse < maxSpeedReverse) {
94+
speedEncoders.forEach(encoder -> {
95+
if (encoder.isStoreTwoDirections()) {
96+
double speed = iter.getReverse(encoder);
97+
logger.debug("Replace " + speed + " with " + customSpeedReverse + " for edge reverse " + edge);
98+
iter.setReverse(encoder, customSpeedReverse);
99+
}
100+
});
101+
} else {
102+
logger.warn("Custom Speed (" + customSpeedReverse + ") > MaxSpeed ( " + maxSpeedReverse + ") for edge reverse " + edge + ",so it will be ignored");
103+
}
104+
}
105+
106+
}
107+
}
108+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.graphhopper.speeds;
2+
3+
import java.util.Objects;
4+
5+
public class SpeedKmByHour {
6+
7+
private double speed;
8+
9+
public SpeedKmByHour(double speed) {
10+
this.speed = speed;
11+
}
12+
13+
public double getSpeed() {
14+
return speed;
15+
}
16+
17+
@Override
18+
public boolean equals(Object o) {
19+
if (this == o) return true;
20+
if (o == null || getClass() != o.getClass()) return false;
21+
SpeedKmByHour that = (SpeedKmByHour) o;
22+
return Double.compare(speed, that.speed) == 0;
23+
}
24+
25+
@Override
26+
public int hashCode() {
27+
return Objects.hash(speed);
28+
}
29+
30+
@Override
31+
public String toString() {
32+
return "SpeedKmByHour{" +
33+
"speed=" + speed +
34+
'}';
35+
}
36+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.graphhopper.speeds;
2+
3+
import com.graphhopper.routing.ev.RoadClass;
4+
5+
import java.util.Optional;
6+
7+
public interface WaySpeedsProvider {
8+
Optional<SpeedKmByHour> speedForWay(long osmWayId);
9+
Optional<SpeedKmByHour> speedForRoadClass(RoadClass roadClass);
10+
}
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
/*
2+
* Licensed to GraphHopper GmbH under one or more contributor
3+
* license agreements. See the NOTICE file distributed with this work for
4+
* additional information regarding copyright ownership.
5+
*
6+
* GraphHopper GmbH licenses this file to you under the Apache License,
7+
* Version 2.0 (the "License"); you may not use this file except in
8+
* compliance with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
package com.graphhopper;
19+
20+
import com.graphhopper.config.CHProfile;
21+
import com.graphhopper.config.Profile;
22+
import com.graphhopper.routing.ev.RoadClass;
23+
import com.graphhopper.speeds.SpeedKmByHour;
24+
import com.graphhopper.speeds.WaySpeedsProvider;
25+
import com.graphhopper.util.*;
26+
import org.junit.jupiter.api.AfterEach;
27+
import org.junit.jupiter.api.BeforeEach;
28+
import org.junit.jupiter.api.Test;
29+
30+
import java.io.File;
31+
import java.util.*;
32+
33+
import static java.util.Arrays.asList;
34+
import static org.junit.jupiter.api.Assertions.*;
35+
36+
/**
37+
* @author Peter Karich
38+
*/
39+
public class GraphHopperCustomSpeedsTest {
40+
41+
public static final String DIR = "../core/files";
42+
43+
// map locations
44+
private static final String MONACO = DIR + "/monaco.osm.gz";
45+
46+
// when creating GH instances make sure to use this as the GH location such that it will be cleaned between tests
47+
private static final String GH_LOCATION = "target/graphhopper-test-gh";
48+
private static final String GH_LOCATION_CUSTOM_SPEEDS = "target/graphhopper-test-gh-custom_speeds";
49+
50+
@BeforeEach
51+
@AfterEach
52+
public void setup() {
53+
54+
Helper.removeDir(new File(GH_LOCATION));
55+
Helper.removeDir(new File(GH_LOCATION_CUSTOM_SPEEDS));
56+
}
57+
58+
class CustomWaySpeedProvider implements WaySpeedsProvider {
59+
60+
@Override
61+
public Optional<SpeedKmByHour> speedForWay(long osmWayId) {
62+
return Optional.of(new SpeedKmByHour(10.10));
63+
}
64+
65+
@Override
66+
public Optional<SpeedKmByHour> speedForRoadClass(RoadClass roadClass) {
67+
return Optional.of(new SpeedKmByHour(10.1));
68+
}
69+
}
70+
71+
@Test
72+
public void testDynamicSpeedProvider() {
73+
final String bikeProfile = "bike_profile";
74+
final String carProfile = "car_profile";
75+
List<Profile> profiles = asList(
76+
new Profile(bikeProfile).setVehicle("bike"),
77+
new Profile(carProfile).setVehicle("car")
78+
);
79+
80+
GraphHopper hopper = new GraphHopper().
81+
setGraphHopperLocation(GH_LOCATION).
82+
setOSMFile(MONACO).
83+
setProfiles(profiles).
84+
setStoreOnFlush(true);
85+
hopper.getCHPreparationHandler().setCHProfiles(
86+
new CHProfile(bikeProfile),
87+
new CHProfile(carProfile)
88+
);
89+
90+
GraphHopper hopperCustomSpeeds = new GraphHopperCustomSpeeds(new CustomWaySpeedProvider()).
91+
setGraphHopperLocation(GH_LOCATION_CUSTOM_SPEEDS).
92+
setOSMFile(MONACO).
93+
setProfiles(profiles).
94+
setStoreOnFlush(true)
95+
.setEncodedValuesString("roundabout, road_class, road_class_link, road_environment, max_speed, road_access, ferry_speed, bike_network, get_off_bike, smoothness, osm_way_id");
96+
hopperCustomSpeeds.getCHPreparationHandler().setCHProfiles(
97+
new CHProfile(bikeProfile),
98+
new CHProfile(carProfile)
99+
);
100+
101+
hopper.importOrLoad();
102+
hopperCustomSpeeds.importOrLoad();
103+
104+
GHResponse rsp = hopper.route(new GHRequest(43.73005, 7.415707, 43.741522, 7.42826)
105+
.setProfile(carProfile));
106+
ResponsePath res = rsp.getBest();
107+
assertFalse(rsp.hasErrors(), rsp.getErrors().toString());
108+
assertEquals(205, res.getTime() / 1000f, 1);
109+
assertEquals(2837, res.getDistance(), 1);
110+
111+
GHResponse rspSpeeds = hopperCustomSpeeds.route(new GHRequest(43.73005, 7.415707, 43.741522, 7.42826)
112+
.setProfile(carProfile));
113+
ResponsePath resSpeeds = rspSpeeds.getBest();
114+
assertFalse(rspSpeeds.hasErrors(), rspSpeeds.getErrors().toString());
115+
assertEquals(893, resSpeeds.getTime() / 1000f, 1);
116+
assertEquals(2481, resSpeeds.getDistance(), 1);
117+
118+
119+
GHResponse rspBike = hopper.route(new GHRequest(43.73005, 7.415707, 43.741522, 7.42826)
120+
.setProfile(bikeProfile));
121+
ResponsePath resBike = rspBike.getBest();
122+
assertFalse(rspBike.hasErrors(), rspBike.getErrors().toString());
123+
assertEquals(536, resBike.getTime() / 1000f, 1);
124+
assertEquals(2521, resBike.getDistance(), 1);
125+
126+
GHResponse rspBikeSpeeds = hopperCustomSpeeds.route(new GHRequest(43.73005, 7.415707, 43.741522, 7.42826)
127+
.setProfile(bikeProfile));
128+
ResponsePath resBikeSpeeds = rspBikeSpeeds.getBest();
129+
assertFalse(rspBikeSpeeds.hasErrors(), rspBikeSpeeds.getErrors().toString());
130+
assertEquals(834, resBikeSpeeds.getTime() / 1000f, 1);
131+
assertEquals(2318, resBikeSpeeds.getDistance(), 1);
132+
133+
}
134+
135+
}
136+

coverage/pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<parent>
1212
<groupId>com.stuart.platform.graphhopper</groupId>
1313
<artifactId>graphhopper-parent</artifactId>
14-
<version>5.0.2</version>
14+
<version>5.1.0</version>
1515
<relativePath>../pom.xml</relativePath>
1616
</parent>
1717

@@ -33,7 +33,7 @@
3333
<dependency>
3434
<groupId>com.stuart.platform.graphhopper</groupId>
3535
<artifactId>graphhopper-example</artifactId>
36-
<version>5.0.2</version>
36+
<version>5.1.0</version>
3737
</dependency>
3838
<dependency>
3939
<groupId>com.stuart.platform.graphhopper</groupId>
@@ -91,4 +91,4 @@
9191
</plugins>
9292
</build>
9393

94-
</project>
94+
</project>

example/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<parent>
1010
<groupId>com.stuart.platform.graphhopper</groupId>
1111
<artifactId>graphhopper-parent</artifactId>
12-
<version>5.0.2</version>
12+
<version>5.1.0</version>
1313
</parent>
1414

1515
<dependencies>

map-matching/pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
<parent>
99
<groupId>com.stuart.platform.graphhopper</groupId>
1010
<artifactId>graphhopper-parent</artifactId>
11-
<version>5.0.2</version>
11+
<version>5.1.0</version>
1212
</parent>
1313

1414
<dependencies>
@@ -59,4 +59,4 @@
5959
</plugin>
6060
</plugins>
6161
</build>
62-
</project>
62+
</project>

navigation/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<parent>
1010
<groupId>com.stuart.platform.graphhopper</groupId>
1111
<artifactId>graphhopper-parent</artifactId>
12-
<version>5.0.2</version>
12+
<version>5.1.0</version>
1313
</parent>
1414

1515
<dependencies>

0 commit comments

Comments
 (0)