简体   繁体   English

如何将Google地图标记绑定为一个圆圈?

[英]How to bind google map markers in a circle?

I need to bind multiple markers in a google map circle. 我需要在Google地图圈子中绑定多个标记。 I am calling following method from onMapReady to load markers: 我正在从onMapReady调用以下方法来加载标记:

void addMarker()
{
 mMap.clear();
    for (int i = 0; i < response.getData().getCount(); i++) {
        float lat = response.getData().get(i).getLat();
        float lng = response.getData().get(i).getLng();
........
........

 LatLng location = new LatLng(lat, lng);
 Marker mapMarker = mMap.addMarker(new MarkerOptions()
        .position(location)
         .draggable(false)
         .icon(bitmapMarker));
  mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 17));
}

@Override
public void onMapReady(GoogleMap googleMap) {
   mMap = googleMap;
   addMarkers();
   DraggableCircle circle = new DraggableCircle(LOCATION, DEFAULT_RADIUS); 
}

As per above code I am able to draw a circle at given location and add markers on given coordinates . 按照上述代码,我能够在给定位置绘制一个circle并在给定coordinates上添加标记。 Everything is working fine like If I am increasing the size of circle then the map will adjust the zoom size as per screen dimensions. 一切工作正常,例如如果我增加圆圈的大小,则地图将根据屏幕尺寸调整缩放大小。

Now What I am looking for: 现在我要寻找的是:

  1. Markers will be shown on screen which is coming under to circle diameters (location and radius) 标记将显示在屏幕上,圆直径(位置和半径)之下
  2. As soon as user increase the radius new markers will get appear. 一旦用户增加radius就会出现新的标记。

Any hint or help will be appreciable. 任何提示或帮助将是可观的。

I hope i did not misunderstand you. 希望我不要误会你。

At bottom there is a seekbar, whenever you change it, also changes circle radius too. 底部有一个搜索栏,每当您更改它时,它也会同时改变圆半径。

Then i'm filtering markers by new radius value in filterMarkers method 然后我在filterMarkers方法中通过新的半径值过滤标记

在此处输入图片说明 在此处输入图片说明 在此处输入图片说明 在此处输入图片说明

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    private SeekBar mRadiusSeekBar;

    private Circle mCircle;
    private double mCircleRadius = 250;
    private LatLng mCircleCenter = new LatLng(38.432398, 27.155882);

    private void addCircle(){
        mCircle = mMap.addCircle(new CircleOptions()
                .strokeWidth(4)
                .radius(mCircleRadius)
                .center(mCircleCenter)
                .strokeColor(Color.parseColor("#D1C4E9"))
                .fillColor(Color.parseColor("#657C4DFF")));
    }

    private List<LatLng> mPoints = new ArrayList<>();
    private List<Marker> mMarkers = new ArrayList<>();

    private void addMarkers(){
        LatLng mPoint1 = new LatLng(38.440925, 27.153672);
        LatLng mPoint2 = new LatLng(38.440700, 27.155877);
        LatLng mPoint3 = new LatLng(38.438402, 27.153988);
        LatLng mPoint4 = new LatLng(38.433767, 27.155410);
        LatLng mPoint5 = new LatLng(38.432143, 27.156049);
        LatLng mPoint6 = new LatLng(38.427804, 27.153486);
        LatLng mPoint7 = new LatLng(38.424637, 27.152007);
        LatLng mPoint8 = new LatLng(38.421315, 27.153216);
        LatLng mPoint9 = new LatLng(38.418219, 27.154731);
        LatLng mPoint10 = new LatLng(38.414628, 27.156085);

        mPoints.add(mPoint1);
        mPoints.add(mPoint2);
        mPoints.add(mPoint3);
        mPoints.add(mPoint4);
        mPoints.add(mPoint5);
        mPoints.add(mPoint6);
        mPoints.add(mPoint7);
        mPoints.add(mPoint8);
        mPoints.add(mPoint9);
        mPoints.add(mPoint10);

        BitmapDescriptor bd = BitmapDescriptorFactory
                .defaultMarker(BitmapDescriptorFactory.HUE_VIOLET);

        for(int i = 0; i<mPoints.size(); i++){
            Marker marker = mMap.addMarker(
                    new MarkerOptions()
                            .visible(false)
                            .position(mPoints.get(i)).icon(bd));

            mMarkers.add(marker);
        }
    }

    private void filterMarkers(double radiusForCircle){
        mCircle.setRadius(radiusForCircle);
        float[] distance = new float[2];
        for(int m = 0; m < mMarkers.size(); m++){
            Marker marker = mMarkers.get(m);
            LatLng position = marker.getPosition();
            double lat = position.latitude;
            double lon = position.longitude;

            Location.distanceBetween(lat, lon, mCircleCenter.latitude,
                    mCircleCenter.longitude, distance);

            boolean inCircle = distance[0] <= radiusForCircle;
            marker.setVisible(inCircle);
        }
    }




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

        mRadiusSeekBar = (SeekBar) findViewById(R.id.seekbar);

        mRadiusSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                filterMarkers(progress * 10);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.moveCamera(CameraUpdateFactory
                .newLatLngZoom(mCircleCenter, 12));

        addMarkers();
        addCircle();
    }
}

layout 布局

<FrameLayout android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.blackkara.mapquestions.MapsActivity" />

<android.support.v7.widget.AppCompatSeekBar
    android:id="@+id/seekbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"/>
</FrameLayout>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM