2015-06-01 126 views
10

我想在地圖中添加多個標記,但我不知道方法。在Google Maps API v2中添加多個標記Android

目前,即時通訊使用這一點,它工作正常:

Marker m1 = googleMap.addMarker(new MarkerOptions() 
       .position(new LatLng(38.609556, -1.139637)) 
       .anchor(0.5f, 0.5f) 
       .title("Title1") 
       .snippet("Snippet1") 
       .icon(BitmapDescriptorFactory.fromResource(R.drawable.logo1))); 


Marker m2 = googleMap.addMarker(new MarkerOptions() 
       .position(new LatLng(40.4272414,-3.7020037)) 
       .anchor(0.5f, 0.5f) 
       .title("Title2") 
       .snippet("Snippet2") 
       .icon(BitmapDescriptorFactory.fromResource(R.drawable.logo2))); 


Marker m3 = googleMap.addMarker(new MarkerOptions() 
       .position(new LatLng(43.2568193,-2.9225534)) 
       .anchor(0.5f, 0.5f) 
       .title("Title3") 
       .snippet("Snippet3") 
       .icon(BitmapDescriptorFactory.fromResource(R.drawable.logo3))); 

但問題是當我想在我的地圖添加300個標記。一個接一個地做這件事很煩人。

有什麼方法可以從數組或其他任何地方讀取標記嗎?

另一個問題:我可以從外部文件讀取標記,因此我可以在不觸摸應用程序代碼的情況下添加或更新標記嗎?

謝謝。

+2

您需要存儲你的'LatLag'在一個ArrayList和使用循環添加多個標記。 – Piyush

回答

32
ArrayList<MarkerData> markersArray = new ArrayList<MarkerData>(); 

for(int i = 0 ; i < markersArray.size() ; i++) { 

    createMarker(markersArray.get(i).getLatitude(), markersArray.get(i).getLongitude(), markersArray.get(i).getTitle(), markersArray.get(i).getSnippet(), markersArray.get(i).getIconResID()); 
} 

... 

protected Marker createMarker(double latitude, double longitude, String title, String snippet, int iconResID) { 

    return googleMap.addMarker(new MarkerOptions() 
      .position(new LatLng(latitude, longitude)) 
      .anchor(0.5f, 0.5f) 
      .title(title) 
      .snippet(snippet); 
      .icon(BitmapDescriptorFactory.fromResource(iconResID))); 
} 
+0

歡迎來到SO ..請儘量寫下你的解決方案。 – deejay

+5

不工作,只添加一個標記,即僅用於第一個記錄 –

1

所以,如果你從TXT文件的座標,你可以這樣閱讀:

BufferedReader reader = null; 
try { 
    reader = new BufferedReader(
     new InputStreamReader(getAssets().open("filename.txt"), "UTF-8")); 

    // do reading, usually loop until end of file reading 
    String mLine = reader.readLine(); 
    while (mLine != null) { 
     //process line 
     ... 
     mLine = reader.readLine(); 
    } 
} catch (IOException e) { 
    //log the exception 
} finally { 
    if (reader != null) { 
     try { 
      reader.close(); 
     } catch (IOException e) { 
      //log the exception 
     } 
    } 
} 

如果你的txt文件看起來像這樣

23.45 43.23 
23.41 43.65 
. 
. 
. 

比你能修改字符串LatLng對象:

String[] coord = mLine.split("\\r?\\n"); 
ArrayList<LatLng> coordinates = new ArrayList<LatLng>; 

for(int i = 0; i < coord.lenght(); ++i){ 
    String[] latlng = coord.split(" "); 
    coordinates.add(new LatLng(latlng[0], latlng[1]); 
} 

而且比:

for(LatLng cor : coordinates){ 
    map.addMarker(new MarkerOptions() 
     .position(cor.getLat(), cor.getLng()) 
     .title("Hello")); 
} 
+0

我通過txt文件獲取我的座標,我在地圖中存儲了我需要的座標 –

+0

@Tárraga我修改了我的答案。 – IgorB

8

使用MarkerOptions

private GoogleMap googleMap; 
private MarkerOptions options = new MarkerOptions(); 
private ArrayList<LatLng> latlngs = new ArrayList<>(); 

您可以添加到latlngs通過的名單,

latlngs.add(new LatLng(12.334343, 33.43434)); //some latitude and logitude value 

然後,使用循環來設置他們在地圖上。

for (LatLng point : latlngs) { 
    options.position(point); 
    options.title("someTitle"); 
    options.snippet("someDesc"); 
    googleMap.addMarker(options); 
} 
+1

謝謝。工作正常:D – Ferrrmolina

0

是的,你可以使用ArrayList存儲在該列表中的所有標記,之後用for循環用於在地圖上添加標記。

例如:

googleMap.clear(); 
Now get all the marker in the Markers 
//seachModelsList is the list of all markers 
Marker[] allMarkers = new Marker[seachModelsList.size()]; 

for (int i = 0; i < seachModelsList.size(); i++) 
{ 
    LatLng latLng = new LatLng(seachModelsList.get(i).getCoordinates()[1], seachModelsList.get(i) 
      .getCoordinates()[0]); 
    if (googleMap != null) { 
     googleMap.setOnMarkerClickListener(this); 
     allMarkers[i] = googleMap.addMarker(new MarkerOptions().position(latLng); 
     googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 17.0f)); 
     googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 17)); 

    } 
} 
0

這取決於你的數據的來源。更好的方法是使您的自定義對象來存儲數據。例如:

public class MyMarkerData { 
     LatLng latLng; 
     String title; 
     Bitmap bitmap; 

     public LatLng getLatLng() { 
      return latLng; 
     } 

     public void setLatLng(LatLng latLng) { 
      this.latLng = latLng; 
     } 

     public String getTitle() { 
      return title; 
     } 

     public void setTitle(String title) { 
      this.title = title; 
     } 

     public Bitmap getBitmap() { 
      return bitmap; 
     } 

     public void setBitmap(Bitmap bitmap) { 
      this.bitmap = bitmap; 
     } 
    } 

然後,你可以寫一些方法將數據從外部文件轉換成自定義的數據對象的列表(但我認爲這超出了這個問題的範圍)。

然後只需將此數據傳遞給您的標記繪製方法並循環。在一些數組列表或者地圖(對象,標記)中保存標記是一種很好的做法,那麼您可以輕鬆訪問它。

類似的東西:

HashMap<Marker, MyMarkerData> mDataMap = new HashMap<>(); 

     public void drawMarkers(ArrayList<MyMarkerData> data) { 
       Marker m; 
       for (MyMarkerData object: data) { 
        m = googleMap.addMarker(new MarkerOptions() 
          .position(object.getLatLng()) 
          .title(object.getTitle()) 
          .icon(BitmapDescriptorFactory.fromBitmap(object.getBitmap())); 

        mDataMap.put(m, object); 
       } 
      } 
+0

那麼,我應該在哪裏添加數據? –

+0

這取決於你,但肯定在調用繪製方法之前。如果你正在使用外部文件,試着找到它轉換爲Java對象 –

+0

我應該問太多如何通過這種方式添加數據,或者如果你能給我一個例子。 –

相關問題