Ранее мне удалось включить 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);
}
Это работает ОК
Позвольте мне предложить несколько вещей:
В новой сборке jar вызов getOverlays(). clear() больше не удаляет оверлей на карте. Вызов remove (1) может быть некорректным сейчас, так как наложение накладки на карте больше не находится в позиции 0.
У проекции есть метод, который даст вам прямоугольник координаты экрана того, что в данный момент находится на экране. Вы можете проверить координаты, которые вы используете, чтобы нарисовать свои линии против этого прямоугольника, чтобы убедиться, что они перехватили его.
Взгляните на новый класс TileSystem. Все, что было устарело, можно воссоздать с помощью этих функций.