2012-10-25 5 views
1

맞춤 오버레이 클래스가있는 OSMdroid지도에 맞춤 마커를 만들려고합니다. 나는 그것을 얻을 생각하지만 주요 활동osm의 맞춤 오버레이 마커

package com.example.osmap1;import java.util.List; 

import org.osmdroid.util.GeoPoint; 
import org.osmdroid.views.MapController; 
import org.osmdroid.views.MapView; 
import org.osmdroid.views.overlay.Overlay; 

import com.example.osmap1.herramientas.MiOverlay; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 

public class MainActivity extends Activity { 
MapView map; 
MapController mc; 
GeoPoint gp; 
List<Overlay> mOverlays; 

private static MainActivity mainActivity=null; 
public static MainActivity getInstance(){ 
    if(mainActivity == null){ 
     mainActivity=new MainActivity(); 

    } 
    return mainActivity; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mainActivity=this; 
    map=(MapView)findViewById(R.id.mapView); 

    mc=map.getController(); 
    map.setBuiltInZoomControls(true); 
    map.setMultiTouchControls(true); 

    addPointToMapOverlay("43.528023","-5.672949"); 

} 

private void addPointToMap (String latitud, String longitud){ 

    String coordenadas[]={latitud,longitud}; 
    double lat=Double.parseDouble(coordenadas[0]); 
    double lng=Double.parseDouble(coordenadas[1]); 
    GeoPoint gp=new GeoPoint((int)lat*1E6,(int)lng*1E6); 
    mc.animateTo(gp); 
    mc.setZoom(4); 
    /*map.invalidate(); no funciona en osm*/ 
} 

private void addPointToMapOverlay (String latitud, String longitud){ 


    String coordenadas[]={latitud,longitud}; 
    double lat=Double.parseDouble(coordenadas[0]); 
    double lng=Double.parseDouble(coordenadas[1]); 
    GeoPoint gp=new GeoPoint((int)lat*1E6,(int)lng*1E6); 

    mOverlays=map.getOverlays(); 
    MiOverlay marker= new MiOverlay(gp); 
    mOverlays.add(marker); 
    mc.animateTo(gp); 
    mc.setZoom(4); 
    map.invalidate(); 
} 



@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 
} 

의 코드를 나에게 무승부 생성자 여기

에 StackOverflowError가 있습니다입니다 그리고 이것은 내가 생각하는 내 사용자 정의 클래스 코드

public class MiOverlay extends Overlay{ 

private GeoPoint punto; 


public MiOverlay(GeoPoint point) { 

    super(MainActivity.getInstance().getBaseContext()); 
    this.punto=point; 
    // TODO Auto-generated constructor stub 
} 

@Override 
public void draw(Canvas canvas, MapView mapview, boolean shadow) { 

    // TODO Auto-generated method stub 
    this.draw(canvas, mapview, shadow); 

    //se traduce el punto geo localizado a un punto en la pantalla 
    Point scrnPoint = new Point(); 
    mapview.getProjection().toPixels(this.punto, scrnPoint); 

    //se construye un bitmap a partir de la imagen 
    Bitmap marker = BitmapFactory.decodeResource(MainActivity.getInstance().getResources(),com.example.osmap1.R.drawable.seas); 

    //se dibuja la imagen del marker 
    canvas.drawBitmap(marker, scrnPoint.x - marker.getWidth()/2, scrnPoint.y - marker.getHeight()/2, null); 


} 

public boolean onTouchEvent(MotionEvent event, MapView mapView) 
{ 
    //---when user lifts his finger--- 
    if (event.getAction() == 1) {     
     GeoPoint p = (GeoPoint) mapView.getProjection().fromPixels(
      (int) event.getX(), 
      (int) event.getY()); 
      Toast.makeText(MainActivity.getInstance().getBaseContext(), 
       p.getLatitudeE6()/1E6 + "," + 
       p.getLongitudeE6() /1E6 , 
       Toast.LENGTH_SHORT).show(); 
    }        
    return false; 
}   

} 

입니다 문제가있다. mapview.getProjection(). toMapPixels (this.punto, scrnPoint)이 될 수 있지만 잘 모르겠다 ... 모든 sugestion은 wellcome이다.

답변

0

그것은 무한 루프 다. TAND 당신이해야 할 노력하고 있지만, 그리기 함수가 자신을 재귀 적으로 부르는 :

draw() 
-> draw() 
    -> draw() 
    ... 
    StackOverflowException 

아마도 당신이 super.draw(canvas, mapview, shadow) 의미 : 제어의 흐름을 보여주는 결과를

@Override 
public void draw(Canvas canvas, MapView mapview, boolean shadow) { 

    this.draw(canvas, mapview, shadow); // This is the same method! 
} 

이 무엇입니까?

+0

예, 루프 였지만 오버레이 클래스의 draw 생성자가 super.draw (canvas, mapview, shadow)를 허용하지 않고 대신 super.drawAt (canvas, Drawable, x, y, shadow)를 호출합니다. 아마도 비트 맵을 호출하는 것보다 낫다. 내가 다른 연습 그걸로 만들고있어 그쪽으로 Google지도를 사용하는, 그게 문제 야 : P는 –

관련 문제