Adding multiple markers in Google Maps API v2 Android

前端 未结 6 743
礼貌的吻别
礼貌的吻别 2020-11-30 02:23

I want to add multiple markers in my map, but I don\'t know the way.

At the moment, I\'m using this, and it works correctly:

Marker m1 = googleMap.ad         


        
相关标签:
6条回答
  • 2020-11-30 02:25

    It depends on the source of your data. The better way is to make your custom object to store data. For example:

    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;
            }
        }
    

    Then, you can write some method to convert data from your external file to list of your custom data objects (but I think it is out of scope of this question).

    Then just pass this data to your marker-drawing method and loop through it. It's a good practice thought to save your markers in some arraylist or map(object, marker) too, then you can easily access it.

    Something like that:

        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)
  • 2020-11-30 02:33

    In Kotlin you can do as :-

    Let you have list of markerData as markerList

    val markerList = ArrayList<MarkerData>()
    

    and then you can iterate list through forEach loop and add Marker in GoogleMap as :-

     markerList.forEach{ markerData ->
         googleMap.addMarker(MarkerOptions()
        .position(LatLng(markerData.latitutde, markerData.longitude))
        .anchor(0.5f, 0.5f)
        .title(markerData.title)
        .snippet(markerData.snippet)
        .icon(BitmapDescriptorFactory.fromResource(markerData.iconResID)))
       }
    

    Suppose your MarkerData is :-

    class MarkerData(val latitutde : Double, val longitude : Double, val title : String, val snippets: String, @DrawableRes val iconResID: Int)
    

    And you are adding MarkerData as -:

    MarkerData(
                35.61049,
                139.63007,
                "Tokyo",
                "hello Tokyo",
                R.drawable.ic_icon_user_review
            )
    

    then you have to create a custom method for vector assets icon like this :-

     private fun bitmapDescriptorFromVector(context: Context, vectorResId: Int): BitmapDescriptor? {
        return ContextCompat.getDrawable(context, vectorResId)?.run {
            setBounds(0, 0, intrinsicWidth, intrinsicHeight)
            val bitmap = Bitmap.createBitmap(intrinsicWidth, intrinsicHeight, Bitmap.Config.ARGB_8888)
            draw(Canvas(bitmap))
            BitmapDescriptorFactory.fromBitmap(bitmap)
        }
    }
    

    and then for Marker your method would be as :

     markerList.forEach{ markerData ->
         googleMap.addMarker(MarkerOptions()
        .position(LatLng(markerData.latitutde, markerData.longitude))
        .anchor(0.5f, 0.5f)
        .title(markerData.title)
        .snippet(markerData.snippet)
        .icon(bitmapDescriptorFromVector(context!!, R.drawable.ic_icon_marker)))
       }
    
    0 讨论(0)
  • 2020-11-30 02:36

    So, if you get coordinates from txt file you could read them like this:

    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
             }
        }
    }
    

    if your txt file looks like this

    23.45 43.23
    23.41 43.65
    .
    .
    .
    

    Than you could modify string to LatLng objects:

    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]);
    }
    

    And than:

    for(LatLng cor : coordinates){
        map.addMarker(new MarkerOptions()
           .position(cor.getLat(), cor.getLng())
           .title("Hello"));
    }
    
    0 讨论(0)
  • 2020-11-30 02:42
    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 讨论(0)
  • 2020-11-30 02:43

    Use MarkerOptions

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

    You can add to the list of latlngs by,

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

    And then, use for loop to set them on the map.

     for (LatLng point : latlngs) {
         options.position(point);
         options.title("someTitle");
         options.snippet("someDesc");
         googleMap.addMarker(options);
     }
    
    0 讨论(0)
  • 2020-11-30 02:50

    Yes , you can use the ArrayList for storing all the marker in that list and after that use the for-loop for adding markers on map.

    For example:

    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 讨论(0)
提交回复
热议问题