ЗДЕСЬ SDK Prem - как получить сжатый Route?

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

Запрос имеет параметр compressedRoute, но алгоритм преобразования на языке сценариев Java.

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

точки взять с route.routeElements.geometry.allPoints?


person Eugene Zaychenko    schedule 02.10.2018    source источник


Ответы (1)


Удалось сжать маршрут. Проблема заключалась в ошибке примера на 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
}
person Eugene Zaychenko    schedule 03.10.2018