After update to 8.0 from 5.3 I tried to rewrite one of our custom encoder to TagParsers. There had to be an internal change in graphhopper or I made some weird mistake.
Old encoder:
class PisteEncoder : AbstractFlagEncoder(4, 1.0, 0) {
init {
avgSpeedEnc = DecimalEncodedValueImpl(EncodingManager.getKey(name, "average_speed"), speedBits, speedFactor, false)
restrictedValues.clear()
blockFords(false)
}
override fun createEncodedValues(registerNewEncodedValue: MutableList<EncodedValue?>) {
super.createEncodedValues(registerNewEncodedValue)
registerNewEncodedValue.add(avgSpeedEnc)
}
override fun getTransportationMode(): TransportationMode = TransportationMode.FOOT
override fun getAccess(way: ReaderWay): EncodingManager.Access {
return EncodingManager.Access.WAY
}
override fun applyWayTags(way: ReaderWay?, edge: EdgeIteratorState?) {
}
override fun handleWayTags(edgeFlags: IntsRef, way: ReaderWay): IntsRef {
if (way.isPisteNordic()) {
avgSpeedEnc.setDecimal(false, edgeFlags, 5.0)
accessEnc.setBool(false, edgeFlags, way.isPisteNordic())
accessEnc.setBool(true, edgeFlags, way.isPisteNordic())
}
return edgeFlags
}
private fun ReaderWay.isPisteNordic(): Boolean {
return getTag("piste:type") == "nordic"
}
}
New approach:
Access:
class PisteAccessParser(lookup: EncodedValueLookup, properties: PMap) : TagParser {
private val accessEnc = lookup.getBooleanEncodedValue(VehicleAccess.key(properties.getString("name", "piste")))
private fun ReaderWay.isPisteNordic(): Boolean {
return getTag("piste:type") == "nordic"
}
override fun handleWayTags(edgeId: Int, edgeIntAccess: EdgeIntAccess?, way: ReaderWay, relationFlags: IntsRef?) {
if (way.isPisteNordic()) {
accessEnc.setBool(false, edgeId, edgeIntAccess, true)
accessEnc.setBool(true, edgeId, edgeIntAccess, true)
}
}
}
Priority:
class PistePriorityParser(lookup: EncodedValueLookup, properties: PMap) : TagParser {
private fun ReaderWay.isPisteNordic(): Boolean {
return getTag("piste:type") == "nordic"
}
private val priorityWayEncoder = lookup.getDecimalEncodedValue(VehiclePriority.key(properties.getString("name", "piste")))
override fun handleWayTags(edgeId: Int, edgeIntAccess: EdgeIntAccess, way: ReaderWay, relationFlags: IntsRef) {
if (way.isPisteNordic()) {
priorityWayEncoder.setDecimal(false, edgeId, edgeIntAccess, PriorityCode.getValue(PriorityCode.BEST.value))
} else
priorityWayEncoder.setDecimal(false, edgeId, edgeIntAccess, PriorityCode.getValue(PriorityCode.EXCLUDE.value))
}
}
Average speed:
class PisteAverageSpeedParser(lookup: EncodedValueLookup, properties: PMap) : AbstractAverageSpeedParser(
lookup.getDecimalEncodedValue(VehicleSpeed.key(properties.getString("name", "piste"))),
lookup.getDecimalEncodedValue(FerrySpeed.KEY),
) {
override fun handleWayTags(edgeId: Int, edgeIntAccess: EdgeIntAccess, way: ReaderWay) {
if (way.isPisteNordic()) {
setSpeed(false, edgeId, edgeIntAccess, 5.0)
}
}
private fun ReaderWay.isPisteNordic(): Boolean {
return getTag("piste:type") == "nordic"
}
}
EncodedValues are created as foot with name change:
configuration.putObject("name", "piste")
VehicleEncodedValues.foot(configuration)
VehicleTagParsers:
configuration.putObject("name", "piste")
VehicleTagParsers(
PisteAccessParser(lookup, configuration),
PistePriorityParser(lookup, configuration),
PisteAverageSpeedParser(lookup, configuration),
)
I always receive PointNotFoundException.