Android 在MapView上加载地理点/路径需要花费很长时间。有没有办法加快速度?
我正在使用应用程序的自定义地图视图。我有一个保存了大量GPS数据点的数据库,目前我正在使用覆盖图加载这些数据点,然后使用覆盖图在MapView上执行.addAll 但是,在MapView上仅加载几百个数据点作为路径需要2分钟 加载数据点的代码为: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);
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个标记,结果还可以。我没有任何不同方法的经验,所以不知道它在其他方法中的地位。我尝试过,但它不是很灵活。