开发者

Google Maps overlay image not visible

I want to overlay a map image (.jpg) over the Google Maps mapview. The problem is: The overlay image is not showing, who knows what's the problem?

There is no error in logcat and the MapView is working.

The code:

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开发者_Python百科 );

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

           return true;
       }
   }


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


to see marker you need to do next

Drawable drawable = ...set your marker drawable
    drawable.setBounds(-drawable.getIntrinsicWidth() / 2, -drawable.getIntrinsicHeight(), drawable.getIntrinsicWidth() / 2, 0);
    overlayitem.setMarker(drawable);


Just to make things clear here is a quote from reference

"The setBounds(Rect) method must be called to tell the Drawable where it is drawn and how large it should be."


Your code has one minor mistake.

Change

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

to

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

and you should be good.


Remember that draw() is called each time the overlay needs to be rendered. When the map is being moved by the user, this could happen multiple times per second!!

You need to load the resource only ONCE, then only draw the bitmap onto the canvas during the draw invocation.

Also, your current implementation is highly coupled with the actual Activity.

in your activity

@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);

    }
}


Change this code

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

instead of

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

and try its working.


You have to add overlays into your listOfOverlays. Then only it will be shown on the map. For that you have to create an overlayitem using ur geopoint and then add it to the list of overlays.

For eg:

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

Try and see. If you face any issue, please add as comments.


I just spent ages pulling my hair out with the same problem as you. Turned out removing android:layout_weight="1" from my MapView declaration resolved the problem. Don't ask me why!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