Carto Mobile: как избежать кластеризации точек со связанными всплывающими окнами

#carto-mobile

#carto-mobile

Вопрос:

Мы используем Carto Mobile SDK в нашем приложении для Android для отображения карты с объектами POI на ней. Таких объектов может быть много, поэтому мы используем кластеризацию, чтобы избежать загромождения карты на более низких уровнях масштабирования. Пока все хорошо.

К каждому POI может быть прикреплена метка, для которой мы используем всплывающее окно с текстом. Поскольку это всплывающее окно использует геометрию точки POI для определения ее положения, оно выглядит как кластер для кластеризованного векторного слоя, и если я не увеличу масштаб до максимального уровня, я не смогу увидеть POI и метку отдельно на карте. Он сразу становится кластером из 2 объектов. Я не могу найти никакой соответствующей информации о том, как избежать кластеризации связанных объектов. Может кто-нибудь пролить свет на эту проблему, пожалуйста?

Редактировать:

Вот как это выглядит при максимальном увеличении — два объекта в одном месте: Максимальный уровень масштабирования

И вот как это выглядит, когда я немного уменьшаю масштаб: Более низкий уровень масштабирования

Код, который создает эти две геометрии, находится здесь:

 private suspend fun MapLayerData.createPointPoi(
    layer: MapLayer,
    projection: Projection,
    pictogramSetIconsDao: PictogramSetIconsDao
): List<VectorElement> {
    val elements = mutableListOf<VectorElement>()
    getPoiPictogram(layer.dataPictogramSetId, icon, pictogramSetIconsDao)?.let { pictogram ->
        Point(
            projection.fromLatLong(vertices.first().lat, vertices.first().lng),
            PointStyleBuilder().also {
                it.bitmap = pictogram
            }.buildStyle()
        )
    }?.let { point ->
        elements.add(point)
        if (text.isNotBlank()) {
            elements.add(createText(point.geometry, text))
        }
    }
    return elements
}

fun createText(location: Geometry, text: String) = BalloonPopup(
    location,
    BalloonPopupStyleBuilder().buildStyle(),
    text,
    ""
)
 

Все элементы, возвращаемые из createPointPoi() метода, добавляются к poiPointsLayer созданному как это:

     private val poiClusterElementBuilder = DefaultClusterElementBuilder(
        res,
        res.drawable(R.drawable.poi_cluster, theme)
    )
    private val poiPointsLayer = ClusteredVectorLayer(poiPointsDataSource, poiClusterElementBuilder)
 

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

Конечно, мы можем переместить эти объекты типа меток из кластеризованного слоя в отдельный векторный слой, но тогда у нас будет много меток на карте поверх кластеризованных пиктограмм. Что-то вроде этого: Загроможденный ярлыками

Комментарии:

1. Можете ли вы добавить скриншот, как он выглядит сейчас и как вы хотите, чтобы он работал. Также может быть полезен пример кода: как вы определили свой уровень данных

2. @JaakL Я добавил то, что вы просили. Спасибо, что взглянули.

3. Я думаю, что вы используете один и тот же источник данных как для marker, так и для BalloonPopup. Таким образом, в представлении кластера считается, что в одной позиции находятся 2 элемента, и отметьте его номером 2. Поместите BalloonPopup в отдельный источник данных.