如何在谷歌地图中一一删除标记?
Posted
技术标签:
【中文标题】如何在谷歌地图中一一删除标记?【英文标题】:How to remove marker one by one in google map? 【发布时间】:2020-01-29 09:26:26 【问题描述】:我单击撤消按钮以删除标记。
mFbClearLastPins = (Button) rootView.findViewById(R.id.fab_last_one_clear);
mFbClearLastPins.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Log.d("index-size", String.valueOf(latLng));
Log.d("index", String.valueOf(index));
Log.d("latLng", String.valueOf(latLng.size()));
if (index > 0 && latLng.size() > 0)
try
latLng.remove(index - 1);
remove(mMarkers.get("name" + String.valueOf(index)).getTitle());
// remove(mMarkers.get("marker" + String.valueOf(index)).getSnippet());
index--;
options = new PolylineOptions().width(20).color(Color.YELLOW).geodesic(true);
catch (ArrayIndexOutOfBoundsException e)
e.printStackTrace();
else
googleMap.clear();
);
package com.vvsugar.fragments.plotmaster;
import android.Manifest;
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.location.Location;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.Polyline;
import com.google.android.gms.maps.model.PolylineOptions;
import com.google.android.gms.maps.model.PolylineOptions;
import com.vvsugar.R;
import com.vvsugar.activity.MainActivity;
import com.vvsugar.dbview.plotmeasure.PlotMeasureDb;
import com.vvsugar.utils.AmtPref;
import com.vvsugar.utils.AppUtils;
import com.vvsugar.utils.Conversion;
import com.vvsugar.utils.GPSTracker;
import com.vvsugar.utils.SphericalUtil;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import static android.content.ContentValues.TAG;
public class Map extends Fragment implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
LocationListener
static final int REQUEST_LOCATION = 2;
private final java.util.Map<String, MarkerOptions> mMarkers = new ConcurrentHashMap<String, MarkerOptions>();
protected LocationManager locationManager;
MapView mMapView;
ArrayList<LatLng> markerPoints;
GoogleApiClient mGoogleApiClient;
GPSTracker gpsTracker;
List<LatLng> latLng = new ArrayList<>();
PolylineOptions options = new PolylineOptions().width(20).color(Color.YELLOW).geodesic(true);
PlotMeasureDb measureDb;
View screen;
Location mLocation;
Marker mCurrLocationMarker;
LocationRequest mLocationRequest;
ArrayList<LatLng> points;
private GoogleMap googleMap;
private FloatingActionButton sds;
private Button mFabCompleted, mFabChangeTheme, mFabClearAllPins, mFbClearLastPins, mFabGetCurrentLocation;
private int index = 0;
private Polyline mPolyLine;
private Location mCurrentLocation;
private double longitude;
private double latitude;
private boolean isFirstTime = true;
private FrameLayout mapdetail;
private TextView areaFinder;
private Button mDoneBtn;
private Dialog dialog;
private Bitmap bmScreen;
private List<Marker> markers = new ArrayList<>();
private MarkerOptions marker;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
View rootView = inflater.inflate(R.layout.plot_measure_fragment, container, false);
gpsTracker = new GPSTracker(getActivity());
mMapView = (MapView) rootView.findViewById(R.id.mapView);
screen = rootView.findViewById(R.id.mapView);
mapdetail = rootView.findViewById(R.id.mapdetail);
areaFinder = rootView.findViewById(R.id.textViewAcre);
mDoneBtn = rootView.findViewById(R.id.done);
mFabChangeTheme = (Button) rootView.findViewById(R.id.fab_change_theme);
mMapView.getMapAsync(this);
mFabChangeTheme.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
if (googleMap.getMapType() == GoogleMap.MAP_TYPE_NORMAL)
mFabChangeTheme.setText("Map");
googleMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
else
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
mFabChangeTheme.setText("Satelite View");
);
checkLocationPermission();
mFabCompleted = (Button) rootView.findViewById(R.id.fab_completed);
mFabCompleted.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
int i;
if (latLng.size() > 0)
// latLng.clear();
for (i = 0; i < latLng.size(); i++)
Log.d(TAG, "onMapReady: " + latLng.get(i));
options.add(latLng.get(i));
if (i > 0)
options.add(latLng.get(0));
mPolyLine = googleMap.addPolyline(options);
mapdetail.setVisibility(View.VISIBLE);
double metere = 1.329409963886882 * 0.0002471053815;
final double acre = Conversion.meterToAcre(Conversion.arrondi(SphericalUtil.computeArea(latLng)));
areaFinder.setText(String.format("%.2f", Double.parseDouble(String.valueOf(acre))) + " acr");
mDoneBtn.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
DecimalFormat df = new DecimalFormat("#0.00");
measureDb = new PlotMeasureDb(AmtPref.getInstance().getPlotBitName(), String.valueOf(df.format(acre)));
measureDb.save();
AppUtils.switchFragment(new PlotMeasureDetailsGetFragment(), "Masters", true, (MainActivity) getActivity());
);
Log.d(TAG, "showmeasureArea: " + SphericalUtil.computeArea(latLng) + "meter-" + metere + "acre" + acre);
Log.d(TAG, "acre: " + acre);
);
mFabClearAllPins = (Button) rootView.findViewById(R.id.fab_all_clear);
mFabClearAllPins.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Log.d(TAG, "onClick: " + "called");
if (mPolyLine != null)
mPolyLine.remove();
latLng.clear();
index = 0;
Log.d("clearlatLng", String.valueOf(latLng.size()));
options = new PolylineOptions().width(20).color(Color.YELLOW).geodesic(true);
googleMap.clear();
);
mFbClearLastPins = (Button) rootView.findViewById(R.id.fab_last_one_clear);
mFbClearLastPins.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Log.d("index-size", String.valueOf(latLng));
Log.d("index", String.valueOf(index));
Log.d("latLng", String.valueOf(latLng.size()));
if (index > 0 && latLng.size() > 0)
try
latLng.remove(index - 1);
remove(mMarkers.get("name" + String.valueOf(index)).getTitle());
// remove(mMarkers.get("marker" + String.valueOf(index)).getSnippet());
index--;
options = new PolylineOptions().width(20).color(Color.YELLOW).geodesic(true);
catch (ArrayIndexOutOfBoundsException e)
e.printStackTrace();
else
googleMap.clear();
);
mFabGetCurrentLocation = (Button) rootView.findViewById(R.id.fab_get_current_location);
mFabGetCurrentLocation.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
DrawPolyLines(googleMap);
);
mMapView.onCreate(savedInstanceState);
mMapView.onResume();
try
MapsInitializer.initialize(getActivity().getApplicationContext());
catch (Exception e)
e.printStackTrace();
mMapView.getMapAsync(this);
return rootView;
private void remove(String name)
mMarkers.remove(name);
getActivity().runOnUiThread(new Runnable()
@Override
public void run()
googleMap.clear();
for (MarkerOptions item : mMarkers.values())
googleMap.addMarker(item);
);
@Override
public void onStart()
super.onStart();
@SuppressLint("MissingPermission")
public void DrawPolyLines(GoogleMap mMap)
double latitude;
double longitude;
index++;
googleMap = mMap;
mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mCurrentLocation != null)
latitude = mCurrentLocation.getLatitude();
longitude = mCurrentLocation.getLongitude();
else
latitude = gpsTracker.getLatitude();
longitude = gpsTracker.getLongitude();
Toast.makeText(getContext(), String.valueOf(latitude + " " + longitude), Toast.LENGTH_LONG).show();
int sze = latLng.size();
Toast.makeText(getContext(), String.valueOf(sze), Toast.LENGTH_LONG).show();
marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title("" + String.valueOf(index));
mMarkers.put("name" + String.valueOf(index), marker);
/* marker = new MarkerOptions().position(new LatLng(latitude, longitude)).snippet("" + String.valueOf(index));
mMarkers.put("marker" + String.valueOf(index), marker);*/
googleMap.addMarker(marker);
// markers.add(mark);
latLng.add(new LatLng(latitude, longitude));
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(latitude, longitude), 100));
// Log.d(TAG, "onMapDistance: " + computeDistanceBetween(latLng.get(0), new LatLng(13.060233, 80.264376)));
// Log.d(TAG, "onMapComputeArea: " + computeArea(this.latLng));
@Override
public void onResume()
super.onResume();
mMapView.onResume();
@Override
public void onPause()
super.onPause();
mMapView.onPause();
@Override
public void onDestroy()
super.onDestroy();
mMapView.onDestroy();
@Override
public void onLowMemory()
super.onLowMemory();
mMapView.onLowMemory();
public boolean checkLocationPermission()
if (ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED)
if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(),
Manifest.permission.ACCESS_FINE_LOCATION))
new AlertDialog.Builder(getActivity())
.setTitle("")
.setMessage("")
.setPositiveButton("Ok", new DialogInterface.OnClickListener()
@Override
public void onClick(DialogInterface dialogInterface, int i)
ActivityCompat.requestPermissions(getActivity(), new String[]
Manifest.permission.ACCESS_FINE_LOCATION, 1);
)
.create()
.show();
else
ActivityCompat.requestPermissions(getActivity(),
new String[]Manifest.permission.ACCESS_FINE_LOCATION,
1);
return false;
else
return true;
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults)
switch (requestCode)
case 1:
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED)
if (ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED)
googleMap.setMyLocationEnabled(true);
else
return;
@SuppressLint("MissingPermission")
@Override
public void onMapReady(GoogleMap googleMap)
this.googleMap = googleMap;
googleMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
//Initialize Google Play Services
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
if (ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED)
buildGoogleApiClient();
googleMap.setMyLocationEnabled(true);
else
buildGoogleApiClient();
googleMap.setMyLocationEnabled(true);
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState)
super.onViewCreated(view, savedInstanceState);
//dbAdapter = new DbAdapter(getContext());
protected synchronized void buildGoogleApiClient()
mGoogleApiClient = new GoogleApiClient.Builder(getActivity())
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mGoogleApiClient.connect();
@Override
public void onLocationChanged(Location location)
mCurrentLocation = location;
if (mCurrLocationMarker != null)
mCurrLocationMarker.remove();
//Place current location marker
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(latLng);
markerOptions.title("Current Position");
markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));
mCurrLocationMarker = googleMap.addMarker(markerOptions);
Toast.makeText(getContext(), String.valueOf(mCurrentLocation.getLatitude() + " " + mCurrentLocation.getLongitude()), Toast.LENGTH_LONG).show();
//move map camera
// googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 100));
//stop location updates
if (mGoogleApiClient != null)
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
@Override
public void onConnected(@Nullable Bundle bundle)
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(1000);
mLocationRequest.setFastestInterval(1000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
if (ContextCompat.checkSelfPermission(getActivity(),
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED)
// LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
//move map camera
mCurrentLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (mCurrentLocation != null)
LatLng latLng = new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude());
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(latLng);
markerOptions.title("Current Position");
markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA));
mCurrLocationMarker = googleMap.addMarker(markerOptions);
Toast.makeText(getContext(), String.valueOf(mCurrentLocation.getLatitude() + " " + mCurrentLocation.getLongitude()), Toast.LENGTH_LONG).show();
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 100));
if (mGoogleApiClient.isConnected())
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
@Override
public void onConnectionSuspended(int i)
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult)
google map pic
[1]: https://i.stack.imgur.com/MiQd0.jpg
【问题讨论】:
【参考方案1】:您可以使用ArrayList,当您在谷歌地图中添加标记时,您还需要在列表中添加标记。
ArrayList<Marker> markers = new ArrayList();
final Marker marker = activity.mMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)));
markers.add(marker);
当你想删除标记时,你可以从列表中获取标记,你可以从地图中删除标记。
Marker marker1 =markers.get(0);
marker1.remove();
【讨论】:
老兄,这个不行,我需要一个一个删除。 如果你想删除所有标记,那么你可以使用 map.clear 那么 marker.remove() 应该可以工作。你能分享你最近更新的代码吗?以上是关于如何在谷歌地图中一一删除标记?的主要内容,如果未能解决你的问题,请参考以下文章