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