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.

1 Like

Hi Vlad_Matvei

I have the same problem with you. I have tried to fix this problem by checking the direction of the matched way and comparing it with the moving direction of the user to consider that it is the valid matched way. However, it leads to a delay in matching the new way when the user actually moves to a new way at intersections.

Happy to exchange solutions with you

Can you share an example/screenshot that shows the problem?