Наложенное изображение Google Maps не видно - PullRequest
2 голосов
/ 11 марта 2011

Я хочу наложить изображение карты (.jpg) поверх карты Google Maps.Проблема: Наложение изображения не отображается, кто знает, в чем проблема?

В logcat нет ошибки, и MapView работает.

Код:

package nl.ultimo.android.skikaart;

import java.util.List;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Bundle;

public class MapsActivity extends MapActivity
{
        Bitmap          bmp;    //Loaded bitmap in memory
    GeoPoint        min;    //Top left corner (lat/long)
    GeoPoint        max;    //Right bottom corner (lat/long)

   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState)
   {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);

       float lat1 = 45.19775f;
       float lng1 = 6.28418333f;
       float lat2 = 45.2636667f;
       float lng2 = 6.17431667f;

       min = new GeoPoint((int)(lat1 * 1E6), (int)(lng1 * 1E6));               // bounding rectangle
       max = new GeoPoint((int)(lat2 * 1E6), (int)(lng2 * 1E6));

       MapView mapView = (MapView) findViewById(R.id.mapView);
       MapController ctrl = mapView.getController();

       int x = (min.getLongitudeE6() + max.getLongitudeE6())/ 2;  //Select map center
       int y = (min.getLatitudeE6() + max.getLatitudeE6())/ 2;

       ctrl.setCenter(new GeoPoint(y,x));
       ctrl.setZoom(12);                 //Set scale
       mapView.setBuiltInZoomControls(true); //Enable zoom controls

       //Add overlay
       MapOverlay mapOverlay = new MapOverlay();
       List<Overlay> listOfOverlays = mapView.getOverlays();
       listOfOverlays.clear();
       listOfOverlays.add(mapOverlay);

       mapView.invalidate();
   }

   class MapOverlay extends com.google.android.maps.Overlay
   {
       @Override
       public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)
       {
           super.draw(canvas, mapView, shadow);

           //Translate the GeoPoint to screen pixels
           Point screenPts = new Point();
           mapView.getProjection().toPixels(min, screenPts);

           //The overlay image
           Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.skikaart);

           //Prepare two rectangles (pixels)
           Point top_left = new Point();
           mapView.getProjection().toPixels(min, top_left);
           Point bottom_right = new Point();
           mapView.getProjection().toPixels(max, bottom_right);

           Rect src = new Rect( 0,0,bmp.getWidth() - 1, bmp.getHeight() - 1 );
           Rect dst = new Rect( top_left.x, bottom_right.y,bottom_right.x,top_left.y );

           canvas.drawBitmap(bmp, src, dst, null);

           return true;
       }
   }


   @Override
   protected boolean isRouteDisplayed() {
       return false;
   }
}

Ответы [ 7 ]

8 голосов
/ 19 октября 2011

чтобы увидеть маркер, нужно сделать следующее

Drawable drawable = ...set your marker drawable
    drawable.setBounds(-drawable.getIntrinsicWidth() / 2, -drawable.getIntrinsicHeight(), drawable.getIntrinsicWidth() / 2, 0);
    overlayitem.setMarker(drawable);
3 голосов
/ 22 февраля 2012

Просто чтобы прояснить ситуацию, приведем цитату из ссылки

"Метод setBounds (Rect) должен вызываться , чтобы сообщить Drawable, где он нарисован и насколько великтак и должно быть. "

2 голосов
/ 12 апреля 2011

Ваш код содержит одну незначительную ошибку.

Изменение

Rect dst = new Rect( top_left.x, bottom_right.y,bottom_right.x,top_left.y );

до

 Rect dst = new Rect( top_left.x, top_left.y,bottom_right.x,bottom_right.y );

и тебе должно быть хорошо.

1 голос
/ 08 марта 2012

Помните, что draw () вызывается каждый раз, когда необходимо выполнить наложение.Когда пользователь перемещает карту, это может происходить несколько раз в секунду !!

Вам необходимо загружать ресурс только ОДИН РАЗ, а затем только рисовать растровое изображение на холсте во время вызова рисования.

Кроме того, ваша текущая реализация тесно связана с фактической деятельностью.

в вашей деятельности

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ...

    map.getOverlays().add(new PNGMapOverlay(getResources(), R.drawable.bitmap_id));

}


// allows re-factoring into separate class/file
class MapOverlay extends com.google.android.maps.Overlay
{
    private Bitmap bitmap;

    public MapOverlay(Resources resources, int resourceId) {

            bitmap = BitmapFactory.decodeResource(resources, resourceId);

    }

    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {

    ...
            canvas.drawBitmap(bmp, src, dst, null);

    }
}
1 голос
/ 18 апреля 2011

Изменить этот код

min = new GeoPoint((int)(lat1 * 1E6), (int)(lng2 * 1E6));  // bounding rectangle
max = new GeoPoint((int)(lat2 * 1E6), (int)(lng1 * 1E6));

вместо

min = new GeoPoint((int)(lat1 * 1E6), (int)(lng1 * 1E6));  // bounding rectangle
max = new GeoPoint((int)(lat2 * 1E6), (int)(lng2 * 1E6));

и попробуй его заработать.

0 голосов
/ 20 сентября 2011

Я просто целую вечность выдергивал свои волосы с той же проблемой, что и вы.Оказалось, что удаление android: layout_weight = "1" из моего объявления MapView решило проблему.Не спрашивай меня почему!

0 голосов
/ 11 марта 2011

Вы должны добавить оверлеи в listOfOverlays. Только тогда это будет показано на карте. Для этого вам нужно создать overlayitem, используя ur geopoint, а затем добавить его в список оверлеев.

Например:

GeoPoint point = new GeoPoint((int) (latitude * 1E6), (int) (longitude * 1E6));
OverlayItem overlayItem = new OverlayItem(point, "", "");   
listOfOverlays.addOverlay(overlayItem);
mapView.invalidate();

Попробуй и посмотри. Если у вас возникли какие-либо проблемы, пожалуйста, добавьте в качестве комментариев.

...