2011-07-19 10 views
7

私はMapViewを持っています。それに1,700ポイントを重ねて表示しています。私は現在Itemized Overlayを使って、すべてのオーバーレイを追加してから、一度フィッシュします。これは機能しますが、パフォーマンスは低速です。ズームレベルとピントを変えるのは難しいです。さて、同じドロアブルなのでArrayItemizedOverlayを使用する方が良いでしょうか、それとも地図が遅くなるでしょうか?(MapViewと1700オーバーレイアイテム).equals( "Slow")

私はアイテムを追加しているどのように
import java.util.ArrayList; 

import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.graphics.Canvas; 
import android.graphics.drawable.Drawable; 
import android.net.Uri; 
import android.app.Activity; 

import com.google.android.maps.ItemizedOverlay; 
import com.google.android.maps.MapView; 
import com.google.android.maps.OverlayItem; 

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

    String newLine = String.format("%n"); 

    public Points(Drawable defaultMarker) { 
     super(boundCenterBottom(defaultMarker)); 
     // TODO Auto-generated constructor stub 
    } 

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

    @Override 
    public int size() { 
     return mOverlays.size(); 
    } 

    @Override 
    public void draw(Canvas canvas, 
      MapView mapView, 
      boolean shadow) { 
     if (!shadow) 
      super.draw(canvas, mapView, shadow); 
    } 

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

    public void populateNow(){ 
     setLastFocusedIndex(-1); 
     populate(); 
    } 

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

    @Override 
    protected boolean onTap(int index) { 
     Intent intent = new Intent(); 
     OverlayItem item = (OverlayItem) mOverlays.get(index); 
     AlertDialog.Builder dialog1 = new AlertDialog.Builder(mContext); 
     dialog1.setTitle(item.getTitle()); 
     String info = item.getSnippet(); 
     String delims = "[$]"; 
     String [] tokens = info.split(delims); 
     String info1 = tokens [0]; 
     String info2 = tokens[1]; 
     String delims2 = "[!]"; 
     String [] tokens2 = info1.split(delims2); 
     double lat = Double.parseDouble(tokens2[0]); 
     double lon = Double.parseDouble(tokens2[1]); 
     final String location = tokens2[0]+","+tokens2[1]; 

     dialog1.setMessage(info2); 

     dialog1.setPositiveButton("Navigate", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       Nav(location); 
      } 
     }); 
     dialog1.setNegativeButton("Directions", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       Direction(location); 
      } 
     }) ; 

     dialog1.show(); 
     return true; 
    } 

    public void Nav(String location) { 
     Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("google.navigation:q=" + location)); 
     mContext.startActivity(i); 
    } 

    public void Direction(String location) { 
     Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("http://maps.google.com/maps?daddr=" + location)); 
     mContext.startActivity(i); 
    } 
} 

mapOverlays = mapView.getOverlays(); 
Drawable drawable = this.getResources().getDrawable(R.drawable.plug); 
itemizedoverlay = new Points(drawable, this); 

while (...) { 
    point = new GeoPoint((int) (lat * 1000000), (int) (lon * 1000000)); 
    overlayitem = new OverlayItem(point, Station_Name, comb); 
    itemizedoverlay.addOverlay(overlayitem); 
} 

答えて

4

完璧なソリューションを待っている間にこれが解決策ではなく、回避策はありません。

私は同じ問題があり、複数のオーバーレイを作成しました。

