2014-09-25 77 views
5

我還沒有找到任何有關如何在Android上使用此技術的完整說明,因此我決定創建一個Q &一個線程。如何在Android上使用Viewport Marker Management

如果您的應用程序必須在Google地圖上顯示大量標記並將它們集羣化不足以防止您的應用程序工作速度過慢,那麼您的最佳選擇之一就是使用此Viewport標記管理技術。你可以在這裏閱讀理論解釋:https://developers.google.com/maps/articles/toomanymarkers

我寫了下面的簡短說明...

回答

5

1°---在創建地圖,你必須設置OnCameraChangeListener和獲得的邊界活動的這樣的屏幕:

mMap.setOnCameraChangeListener(new OnCameraChangeListener() { 

     @Override 
     public void onCameraChange(CameraPosition arg0) { 

     LatLngBounds bounds = mapa.getProjection().getVisibleRegion().latLngBounds; 

     } 

2°---此步驟可能會有所不同,取決於如何獲取標記數據。基本上,你要做的是計算每個標記的經度和緯度是否在屏幕邊界內。我將向您展示如何通過從存儲經緯度的SQLite數據庫中提取數據,將其存儲在標記表內的兩個不同的DOUBLE clomuns中。

mMap.setOnCameraChangeListener(new OnCameraChangeListener() { 

     @Override 
     public void onCameraChange(CameraPosition arg0) { 

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

     LatLng northeast = bounds.northeast; 
     String boundLat = String.valueOf(northeast.latitude); 
     String boundLong = String.valueOf(northeast.longitude); 

     LatLng southwest = bounds.southwest; 

     String boundLat2 = String.valueOf(southwest.latitude); 
     String boundLong2 = String.valueOf(southwest.longitude); 

     //Remove all markers from map 

     mMap.clear(); // or if your a using cluster manager: 
     //mClusterManager.clearItems(); 

     String[] fields = new String[] { "name", "latitude", "longitude" }; 
     String[] args = new String[] {boundLat, boundLong, boundLat2, boundLong2,}; 

     Cursor markers = dataBase.query("markers", fields, "latitude<=? AND longitude<=? AND latitude>=? AND longitude>=?"); 

     if (markers.moveToFirst()) { 
       do { 
        mMap.addMarker(new MarkerOptions() 
        .position(new LatLng(marker.getDouble(1), marker.getDouble(2))) 
        .title(marker.getString(0))); 

        // or if you are using cluster manager create and add the items as you normaly do. 

        } while (c.moveToNext()); 

        //if using cluster manager add : 
        //mClusterManager.cluster(); 
        } 
    } 
}); 

我們的想法很簡單,只需要記住,你的標記lat和隆基必須比屏幕的東北位置比西南角小,大,或者僅使用LatLngBounds.contains功能。

編輯:

爲了避免標記這是不是已經在屏幕中心時,點擊信息窗口關閉得到,你可以更改標記點擊收聽默認操作,刪除相機的舉動。

map.setOnMarkerClickListener(new OnMarkerClickListener() { 

     @Override 
     public boolean onMarkerClick(Marker arg0) { 
      arg0.showInfoWindow(); 

      return true; //must be true, if not, it will execute the default code after yours 
     } 

    }); 
+0

工程就像一個魅力。但是,如何顯示標記的標題?當我按下標記時,setOnCameraChangeListener()被調用並再次關閉標題。你如何解決這個問題?謝謝! – jcasadellaoller 2015-11-20 11:21:48

+0

我編輯了答案。 – MauriF 2015-11-25 14:40:28

+2

謝謝mauriF。我解決了它,但以不同的方式。我在markerClickListener上設置了一個布爾值爲true,如果在onCameraChange中爲true,則爲false。最後,如果布爾值爲假,則只更新相機位置。結果相同。感謝你的寶貴時間! – jcasadellaoller 2015-11-26 18:22:02