【问题标题】:Google Maps overlay image not visible谷歌地图覆盖图像不可见
【发布时间】:2011-03-11 08:38:50
【问题描述】:

我想在 Google 地图地图视图上叠加地图图像 (.jpg)。 问题是:覆盖图像没有显示,谁知道是什么 有问题吗?

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;
   }
}

【问题讨论】:

  • 您的图像存储在哪里
  • 位图 bmp = BitmapFactory.decodeResource(getResources(),R.drawable.skikaart);
  • 您尚未将任何人标记为答案。有什么理由吗?

标签: android maps overlay


【解决方案1】:

要查看下一步需要做的标记

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

【讨论】:

    【解决方案2】:

    为了清楚起见,这里引用了参考文献

    “必须调用 setBounds(Rect) 方法告诉 Drawable 它在​​哪里绘制以及它应该有多大。”

    【讨论】:

    • 这为我解决了问题。谢谢。
    【解决方案3】:

    您的代码有一个小错误。

    改变

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

    你应该很好。

    【讨论】:

      【解决方案4】:

      请记住,每次需要渲染叠加层时都会调用 draw()。当用户移动地图时,每秒可能会发生多次!

      您只需要加载一次资源,然后只在绘制调用期间将位图绘制到画布上。

      此外,您当前的实现与实际的 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);
      
          }
      }
      

      【讨论】:

        【解决方案5】:

        更改此代码

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

        并尝试它的工作。

        【讨论】:

        • 根据要求设置最小值和最大值,您的最​​小值和最大值错误,因此图像不会显示在地图中。
        【解决方案6】:

        您必须将叠加层添加到您的listOfOverlays。然后只有它会显示在地图上。为此,您必须使用您的 geopoint 创建一个 overlayitem,然后将其添加到覆盖列表中。

        例如:

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

        试试看。如果您遇到任何问题,请添加为 cmets。

        【讨论】:

        • 感谢您的回答。但我确实添加了叠加层://添加叠加层 MapOverlay mapOverlay = new MapOverlay(); List listOfOverlays = mapView.getOverlays(); //listOfOverlays.clear(); listOfOverlays.add(mapOverlay); mapView.invalidate();`我已经指定了两个GeoPoints,一个用于覆盖的左上角,一个用于右下角。
        【解决方案7】:

        我只是花了很长时间把我的头发拉出来,和你一样的问题。原来从我的 MapView 声明中删除 android:layout_weight="1" 解决了这个问题。不要问我为什么!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-19
          • 1970-01-01
          • 2015-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多