yandexmapkit-android icon indicating copy to clipboard operation
yandexmapkit-android copied to clipboard

OverlayItem zoom with map

Open Defuera opened this issue 7 years ago • 9 comments

Коллеги, подскажите пожалуйста, существует ли возможность масштабировать overlayItem пропорцианально карте?

image

Моя задача - обеспечить, что бы выделенная область все время покрывала одну и ту же площадь. Сейчас при зуме я получаю следующий результат:

image

Defuera avatar Jul 14 '17 11:07 Defuera

Можно. Но вам придется самому отслеживать что изменился зум и далее перерисовывать область меняя масштаб. То есть у вас появляется зависимость радиуса от масштаба.

14 июл. 2017 г. 14:05 пользователь "Denis Volyntsev" < [email protected]> написал:

Коллеги, подскажите пожалуйста, существует ли возможность масштабировать overlayItem пропорцианально карте?

[image: image] https://user-images.githubusercontent.com/1181883/28209880-e28cd106-6894-11e7-9db9-f3259d07fc5b.png

Моя задача - обеспечить, что бы выделенная область все время покрывала одну и ту же площадь. Сейчас при зуме я получаю следующий результат:

[image: image] https://user-images.githubusercontent.com/1181883/28209911-062e2a6a-6895-11e7-96e6-64dc4933f3ff.png

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/yandexmobile/yandexmapkit-android/issues/280, or mute the thread https://github.com/notifications/unsubscribe-auth/ABSEm8V9WPKKhEBS2NHwFMjup1TYPMGtks5sN0tagaJpZM4OYHw6 .

saint13 avatar Jul 14 '17 11:07 saint13

@saint13 Спасибо, а подскажите, как это лучше сделать, с помощью

mapController.addMapListener(new OnMapListener() {});

?

Те как можно отследить коэффициент зума?

Defuera avatar Jul 14 '17 11:07 Defuera

Могу посоветовать посмотреть как это сделано с кругом погрешности для локации. Можно самому посмотреть реализацию. Надеюсь это понятно как сделать ).

14 июл. 2017 г. 14:32 пользователь "Denis Volyntsev" < [email protected]> написал:

@saint13 https://github.com/saint13 Спасибо, а подскажите, как это лучше сделать, с помощью

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/yandexmobile/yandexmapkit-android/issues/280#issuecomment-315337975, or mute the thread https://github.com/notifications/unsubscribe-auth/ABSEm0wFoL6Uxh6PiNf7Rajplr8pLY-Nks5sN1HAgaJpZM4OYHw6 .

saint13 avatar Jul 14 '17 11:07 saint13

Нет -( В семпле я не вижу такого примера. Тыкнете носом пожалуйста)

Defuera avatar Jul 14 '17 11:07 Defuera

В самплах такого нет. Можно посмотреть в самом мапкит через студию.

14 июл. 2017 г. 14:49 пользователь "Denis Volyntsev" < [email protected]> написал:

Нет -( В семпле я не вижу такого примера. Тыкнете носом пожалуйста)

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/yandexmobile/yandexmapkit-android/issues/280#issuecomment-315340851, or mute the thread https://github.com/notifications/unsubscribe-auth/ABSEm1QfZsgq0rnWfueU7wSdp6cuTm--ks5sN1XlgaJpZM4OYHw6 .

saint13 avatar Jul 14 '17 11:07 saint13

Трудновато там разбираться, учитывая, что код обфусцирован. Можно где то найти исходники sdk?

Defuera avatar Jul 14 '17 12:07 Defuera

@Defuera юзай гугл карты и будет тебе счастье. Создал объект Circle() задал центр и радиус в метрах, всё.

rostopira avatar Aug 18 '17 16:08 rostopira

@Defuera если ещё актуально, вот код. Параметры paint-а поменяй только, это я для себя писал

final class YMCircle extends Overlay implements IRender {
    private double radius;
    private final Paint paint;
    private GeoPoint center;
    private final OverlayItem overlay;

    YMCircle(MapController mapController, GeoPoint center, double radius, boolean stroke) {
        super(mapController);
        this.radius = radius;
        this.center = center;
        final ShapeDrawable oval = new ShapeDrawable(new OvalShape());
        paint = oval.getPaint();
        overlay = new OverlayItem(center, oval);
        addOverlayItem(overlay);
        if (stroke) {
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(ViewKt.dpToPx(3));
            paint.setColor(0xFF1D93D2);
        } else {
            paint.setStyle(Paint.Style.FILL);
            paint.setColor(0x451D93D2);
        }
    }

    @Override
    public int compareTo(@NonNull Object o) {
        return 0;
    }

    public void setRadius(double radius) {
        this.radius = radius;
    }

    public void setCenter(GeoPoint center) {
        this.center = center;
        overlay.setGeoPoint(center);
    }

    public GeoPoint getCenter() {
        return center;
    }

    @Override
    public void draw(Canvas canvas, OverlayItem overlayItem) {
        final ScreenPoint sp = getMapController().getScreenPoint(center);
        final int width = canvas.getWidth();
        final double widthMeters = CoordConversion.getDistance(
            getMapController().getGeoPoint(new ScreenPoint(0, 0)),
            getMapController().getGeoPoint(new ScreenPoint(0, width))
        );

        final double radiusPixels = width * radius / widthMeters;
        canvas.drawCircle(sp.getX(), sp.getY(), (float) radiusPixels, paint);
    }

    @Override
    public IRender getIRender() {
        return this;
    }
}

rostopira avatar Aug 19 '17 19:08 rostopira

@rostopira Можно ли использовать ваше решение с DragAndDropItem?

Wise71 avatar Jun 22 '18 12:06 Wise71