Google Maps Android - 仅显示特定缩放级别以下的标记 [英] Google Maps Android - Only show markers below a certain zoom level
问题描述
过去几周我一直在努力解决这个问题,但没有任何工作答案。帮助表示赞赏。
我只想显示某个缩放级别以下的标记。这不仅是为了防止滞后,而且也是为了防止标记聚集。标记群集不是我要找的。 p>
请帮忙!以下是我的Java代码:
package us.wingitapp.jared.wingit;
$ p
导入android.Manifest;
导入android.content.pm.PackageManager;
导入android.location.Address;
导入android.location.Geocoder;
导入android.os.Bundle;
导入android.support.v4.app.ActivityCompat;
导入android.support.v4.app.FragmentActivity;
导入android.util.Log;
导入android.view.View;
导入android.widget.EditText;
import com.google.android.gms.maps.CameraUpdateFactory;
导入com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
导入com.google.android.gms.maps.model.Marker;
导入com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.common.api.Status;
import com.google.android.gms.location.places.Place;
import com.google.android.gms.location.places.ui.PlaceAutocompleteFragment;
import com.google.android.gms.location.places.ui.PlaceSelectionListener;
import java.io.IOException;
import java.util.List;
公共类MainActivity扩展FragmentActivity实现OnMapReadyCallback {
私有GoogleMap mMap;
PlaceAutocompleteFragment placeAutoComplete;
private static final String TAG =Main Activity;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
placeAutoComplete =(PlaceAutocompleteFragment)getFragmentManager()。findFragmentById(R.id.place_autocomplete);
placeAutoComplete.setOnPlaceSelectedListener(new PlaceSelectionListener(){
@Override
public void onPlaceSelected(Place place){
Log.i(TAG,Place Selected: + place.getName());
LatLng latLng = place.getLatLng();
//移动地图相机
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,11) );
}
@Override
public void onError(状态状态){
Log.d(Maps,发生错误:+状态) ;
}
});
SupportMapFragment mapFragment =(SupportMapFragment)getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap){
mMap = googleMap;
//在这里初始化标记
}
}
$ b解决方案
创建一个变量来存储标记。 b $ b
列表<标记> list = new ArrayList<>();
然后设置 添加所有标记。
Marker marker = googleMap.addMarker(new MarkerOptions()。position(latlng).title(name).snippet(snippet));
list.add(marker);
OnCameraChangeListener
。googleMap.setOnCameraChangeListener(new
GoogleMap.OnCameraChangeListener(){
@Override
public void onCameraChange(CameraPosition cameraPosition){
for(Marker m:list){
m.setVisible(cameraPosition.zoom> 8);
// 8这里是您的缩放级别,您可以设置它作为您的需要。
}
}
});
此外,初始化所有标记这个列表是你可以通过提供一个位置来获得任何标记的所有信息,你也可以设置一个微调器来选择一个标记,并在微调器中选择时将摄像机移动到该标记。(下面的代码可能不是必需的,但不是无用的)
以下代码可以帮助您(仅从我的项目中复制粘贴)。
$ b $ (标记m:列表){
if(m.getTitle()。equals(selection)){
m.showInfoWindow();
CameraPosition cameraPosition = new CameraPosition.Builder()。target(m.getPosition())。zoom(14).build();
googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
休息;
选择
这里是一个从spinner的 onItemClickListener
传递的字符串,你也可以在方法中放置上面的代码,把方法调用放在 onItemClickListener
,然后通过此方法调用传递字符串。
仍然有些东西缺失,随时可以问。
I've been working on this for the last few weeks with no working answer. Help is appreciated.
I want to only show markers below a certain zoom level. This is not only to prevent lag, but also to prevent clustering of markers. Marker clustering isn't what I'm looking for.
Please help! Here's my java code so far:
package us.wingitapp.jared.wingit;
import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
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.common.api.Status;
import com.google.android.gms.location.places.Place;
import com.google.android.gms.location.places.ui.PlaceAutocompleteFragment;
import com.google.android.gms.location.places.ui.PlaceSelectionListener;
import java.io.IOException;
import java.util.List;
public class MainActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
PlaceAutocompleteFragment placeAutoComplete;
private static final String TAG = "Main Activity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
placeAutoComplete = (PlaceAutocompleteFragment) getFragmentManager().findFragmentById(R.id.place_autocomplete);
placeAutoComplete.setOnPlaceSelectedListener(new PlaceSelectionListener() {
@Override
public void onPlaceSelected(Place place) {
Log.i(TAG, "Place Selected: " + place.getName());
LatLng latLng = place.getLatLng();
//move map camera
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng,11));
}
@Override
public void onError(Status status) {
Log.d("Maps", "An error occurred: " + status);
}
});
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
//initialize markers here
}
}
Create a variable to store markers.
List<Marker> list = new ArrayList<>();
Add all markers to it like.
Marker marker = googleMap.addMarker(new MarkerOptions().position(latlng).title(name).snippet(snippet)); list.add(marker);
Then set an
OnCameraChangeListener
.googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { @Override public void onCameraChange(CameraPosition cameraPosition) { for(Marker m:list){ m.setVisible(cameraPosition.zoom>8); //8 here is your zoom level, you can set it as your need. } } });
Also, the advantage of initializing all markers in this list is you can get all info of any marker by providing a position and you can also set a spinner to select a marker and move the camera to that marker upon selection in the spinner.(Below code may not be required but not useless at all)
Following code can help (just a copy paste though from my project).
for (Marker m: list) {
if (m.getTitle().equals(selection)) {
m.showInfoWindow();
CameraPosition cameraPosition = new CameraPosition.Builder().target(m.getPosition()).zoom(14).build();
googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
break;
}
}
selection
here is a string passed from the onItemClickListener
of the spinner and also you can put above code in a method, put method call in onItemClickListener
of the spinner and pass the string through this method call.
Still, something missing, feel free to ask.
这篇关于Google Maps Android - 仅显示特定缩放级别以下的标记的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!