Java 如何在android的osm地图中添加更多标记

Java 如何在android的osm地图中添加更多标记,java,android,openstreetmap,Java,Android,Openstreetmap,我已经找到了一个解决方案,如何在openstreet地图中映射气球我根据需要定制osmbonuspack,这很好,但只显示一张地图 如何在下面粘贴的代码中添加多个标记 我的输出URL工作正常,请告诉我如何在图像气泡中添加文本,以及如何在地图中添加多个标记 import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast;

我已经找到了一个解决方案,如何在openstreet地图中映射气球我根据需要定制osmbonuspack,这很好,但只显示一张地图

如何在下面粘贴的代码中添加多个标记

我的输出URL工作正常,请告诉我如何在图像气泡中添加文本,以及如何在地图中添加多个标记

import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.osmbonuspackdemo.R;

public class NavigationActivity extends Activity 
{
    protected MapView map;
    protected ItemizedOverlayWithBubble<ExtendedOverlayItem> markerOverlays;
    protected ExtendedOverlayItem markerStart;

    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        map = (MapView) findViewById(R.id.map);
        map.setBuiltInZoomControls(true);
        map.setMultiTouchControls(true);
        MapController mapController = map.getController();

        GeoPoint myPoint1 = new GeoPoint(24.893379000000000000, 67.028060900000010000);
        mapController.setZoom(9);
        mapController.setCenter(myPoint1);


        final ArrayList<ExtendedOverlayItem> waypointsItems = new ArrayList<ExtendedOverlayItem>();
        markerOverlays = new ItemizedOverlayWithBubble<ExtendedOverlayItem>(this, waypointsItems, map);
        map.getOverlays().add(markerOverlays);
        markerStart = putMarkerItem(null, myPoint1, "Start", R.drawable.marker_a, R.drawable.rogger_rabbit);
    }

    public ExtendedOverlayItem putMarkerItem(ExtendedOverlayItem item, GeoPoint p, String title, int markerResId, int iconResId) {
            Drawable marker = getResources().getDrawable(markerResId);
            ExtendedOverlayItem overlayItem = new ExtendedOverlayItem(title, "", p);

            overlayItem.setMarker(marker);
            overlayItem.setImage(getResources().getDrawable(iconResId));
            markerOverlays.addItem(overlayItem);
            map.invalidate();

            return overlayItem;
   }  

}

import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.overlay.OverlayItem;
import android.graphics.drawable.Drawable;

public class ExtendedOverlayItem extends OverlayItem {

    private String mTitle, mDescription; // now, they are modifiable
    private String mSubDescription; //a third field that can be displayed in the infowindow, on a third line
    private Drawable mImage; //that will be shown in the infowindow.
    //private GeoPoint mGeoPoint //unfortunately, this is not so simple...

    public ExtendedOverlayItem(String aTitle, String aDescription, GeoPoint aGeoPoint) {
        super(aTitle, aDescription, aGeoPoint);
        mTitle = aTitle;
        mDescription = aDescription;
        mSubDescription = null;
        mImage = null;
    }

    public void setTitle(String aTitle){
        mTitle = aTitle;
    }

    public void setDescription(String aDescription){
        mDescription = aDescription;
    }

    public void setSubDescription(String aSubDescription){
        mSubDescription = aSubDescription;
    }

    public void setImage(Drawable anImage){
        mImage = anImage;
    }

    public String getTitle() {
        return mTitle;
    }

    public String getDescription() {
        return mDescription;
    }

    public String getSubDescription() {
        return mSubDescription;
    }

    public Drawable getImage() {
        return mImage;
    }
}


public class InfoWindow {

    protected View mView;
    protected boolean mIsVisible = false;
    protected MapView mMapView;

