ТУТ SDK Prem - как получить сжатый маршрут? - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь получить отели по длине маршрута, с помощью REST-запроса

В запросе есть параметрressedRoute , но алгоритм преобразования в Javaскриптовый язык.

Есть ли такой алгоритм в Java или Kotlin?Может быть, такой запрос есть в SDK, но я его не вижу?

точек, чтобы взять из route.routeElements.geometry.allPoints?

1 Ответ

0 голосов
/ 03 октября 2018

Мне удалось сжать маршрут.Проблема была в ошибке примера на JS.

Сначала нужно пройти, чтобы ограничить количество точек на маршруте, я установил 120. Если вы сделаете больше, может возникнуть 414 ошибок

fun execute(route: Route, categoryName: String, radiusInMeters: Int): Single<List<ItemPlaceByCorridor>> {

    val allPointList = route.routeGeometry
    val pointList = ArrayList<GeoCoordinate>()

    for ((index, elem) in allPointList.withIndex()) {
        if (index % (allPointList.size / POINTS_IN_ROUTE) == 0 || (index == 0) || (index == allPointList.lastIndex)) {
            pointList.add(elem)
        }
    }

    var routeStr = hereEncodePolyline(pointList)
    routeStr += ";w=$radiusInMeters"

    return mHereMapsApi.getPlacesByCorridor(categoryName, routeStr)
            .map { response -> response.results.listItems }
}

Алгоритм перенесен из JS в Kotlin

private fun hereEncodePolyline(positions: List<GeoCoordinate>): String {
    var lastLat = 0.0
    var lastLon = 0.0
    var result = ""

    for (i in 1..positions.lastIndex) {
        val elem = positions[i]
        result += hereEncodeFloat(elem.latitude - lastLat)
        result += hereEncodeFloat(elem.longitude - lastLon)
        lastLat = elem.latitude
        lastLon = elem.longitude
    }
    return result
}

private fun hereEncodeFloat(value: Double): String {
    val chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
    var result = ""

    // convert to fixed point
    var fixedPoint = Math.round(value * 100000)

    // make room on the lowest bit
    fixedPoint = fixedPoint shl (1)

    // flip bits of negative numbers and ensure that the last bit is set
    // (should actually always be the case, but for readability it is ok to do it explicitly)

    if (fixedPoint < 0) {
        fixedPoint = (fixedPoint.inv()) or 0x01
    }

    // var-length encode the number in chunks of 5 bits starting with the least significant
    // to the most significant
    while (fixedPoint > 0x1F) {
        result += (chars[((fixedPoint and 0x1F) or 0x20).toInt()]).toString()
        fixedPoint = fixedPoint shr (5)
    }
    result += (chars[fixedPoint.toInt()])

    return result
}
...