web-dev-qa-db-ja.com

GoogleマップAndroid API v2は、マーカーを多数追加すると非常に遅くなります

既存のAndroidアプリを新しいGoogleマップを使用するように更新していますAndroid API v2。マップに追加するマーカーが約2500あります。古いバージョンのAPIでは、マーカーの数が2500の場合、マップの応答性が非常に悪かったため、マップの現在表示されている領域にあるマーカーのみを追加することで回避する必要がありました。

新しいAPIを使用すると2500マーカーが高速になることを期待していましたが、Nexus 4でもそれはひどいものであり、クラスタリングを実行するためのオプションはありません。

だから私の質問:特定の緯度/経度のポイントがマップの可視領域内に含まれているかどうかをどのように判断できますか?

私はドキュメントで VisibleRegion を見てきましたが、今のところそれでうまくいきません。どんな助けでも大歓迎です。

*注意事項:iOS MKMapView(googleマップまたはAppleマップ)上の2500マーカーは、iPhone 3gsを使用しても非常にスムーズで応答性があります。Androidでは速度が遅い理由を理解できませんが、最新かつ最高のハードウェアでも。

31
DiscDev

さてさて、いくつかのことを試した後、特定のポイントが可視領域にあるかどうかを判断する方法を見つけました。それは非常に簡単です。

//Note: this.mMap is an instance of GoogleMap

LatLngBounds bounds = this.mMap.getProjection().getVisibleRegion().latLngBounds;

LatLng markerPoint = new LatLng(item.getLatitude(), item.getLongitude());

if(bounds.contains(markerPoint))
{
    this.mMap.addMarker(new MarkerOptions(...));    
}

* GoogleMapの投影を取得するのは負荷の高い操作なので、マーカーを作成するためにアイテムの長いリストをループして、私と同じようにマップに追加する場合は、ループする前に一度だけ投影を取得してください。

更新

私は、マップの可視領域にあるマーカーを表示する方法と、画面から移動したマーカーを非表示にする方法を詳しく説明するブログ投稿を書くことにしました。これは完璧な解決策ではありませんが、何千ものマーカーを表示していて、ユーザーがそれらすべてを同時に見る必要がないことを知っている場合(ズームアウトしない限り)、これはかなり良い回避策です。

Googleマップでのマーカーの表示と非表示Android API V2

52
DiscDev

Androidでのクラスタリングソリューションの場合、Android Maps Extensions: https://github.com/mg6maciej/Android-maps -extensions

13
MaciejGórski