Оверлеи в osmdroid-android-3.0.3.jar

1

Ранее мне удалось включить OpenStreetMaps в мое приложение, используя osmdroid-android-3.0.1.jar с большой помощью ответа на мой вопрос.

Портирование приложения Google Maps на Osmdroid - проблема с наложением

Теперь я обновился до использования флага 3.0.3 и не могу отобразить свой оверлей.

Мое приложение может переключать отображение с Карт Google на OSM и отображать одно и то же наложение, состоящее из строк и текстов поверх них. Альтернативный вариант показывает, что каждый из них запускается в своей собственной деятельности на данный момент, поскольку классы аналогичны, но не имеют абсолютно идентичных методов или, по крайней мере, их нет в версии 3.0.1. (В конечном счете, я хотел бы использовать баннер обертки Osmdroid, чтобы объединить их в одном действии и уменьшить дубликат кода, но это вопрос на более позднюю дату). Прямо сейчас я хотел бы получить ту же функциональность, что и у меня с сейчас устаревший 3.0.1 jar с использованием новой версии 3.0.3.

В новой банке я все еще получаю отображение карты ОК, но оверлей исчез. Мне пришлось внести некоторые изменения в код, так как метод 3.0.1 onDraw() теперь заменен draw() (как и Google) в MapOverlay extends org.osmdroid.views.overlay.Overlay.

Весь код в предыдущем методе onDraw() (теперь рисовать) был скопирован дословно из ответа на упомянутый выше вопрос. Он отлично работал, хотя я признаю, что не полностью понимаю понятия миров, ограничивающих прямоугольников и описанное преобразование.

Я заметил, что метод

final Point upperLeft = org.osmdroid.views.util.Mercator
            .projectGeoPoint(boundingBox.getLatNorthE6(), boundingBox.getLonWestE6(),
            zoomLevel + tileZoom, null);

теперь устарел, и мне пришлось удалить tileZoom и

final int tileZoom = projection.getTileMapZoom();

чтобы его компилировать.

Когда я получаю код в методе draw(), я вижу в отладчике, что все данные, необходимые для наложения наложения, все еще присутствуют и правильны. Чертеж выполняется линиями, такими как canvas.drawLine(....) и canvas.drawText(....). Я вообще не использовал дополнительный параметр для функции (булевская тень).

Мой метод redrawOverlay() остается следующим:

private void redrawOverlay() {

    mGpt = mMapVw.getMapCenter();

    if (mmapOverlay == null)
        mmapOverlay = new MapOverlay(this);
    mmapOverlay.setEnabled(true);
    List<Overlay> listOfOverlays = mMapVw.getOverlays();
    int ovlSize = listOfOverlays.size();
    if (ovlSize > 1)
        listOfOverlays.remove(1);
    listOfOverlays.add(mmapOverlay);
    mMapVw.invalidate();
}

(Список GoogleofOverlays.clear() не должен использоваться, поскольку osmdroid 3.0.1 имел элемент 0 в качестве самой карты - следовательно, remove (1))

Мне интересно, что мне нужно сделать, чтобы изменить существующий код 3.0.1 для работы с 3.0.3? Я надеюсь, что один из авторов может прочитать этот вопрос.

Обновление

Применяя переопределение Minimap, как было предложено в ответе на упомянутый выше вопрос, метод draw() для рисования наложения сверху слева направо, теперь становится:

    @Override
    protected void draw(Canvas pC,  MapView pOsmv, boolean shadow) {
        if(shadow)
            return;

        Paint lp3;
        lp3 = new Paint();
        lp3.setColor(Color.RED);
        lp3.setAntiAlias(true);
        lp3.setStyle(Style.STROKE);
        lp3.setStrokeWidth(1);
        lp3.setTextAlign(Paint.Align.LEFT);
        lp3.setTextSize(12);
        // Calculate the half-world size
          final Rect viewportRect = new Rect();
          final Projection projection = pOsmv.getProjection();
          final int zoomLevel = projection.getZoomLevel();
          int mWorldSize_2 = TileSystem.MapSize(zoomLevel) / 2;

          // Save the Mercator coordinates of what is on the screen
          viewportRect.set(projection.getScreenRect());
          // DON'T set offset with either of below
          //viewportRect.offset(-mWorldSize_2, -mWorldSize_2);
          //viewportRect.offset(mWorldSize_2, mWorldSize_2);

          // Draw a line from one corner to the other
          pC.drawLine(viewportRect.left, viewportRect.top, viewportRect.right, viewportRect.bottom, lp3);
    }

Это работает ОК

Теги:
openstreetmap
osmdroid

1 ответ

0
Лучший ответ

Позвольте мне предложить несколько вещей:

  • В новой сборке jar вызов getOverlays(). clear() больше не удаляет оверлей на карте. Вызов remove (1) может быть некорректным сейчас, так как наложение накладки на карте больше не находится в позиции 0.

  • У проекции есть метод, который даст вам прямоугольник координаты экрана того, что в данный момент находится на экране. Вы можете проверить координаты, которые вы используете, чтобы нарисовать свои линии против этого прямоугольника, чтобы убедиться, что они перехватили его.

  • Взгляните на новый класс TileSystem. Все, что было устарело, можно воссоздать с помощью этих функций.

  • 0
    Спасибо за информацию. Мне удалось заставить его работать, адаптировав оверлей Minimap, как вы предлагали ранее. Я заметил, что настройка смещения должна быть удалена, чтобы он работал, хотя это не похоже на пример с мини-картой (см. Обновление). Я также отметил, что мой на TouchEvent, который я использовал для реализации 'doubleTap' путем синхронизации времени между двумя событиями ACTION_DOWN, кажется, запускается дважды в течение 1 мс на одно касание?
  • 0
    Причина, по которой вам не нужно смещаться, состоит в том, что getScreenRect () получает готовые к рисованию координаты экрана того, что находится на экране. Другими словами, это предварительное смещение. Вы должны иметь возможность переопределить onDoubleTap (или что-то подобное) в своем оверлее, чтобы получить событие двойного нажатия.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню