オーバーレイを使用して、任意のソースから取得した数万のジオポイントの形状を描画することで、Google マップ上の領域をマークしています。これは機能し、次のようになります。
@Override
public void draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow) {
super.draw(canvas, mapView, false);
Projection projection = mapView.getProjection();
List<Zone> zones = ApplicationContext.getZones();
path.rewind();
for (Zone zone : zones) {
paint.setDither(true);
paint.setStyle(Style.FILL);
paint.setAlpha(40);
MultiPolygon multiPolygon = zone.getMultiPolygon();
List<Polygon> polygons = multiPolygon.getPolygons();
for (Polygon polygon : polygons) {
for (List<Coordinate> coordinates : polygon.getCoordinates()) {
for (int i = 0; i < coordinates.size(); i++) {
Point p = new Point();
projection.toPixels(new GeoPoint((int)(coordinates.get(i).getLatitude() * 1E6), (int)(coordinates.get(i).getLongitude() * 1E6)), p);
if (i == 0) {
path.moveTo(p.x, p.y);
}
else {
path.lineTo(p.x, p.y);
}
}
}
}
}
canvas.drawPath(path, paint);
}
問題は、これが非常にリソースを消費することです。MapView でマップをスクロールまたは移動するたびに、ピクセル座標が変更されているため、パスを何度も計算する必要があります。描画された領域が非常に大きくなり、MapView でのスクロールが非常に遅くなり、機能的に使用できなくなる可能性があります。
私のアイデアは
- パスが生成する「形状」を何らかの方法でキャッシュし、MapView でズーム レベルが変更されたときにそれを再描画するだけです。
- 「その場で」ビットマップで何らかの方法で絵を描き、それをオーバーレイとして(おそらくItemizedOverlayとして)使用し、MapViewのスクロールをリッスンし、スクロールされた距離だけビットマップを移動します。
より良い方法があるかどうかはわかりません。
この問題を解決する方法はありますか? (Google Maps API 1 を使用しており、変更できません)。