функция выбора карты android при нажатии

Я использую mapbox с GeoJsonSource и Symbollayer. Когда пользователь нажимает на функцию, она должна изменить цвет. Я обрабатываю эту логику с помощью следующего кода, и он работает, но он слишком медленный и изменение цвета значка занимает несколько секунд.

Здесь я настраиваю слой символов, добавляю логику изменения значков для PROPERTY_SELECTED:

mapBoxMap?.addLayer(SymbolLayer(markerStyleLayerIdentifier, markerSourceIdentifier)
                .withProperties(
                        PropertyFactory.iconImage(markerImage),
                        PropertyFactory.iconAllowOverlap(false),
                        PropertyFactory.iconImage(match(
                                get(PROPERTY_SELECTED), literal(0),
                                literal(markerImage),
                                literal(markerImageSelected)
                        ))
                ))

на карте обновляются объекты функций кликов:

 override fun onMapClick(point: LatLng) {
    val screenPoint = mapBoxMap?.projection?.toScreenLocation(point)
    var features = mapBoxMap?.queryRenderedFeatures(screenPoint
            ?: return, markerStyleLayerIdentifier)

    if ((features ?: return).isNotEmpty()) {
        var feature = features[0]
        showMarkerInfo(feature)
        doAsync {
            var featureList = featureCollection?.features()

            var id = feature.getNumberProperty(PROPERTY_STOP_ID)

            if (featureList != null) {
                for (i in 0 until featureList.size) {

                    var fId = featureList[i].getNumberProperty(PROPERTY_STOP_ID)

                    if (fId == id) {
                        featureList[i].properties()?.addProperty(PROPERTY_SELECTED, 1)
                    } else {
                        featureList[i].properties()?.addProperty(PROPERTY_SELECTED, 0)
                    }
                }

                uiThread {
                    refreshSource()
                }
            }
        }
    }
}

и обновить источник:

private fun refreshSource() {
    var source = mapBoxMap?.getSource(markerSourceIdentifier) as GeoJsonSource?
    if (source != null && featureCollection != null) {
        source.setGeoJson(featureCollection)
    }
}

после вызова «refreshSource» обновление значка занимает некоторое время. В моем случае есть 2050 функций в источнике. Есть ли лучший способ реализовать это? Или каким-либо способом оптимизировать это решение?


person Nininea    schedule 24.09.2018    source источник
comment
Как я могу создать выражение, если поле SELECED истинно, использовать цвет A для заливки, а иначе использовать цвет B в свойствах?   -  person Mahdi    schedule 21.06.2019


Ответы (1)


вот второй, более быстрый способ ответа на github:

 var selectedLayer = mapBoxMap?.getLayer(markerSelectedStyleLayerIdentifier) as SymbolLayer?
            var id = feature.getNumberProperty(PROPERTY_STOP_ID)
            var selectedExpression = any(
                    eq(get(PROPERTY_STOP_ID), literal(id.toString()))
            )
            selectedLayer?.filter = selectedExpression

вы можете увидеть здесь всю проблему

https://github.com/mapbox/mapbox-java/issues/892

person Nininea    schedule 27.09.2018