Портирование приложения Google Maps на Osmdroid - проблема с наложением - PullRequest
2 голосов
/ 06 февраля 2011

Я портирую проект на основе Google Maps на Osmdroid, чтобы использовать OpenStreetMaps.Порт работает нормально, кроме добавления моего оверлея, который состоит из ряда прямых линий и некоторого текста.В обоих проектах я добавляю Overlay с помощью потока таймера и обработчика, вызывающего redrawOverlay.

В проекте OSM мое наложение - это просто серый квадрат, полностью скрывающий карту.Если я удаляю вызов redrawOveraly, плитки OSM отображаются в порядке.Я сократил оверлейный код до минимума одной диагональной линии в примерах кода ниже.Он отлично работает в приложении Google, накладывая плитку карты.В com.google.android.maps.Overlay есть метод draw, в OSM - onDraw, поэтому у меня в версии OSM:

   private MapView mv;
   private MapOverlay mmapOverlay = null;

   private void redrawOverlay() {

   gPt = mv.getMapCenter();
   if (mmapOverlay == null)
      mmapOverlay = new MapOverlay(getApplicationContext());
      List<Overlay> listOfOverlays = mv.getOverlays();
      listOfOverlays.clear();
      listOfOverlays.add(mmapOverlay);
      mv.invalidate();
   }

   public class MapOverlay extends org.osmdroid.views.overlay.Overlay {

   public MapOverlay(Context ctx) {
      super(ctx);
      // TODO Auto-generated constructor stub
   }

      @Override
      public void onDraw(Canvas canvas, MapView mapView) {

      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);
      canvas.drawLine(10, 10, 150, 150, lp3);
   }

Хотя в оригинале карт Google у меня есть эквивалент:

  public class MapOverlay extends com.google.android.maps.Overlay {


   @Override
   public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
   long when) {
      super.draw(canvas, mapView, shadow);
      Paint lp3;
      lp3 = new Paint();
      .....etc.

redrawOverlay - то же самое, за исключением того, что экземпляр оверлея просто:

mmapOverlay = new MapOverlay();

Будут с благодарностью приняты все предложения

ОБНОВЛЕНИЕ Вопрос для kurtzmarc:

Спасибо за вашу помощь, я вижу, что вы один из авторов Osmdroid.Мне нравится то, что он делает до сих пор.Я хотел бы подавить «прыгать и увеличить», который вы получаете при двойном нажатии.Я бы хотел, чтобы это вообще ничего не делало.Я думаю, что это, вероятно, ударяет этот бит в вашем источнике и делает zoomInFixing:

private class MapViewDoubleClickListener implements GestureDetector.OnDoubleTapListener {
   @Override
   public boolean onDoubleTap(final MotionEvent e) {
   for (int i = mOverlays.size() - 1; i >= 0; i--)
      if (mOverlays.get(i).onDoubleTapUp(e, MapView.this))
         return true;

      final GeoPoint center = getProjection().fromPixels(e.getX(), e.getY());
      return zoomInFixing(center);
  }

Не похоже, что я могу переопределить его.Я использую jar 3.0.1 и связанные с ним javadocs.Мне интересно, помог бы метод setTouchDelegate Mapview, но в javadocs нет ссылки на него.У вас есть предложения, пожалуйста?

1 Ответ

2 голосов
/ 08 февраля 2011

Я не уверен, откуда вы вызываете redrawOverlay (), но если вы посмотрите на MinimapOverlay, вы увидите пример, где что-то нарисовано в фиксированном месте на экране.Другими словами, вы рисуете в координатах экрана, а не в координатах карты.

Пример:

@Override
protected void onDraw(final Canvas pC, final MapView pOsmv) {
  // Calculate the half-world size
  final Rect viewportRect = new Rect();
  final Projection projection = pOsmv.getProjection();
  final int zoomLevel = projection.getZoomLevel();
  final int tileZoom = projection.getTileMapZoom();
  mWorldSize_2 = 1 << (zoomLevel + tileZoom - 1);

  // Find what's on the screen
  final BoundingBoxE6 boundingBox = projection.getBoundingBox();
  final Point upperLeft = org.osmdroid.views.util.Mercator
            .projectGeoPoint(boundingBox.getLatNorthE6(), boundingBox.getLonWestE6(),
            zoomLevel + tileZoom, null);
  final Point lowerRight = org.osmdroid.views.util.Mercator
     .projectGeoPoint(boundingBox.getLatSouthE6(), boundingBox.getLonEastE6(), zoomLevel
     + tileZoom, null);

  // Save the Mercator coordinates of what is on the screen
  viewportRect.set(upperLeft.x, upperLeft.y, lowerRight.x, lowerRight.y);

  // Offset into OSM coordinates
  viewportRect.offset(-mWorldSize_2, -mWorldSize_2);

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

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

ОБНОВЛЕНИЕ:

Чтобы ответить на ваш второй вопрос - вам нужно переопределить onDoubleTap в вашемНаложить и вернуть «правда».Возвращение «true» указывает базовому классу, что вы «потребили» событие, и дальнейшая обработка не должна выполняться.Взгляните на код наложения миникарты для хорошего примера:

http://code.google.com/p/osmdroid/source/browse/trunk/osmdroid-android/src/org/osmdroid/views/overlay/MinimapOverlay.java

Мы сейчас находимся в середине капитального ремонта оверлеев, поэтому некоторые из них будут обработаны немного лучше вближайшее будущее.Например, об ошибке getOverlays (). Clear (), с которой вы столкнулись, также сообщалось в другом месте, и с тех пор мы ее исправили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...