Google Maps Android - 仅显示特定缩放级别以下的标记 [英] Google Maps Android - Only show markers below a certain zoom level

查看:92
本文介绍了Google Maps Android - 仅显示特定缩放级别以下的标记的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

过去几周我一直在努力解决这个问题,但没有任何工作答案。帮助表示赞赏。



我只想显示某个缩放级别以下的标记。这不仅是为了防止滞后,而且也是为了防止标记聚集。标记群集不是我要找的。

请帮忙!以下是我的Java代码:

  package us.wingitapp.jared.wingit; 

导入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屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