Как нарисовать кратчайший путь на карте Google в Kotlin с живой навигацией?

#android #kotlin

#Android #kotlin

Вопрос:

Кто-нибудь может помочь мне нарисовать кратчайший путь на карте с помощью Kotlin и обновить мой путь во время навигации или обновить мой LatLng. Я должен реализовать это в приложении, похожем на OLA, для навигации по кабинам. но я могу нарисовать кратчайший путь между двумя точками, водителем и пользователем.

Заранее спасибо

Ответ №1:

Попробуйте этот код:

в файле gradle добавьте зависимость

  compile 'org.jetbrains.anko:anko-sdk15:0.8.2'
 compile 'com.beust:klaxon:0.30'



override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap
val sydney = LatLng(-34.0, 151.0)
val opera = LatLng(-33.9320447,151.1597271)
mMap!!.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
mMap!!.addMarker(MarkerOptions().position(opera).title("Opera House"))        
}
  

Следующий шаг — создать объект PolylineOptions, настроить цвет и ширину. Мы будем использовать этот объект для добавления точек позже.

 val options = PolylineOptions()
options.color(Color.RED)
options.width(5f)
  

Теперь нам нужно создать URL-адрес, который мы будем использовать для вызова API. Мы можем поместить его в отдельную функцию, чтобы убрать его с дороги:

 private fun getURL(from : LatLng, to : LatLng) : String {
    val origin = "origin="   from.latitude   ","   from.longitude
    val dest = "destination="   to.latitude   ","   to.longitude
    val sensor = "sensor=false"
    val params = "$originamp;$destamp;$sensor"
 return "https://maps.googleapis.com/maps/api/directions/json?$params"
 }
  And, of course, we call it by doing:

  val url = getURL(sydney, opera)

 async {
   val result = URL(url).readText()
   uiThread {
   // this will execute in the main thread, after the async call is done }
 }
  

Как только наша строка будет сохранена и готова, часть кода UIThread будет выполнена, и там будет остальная часть кода. Теперь мы готовы извлечь объект JSON из строки, и для этого мы будем использовать klaxon. Это тоже довольно просто:

  val parser: Parser = Parser()
 val stringBuilder: StringBuilder = StringBuilder(result)
 val json: JsonObject = parser.parse(stringBuilder) as JsonObject
  

На самом деле обход объекта JSON для получения точек довольно прост. klaxon прост в использовании, и его массивы JSON можно использовать так же, как любой список Kotlin.

  val routes = json.array<JsonObject>("routes")
 val points = routes!!["legs"]["steps"][0] as JsonArray<JsonObject>

  val polypts = points.map { it.obj("polyline")?.string("points")!!  }
  val polypts = points.flatMap { decodePoly(it.obj("polyline")?.string("points")!!)  
   }

  //polyline
  options.add(sydney)
 for (point in polypts) options.add(point)
 options.add(opera)
  mMap!!.addPolyline(options)

 mMap!!.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100))
  

Refer:https://medium.com/@irenenaya/drawing-path-between-two-points-in-google-maps-with-kotlin-in-android-app-af2f08992877