Масштабирование пользовательского маркера на карте в зависимости от уровня масштабирования - PullRequest
0 голосов
/ 26 апреля 2018

Я рисую простой круг на карте, выполнив следующее:

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    try {
        boolean success = mMap.setMapStyle(MapStyleOptions.loadRawResourceStyle(getContext(), R.raw.style_json));
        if (!success) {
            Log.e("MapsActivityRaw", "Style parsing failed.");
        }

    } catch (Resources.NotFoundException e) {
        Log.e("MapsActivityRaw", "Can't find style.", e);
    }

    final LatLng myLatlng = new LatLng(-33.999564, 18.516763);
    mMap.moveCamera(CameraUpdateFactory.newLatLng(myLatlng));
    mMap.animateCamera( CameraUpdateFactory.zoomTo( 11.0f ) );

    mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
        public void onMapLoaded() {

            bar.setVisibility(View.GONE);
            drawCircle(myLatlng);

        }
    });

}

private void drawCircle(LatLng point){
    CircleOptions circleOptions = new CircleOptions();
    circleOptions.center(point);
    circleOptions.radius(500);
    circleOptions.strokeColor(Color.BLACK);
    circleOptions.fillColor(0x30ff0000);
    circleOptions.strokeWidth(2);
    mMap.addCircle(circleOptions);

}

Это отлично работает, круг рисуется на карте, как и ожидалось.

previewImage

Проблема в том, что при увеличении и уменьшении размер круга увеличивается / уменьшается.


Мой вопрос:

Я ищу способ сохранить размер круга при увеличении и уменьшении масштаба.

Также ..

Я не хочу использовать кластеризацию маркеров.

1 Ответ

0 голосов
/ 27 апреля 2018

По сути, вам нужно определить, какой пропорцией экрана будет радиус круга.

В этом примере это всегда 10% ширины.

Учитывая это, затем вычислите расстояние между долготами экрана и разделите это расстояние на требуемую пропорцию (радиус).

Я подозреваю, что вам понадобятся разные пропорции в зависимости от ориентации.

Этот фрагмент кода рисует круг, радиус которого составляет 10% ширины экрана, а затем прослушивает движения камеры (включая масштабирование), чтобы настроить радиус на основе новых границ долготы.

Circle c;

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;

    mMap.getUiSettings().setZoomControlsEnabled(true);
    LatLng p = new LatLng(39.171755, -86.510632);

    LatLngBounds llb = mMap.getProjection().getVisibleRegion().latLngBounds;
    LatLng ne = llb.northeast;
    LatLng sw = llb.southwest;
    double d = SphericalUtil.computeDistanceBetween(ne,new LatLng(ne.latitude,sw.longitude));
    double r = (d/10);

    c = mMap.addCircle(new CircleOptions().center(p).radius(r).strokeColor(Color.BLUE));

    mMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
        @Override
        public void onCameraMove() {
            LatLngBounds llb = mMap.getProjection().getVisibleRegion().latLngBounds;
            LatLng ne = llb.northeast;
            LatLng sw = llb.southwest;
            double d = SphericalUtil.computeDistanceBetween(ne,new LatLng(ne.latitude,sw.longitude));
            double r = (d/10);

            c.setRadius(r);
        }
    });


}

Также обратите внимание, что кружок не является маркером - заголовок нуждается в обновлении (может помочь поисковикам в будущем.)

...