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
相关产品推荐
相关产品推荐

