2011-02-05 4 views
2

OpenStreetMaps를 사용하기 위해 Google지도 기반 프로젝트를 Osmdroid로 포팅합니다. 포트는 여러 개의 직선과 일부 텍스트로 구성된 오버레이를 추가하는 것과는 별개로 작동합니다. 두 프로젝트에서 타이머 스레드와 redrawOverlay를 호출하는 핸들러를 사용하여 오버레이를 추가합니다.Google지도 앱을 Osmdroid에 포팅 - 오버레이 문제

OSM 프로젝트에서 내 오버레이는지도를 완전히 숨기는 회색 사각형입니다. redrawOveraly에 대한 호출을 제거하면 OSM 타일이 OK로 표시됩니다. 아래의 코드 샘플에서 오버레이 코드를 단일 대각선의 최소값으로 줄였습니다. 지도 타일을 오버레이하여 Google 앱에서 정상적으로 작동합니다. com.google.android.maps.Overlay 무승부 방법을 가지고는 OSM가 된 onDraw가있다, 그래서 OSM 버전이 있습니다

: 나는 해당이 Google지도 원래의 하다니

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

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

모든 제안은 감사

0을 수신 할 것 kurtzmarc에 대한

UPDATE 질문 : 당신을 위해

덕분에 나는 당신이 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); 
    } 

내가 그것을 덮어 쓸 수 있다는 것 같지 않습니다. 3.0.1 jar와 관련 javadocs를 사용하고 있습니다. Mapview의 setTouchDelegate 메소드가 도움이 될지 궁금하지만 javadocs에는이 참조가 없습니다. 어떤 제안을 해주시겠습니까?

답변

2

어디에서 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 화면 오른쪽 아래에 좌상을 나타낸다. 이것을 사용하여 화면의 고정 된 점을 그릴 수 있습니다.

UPDATE :

이 두 번째 질문에 대답하기 위해 - 당신이 할 필요하면 오버레이에 onDoubleTap 무시하고 "true"를 반환합니다. "true"를 반환하면 기본 클래스에 이벤트를 "소비"했음을 나타내며 더 이상 처리하지 않아야합니다. 좋은 예를 들어 미니 맵 오버레이 코드를 살펴 보자

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

우리는 바로 오버레이를 정밀 검사의 중간에 있으므로이 중 일부는 가까운 장래에 조금 더 처리 될 것입니다. 예를 들어, 당신이 만난 getOverlays(). clear() 버그도 다른 곳에서보고되었으며 그 이후로 수정했습니다.

+0

확실히 mWorldSize_2를 int로 정의하고 .drawline에 Paint 인수를 추가하면 화면에 선이 그려집니다. (Canvas가 전달되는 Canvas는 Google Maps가 전달하는 Canvas와 완전히 다릅니다). 그러나 기본 MapView가 사라지면 회색 배경 위에 선이 생깁니다. – NickT

+0

도움을 주셔서 감사합니다, 나는 천천히 거기에 가고 있습니다! listOfOverlays.clear()가 범인입니다. 인덱스 0에있는 것을 제외하고 모두 삭제해야했습니다 (Google지도의 경우와 동일하지 않습니다). 필자의 주된 문제는 필자가 쓴 서비스/원격 인터페이스를 통해 그려지는 선과 텍스트의 좌표를 얻기 위해 많은 노력을 기울 였다는 것입니다. 이는 화면 오버랩 픽셀이 화면 픽셀 좌표로 표시되기 때문에 Google 오버레이가이를 원했기 때문입니다. Osmdroid를 위해 모든 것을 OSM 좌표로 변환해야합니다. – NickT

+0

완성했습니다! 매우 감사합니다. 머리를 깨끗이하고 펜과 종이로 앉아서 두 줄의 transformX transformY 루틴을 작성해야한다는 것을 깨달았습니다. 이제 Google지도 오버레이처럼 보입니다. – NickT