Как нарисовать много маркеров на карте - PullRequest
2 голосов
/ 29 октября 2011

Я пытаюсь нарисовать на карте, используя маркеры.Проблема в том, что когда я пытаюсь добавить их много, я не могу заставить их работать.Чтобы проиллюстрировать мою проблему, скажем, я хочу нарисовать квадрат из 900 меньших квадратов (30x30).Кстати, мне нужны эти квадраты, а не только один большой квадрат, который я пытаюсь добавить маркеры к наложенному элементу, а затем нарисовать его.

код ниже.Любое предложение, как я мог это сделать?Большое спасибо !!

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

}

1 Ответ

1 голос
/ 04 ноября 2011

Существует ограничение на количество элементов наложения, которые может обрабатывать MapView. Официально не известно, что это за предел, но через некоторое время вы увидите медленное поведение при масштабировании / панорамировании.

Некоторые решения:

  • Ленивая загрузка MapView
  • Загружайте только столько видимых маркеров, делайте это в зависимости от уровня масштабирования и диапазона.
  • 10 оверлеев с 99 точками быстрее, чем 1 оверлей с 900 точками.
...