如何在OSM地图android系统中添加更多的标记,请帮助我 [英] how to add more marker in osm map in android please help me

查看:356
本文介绍了如何在OSM地图android系统中添加更多的标记,请帮助我的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这么多的努力后,现在终于我找到一个解决方案如何映射在openstreet地图气囊我根据我的需要定制osmbonuspack是做工精细,但只显示一张地图。

我如何在这code,我在下面粘贴添加更多然后一个标志?

我的输出URL是做工精细只是告诉我,我怎么在图像泡沫添加文字,也是我如何地图添加一个以上的标记?

 进口android.widget.Button;
进口android.widget.EditText;
进口android.widget.TextView;
进口android.widget.Toast;
进口com.osmbonuspackdemo.R;公共类NavigationActivity扩展活动
{
    保护MapView的地图;
    保护ItemizedOverlayWithBubble< ExtendedOverlayItem> markerOverlays;
    保护ExtendedOverlayItem markerStart;    @覆盖公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.main);        地图=(图形页面)findViewById(R.id.map);
        map.setBuiltInZoomControls(真);
        map.setMultiTouchControls(真);
        MapController mapController = map.getController();        GeoPoint的myPoint1 =新的GeoPoint(24.893379000000000000,67.028060900000010000);
        mapController.setZoom(9);
        mapController.setCenter(myPoint1);
        最终的ArrayList< ExtendedOverlayItem> waypointsItems =新的ArrayList< ExtendedOverlayItem>();
        markerOverlays =新ItemizedOverlayWithBubble< ExtendedOverlayItem>(这一点,waypointsItems,地图);
        。map.getOverlays()加(markerOverlays);
        markerStart = putMarkerItem(NULL,myPoint1,开始,R.drawable.marker_a,R.drawable.rogger_rabbit);
    }    公共ExtendedOverlayItem putMarkerItem(ExtendedOverlayItem项目的GeoPoint P,字符串标题,诠释markerResId,诠释iconResId){
            可绘制标记= getResources()getDrawable(markerResId)。
            ExtendedOverlayItem overlayItem =新ExtendedOverlayItem(标题,,P);            overlayItem.setMarker(标记);
            overlayItem.setImage(getResources()getDrawable(iconResId));
            markerOverlays.addItem(overlayItem);
            map.invalidate();            返回overlayItem;
   }}进口org.osmdroid.util.GeoPoint;
