2011-10-28 17 views
2

マーカーを使用して地図上に描画しようとしています。私が抱えている問題は、それらの多くを追加しようとすると、それを実行することができません。 私の問題を説明するために、900個の小さな正方形(30x30)からなる正方形を描きたいとしましょう。ちなみに、大きな四角形だけでなく、それらの四角形が必要です。 私はitemizedoverlayにマーカーを追加して描画しようとしています。地図上に多くのマーカーを描画する方法

コードは以下のとおりです。どのように私はそれを行うことができる任意の提案? ありがとうございます!

public class MainActivity extends MapActivity { 
MapView mapView; 
MapController mc; 
GeoPoint p; 
static Context context; 

int k=1;  
List<Overlay> mapOverlays; 
MyItemizedOverlay itemizedoverlay; 
int[] xx,yy; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main);   
    context = getApplicationContext();   
    mapView = (MapView) findViewById(R.id.mapView); 
    mapView.setBuiltInZoomControls(true);   

    mc = mapView.getController(); 
    String coordinates[] = {"36.186382", "-112.221909"}; 
    double lat = Double.parseDouble(coordinates[0]); 
    double lng = Double.parseDouble(coordinates[1]); 
    p = new GeoPoint(
        (int) (lat * 1E6), 
        (int) (lng * 1E6)); 
    mc.animateTo(p); 
    mc.setZoom(10); 

    mapOverlays = mapView.getOverlays(); 
    Drawable squareM = this.getResources().getDrawable(R.drawable.square); 
    itemizedoverlay = new MyItemizedOverlay(squareM); 

    int n=0; 
    xx = new int[30]; 
    yy = new int[30]; 
    while(n<30){ 
     xx[n]=n; 
     yy[n]=n; 
     n++; 
    } 

} 

protected void drawNewMarker(GeoPoint p){ 
    OverlayItem overlayitem = new OverlayItem(p, "", ""); 
    itemizedoverlay.addOverlay(overlayitem); 
    mapOverlays.add(itemizedoverlay); 
    mapView.postInvalidate(); 
} 

protected void drawNewMarkerD(){ 
    Point pointP = new Point(0,0); 
    mapView.getProjection().toPixels(p, pointP); 
    int xoff = 20*k; 
    int yoff = 20*k; 
    GeoPoint pp = mapView.getProjection().fromPixels(pointP.x + xoff, pointP.y + yoff); 

    OverlayItem overlayitem = new OverlayItem(pp, "", ""); 
    Drawable iconM = this.getResources().getDrawable(R.drawable.icon); 
    iconM.setBounds(0,0, 50, 50); 
    overlayitem.setMarker(iconM); 
    itemizedoverlay.addOverlay(overlayitem); 
    mapOverlays.add(itemizedoverlay); 
    k++; 
    //mapView.postInvalidate(); 
} 

@Override 
protected boolean isRouteDisplayed() { 

    return false; 
} 


protected void drawGrid(int xoff, int yoff){ 
    GeoPoint p = newGeoPointFromOffset(xoff, yoff); 
    OverlayItem overlayitem = new OverlayItem(p, "", ""); 
    Drawable marker = this.getResources().getDrawable(R.drawable.grid); 
    marker.setBounds(0,0, 15, 15); 
    overlayitem.setMarker(marker); 
    itemizedoverlay.addOverlay(overlayitem); 
    mapOverlays.add(itemizedoverlay); 
} 

protected GeoPoint newGeoPointFromOffset(int xoff, int yoff){ 
    Point screenPointP = new Point(0,0);  
    mapView.getProjection().toPixels(p, screenPointP); 
    int x = 15*xoff; 
    int y = 15*yoff;  
    return mapView.getProjection().fromPixels(screenPointP.x + x, screenPointP.y + y);    
} 

public boolean onKeyDown(int keyCode, KeyEvent event){ 
    MapController mc = mapView.getController(); 
    switch(keyCode){ 
    case KeyEvent.KEYCODE_3: 
     mc.zoomIn(); 
     break; 
    case KeyEvent.KEYCODE_1: 
     mc.zoomOut(); 
     break; 
    case KeyEvent.KEYCODE_0: 
     drawNewMarker(p); 
     break; 
    case KeyEvent.KEYCODE_9:  
     for(int r=0;r<30;r++){ 
      for(int s=0;s<30;s++){ 
       drawGrid(r,s); 
      } 
     } 
     mapView.postInvalidate();   
     break; 
    }  
    return super.onKeyDown(keyCode, event); 
}  

}

public class MyItemizedOverlay extends ItemizedOverlay{ 
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); 
private Context mContext; 

public MyItemizedOverlay(Drawable defaultMarker) { 
    super(boundCenterBottom(defaultMarker)); 
} 

public MyItemizedOverlay(Drawable defaultMarker, Context context) { 
     super(defaultMarker); 
     mContext = context; 
} 

public void draw(android.graphics.Canvas canvas, MapView mapView,boolean shadow) { 
     super.draw(canvas, mapView, false); 
} 

public void addOverlay(OverlayItem overlay) { 
    mOverlays.add(overlay); 
    populate(); 
} 

@Override 
protected OverlayItem createItem(int i) { 
    return mOverlays.get(i); 
} 

}

+2

AFAIK ItemizedOverlayは、いくつかの項目でのみ使用できます。代わりにオーバーレイを使用してください。オーバーレイに数100のアイテムを追加することは問題ありません。 –

答えて

0

のMapViewが処理できるオーバーレイアイテムの数には限界があります。この制限には正式な言葉はありませんが、しばらくするとズーム/パン時の動作が鈍くなります。

いくつかの解決策は以下のとおりです。表示されている

  • LazyLoading of MapView
  • ロードのみなど、多くのマーカー、ズームレベルおよびスパンに基づいてこれを行います。
  • 99のポイントを含む10のオーバーレイは、900のポイントを有する1つのオーバーレイよりも速い。
関連する問題