首页 > 解决方案 > 将 Mapbox 文本 SymbolLayer 与图标 SymbolLayer 对齐

问题描述

我目前正在使用类似于此官方示例的方法对 Mapbox 地图上的符号进行聚类。测试时,我发现图标和文本按预期显示,但是当我与图标层交互并旋转地图时,文本层似乎失去了与图标层的对齐。

我在创建对象时使用了PropertyFactory.iconAnchorandPropertyFactory.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:15am) 根据@riastrad 的建议,请在下面找到我遇到的行为的屏幕截图:

启动到应用程序后,群集符号显示得很好,图标位于文本层下方(对齐良好)。 (上图)启动到应用程序后,集群符号显示得很好,图标位于文本层下方(对齐良好)。

(下)但是,当手势旋转地图时,图标和文本都会分开,直到视图/相机位置返回到它们的起点

图标 SymbolLayer 上未对齐的文本 SymbolLayer(大约 90 度旋转)

图标 SymbolLayer 上未对齐的文本 SymbolLayer(大约 180 度旋转)

标签: androidmapboxmapbox-android

解决方案


我相信这是因为您正在icon-translate为您的 icon设置一个值SymbolLayer

根据链接的文档,这代表:

图标的锚点从其原始位置移动的距离。

所以基本上你将你的文本和图标都锚定到底部,但同时你将你的图标移动了Float[]{1f, 13f}.

解决方案应该是为您设置相同的值text-translate或将其从您的图标中SymbolLayer完全删除。


推荐阅读