Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.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 在MapView上加载地理点/路径需要花费很长时间。有没有办法加快速度?_Android_Google Maps_Overlay_Android Mapview_Itemizedoverlay - Fatal编程技术网

Android 在MapView上加载地理点/路径需要花费很长时间。有没有办法加快速度?

Android 在MapView上加载地理点/路径需要花费很长时间。有没有办法加快速度?,android,google-maps,overlay,android-mapview,itemizedoverlay,Android,Google Maps,Overlay,Android Mapview,Itemizedoverlay,我正在使用应用程序的自定义地图视图。我有一个保存了大量GPS数据点的数据库,目前我正在使用覆盖图加载这些数据点,然后使用覆盖图在MapView上执行.addAll 但是,在MapView上仅加载几百个数据点作为路径需要2分钟 加载数据点的代码为: private void loadMap() { //Load the specific data from the database DBAdapter db = new DBAdapter(this);

我正在使用应用程序的自定义地图视图。我有一个保存了大量GPS数据点的数据库,目前我正在使用覆盖图加载这些数据点,然后使用覆盖图在MapView上执行.addAll

但是,在MapView上仅加载几百个数据点作为路径需要2分钟

加载数据点的代码为:

    private void loadMap() {        
    //Load the specific data from the database
    DBAdapter db = new DBAdapter(this);
    try {
        db.open();
        Cursor mDataPoints = db.db.rawQuery("SELECT * FROM GPS_DATA)", null);
        if ((mDataPoints != null) && (!mDataPoints.isClosed()) && (mDataPoints.moveToFirst())) {                
            mapMain.setFinishedLoading(false);
            mapMain.getOverlays().clear();

            if ((!mDataPoints.isClosed()) && (mDataPoints.moveToFirst())) {
                while (!mDataPoints.isAfterLast()) {

                    this.drawPath(db, 
                                  DBAdapter.formatLong(mDataPoints, "data_id"), 
                                  DBAdapter.formatString(mDataPoints, "data_name"),
                                  DBAdapter.formatString(mDataPoints, "data_type"));                        

                    mDataPoints.moveToNext();
                }
            }

            mapMain.refreshDrawableState();
            mapMain.setEnabled(true);
        }
    } finally {
        db.close();
    }
}

public void drawPath(DBAdapter db, long pDataID, String pDataName, String pDataType) {  

    Cursor mData = db.getPointDataByDataID(pDataID);
    if ((!mData.isClosed()) && (mData.moveToFirst())) {
        boolean vFirst = true;
        int i = 0;
        GeoPoint startGP;
        GeoPoint geoPoint1;
        GeoPoint geoPoint2 = null;

        while (!mData.isAfterLast()) {
            if (vFirst) {
                startGP = new GeoPoint((int) (DBAdapter.formatDouble(mData, "latitude") * 1E6), (int) (DBAdapter.formatDouble(mData, "longitude") * 1E6));
                mapMain.getOverlays().add(new Map_Route_Overlay(startGP, startGP, this.returnPathColor(pDataType), pDataName));
                vFirst = false;
                geoPoint2 = startGP;
            } else {
                geoPoint1 = geoPoint2;

                geoPoint2 = new GeoPoint((int) (DBAdapter.formatDouble(mData, "latitude") * 1E6), (int) (DBAdapter.formatDouble(mData, "longitude") * 1E6));
                if (geoPoint2.getLatitudeE6() != 22200000) {
                    mapMain.getOverlays().add(new Map_Route_Overlay(geoPoint1, geoPoint2, this.returnPathColor(pDataType), pDataName));
                }
            }

            i += 1;
            mData.moveToNext();
        }

        if (geoPoint2 != null) { 
            mapMain.getOverlays().add(new Map_Route_Overlay(geoPoint2, geoPoint2, this.returnDataColor(pDataType), pDataName));
        }
    }
    mData.close();
}
public int returnDataColor(String pType) {
    int vReturnData = Color.BLUE;

    if (pType.trim().equals("S")) {
        vReturnData = Color.RED;
    }

    return vReturnData;
}
地图\路线\覆盖类的代码为:

public final class Map_Route_Overlay extends Overlay {
  private static String TAG = CoreFunctions.APP_TAG + "_MapRouteOverlay";

  private GeoPoint geoPoint1;
  private GeoPoint geoPoint2;
  private int defaultColor = 999;
  private String dataName = "";

  public Map_Route_Overlay(GeoPoint pGeoPoint1, GeoPoint pGeoPoint2, int pColor, String pText) {
    this.geoPoint1 = pGeoPoint1;
    this.geoPoint2 = pGeoPoint2;
    this.defaultColor = pColor;
    this.dataName = pText;
  }

  public void setDataName(String pName) {
    this.dataName = pName;
  }

  @Override
  public boolean draw (Canvas canvas, MMMapView mapView, boolean shadow, long when) {
    Projection projection = mapView.getProjection();
    if (shadow == false) {
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        Point point = new Point();
        projection.toPixels(this.geoPoint1, point);
        paint.setColor(this.defaultColor);
        Point point2 = new Point();
        projection.toPixels(this.geoPoint2, point2);
        paint.setStrokeWidth(2);
        paint.setAlpha(this.defaultColor == Color.parseColor("#6C8715")?220:120);
        canvas.drawLine(point.x, point.y, point2.x,point2.y, paint);
    }

    return super.draw(canvas, mapView, shadow, when);
  }
}

我尝试了几个选项,包括使用线程加载数据,但在完成后通知MapView加载覆盖图却成了一场噩梦


仅供参考,MMMapView是我的自定义MapView组件,目前它只是继承了MapView并实现了两个功能。

您真的不应该试图一次在屏幕上显示数百个覆盖图,因为这样会导致性能下降。尝试将其限制在10-20。除此之外,它对用户来说实在太忙了

您还应该使用线程从数据库中加载项目。我要做的是使用自定义ItemizedOverlay,并在线程中向其添加自定义OverlayItems。一旦加载完毕,我就调用
mapView.postInvalidate()以便它们显示在屏幕上。

我使用的是:


它提供了懒散加载功能,只加载地图上可见的标记。

我认为加载这么多覆盖会导致严重的性能问题。我试图完成的是从数据库中的数据中绘制一组路径。路径由唯一id分解,然后在另一个数据库表中有相应的记录,可能在10个地质点或200个地质点之间(取决于路径的长度)。我不确定这是否会产生差异,但您是否可以只使用一个覆盖来表示和绘制所有路径?这可能会使性能有所不同。任何人都有使用此库的经验吗?它是否稳定且性能良好?我只在我个人的小项目中使用它,但在1个覆盖层上测试了1000个标记,结果还可以。我没有任何不同方法的经验,所以不知道它在其他方法中的地位。我尝试过,但它不是很灵活。