如何在OSM地图android系统中添加更多的标记,请帮助我 [英] how to add more marker in osm map in android please help me
问题描述
这么多的努力后,现在终于我找到一个解决方案如何映射在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(位置);
} @覆盖保护布尔onSingleTapUpHelper(最终诠释指数,最后一个项目的项目,
最终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屋!