Ограничение области, на которую пользователь может перейти на MapView - PullRequest
5 голосов
/ 23 марта 2011

Я использую настроенную версию карты (версия OSMDroid). Я использую собственные плитки в нем, и я хочу, чтобы пользователь мог только просматривать область, где у меня есть мои собственные плитки. Есть ли способ установить границу lat long, чтобы при панорамировании карты она не выходила за эти границы?

Ответы [ 4 ]

6 голосов
/ 28 июня 2011

Обновление: Я знаю, что это старый вопрос, но в osmdroid теперь есть метод setScrollableAreaLimit (), который достигнет того, что вы ищете.Существует также метод setMinZoomLevel () и setMaxZoomLevel () для простого ограничения уровней масштабирования.

Исходный ответ:

Пожалуйста, следите за:

http://code.google.com/p/osmdroid/issues/detail?id=209

Патч уже создан и, вероятно, будет вскоре интегрирован.

3 голосов
/ 29 августа 2012

Это кросс-пост от темы osmdroid .Теперь есть список BoundedMapView класса, который реализует вышеупомянутый патч.

Для тех, кто использует .jar или иным образом не знаком с патчами, я собрал подкласс MapView, который поддерживает ограничениевзгляд пользователя на конкретную область.

Подробную информацию о том, как его использовать, если не очевидно, можно найти по адресу http://www.sieswerda.net/2012/08/15/boundedmapview-a-mapview-with-limits/

1 голос
/ 06 июня 2011

Если это кому-нибудь поможет ...

У меня есть своего рода решение, которое я использую, оно работает нормально, но определенно может быть лучше, поскольку карта может отойти слишком далеко от экрана, прежде чем она отскочит назад! Он использует лат длинные и работает там, где находится карта. Я установил 4 координаты, которые примерно равны 4 углам карты. Я обнаружил, что он работает лучше, если вы установите их немного на карте, а не точно углы, тогда я решу, если лонг-лонги полностью покинули экран ... если это так, он отскочит на полпути:

Я перекрыл вид карты и событие OnTouch карты

@Override
public boolean onTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_UP) {

        // (only works for north of equator)
        // * map right side (lat) can't go past the left (lat) of screen

        // get geopoints of the 4 corners of the screen
        Projection proj = getProjection();
        GeoPoint screenTopLeft = proj.fromPixels(0, 0);
        GeoPoint screenTopRight = proj.fromPixels(getWidth(), 0);
        GeoPoint screenBottomLeft = proj.fromPixels(0, getHeight());

        double screenTopLat = screenTopLeft.getLatitudeE6() / 1E6;
        double screenBottomLat = screenBottomLeft.getLatitudeE6() / 1E6;
        double screenLeftlong = screenTopLeft.getLongitudeE6() / 1E6;
        double screenRightlong = screenTopRight.getLongitudeE6() / 1E6;

        double mapTopLat = BoundsTopLeftCorner.getLatitudeE6() / 1E6;
        double mapBottomLat = BoundsBottomLeftCorner.getLatitudeE6() / 1E6;
        double mapLeftlong = BoundsTopLeftCorner.getLongitudeE6() / 1E6;
        double mapRightlong = BoundsTopRightCorner.getLongitudeE6() / 1E6;

        // screen bottom greater than map top
        // screen top less than map bottom
        // screen right less than map left
        // screen left greater than map right
        boolean movedLeft = false;
        boolean movedRight = false;
        boolean movedUp = false;
        boolean movedDown = false;

        boolean offscreen = false;
        if (screenBottomLat > mapTopLat) {
            movedUp = true;
            offscreen = true;
        }
        if (screenTopLat < mapBottomLat) {
            movedDown = true;
            offscreen = true;
        }
        if (screenRightlong < mapLeftlong) {
            movedLeft = true;
            offscreen = true;
        }
        if (screenLeftlong > mapRightlong) {
            movedRight = true;
            offscreen = true;
        }

        if (offscreen) {
            // work out on which plane it's been moved off screen (lat/lng)

            if (movedLeft || movedRight) {

                double newBottomLat = screenBottomLat;
                double newTopLat = screenTopLat;

                double centralLat = newBottomLat
                        + ((newTopLat - newBottomLat) / 2);
                if (movedRight)
                    this.getController().setCenter(
                            new GeoPoint(centralLat, mapRightlong));
                else
                    this.getController().setCenter(
                            new GeoPoint(centralLat, mapLeftlong));

            }
            if (movedUp || movedDown) {

                // longs will all remain the same
                double newLeftLong = screenLeftlong;
                double newRightLong = screenRightlong;

                double centralLong = (newRightLong + newLeftLong) / 2;

                if (movedUp)
                    this.getController().setCenter(
                            new GeoPoint(mapTopLat, centralLong));

                else
                    this.getController().setCenter(
                            new GeoPoint(mapBottomLat, centralLong));
            }

        }

    }
    return super.onTouchEvent(ev);
}}

Несколько вещей, на которые следует обратить внимание, если вы планируете использовать это:

  1. Я не даю никаких гарантий, что это сработает для вашей ситуации, и вы должны использовать это только в качестве отправной точки.
  2. Это будет работать только для областей к северу от экватора (я думаю) из-за того, как я сделал координаты!
  3. Он работает над «действием вверх» события касания, поэтому он берет точку, когда пользователь убирает палец с экрана. Это означает, что когда карта переворачивается, она совершенно неточна, так как я не мог понять, где остановилась карта, из-за этого я отключил ее, переопределив событие fling и ничего не делая в нем ... это действительно делает карту немного веселой!

Если у кого-нибудь есть более качественные решения или он может улучшить мой код, не стесняйтесь!

0 голосов
/ 19 апреля 2011

Я ищу точно то же самое.

Мое лучшее преимущество - добавить оверлей, который расширяет boolean onScroll(...). Если это возвращает true, то прокрутка отменяется.

Это именно то, чего я хочу, за исключением одного: бросать / щелкать. Тот же подход можно использовать для отмены событий броска, хотя об этом можно услышать только в начале броска.

В идеале вы должны слушать метод computeScroll() и ограничивать (x, y) прокрутки на основе mScroller.getCurX() и mScroller.getCurY().

...