You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

osmbonuspack在KML结构中无法为每个Marker单独设置样式问题求助

核心问题根因

你之前的方案失效主要有两个原因:

  • 样式归属不匹配:你创建的自定义Style只存在于临时生成的局部KmlDocument实例中,添加到全局Utilities.kmlDocument时,全局实例未同步该样式定义,序列化保存KML时样式信息直接丢失,加载时只能读取默认样式。
  • 没有给Marker和对应KmlPlacemark做唯一标识绑定,自定义Styler无法区分不同Placemark对应的图标。

具体实现步骤

步骤1:给Marker绑定专属图标资源标识

修改insertIcon方法,用osmdroid Marker预留的relatedObject字段存储当前Marker对应的图标资源ID,后续生成KML时直接读取该值生成对应样式:

public void insertIcon(int image) throws IOException {
    marker = new Marker(map);
    point = new GeoPoint(currentLocation);
    marker.setPosition(point);
    marker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);
    map.getOverlays().add(marker);
    map.invalidate();
    applyDraggableListener(marker);
    marker.setIcon(activity.getDrawable(image));
    // 新增:存储当前Marker对应的图标资源ID
    marker.setRelatedObject(image);
}

步骤2:拖拽结束后直接在全局KmlDocument中绑定专属样式

删除局部临时KmlDocument的逻辑,直接在全局实例上操作,确保样式和Placemark归属同一KML实例:

public void onMarkerDragEnd(Marker marker) {
    KmlDocument globalKml = Utilities.kmlDocument;
    // 读取Marker绑定的图标资源ID
    int iconResId = (int) marker.getRelatedObject();
    // 生成当前Marker专属样式
    Drawable iconDrawable = AppCompatResources.getDrawable(activity, iconResId);
    Bitmap iconBitmap = ((BitmapDrawable) iconDrawable).getBitmap();
    Style customStyle = new Style(iconBitmap, 0x901010AA, 3.0f, 0x20AA1010);
    // 将样式添加到全局KML文档,获取样式ID
    String styleId = globalKml.addStyle(customStyle);
    // 生成对应Placemark并绑定样式
    KmlPlacemark placemark = new KmlPlacemark(marker);
    placemark.mStyle = styleId;
    // 将Placemark添加到全局KML根节点
    globalKml.mKmlRoot.add(placemark);
    // 可选:移除原拖拽Marker,换成KML层渲染的标记,避免重复显示
    map.getOverlays().remove(marker);
    globalKml.mKmlRoot.buildOverlay(map, null, null, globalKml);
    map.invalidate();
}

步骤3:加载KML时用自定义Styler适配样式

如果需要从本地存储的KML文件恢复标记,自定义KmlStyler读取每个Placemark绑定的样式设置对应图标即可:

public class MyKmlStyler implements KmlStyler {
    private final Context mContext;
    public MyKmlStyler(Context context) {
        mContext = context;
    }
    @Override
    public void onPoint(Marker marker, KmlPlacemark kmlPlacemark, KmlPoint kmlPoint) {
        Style placemarkStyle = kmlPlacemark.getStyle();
        if (placemarkStyle != null && placemarkStyle.getIcon() != null) {
            // 应用KML中存储的专属图标
            marker.setIcon(new BitmapDrawable(mContext.getResources(), placemarkStyle.getIcon()));
            marker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);
        }
    }
    @Override
    public void onLine(Polyline polyline, KmlPlacemark kmlPlacemark, KmlLineString kmlLineString) {}
    @Override
    public void onPolygon(Polygon polygon, KmlPlacemark kmlPlacemark, KmlPolygon kmlPolygon) {}
}

加载KML时传入自定义Styler:

KmlDocument loadKml = new KmlDocument();
loadKml.parseKMLFile(kmlFilepath);
FolderOverlay kmlOverlay = (FolderOverlay) loadKml.mKmlRoot.buildOverlay(map, new MyKmlStyler(context), null, loadKml);
map.getOverlays().add(kmlOverlay);
map.invalidate();

内容的提问来源于stack exchange,提问作者miukr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 02:54:05