【问题标题】:Rotate a Marker in OSMDroid for Android?在 OSMDroid for Android 中旋转标记?
【发布时间】:2013-12-11 12:54:20
【问题描述】:

好的,这个问题困扰了我好几个小时,我有以下相对简单的代码,可以在 osmdroid 地图上放置一个标记

final ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();
OverlayItem marker = new OverlayItem("markerTitle", "markerDescription", new GeoPoint(52.033954,1.210179));
marker.setMarkerHotspot(OverlayItem.HotspotPlace.TOP_CENTER);
items.add(marker);

Drawable newMarker = this.getResources().getDrawable(R.drawable.maincar);
DefaultResourceProxyImpl resProxyImp = new DefaultResourceProxyImpl(getApplicationContext());
ItemizedIconOverlay markersOverlay = new ItemizedIconOverlay<OverlayItem>(items, newMarker, null, resProxyImp);
mapView.getOverlays().add(markersOverlay);

但是,标记始终面向屏幕顶部(0 度旋转)。我怎样才能轻松地将每个标记旋转到指定的度数(360 度是一个完整的圆)?

【问题讨论】:

  • 考虑将赏金奖励给回答您问题的人。

标签: java android maps openstreetmap osmdroid


【解决方案1】:

尝试像这样使用 RotateMyBitmap 方法:

Bitmap source = BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher);

Bitmap target = RotateMyBitmap(source, 120.0f);

final ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();
OverlayItem marker = new OverlayItem("markerTitle", "markerDescription", new GeoPoint(52.033954,1.210179));
marker.setMarkerHotspot(OverlayItem.HotspotPlace.TOP_CENTER);
items.add(marker);

Drawable newMarker = new BitmapDrawable(getResources(), target);

//Drawable newMarker = this.getResources().getDrawable(R.drawable.maincar);
DefaultResourceProxyImpl resProxyImp = new DefaultResourceProxyImpl(getApplicationContext());
ItemizedIconOverlay markersOverlay = new ItemizedIconOverlay<OverlayItem>(items, newMarker, null, resProxyImp);
mapView.getOverlays().add(markersOverlay);

RotateMyBitmap 是:

public static Bitmap RotateMyBitmap(Bitmap source, float angle)
{
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    return Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true);
}

结果是:

这很好,但我建议你使用MyLocationOverlay class

【讨论】:

    【解决方案2】:

    如果您不想添加任何自定义代码,您还可以将您的 ItemizedIconOverlay 替换为来自 OSMBonusPack library 的标记(在 osmdroid 之上)。

    它支持setRotation(degreees)

    它还支持“平面”或“广告牌”模式,具体取决于您希望在地图也旋转时发生的情况。

    【讨论】:

      【解决方案3】:

      这个怎么样:

      Bitmap bmpOriginal = BitmapFactory.decodeResource(this.getResources(), R.drawable.maincar_osm);
      Bitmap bmResult = Bitmap.createBitmap(bmpOriginal.getWidth()*2, bmpOriginal.getHeight()*2, Bitmap.Config.ARGB_8888);
      Canvas tempCanvas = new Canvas(bmResult);
      tempCanvas.rotate(270, bmpOriginal.getWidth()/2, bmpOriginal.getHeight()/2);
      tempCanvas.drawBitmap(bmpOriginal, 0, 0, null);
      Drawable newMarker = new BitmapDrawable(getResources(),bmResult);
      DefaultResourceProxyImpl resProxyImp = new DefaultResourceProxyImpl(getApplicationContext());
      ItemizedIconOverlay markersOverlay = new ItemizedIconOverlay<OverlayItem>(items, newMarker, null, resProxyImp);
      mapView.getOverlays().add(markersOverlay);
      

      【讨论】:

        【解决方案4】:

        您最好的选择可能是创建 ItemizedItemOverlay 的子类。覆盖 onDrawItem() 并尝试这样的事情:

        @Override
        protected void onDrawItem(ISafeCanvas canvas, Item item, Point curScreenCoords, float aMapOrientation) {
        
            int degrees = 90;
            canvas.save();
            canvas.rotate(degrees, curScreenCoords.x, curScreenCoords.y);
            super.onDrawItem(canvas, item, curScreenCoords, aMapOrientation);
            canvas.restore();
        }
        

        【讨论】:

          【解决方案5】:

          试试这个:仅当您需要旋转相机时

          CameraPosition cameraPosition = new CameraPosition.Builder()
                          .target(centerCoordinates)      // Sets the center of the map
                          .zoom(zoom)                   // Sets the zoom
                          .bearing(bearing)             // Sets the orientation of the camera to east
                          .tilt(30)                   // Sets the tilt of the camera to 30 degrees
                          .build();                   // Creates a CameraPosition from the builder
          
          googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
          

          【讨论】:

          • 不幸的是,这是针对谷歌地图而不是 OSM 的,它会旋转整个地图而不仅仅是标记。感谢您至少回答:-)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多