99ポイントのオーバーレイは、600ポイントのオーバーレイよりも実際には高速です。私の場合

 for (int i = 0; i < 99; i++) { 
      webcamCursor.moveToPosition(i); 
      float lat = Float.valueOf(webcamCursor.getString(webcamCursor 
        .getColumnIndex("Lat"))); 
      float lon = Float.valueOf(webcamCursor.getString(webcamCursor 
        .getColumnIndex("Lon"))); 
      GeoPoint gp = new GeoPoint((int) (lat/10), (int) (lon/10)); 
      myOverlay1.addPoint(gp); 
     } 
     for (int i = 100; i < 199; i++) { 
      webcamCursor.moveToPosition(i); 
      float lat = Float.valueOf(webcamCursor.getString(webcamCursor 
        .getColumnIndex("Lat"))); 
      float lon = Float.valueOf(webcamCursor.getString(webcamCursor 
        .getColumnIndex("Lon"))); 
      GeoPoint gp = new GeoPoint((int) (lat/10), (int) (lon/10)); 
      myOverlay2.addPoint(gp); 
     } 
     for (int i = 200; i < 299; i++) { 
      webcamCursor.moveToPosition(i); 
      float lat = Float.valueOf(webcamCursor.getString(webcamCursor 
        .getColumnIndex("Lat"))); 
      float lon = Float.valueOf(webcamCursor.getString(webcamCursor 
        .getColumnIndex("Lon"))); 
      GeoPoint gp = new GeoPoint((int) (lat/10), (int) (lon/10)); 
      myOverlay3.addPoint(gp); 
     } 
     for (int i = 300; i < 399; i++) { 
      webcamCursor.moveToPosition(i); 
      float lat = Float.valueOf(webcamCursor.getString(webcamCursor 
        .getColumnIndex("Lat"))); 
      float lon = Float.valueOf(webcamCursor.getString(webcamCursor 
        .getColumnIndex("Lon"))); 
      GeoPoint gp = new GeoPoint((int) (lat/10), (int) (lon/10)); 
      myOverlay4.addPoint(gp); 
     } 
     for (int i = 400; i < 499; i++) { 
      webcamCursor.moveToPosition(i); 
      float lat = Float.valueOf(webcamCursor.getString(webcamCursor 
        .getColumnIndex("Lat"))); 
      float lon = Float.valueOf(webcamCursor.getString(webcamCursor 
        .getColumnIndex("Lon"))); 
      GeoPoint gp = new GeoPoint((int) (lat/10), (int) (lon/10)); 
      myOverlay5.addPoint(gp); 
     } 
     for (int i = 500; i < webcamCursor.getCount(); i++) { 
      webcamCursor.moveToPosition(i); 
      float lat = Float.valueOf(webcamCursor.getString(webcamCursor 
        .getColumnIndex("Lat"))); 
      float lon = Float.valueOf(webcamCursor.getString(webcamCursor 
        .getColumnIndex("Lon"))); 
      GeoPoint gp = new GeoPoint((int) (lat/10), (int) (lon/10)); 
      myOverlay6.addPoint(gp); 
     } 
     System.out.println("**TIME**" + (System.currentTimeMillis() - t)); 

     mMap.getOverlays().add(myOverlay1); 
     mMap.getOverlays().add(myOverlay2); 
     mMap.getOverlays().add(myOverlay3); 
     mMap.getOverlays().add(myOverlay4); 
     mMap.getOverlays().add(myOverlay5); 
     mMap.getOverlays().add(myOverlay6); 
+0

私はこれを試してみましたが、それは速くはありませんでした。追加するアイテムは108個あり、3つのパーティションに分割しました。私が使った方法にかかわらず、ほぼ同じ速度でした。 – dermatthias

+0

はい、私は私の例で100のアイテムを使用しています。スピードが落ち始めると限界が150アイテムになると思いますので、心配する必要はありません。 –

0

(15秒ローディング対時間1秒)、IはOverlay#draw()又はMapView#draw()ポイントが可視マップ領域に落ちるかどうかを確認するためにオーバーライドします。並べ替えられた初期点の配列では、チェックが優れています。 しかし、最初のコーディングの反復では、私は上記のソリューションを使用することをお勧めします(Profete 162)。また

0

非常に面白いかもしれません何か.. http://code.google.com/p/mapview-overlay-manager/wiki/LazyLoading

私もそれを試してみましたが、ちょうどいくつかの新しいアイデアを示唆していません。

私は以前の回答を編集する必要があるかどうかは分かりませんが、これはまったく異なるので、新しい回答を投稿する必要があります。

関連する問題