    public InfoWindow(int layoutResId, MapView mapView) {
        mMapView = mapView;
        mIsVisible = false;
        ViewGroup parent=(ViewGroup)mapView.getParent();
        Context ctx = mapView.getContext();
        LayoutInflater inflater = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        /*
        if (layoutResId == 0)
            layoutResId = R.layout.bonuspack_bubble;
        */
        mView = inflater.inflate(layoutResId, parent, false);
        mView.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                close();
            }
        });
    }

    public View getView() {
        return(mView);
    }

    public void open(GeoPoint position, int offsetX, int offsetY) {
        MapView.LayoutParams lp=new MapView.LayoutParams(
            MapView.LayoutParams.WRAP_CONTENT,
            MapView.LayoutParams.WRAP_CONTENT,
            position, MapView.LayoutParams.BOTTOM_CENTER,
            offsetX, offsetY);
        close();
        mMapView.addView(mView, lp);
        mIsVisible = true;
    }

    public void close() {
        if (mIsVisible) {
            mIsVisible = false;
            ((ViewGroup)mView.getParent()).removeView(mView);
        }
    }

    public void setPosition(GeoPoint p, int offsetX, int offsetY){
        if (mIsVisible){
            open(p, offsetX, offsetY);
        }
    }
}

import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import org.osmdroid.views.overlay.ItemizedIconOverlay;
import org.osmdroid.views.overlay.OverlayItem;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

