Выравнивание текста Mapbox SymbolLayer по значку SymbolLayer - PullRequest
0 голосов
/ 06 февраля 2019

В настоящее время я работаю над кластеризацией символов на карте Mapbox, используя метод, подобный этому официальному примеру .При тестировании я обнаружил, что значки и текст отображаются должным образом, , однако текстовый слой теряет выравнивание со слоем значков при взаимодействии с ним и поворачивает карту.

Я использую свойства PropertyFactory.iconAnchor и PropertyFactory.iconTranslate при создании объектов SymbolLayer.Я пропускаю свойство, которое используется для обеспечения относительного положения этих двух слоев?

В случае, если это помогает, код, который я использую для создания SymbolLayer объектов, выглядит следующим образом:

public List<SymbolLayer> createClusterLevelSymbolLayer(int[] layers) {
    List<SymbolLayer> symbolLayers = new ArrayList<>();

    for (int i = 0; i < layers.length; i++) {
        SymbolLayer symbolLayer = new SymbolLayer("cluster-" + i, "points");
        symbolLayer.setProperties(
                iconImage("circle-15"),
                iconTranslate(new Float[]{1f, 13f}),
                iconSize(1.5f),
                iconAnchor(Property.ICON_ANCHOR_BOTTOM)
        );

        Expression pointCount = toNumber(get("point_count"));
        symbolLayer.setFilter(
                i == 0
                        ? all(has("point_count"),
                        gte(pointCount, literal(layers[i]))
                ) : all(has("point_count"),
                        gt(pointCount, literal(layers[i])),
                        lt(pointCount, literal(layers[i - 1]))
                )
        );
        symbolLayers.add(symbolLayer);
    }

    return symbolLayers;
}

public SymbolLayer createClusterTextLayer() {
    return new SymbolLayer("count", "points").withProperties(
            textField(Expression.toString(get("point_count"))),
            textSize(12f),
            textColor(Color.BLACK),
            textIgnorePlacement(true),
            textAllowOverlap(true),
            textAnchor(Property.TEXT_ANCHOR_BOTTOM)
    );
}

Изменить (07/02/2019 @ 10:15 утра) В соответствии с рекомендацией @ riastrad, пожалуйста, найдите скриншоты поведения, которое я испытываю, ниже:

Upon booting into the app, the clustered symbol appears just fine, with icon beneath a text layer (aligned well). (вверху) После загрузки приложения кластерный символ выглядит очень хорошо, со значком под текстовым слоем (хорошо выровненным).

(ниже) Однако при жесте поворота карты значок и текст разделяются до тех пор, пока вид / позиция камеры не вернутся в исходную точку

Misaligned text SymbolLayer over icon SymbolLayer (approximate 90 degree rotation)

Misaligned text SymbolLayer over icon SymbolLayer (approximate 180 degree rotation)

1 Ответ

0 голосов
/ 11 февраля 2019

Я полагаю, что это происходит, потому что вы устанавливаете значение для icon-translate для своего значка SymbolLayer.

Согласно связанной документации это представляет собой:

Расстояние, на которое якорь значка перемещается из исходного положения.

Таким образом, по сути, вы привязываетесьи текст, и значок внизу, но в то же время вы перемещаете значок на Float[]{1f, 13f}.

Решение должно состоять в том, чтобы либо установить одинаковые значения для вашего text-translate, либо полностью удалить его из значка SymbolLayer.

...