Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在android中的google地图上添加多个标记_Android_Google Maps_Mobile_Google Maps Markers - Fatal编程技术网

在android中的google地图上添加多个标记

在android中的google地图上添加多个标记,android,google-maps,mobile,google-maps-markers,Android,Google Maps,Mobile,Google Maps Markers,我是triyng在谷歌地图上添加多个标记。这是我的代码部分 public class GoogleMap extends MapView { MapController mc; MapView mapView; GeoPoint p; @Override public void onCreate(Bundle savedInstanceState) { .... double lat = Double.p

我是triyng在谷歌地图上添加多个标记。这是我的代码部分

public class GoogleMap extends MapView 
 {
     MapController mc;
     MapView mapView; 
     GeoPoint p; 

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    ....

         double lat = Double.parseDouble(bundle.getString("paramLat"));
         double lng = Double.parseDouble(bundle.getString("paramLong"));

         mc = mapView.getController();
         p = new GeoPoint( (int) (lat * 1E6),  (int) (lng * 1E6));
         mc.animateTo(p);
         mc.setZoom(17);

         //---Add a location marker---
         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(p, screenPts);

                   //---add the marker---
                   Bitmap bmp = BitmapFactory.decodeResource(getResources(),  R.drawable.pushpin);            
                   canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null);     


                   return true;



         }
}
公共类GoogleMap扩展了MapView
{
地图控制器;
地图视图;
地质点p;
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
....
double-lat=double.parseDouble(bundle.getString(“paramLat”));
double lng=double.parseDouble(bundle.getString(“paramLong”);
mc=mapView.getController();
p=新地质点((内部)(纬度*1E6),(内部)(液化天然气*1E6));
司马迁(p),;
mc.setZoom(17);
//---添加位置标记---
MapOverlay MapOverlay=新的MapOverlay();
List ListoForLays=mapView.getOverlays();
listOfOverlays.clear();
添加(映射覆盖);
mapView.invalidate();
}
类MapOverlay扩展了com.google.android.maps.Overlay
{
@凌驾
公共布尔绘制(画布画布、地图视图、地图视图、布尔阴影、长时间)
{
super.draw(画布、地图视图、阴影);
//---将地质点转换为屏幕像素---
点屏幕PTS=新点();
getProjection().toPixels(p,screenPts);
//---添加标记---
位图bmp=BitmapFactory.decodeResource(getResources(),R.drawable.pushpin);
canvas.drawBitmap(bmp,screenPts.x,screenPts.y-50,null);
返回true;
}
}
我这里有两个问题。当我试图只添加一个标记时,它工作了,但draw方法被调用了很多次。但为什么?什么时候被调用

第二个问题是如何添加新标记。我创建了第二个名为p2的地质点,在这之后我该怎么做?非常感谢

  • 要防止多重绘图,您需要缓存。这是MapOverlay绘图方法中的一个错误
  • 要添加多个标记,必须使用ItemizeOverlay

  • 您应该遵循开发者网站上的Android地图视图教程

    第2部分包含用于构建覆盖层的部分


    在Draw方法中应该做最少的工作;它被称为很多,包括每次移动/缩放贴图/使其无效时。

    您需要从一个ItemizedOverlay开始,它是一个点数组。您可以在这里找到文档。然后您需要调用ItemizedOverlay.Draw()方法,该方法将根据它们的位置绘制其中的所有点。希望这会有所帮助。

    我已经在我的项目中实现了多个标记。这是示例代码;您需要更改的是标记图像、长度(要在for循环中定义的标记数)。希望这会有所帮助!!!

    public class ShowMapActivity extends MapActivity{
        private MapController mapControll;
        private GeoPoint geoPoint=null;
        private MapView mapview;
        private MyItemizedOverlay userPicOverlay;
        private MyItemizedOverlay nearPicOverlay;
        private Drawable userPic,atmPic;
        private OverlayItem nearatms[] = new OverlayItem[50];
        public static Context context;
    
        @Override
        protected void onCreate(Bundle icicle) {
            // TODO Auto-generated method stub
            super.onCreate(icicle);
            context = getApplicationContext();
            setContentView(R.layout.your layout xml);
            showMap();
        }
    
        public void showMap() {
            // TODO Auto-generated method stub
    
            try {
                geoPoint = new GeoPoint((int)(latitude * 1E6),(int)(longitude * 1E6));          
                mapview = (MapView)findViewById(R.id.mapview);
                mapControll= mapview.getController();
                mapview.setBuiltInZoomControls(true);
                mapview.setStreetView(true);
                mapControll.setZoom(16);
                mapControll.animateTo(geoPoint);
    
                userPic = this.getResources().getDrawable(R.drawable.your pic);
                userPicOverlay = new MyItemizedOverlay(userPic);
                OverlayItem overlayItem = new OverlayItem(geoPoint, "I'm Here!!!", null);
                userPicOverlay.addOverlay(overlayItem);
                mapview.getOverlays().add(userPicOverlay);
    
    
                atmPic = this.getResources().getDrawable(R.drawable.your pic);
                nearPicOverlay = new MyItemizedOverlay(atmPic);
                for (int i = 0; i < define your length here; i++) {
                    nearatms[i] = new OverlayItem(new GeoPoint((int)((latitude) * 1E6)),(int)(longitude) * 1E6)),"Name", null);//just check the brackets i just made change here so....
                    nearPicOverlay.addOverlay(nearatms[i]);
                }
                mapview.getOverlays().add(nearPicOverlay);
                //Added symbols will be displayed when map is redrawn so force redraw now
                mapview.postInvalidate();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        @Override
        protected boolean isRouteDisplayed() {
            // TODO Auto-generated method stub
            return false;
        }
    
    }
    
    公共类ShowMapActivity扩展了MapActivity{
    私有映射控制器mapControll;
    专用地质点=空;
    私有地图视图;
    私有MyItemizeOverlay用户PicOverlay;
    私有MyItemizedOverlay近PicOverlay;
    私有可绘制用户PIC,atmPic;
    私人OverlayItem NearATM[]=新OverlayItem[50];
    公共静态语境;
    @凌驾
    创建时受保护的空隙(捆绑冰柱){
    //TODO自动生成的方法存根
    超级冰柱;
    context=getApplicationContext();
    setContentView(R.layout.your布局xml);
    showMap();
    }
    公共void showMap(){
    //TODO自动生成的方法存根
    试一试{
    地质点=新的地质点((int)(纬度*1E6),(int)(经度*1E6));
    mapview=(mapview)findViewById(R.id.mapview);
    mapControll=mapview.getController();
    mapview.SetBuilTinZoomControl(真);
    mapview.setStreetView(真);
    mapControll.setZoom(16);
    mapControll.animateTo(地质点);
    userPic=this.getResources().getDrawable(R.drawable.your pic);
    userPicOverlay=newmyitemizedoverlay(userPic);
    OverlayItem OverlayItem=新的OverlayItem(地理点,“我在这里!!!”,null);
    userPicOverlay.addOverlay(overlayItem);
    mapview.getOverlays().add(userPicOverlay);
    atmPic=this.getResources().getDrawable(R.drawable.your pic);
    nearPicOverlay=新的MyItemizedOverlay(atmPic);
    for(int i=0;i<在此处定义长度;i++){
    nearatms[i]=新的覆盖项(新的地理点((int)((纬度)*1E6)),(int)(经度)*1E6)),“Name”,null);//只要检查一下我刚才在这里更改的括号就可以了。。。。
    nearPicOverlay.addOverlay(nearatms[i]);
    }
    mapview.getOverlays().add(nearPicOverlay);
    //重新绘制地图时将显示添加的符号,因此现在强制重新绘制
    mapview.postInvalidate();
    }捕获(例外e){
    e、 printStackTrace();
    }
    }
    @凌驾
    受保护的布尔值isRouteDisplayed(){
    //TODO自动生成的方法存根
    返回false;
    }
    }
    
    用于放置标记的逐项分类

    public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {
    
        private ArrayList<OverlayItem> myOverlays ;
    
        public MyItemizedOverlay(Drawable defaultMarker) {
            super(boundCenterBottom(defaultMarker));
            myOverlays = new ArrayList<OverlayItem>();
            populate();
        }
    
        public void addOverlay(OverlayItem overlay){
            myOverlays.add(overlay);
            populate();
        }
    
        @Override
        protected OverlayItem createItem(int i) {
            return myOverlays.get(i);
        }
    
        // Removes overlay item i
        public void removeItem(int i){
            myOverlays.remove(i);
            populate();
        }
    
        // Returns present number of items in list
        @Override
        public int size() {
            return myOverlays.size();
        }
    
    
        public void addOverlayItem(OverlayItem overlayItem) {
            myOverlays.add(overlayItem);
            populate();
        }
    
    
        public void addOverlayItem(int lat, int lon, String title) {
            try {
                GeoPoint point = new GeoPoint(lat, lon);
                OverlayItem overlayItem = new OverlayItem(point, title, null);
                addOverlayItem(overlayItem);    
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
    
        @Override
        protected boolean onTap(int index) {
            // TODO Auto-generated method stub
            String title = myOverlays.get(index).getTitle();
            Toast.makeText(ShowMapActivity.context, title, Toast.LENGTH_LONG).show();
            return super.onTap(index);
        }
    }
    
    公共类MyItemizeOverlay扩展了ItemizeOverlay{
    私人ArrayList myOverlays;
    公共MyItemizedOverlay(可绘制的默认标记){
    super(boundCenterBottom(defaultMarker));
    myOverlays=新的ArrayList();
    填充();
    }
    公共void addOverlay(OverlayItem overlay){
    添加(覆盖);
    填充();
    }
    @凌驾
    受保护的OverlayItem createItem(int i){
    返回myOverlays.get(i);
    }
    //删除覆盖项i
    公共无效删除项(int i){
    删除(i);
    填充();
    }
    //返回列表中的当前项数
    @凌驾
    公共整数大小(){
    返回myOverlays.size();
    }
    公共void addOverlayItem(OverlayItem OverlayItem){
    加上