如何在android osm上点击标记显示标记细节?

时间:2014-12-30 09:38:00

标签: android openstreetmap osmdroid

我是新手在android中使用osm。我已成功在android中显示OSM。但我不知道" 如何点击标记并显示标记细节,例如google map v2 infowindow popup "。

如何使用图像onclick标记openstreetmap android显示标记详细信息,与标记点击时的Google地图Infowindow显示相同。

请给我代码或想法在osm android中实现标记点击事件。

提前谢谢。

这是我在android java中实现的代码

public class MainActivity extends Activity 
{
private MapView mapView;
private MapController mapController;    
LocationManager locationManager;

ArrayList<OverlayItem> overlayItemArray;

@Override
protected void onCreate(Bundle savedInstanceState) 
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapView = (MapView)findViewById(R.id.mapview);

mapView.setBuiltInZoomControls(true);
mapView.setMultiTouchControls(true);
mapView.setClickable(true);
//mapView.setUseDataConnection(false);
mapController = (MapController) mapView.getController();
mapController.setZoom(17);

//--- Create Overlay
overlayItemArray = new ArrayList<OverlayItem>();

DefaultResourceProxyImpl defaultResourceProxyImpl = new DefaultResourceProxyImpl(this);
MyItemizedIconOverlay myItemizedIconOverlay = new MyItemizedIconOverlay(overlayItemArray, null, defaultResourceProxyImpl);
mapView.getOverlays().add(myItemizedIconOverlay);
//---

locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

//for demo, getLastKnownLocation from GPS only, not from NETWORK
Location lastLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if(lastLocation != null)
{
    updateLoc(lastLocation);
}

//Add Scale Bar
ScaleBarOverlay myScaleBarOverlay = new ScaleBarOverlay(this);
mapView.getOverlays().add(myScaleBarOverlay);
}

@Override
protected void onResume()
{
super.onResume();
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, myLocationListener);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, myLocationListener);
}

@Override
protected void onPause() 
{
super.onPause();
locationManager.removeUpdates(myLocationListener);
}

private void updateLoc(Location loc)
{
GeoPoint locGeoPoint = new GeoPoint(loc.getLatitude(), loc.getLongitude());
mapController.setCenter(locGeoPoint);
mapController.animateTo(locGeoPoint);

setOverlayLoc(loc);

mapView.invalidate();
}

private void setOverlayLoc(Location overlayloc)
{
GeoPoint overlocGeoPoint = new GeoPoint(overlayloc);
//---
overlayItemArray.clear();

OverlayItem newMyLocationItem = new OverlayItem("My Location", "My Location", overlocGeoPoint);
overlayItemArray.add(newMyLocationItem);
//---
}

private LocationListener myLocationListener = new LocationListener()
{
@Override
public void onLocationChanged(Location location)
{
    updateLoc(location);
}

@Override
public void onProviderDisabled(String provider)
{           
}

@Override
public void onProviderEnabled(String provider)
{           
}

@Override
public void onStatusChanged(String provider, int status, Bundle extras)
{           
}
};

private class MyItemizedIconOverlay extends ItemizedIconOverlay<OverlayItem>
{

public MyItemizedIconOverlay(List<OverlayItem> pList,org.osmdroid.views.overlay.ItemizedIconOverlay.OnItemGestureListener<OverlayItem> pOnItemGestureListener,
        ResourceProxy pResourceProxy)
{
    super(pList, pOnItemGestureListener, pResourceProxy);           
}

@Override
public void draw(Canvas canvas, MapView mapview, boolean arg2)
{
    super.draw(canvas, mapview, arg2);

    if(!overlayItemArray.isEmpty())
    {
        //overlayItemArray have only ONE element only, so I hard code to get(0)
        GeoPoint in = overlayItemArray.get(0).getPoint();

        Point out = new Point();
        mapview.getProjection().toPixels(in, out);

        Bitmap bm = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
        canvas.drawBitmap(bm,out.x - bm.getWidth()/2,out.y - bm.getHeight()/2,null);
    }
}

@Override
public boolean onSingleTapUp(MotionEvent event, MapView mapView)
{
    //return super.onSingleTapUp(event, mapView);
    return true;
}

@Override
public boolean onSingleTapConfirmed(MotionEvent event, MapView mapView)
{
    return true;
}
}
}

activity_main.xm

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<org.osmdroid.views.MapView
    android:id="@+id/mapview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
</org.osmdroid.views.MapView>

</LinearLayout>

2 个答案:

答案 0 :(得分:1)

使用OSMBonusPack Marker类时,所有这些功能都可用,其目的是为osmdroid提供类似Google Maps v2的Marker。

答案 1 :(得分:0)

我从这个链接获得了解决方案

http://code.google.com/p/osmdroid/issues/detail?id=245#makechanges