在android中的google地图上添加多个标记
我是triyng在谷歌地图上添加多个标记。这是我的代码部分在android中的google地图上添加多个标记,android,google-maps,mobile,google-maps-markers,Android,Google Maps,Mobile,Google Maps Markers,我是triyng在谷歌地图上添加多个标记。这是我的代码部分 public class GoogleMap extends MapView { MapController mc; MapView mapView; GeoPoint p; @Override public void onCreate(Bundle savedInstanceState) { .... double lat = Double.p
public class GoogleMap extends MapView
{
MapController mc;
MapView mapView;
GeoPoint p;
@Override
public void onCreate(Bundle savedInstanceState)
{
....
double lat = Double.parseDouble(bundle.getString("paramLat"));
double lng = Double.parseDouble(bundle.getString("paramLong"));
mc = mapView.getController();
p = new GeoPoint( (int) (lat * 1E6), (int) (lng * 1E6));
mc.animateTo(p);
mc.setZoom(17);
//---Add a location marker---
MapOverlay mapOverlay = new MapOverlay();
List<Overlay> listOfOverlays = mapView.getOverlays();
listOfOverlays.clear();
listOfOverlays.add(mapOverlay);
mapView.invalidate();
}
class MapOverlay extends com.google.android.maps.Overlay
{
@Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)
{
super.draw(canvas, mapView, shadow);
//---translate the GeoPoint to screen pixels---
Point screenPts = new Point();
mapView.getProjection().toPixels(p, screenPts);
//---add the marker---
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pushpin);
canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null);
return true;
}
}
公共类GoogleMap扩展了MapView
{
地图控制器;
地图视图;
地质点p;
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
....
double-lat=double.parseDouble(bundle.getString(“paramLat”));
double lng=double.parseDouble(bundle.getString(“paramLong”);
mc=mapView.getController();
p=新地质点((内部)(纬度*1E6),(内部)(液化天然气*1E6));
司马迁(p),;
mc.setZoom(17);
//---添加位置标记---
MapOverlay MapOverlay=新的MapOverlay();
List ListoForLays=mapView.getOverlays();
listOfOverlays.clear();
添加(映射覆盖);
mapView.invalidate();
}
类MapOverlay扩展了com.google.android.maps.Overlay
{
@凌驾
公共布尔绘制(画布画布、地图视图、地图视图、布尔阴影、长时间)
{
super.draw(画布、地图视图、阴影);
//---将地质点转换为屏幕像素---
点屏幕PTS=新点();
getProjection().toPixels(p,screenPts);
//---添加标记---
位图bmp=BitmapFactory.decodeResource(getResources(),R.drawable.pushpin);
canvas.drawBitmap(bmp,screenPts.x,screenPts.y-50,null);
返回true;
}
}
我这里有两个问题。当我试图只添加一个标记时,它工作了,但draw方法被调用了很多次。但为什么?什么时候被调用
第二个问题是如何添加新标记。我创建了第二个名为p2的地质点,在这之后我该怎么做?非常感谢
您应该遵循开发者网站上的Android地图视图教程 第2部分包含用于构建覆盖层的部分
在Draw方法中应该做最少的工作;它被称为很多,包括每次移动/缩放贴图/使其无效时。您需要从一个ItemizedOverlay开始,它是一个点数组。您可以在这里找到文档。然后您需要调用ItemizedOverlay.Draw()方法,该方法将根据它们的位置绘制其中的所有点。希望这会有所帮助。我已经在我的项目中实现了多个标记。这是示例代码;您需要更改的是标记图像、长度(要在for循环中定义的标记数)。希望这会有所帮助!!!
public class ShowMapActivity extends MapActivity{
private MapController mapControll;
private GeoPoint geoPoint=null;
private MapView mapview;
private MyItemizedOverlay userPicOverlay;
private MyItemizedOverlay nearPicOverlay;
private Drawable userPic,atmPic;
private OverlayItem nearatms[] = new OverlayItem[50];
public static Context context;
@Override
protected void onCreate(Bundle icicle) {
// TODO Auto-generated method stub
super.onCreate(icicle);
context = getApplicationContext();
setContentView(R.layout.your layout xml);
showMap();
}
public void showMap() {
// TODO Auto-generated method stub
try {
geoPoint = new GeoPoint((int)(latitude * 1E6),(int)(longitude * 1E6));
mapview = (MapView)findViewById(R.id.mapview);
mapControll= mapview.getController();
mapview.setBuiltInZoomControls(true);
mapview.setStreetView(true);
mapControll.setZoom(16);
mapControll.animateTo(geoPoint);
userPic = this.getResources().getDrawable(R.drawable.your pic);
userPicOverlay = new MyItemizedOverlay(userPic);
OverlayItem overlayItem = new OverlayItem(geoPoint, "I'm Here!!!", null);
userPicOverlay.addOverlay(overlayItem);
mapview.getOverlays().add(userPicOverlay);
atmPic = this.getResources().getDrawable(R.drawable.your pic);
nearPicOverlay = new MyItemizedOverlay(atmPic);
for (int i = 0; i < define your length here; i++) {
nearatms[i] = new OverlayItem(new GeoPoint((int)((latitude) * 1E6)),(int)(longitude) * 1E6)),"Name", null);//just check the brackets i just made change here so....
nearPicOverlay.addOverlay(nearatms[i]);
}
mapview.getOverlays().add(nearPicOverlay);
//Added symbols will be displayed when map is redrawn so force redraw now
mapview.postInvalidate();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
}
公共类ShowMapActivity扩展了MapActivity{
私有映射控制器mapControll;
专用地质点=空;
私有地图视图;
私有MyItemizeOverlay用户PicOverlay;
私有MyItemizedOverlay近PicOverlay;
私有可绘制用户PIC,atmPic;
私人OverlayItem NearATM[]=新OverlayItem[50];
公共静态语境;
@凌驾
创建时受保护的空隙(捆绑冰柱){
//TODO自动生成的方法存根
超级冰柱;
context=getApplicationContext();
setContentView(R.layout.your布局xml);
showMap();
}
公共void showMap(){
//TODO自动生成的方法存根
试一试{
地质点=新的地质点((int)(纬度*1E6),(int)(经度*1E6));
mapview=(mapview)findViewById(R.id.mapview);
mapControll=mapview.getController();
mapview.SetBuilTinZoomControl(真);
mapview.setStreetView(真);
mapControll.setZoom(16);
mapControll.animateTo(地质点);
userPic=this.getResources().getDrawable(R.drawable.your pic);
userPicOverlay=newmyitemizedoverlay(userPic);
OverlayItem OverlayItem=新的OverlayItem(地理点,“我在这里!!!”,null);
userPicOverlay.addOverlay(overlayItem);
mapview.getOverlays().add(userPicOverlay);
atmPic=this.getResources().getDrawable(R.drawable.your pic);
nearPicOverlay=新的MyItemizedOverlay(atmPic);
for(int i=0;i<在此处定义长度;i++){
nearatms[i]=新的覆盖项(新的地理点((int)((纬度)*1E6)),(int)(经度)*1E6)),“Name”,null);//只要检查一下我刚才在这里更改的括号就可以了。。。。
nearPicOverlay.addOverlay(nearatms[i]);
}
mapview.getOverlays().add(nearPicOverlay);
//重新绘制地图时将显示添加的符号,因此现在强制重新绘制
mapview.postInvalidate();
}捕获(例外e){
e、 printStackTrace();
}
}
@凌驾
受保护的布尔值isRouteDisplayed(){
//TODO自动生成的方法存根
返回false;
}
}
用于放置标记的逐项分类
public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {
private ArrayList<OverlayItem> myOverlays ;
public MyItemizedOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
myOverlays = new ArrayList<OverlayItem>();
populate();
}
public void addOverlay(OverlayItem overlay){
myOverlays.add(overlay);
populate();
}
@Override
protected OverlayItem createItem(int i) {
return myOverlays.get(i);
}
// Removes overlay item i
public void removeItem(int i){
myOverlays.remove(i);
populate();
}
// Returns present number of items in list
@Override
public int size() {
return myOverlays.size();
}
public void addOverlayItem(OverlayItem overlayItem) {
myOverlays.add(overlayItem);
populate();
}
public void addOverlayItem(int lat, int lon, String title) {
try {
GeoPoint point = new GeoPoint(lat, lon);
OverlayItem overlayItem = new OverlayItem(point, title, null);
addOverlayItem(overlayItem);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
@Override
protected boolean onTap(int index) {
// TODO Auto-generated method stub
String title = myOverlays.get(index).getTitle();
Toast.makeText(ShowMapActivity.context, title, Toast.LENGTH_LONG).show();
return super.onTap(index);
}
}
公共类MyItemizeOverlay扩展了ItemizeOverlay{
私人ArrayList myOverlays;
公共MyItemizedOverlay(可绘制的默认标记){
super(boundCenterBottom(defaultMarker));
myOverlays=新的ArrayList();
填充();
}
公共void addOverlay(OverlayItem overlay){
添加(覆盖);
填充();
}
@凌驾
受保护的OverlayItem createItem(int i){
返回myOverlays.get(i);
}
//删除覆盖项i
公共无效删除项(int i){
删除(i);
填充();
}
//返回列表中的当前项数
@凌驾
公共整数大小(){
返回myOverlays.size();
}
公共void addOverlayItem(OverlayItem OverlayItem){
加上