问题描述
我正在使用 osmdroid 和 osmbonus 包库开发一个 Android 应用程序,它允许用户从菜单中将图标拖放到地图上。 该应用程序旨在允许用户“保存地图”,因此我试图管理如何将所有拖动的标记保存在 kml 文档中,而不是在必要时加载它。
我已经尝试按照 13.3 教程 https://github.com/MKergall/osmbonuspack/wiki/Tutorial_4 进行操作,但我仍然无法弄清楚,所以我可能遗漏了一些东西。
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));
}
...
public void onMarkerDragEnd(Marker marker) {
GeoPoint geopoint = marker.getPosition();
//poiMarker.setDraggable(false);
Utilities.kmlDocument.mKmlRoot.addOverlay(marker,Utilities.kmlDocument);
}
...
此时,我不知道如何为该特定标记分配其特定样式,这基本上只是图标。
我已经在 MyKmlStyler 中进行了几次测试,但问题的要点实际上是我不知道如何区分每个 kmlPlacemark。
在 onPoint
的方法 MyKmlStyler
中,我放置了一个 println,显然所有地标都具有相同的样式。
@Override
public void onPoint(Marker marker,KmlPlacemark kmlPlacemark,KmlPoint kmlPoint) {
System.out.println(kmlPlacemark);
}
我唯一能做的就是为所有拖动的标记提供独特的样式。
我已经尝试过 putStyle
和教程中描述的其他方法,但正如我已经说过的,我很可能遗漏了一些东西。
我的目标是根据用户拖动的标记的真实图标为每个 kmlPlacemark 赋予不同的样式,所有这些都在同一个 kmlDocument 中。
编辑
我以为我设法通过这种方式找到了解决方案:
public void onMarkerDragEnd(Marker marker) {
/*GeoPoint geopoint = marker.getPosition();
poiMarker.setDraggable(false);
*/
KmlDocument mKmlDocument = new KmlDocument();
KmlPlacemark p = new KmlPlacemark(marker);
Style s = buildStyle();
p.mStyle = mKmlDocument.addStyle(s);
mKmlDocument.mKmlRoot.add(p);
mKmloverlay = (FolderOverlay) mKmlDocument.mKmlRoot.buildOverlay(map,null,mKmlDocument);
Utilities.kmlDocument.mKmlRoot.addOverlay(mKmloverlay,Utilities.kmlDocument);
}
private Style buildStyle(){
Drawable defaultMarker = AppCompatResources.getDrawable(activity,R.drawable.person);
Bitmap defaultBitmap = ((BitmapDrawable) defaultMarker).getBitmap();
return new Style(defaultBitmap,0x901010AA,3.0f,0x20AA1010);
}
但仍然没有对标记应用任何样式,因此显示的图标是默认图标,而不是所选图标。
注意:Utilities.kmlDocument
是我存储所有地图标记的地方,因此它不同于 mKmlDocument
解决方法
基本上,如果您尝试依赖标记来构建 KML 文档,那么您的根本原因就是问题。 您应该处理自己的“模型”,然后根据该模型根据需要构建标记,并在需要时构建 KML 文档。
您的“模型”可能是一个简单的对象数组列表,其中包含:一个 GeoPosition 和一个“类型”。根据这种类型,您将能够创建具有各种图标的标记和具有各种样式的 KmlPlacemark。