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

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

1 голос
/ 01 апреля 2011

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

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

Я обновился до версии 3.0.3 и не могу отобразить наложение.

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

С новым jar я по-прежнему отображаю вид карты в порядке, но наложение исчезло.Мне пришлось внести некоторые изменения в код, так как метод 3.0D onDraw () был заменен на draw () (точно так же, как Google) в MapOverlay расширяет org.osmdroid.views.overlay.Overlay класс.

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

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

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();
}

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

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

Обновление

Путем чрезмерной адаптации миникарты, как предложено в ответе на вопрос, упомянутый выше, метод 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);
    }

Это работает нормально

1 Ответ

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

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

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

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

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

...