HeatStressWeighting.java
package org.heigit.ors.routing.graphhopper.extensions.weighting;
import com.graphhopper.routing.querygraph.EdgeIteratorStateHelper;
import com.graphhopper.routing.util.FlagEncoder;
import com.graphhopper.routing.weighting.FastestWeighting;
import com.graphhopper.storage.GraphHopperStorage;
import com.graphhopper.util.EdgeIteratorState;
import com.graphhopper.util.PMap;
import org.heigit.ors.routing.graphhopper.extensions.storages.CsvGraphStorage;
import org.heigit.ors.routing.graphhopper.extensions.storages.GraphStorageUtils;
public class HeatStressWeighting extends FastestWeighting {
private final CsvGraphStorage heatStressStorage;
private final byte[] buffer;
private final double weightingFactor;
private final String columnName;
private final int columnIndex; // Caches index of columnName for performance reasons
public HeatStressWeighting(FlagEncoder encoder, PMap map, GraphHopperStorage graphStorage) {
super(encoder, map);
heatStressStorage = GraphStorageUtils.getGraphExtension(graphStorage, CsvGraphStorage.class);
buffer = new byte[heatStressStorage.numEntries()];
weightingFactor = map.getDouble("factor", 1);
this.columnName = map.getString("column", "");
this.columnIndex = heatStressStorage.columnIndex(columnName);
}
@Override
public double calcEdgeWeight(EdgeIteratorState edgeState, boolean reverse) {
if (heatStressStorage != null) {
int stressLevel = heatStressStorage.getEdgeValue(EdgeIteratorStateHelper.getOriginalEdge(edgeState), columnIndex, buffer);
// Convert value range from [0,100] to [1,2] to avoid large detours and multiply by user weighting in API request
return (stressLevel * 0.01 * weightingFactor) + 1;
}
return 1.0;
}
@Override
public boolean equals(Object obj) {
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final HeatStressWeighting other = (HeatStressWeighting) obj;
return toString().equals(other.toString());
}
@Override
public int hashCode() {
return ("HeatStressWeighting" + this).hashCode();
}
}