#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 в отдельный источник данных.