我正在使用osmdroid和osmphonus包库开发一个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));
}
然后,一旦标记被拖到某个位置,我就把它添加到kml结构中:
...
public void onMarkerDragEnd(Marker marker) {
GeoPoint geopoint = marker.getPosition();
//poiMarker.setDraggable(false);
Utilities.kmlDocument.mKmlRoot.addOverlay(marker, Utilities.kmlDocument);
}
...
在这一点上,我不知道如何为特定的标记指定其特定的样式,基本上只是图标。我已经在MyKmlStyler中进行了几次测试,但问题的要点实际上是我不知道如何区分每个kmlPlacemark。在MyKmlStyler
的方法onPoint
中,我放了一个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, 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和一个";类型";。根据这种类型,您将能够创建具有各种图标的标记,以及具有各种样式的KmlPlacemarks。