进口org.osmdroid.views.overlay.OverlayItem;
进口android.graphics.drawable.Drawable;公共类ExtendedOverlayItem扩展OverlayItem {    私人字符串mTitle,mDescription; //现在,他们正在修改
    私人字符串mSubDescription; //可以显示在信息窗口的第三字段,在第三行
    私人可绘制mImage; //将在信息窗口显示。
    //私人的GeoPoint mGeoPoint //遗憾的是,这不是那么简单......    公共ExtendedOverlayItem(字符串aTitle,字符串aDescription,GeoPoint的aGeoPoint){
        超(aTitle,aDescription,aGeoPoint);
        mTitle = aTitle;
        mDescription = aDescription;
        mSubDescription = NULL;
        mImage = NULL;
    }    公共无效的setTitle(字符串aTitle){
        mTitle = aTitle;
    }    公共无效setDescription(字符串aDescription){
        mDescription = aDescription;
    }    公共无效setSubDescription(字符串aSubDescription){
        mSubDescription = aSubDescription;
    }    公共无效setImage(可绘制anImage){
        mImage = anImage;
    }    公共字符串的getTitle(){
        返回mTitle;
    }    公共字符串getDescription(){
        返回mDescription;
    }    公共字符串getSubDescription(){
        返回mSubDescription;
    }    公众可绘制的getImage(){
        返回mImage;
    }
}
公共类信息窗口{    受保护的视图MView的;
    保护布尔mIsVisible = FALSE;
    受保护的MapView mMapView;    公开信息窗口(INT layoutResId,MapView类MapView类){
        mMapView =图形页面;
        mIsVisible = FALSE;
        ViewGroup中父=(ViewGroup中)mapView.getParent();
        上下文CTX = mapView.getContext();
        LayoutInflater吹气=(LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        / *
        如果(layoutResId == 0)
            layoutResId = R.layout.bonuspack_bubble;
        * /
        MVIEW = inflater.inflate(layoutResId,父母,假);
        mView.setOnClickListener(新View.OnClickListener(){
            公共无效的onClick(视图v){
                关();
            }
        });
    }    公共查看getView(){
        返回(MVIEW);
    }    公共无效打开(GeoPoint的位置,诠释offsetX,诠释offsetY){
        MapView.LayoutParams LP =新MapView.LayoutParams(
            MapView.LayoutParams.WRAP_CONTENT,
            MapView.LayoutParams.WRAP_CONTENT,
            位置,MapView.LayoutParams.BOTTOM_CENTER,
            offsetX,offsetY);
        关();
        mMapView.addView(MVIEW,LP);
        mIsVisible =真;
    }    公共无效的close(){
        如果(mIsVisible){
            mIsVisible = FALSE;
            ((ViewGroup中)mView.getParent())removeView(MVIEW)。
        }
    }    公共无效setPosition两种(GeoPoint的P,INT offsetX,诠释offsetY){
        如果(mIsVisible){
            开(P,offsetX,offsetY);
        }
    }
}进口org.osmdroid.util.GeoPoint;
进口org.osmdroid.views.MapView;
进口org.osmdroid.views.overlay.ItemizedIconOverlay;
进口org.osmdroid.views.overlay.OverlayItem;
进口android.content.Context;
进口android.graphics.drawable.Drawable;
进口android.view.View;
进口android.widget.ImageView;
进口android.widget.TextView;公共类ItemizedOverlayWithBubble<项目扩展OverlayItem>扩展
ItemizedIconOverlay<项目> {
    保护信息窗口mBubble; //只是这个覆盖的所有项目= GT;逐个
 一时间
 私人上下文的背景下;
    保护OverlayItem mItemWithBubble; //该项目目前呈现的泡沫。
   如果没有则为null。
    最终诠释mTitleId,mDescriptionId,mSubDescriptionId,mImageId;    公共ItemizedOverlayWithBubble(最终上下文的背景下,最终的名单,LT;项目> ALIST,
  最终MapView类MapView类){
        超(背景下,ALIST,新OnItemGestureListener<项目>(){
            @覆盖公共布尔onItemSingleTapUp(最终诠释指数,最终
  OverlayItem项){
                返回false;
            }
            @覆盖公共布尔onItemLong preSS(最终诠释指数,最终
  OverlayItem项){
                返回false;
            }
        });        字符串的packageName = context.getClass()getPackage()的getName()。
        INT layoutId =
 。context.getResources()则getIdentifier(布局/ bonuspack_bubble,空,的packageName);
        mTitleId = context.getResources()则getIdentifier(ID / bubble_title,空,
 的packageName);
        mDescriptionId =
 context.getResources()则getIdentifier(ID / bubble_description,空,的packageName)。
        mSubDescriptionId =
 context.getResources()则getIdentifier(ID / bubble_subdescription,空,的packageName)。
        mImageId = context.getResources()则getIdentifier(ID / bubble_image,空,
 的packageName);
        mBubble =新的信息窗口(layoutId,MapView类);
        mItemWithBubble = NULL;
    }    公共无效showBubbleOnItem(INT指数,MapView类MapView类){
        ExtendedOverlayItem eItem =(ExtendedOverlayItem)(的getItem(指数));
        mItemWithBubble = eItem;
        GeoPoint的位置= eItem.getPoint();
        //更新泡沫的内容的基础上挖掘的项目:
        查看查看= mBubble.getView();
        ((的TextView)view.findViewById(mTitleId /*R.id.title*
/))的setText(eItem.getTitle())。
        ((的TextView)view.findViewById(mDescriptionId /*R.id.description*
  /))的setText(eItem.getDescription())。        //手柄mSubDescription,hidding或显示文本视图:
        TextView的subDescText =(TextView中)view.findViewById(mSubDescriptionId);
        串subDesc = eItem.getSubDescription();
        如果(subDesc = NULL&放大器;!&安培;!(等于(subDesc))){
            subDescText.setText(subDesc);
            subDescText.setVisibility(View.VISIBLE);
        }其他{
            subDescText.setVisibility(View.GONE);
        }        ImageView的ImageView的=(ImageView的)view.findViewById(mImageId
   /*R.id.image*/);
        绘制的图像= eItem.getImage();
        如果(形象!= NULL){
            imageView.setBackgroundDrawable(图片);
            imageView.setVisibility(View.VISIBLE);
        }其他
            imageView.setVisibility(View.GONE);        INT offsetY = -20;
        可绘制标记= eItem.getMarker(OverlayItem.ITEM_STATE_FOCUSED_MASK);
        如果(标记!= NULL)
            offsetY = -marker.getIntrinsicHeight()* 3/4​​;
        mBubble.open(位置,0,offsetY);
        。mapView.getController()animateTo(位置);
    }    @覆盖保护布尔onSingleTapUpH​​elper(最终诠释指数,最后一个项目的项目,
    最终MapView类MapView类){
        showBubbleOnItem(索引,MapView类);
        返回true;
    }    / ** @返回该项目currenty呈现泡沫,如果没有则为null。 * /
    公共OverlayItem getBubbledItem(){
        // TODO:如果用户点击泡泡将其关闭,mItemWithBubble未设置
 为空...
        返回mItemWithBubble;
    }    @覆盖公共布尔的removeItem(项目项目){
        布尔结果= super.removeItem(项目);
        如果(mItemWithBubble ==项目){
                mBubble.close();
                mItemWithBubble = NULL;
        }
        返回结果;
    }    @覆盖公共无效removeAllItems(){
        super.removeAllItems();
        mBubble.close();
        mItemWithBubble = NULL;
    }  @覆盖
    公共布尔onTouchEvent(MotionEvent事件,MapView类MapView类)
    {        如果(event.getAction()== 0){
            GeoPoint对象的GeoPoint =(GeoPoint对象)MapView.getProjection()在。fromPixels(
                (INT)event.getX(),
                (INT)event.getY());
            //纬度
            双纬度= geopoint.getLatitudeE6()/ 1E6;
            //经度
            双LON = geopoint.getLongitudeE6()/ 1E6;
            Toast.makeText(背景下,纬度:+纬度+,经度:+ LON,
  Toast.LENGTH_SHORT).show();
        }
        返回false;
    }
 }


解决方案

使用逐项叠加这样的(填充的方法是最重要的)

 公共类CustomOverLay扩展ItemizedOverlay< OverlayItem> {私人的ArrayList< OverlayItem> overlayItems =新的ArrayList< OverlayItem>();
私人MapView类MapView类;公共CustomOverLay(绘制对象绘制,MapView类MapView类){
    超(boundCenterBottom(绘制));
    this.mapView =图形页面;
}公共无效addOverlayItem(OverlayItem项){
    overlayItems.add(项目);
    填充();
}@覆盖
保护OverlayItem createItem中(INT指数){
    返回overlayItems.get(索引);
}@覆盖
公众诠释大小(){
    返回overlayItems.size();
}@覆盖
保护布尔中的onTap(INT指数){
    返回true;
}

}

,一旦你这样做遵循code波纹管,加OverlayItem你想在地图放置一些标记

 列表<&覆盖GT; mapOverlays =调用MapView.getOverlays();
CustomOverLay覆盖=新CustomOverLay(绘制,图形页面);GeoPoint的P =新的GeoPoint(getLat(util.getLatitude()),getLong之(util.getLongitude()));
OverlayItem overlayItem =新OverlayItem(对,,);
overlays.addOverlayItem(overlayItem);
GeoPoint的P =新的GeoPoint(getLat(util.getLatitude()),getLong之(util.getLongitude()));
OverlayItem overlayItem =新OverlayItem(对,,);
overlays.addOverlayItem(overlayItem);.....等等mapOverlays.add(覆盖);

欢呼声

After so much effort now finally I find a solution how to map balloon in openstreet map I customize osmbonuspack according to my need is work fine but is only show one map.

How do I add more then one marker in this code which I paste below?

My output URL is work fine just tell me how do I add text in image bubble and also how I add more then one marker in map?

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

解决方案

Use Itemized Overlay like this (populate method is most important)

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

}

and once you did this follow the code bellow, add OverlayItem for the number markers you want to place in the Map

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

cheers

这篇关于如何在OSM地图android系统中添加更多的标记,请帮助我的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