public class ItemizedOverlayWithBubble<Item extends OverlayItem> extends  
ItemizedIconOverlay<Item> {
    protected InfoWindow mBubble; //only one for all items of this overlay => one at  
 a  time
 private Context context;
    protected OverlayItem mItemWithBubble; //the item currently showing the bubble.  
   Null if none.
    final int mTitleId, mDescriptionId, mSubDescriptionId, mImageId;

    public ItemizedOverlayWithBubble(final Context context, final List<Item> aList,  
  final MapView mapView) {
        super(context, aList, new OnItemGestureListener<Item>() {
            @Override public boolean onItemSingleTapUp(final int index, final  
  OverlayItem item) {
                return false;
            }
            @Override public boolean onItemLongPress(final int index, final  
  OverlayItem item) {
                return false;
            }
        });

        String packageName = context.getClass().getPackage().getName();
        int layoutId =  
 context.getResources().getIdentifier("layout/bonuspack_bubble" , null, packageName);
        mTitleId = context.getResources().getIdentifier("id/bubble_title", null, 
 packageName);
        mDescriptionId = 
 context.getResources().getIdentifier("id/bubble_description", null, packageName);
        mSubDescriptionId = 
 context.getResources().getIdentifier("id/bubble_subdescription", null, packageName);
        mImageId = context.getResources().getIdentifier( "id/bubble_image", null,  
 packageName);
        mBubble = new InfoWindow(layoutId, mapView);
        mItemWithBubble = null;
    }

    public void showBubbleOnItem(int index, MapView mapView) {
        ExtendedOverlayItem eItem = (ExtendedOverlayItem)(getItem(index));
        mItemWithBubble = eItem;
        GeoPoint position = eItem.getPoint();
        //update the content of the bubble, based on the item tapped:
        View view = mBubble.getView();
        ((TextView)view.findViewById(mTitleId /*R.id.title*  
/)).setText(eItem.getTitle());
        ((TextView)view.findViewById(mDescriptionId /*R.id.description* 
  /)).setText(eItem.getDescription());

        //handle mSubDescription, hidding or showing the text view:
        TextView subDescText = (TextView)view.findViewById(mSubDescriptionId);
        String subDesc = eItem.getSubDescription();
        if (subDesc != null && !("".equals(subDesc))){
            subDescText.setText(subDesc);
            subDescText.setVisibility(View.VISIBLE);
        } else {
            subDescText.setVisibility(View.GONE);
        }

        ImageView imageView = (ImageView)view.findViewById(mImageId   
   /*R.id.image*/);
        Drawable image = eItem.getImage();
        if (image != null){
            imageView.setBackgroundDrawable(image);
            imageView.setVisibility(View.VISIBLE);
        } else
            imageView.setVisibility(View.GONE);

        int offsetY = -20;
        Drawable marker = eItem.getMarker(OverlayItem.ITEM_STATE_FOCUSED_MASK);
        if (marker != null)
            offsetY = -marker.getIntrinsicHeight()*3/4;
        mBubble.open(position, 0, offsetY);
        mapView.getController().animateTo(position);
    }

    @Override protected boolean onSingleTapUpHelper(final int index, final Item item,  
    final MapView mapView) {
        showBubbleOnItem(index, mapView);
        return true;
    }

    /** @return the item currenty showing the bubble, or null if none.  */
    public OverlayItem getBubbledItem(){
        //TODO: if user taps the bubble to close it, mItemWithBubble is not set 
 to  null...
        return mItemWithBubble;
    }

    @Override public boolean removeItem(Item item){
        boolean result = super.removeItem(item);
        if (mItemWithBubble == item){
                mBubble.close();
                mItemWithBubble = null;
        }
        return result;
    }

    @Override public void removeAllItems(){
        super.removeAllItems();
        mBubble.close();
        mItemWithBubble = null;
    }

  @Override
    public boolean onTouchEvent(MotionEvent event, MapView mapView) 
    {   

        if (event.getAction() == 0) {                
            GeoPoint geopoint = (GeoPoint) mapView.getProjection().fromPixels(
                (int) event.getX(),
                (int) event.getY());
            // latitude
            double lat = geopoint.getLatitudeE6() / 1E6;
            // longitude
            double lon = geopoint.getLongitudeE6() / 1E6;
            Toast.makeText(context, "Lat: " + lat + ", Lon: "+lon,   
  Toast.LENGTH_SHORT).show();
        }                            
        return false;
    } 
 }
导入android.widget.Button;
导入android.widget.EditText;
导入android.widget.TextView;
导入android.widget.Toast;
导入com.osmbonuspackdemo.R;
公共类导航活动扩展活动
{
受保护的地图视图;
受保护的物品用气泡标记覆盖;
受保护的ExtendedOverlayItem markerStart;
@在创建时覆盖公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
map=(MapView)findviewbyd(R.id.map);
map.setBuiltInZoomControls(真);
map.setMultiTouchControls(真);
MapController MapController=map.getController();
地质点myPoint1=新的地质点(24.89337900000000000067.0280609000001000000);
mapController.setZoom(9);
mapController.setCenter(myPoint1);
最终ArrayList waypointsItems=新ArrayList();
markerOverlays=新项目化overlaywithbubble(此、航路点站点、地图);
map.getOverlays().add(markerOverlays);
markerStart=putMarkerItem(null,myPoint1,“Start”,R.drawable.marker\u a,R.drawable.rogger\u rabbit);
}
公共ExtendedOverlayItem putMarkerItem(ExtendedOverlayItem项,地理点p,字符串标题,int-markerResId,int-iconResId){
Drawable marker=getResources().getDrawable(markerResId);
ExtendedOverlayItem overlayItem=新的ExtendedOverlayItem(标题“”,p);
覆盖项设置标记(标记);
setImage(getResources().getDrawable(iconResId));
markerOverlays.addItem(overlayItem);
map.invalidate();
返回覆盖项;
}  
}
导入org.osmdroid.util.GeoPoint;
导入org.osmdroid.views.overlay.OverlayItem;
导入android.graphics.drawable.drawable;
公共类ExtendedOverlayItem扩展了OverlayItem{
私有字符串mTitle,mDescription;//现在,它们是可修改的
私有字符串mSubDescription;//可以在信息窗口的第三行显示的第三个字段
private Drawable mImage;//将显示在信息窗口中。
//私有地质点mGeoPoint//不幸的是,这并不是那么简单。。。
公共扩展覆盖项(字符串标记、字符串描述、地质点标记){
超级(aTitle、aDescription、aGeoPoint);
mTitle=aTitle;
mddescription=描述;
mSubDescription=null;
mImage=null;
}
公共无效集合标题(字符串aTitle){
mTitle=aTitle;
}
public void setDescription(字符串描述){
mddescription=描述;
}
public void setSubDescription(字符串aSubDescription){
mSubDescription=aSubDescription;
}
公共空白设置图像(可绘制动画){
图像=动物图像;
}
公共字符串getTitle(){
返回mTitle;
}
公共字符串getDescription(){
返回mDescription;
}
公共字符串getSubDescription(){
返回mSubDescription;
}
公共可绘制的getImage(){
返回图像;
}
}
公共类信息窗口{
保护视图mView;
受保护的布尔值不可见=假;
受保护的地图视图mMapView;
公共信息窗口(int layoutResId、MapView MapView){
mMapView=地图视图;
错误可见=错误;
ViewGroup parent=(ViewGroup)mapView.getParent();
Context ctx=mapView.getContext();
LayoutInflater充气器=(LayoutInflater)ctx.getSystemService(Context.LAYOUT\u充气器\u服务);
/*
if(layoutResId==0)
layoutResId=R.layout.bonuspack\u bubble;
*/
mView=充气机。充气(layoutResId,父级,false);
mView.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
close();
}
});
}
公共视图getView(){
返回(mView);
}
公共无效打开(地质点位置、整数偏移、整数偏移){
MapView.LayoutParams lp=新建MapView.LayoutParams(
MapView.LayoutParams.WRAP_内容,
MapView.LayoutParams.WRAP_内容,
位置,MapView.LayoutParams.BOTTOM_中心,
offsetX,offsetY);
close();
mMapView.addView(mView,lp);
错误可见=正确;
}
公众假期结束(){
如果(不可见){
错误可见=错误;
((视图组)mView.getParent()).removeView(mView);
}
}
公共无效设置位置(地质点p、整数偏移X、整数偏移){
如果(不可见){
开放式(p、offsetX、offsetY);
}
}
}
导入org.osmdroid.util.GeoPoint;
导入org.osmdroid.views.MapView;
导入org.osmdroid.views.overlay.itemizedictionoverlay;
导入org.osmdroid.views.overlay.OverlayItem;
导入android.content.Context;
导入android.graphics.drawable.drawable;
导入android.view.view;
导入android.widget.ImageView;
导入android.widget.TextView;
公共类ItemizedOverlayWithBubble扩展
项目法令概述{
受保护的InfoWindow mBubble;//此覆盖的所有项仅一个=>一个
一段时间
私人语境;
protected OverlayItem mItemWithBubble;//当前显示冒泡的项目。
如果没有,则为Null。
final int mTitleId、mddescriptionid、mSubDescriptionId、mImageId;
public ItemizedOverlayWithBubble(最终上下文、最终列表、,
最终地图视图(地图视图){
super(上下文、列表、新OnItemTestureListener(){
@重写公共布尔值和单个标记(最终整型索引,最终
覆盖项(项目){
返回false;
public class CustomOverLay extends ItemizedOverlay<OverlayItem> {

private ArrayList<OverlayItem> overlayItems = new ArrayList<OverlayItem>();
private MapView mapView;

public CustomOverLay(Drawable drawable, MapView mapView) {
    super(boundCenterBottom(drawable));
    this.mapView = mapView;
}

public void addOverlayItem(OverlayItem item) {
    overlayItems.add(item);
    populate();
}

@Override
protected OverlayItem createItem(int index) {
    return overlayItems.get(index);
}

@Override
public int size() {
    return overlayItems.size();
}

@Override
protected boolean onTap(int index) {
    return true;
}
List<Overlays> mapOverlays = mapView.getOverlays();
CustomOverLay overlays = new CustomOverLay(drawable, mapView);

GeoPoint p = new GeoPoint(getLat(util.getLatitude()), getLong(util.getLongitude()));
OverlayItem overlayItem = new OverlayItem(p, "", "");
overlays.addOverlayItem(overlayItem);


GeoPoint p = new GeoPoint(getLat(util.getLatitude()), getLong(util.getLongitude()));
OverlayItem overlayItem = new OverlayItem(p, "", "");
overlays.addOverlayItem(overlayItem);

..... so on

mapOverlays.add(overlays);