Map Matching Precision Enhancement

Hello,

I’m developing an Android app for taxi drivers with real-time location updates sent to a server. I’ve integrated GraphHopper’s map matching module to snap GPS points to roads. While my implementation works, I’m seeking ways to enhance accuracy.

Challenge: Inaccurate Snapping at Intersections

In cases where a driver travels on road A intersecting road B, GraphHopper occasionally snaps to road B instead of road A.

I’ve tried solutions, such as prioritizing snap candidates sharing an edge with the previous snapped point. However, these adjustments haven’t completely resolved the issue and inaccuracies persist.

Code:

GraphHopper Init:

private fun setupGraphHopper(fileName: String, osmCacheDirectory: File) {
  val config = GraphHopperConfig()
  val osmFile = File(osmCacheDirectory, fileName)

  config.putObject("datareader.file", osmFile.absoluteFile.toString())
  config.putObject("graph.location", osmCacheDirectory.absolutePath)
  config.profiles = listOf(Profile("car_profile"))

  graphHopper = GraphHopper().init(config).importOrLoad()
}

Map Matching:

var prevEdge: Int? = null

private fun doMapMatching(point: Location) {
  val hints = PMap().apply { putObject("profile", "car_profile") }

  val mapMatching = MapMatching(graphHopper, hints).apply {
     setMeasurementErrorSigma(point.accuracy.toDouble())
  }

  val candidates = mapMatching.findCandidateSnaps(point.latitude, point.longitude)
        
  val result = if (prevEdge == null) {
     candidates.minByOrNull { it.queryDistance }
  } else {
     candidates.find { it.closestEdge.edge == prevEdge }
  }
        
  if (result != null) {
     val snappedPoint = result.snappedPoint
            
      // ... other logic 
            
     prevEdge = result.closestEdge.edge
  }
}

I’d appreciate any insights, recommendations or directions you can offer to help me refine my approach.