このアプリケーションでは、Google マップ API v1 を使用します。マーカーのグリッドベースのクラスタ化を作成しました(合計数千まで)。すべてが正常に動作します - 良好なパフォーマンスなど...唯一の問題は、現在表示されている領域に応じてグリッドを計算することです
private void createCluster2DArray() {
double cwidth = (cachedrightLongitude - cachedleftLongitude) / clustersXnum;
double cheight = (cachedtopLatitude - cachedbottomLatitude) / clustersYnum;
for (int i = 0; i < clustersXnum; i++) {
for (int j = 0; j < clustersYnum; j++) {
Cluster cluster;
if (clusters[i][j] == null) {
cluster = new Cluster();
clusters[i][j] = cluster;
} else {
cluster = clusters[i][j];
cluster.list.clear();
}
//calculate dimensions
cluster.left = cachedleftLongitude + i * cwidth;
cluster.right = cluster.left + cwidth;
cluster.bottom = cachedbottomLatitude + j * cheight;
cluster.top = cluster.bottom + cheight;
cluster.calculateCenter(mMapView);
}
}
}
cachedrightLongitude, cachedrightLongitude, cachedrightLongitude, cachedrightLongitude
度単位のデバイス画面領域の境界です。問題は、ユーザーが表示領域を変更する (ズーム レベルを変更する、または単に画面をスライドする) たびにクラスターの境界線が変化することです。これにより、クラスターの再計算とマーカーの再配布が行われます。
私が見る唯一の解決策は、ズームレベルごとにある種の静的な画面に依存しないクラスターを作成することです(たとえば、ズームレベル5ではクラスターのサイズは10ミリ度になり、レベル6では2ミリ度になるため、境界クラスターのみサイズと外枠を動的に変更します)。私は正しいですか?
他の提案はありますか?