地图应用定位,覆盖图层

    技术2025-09-29  49

    Android地图开发使用的是Google的地图开发接口。

     

    相关的类:

     

    MapActivity:编写的地图类必须继承它

     

    MapView:地图显示控件,可以设置成是否可以点击,交通模式,卫星模式,街道模式

     

    MapController:设置地图缩放等级,地图显示中点

     

    GeoPoint:地理坐标

     

    ItemizedOverlay:覆盖层

     

    使用GOOGLE地图开发必须使用密钥。

     

    具体申请密钥过程这里不讲了。

     

    源代码:

     

    package com.mobimtech.message;

    import java.util.ArrayList;

    import android.content.Context;import android.content.Intent;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.widget.TextView;

    import com.google.android.maps.GeoPoint;import com.google.android.maps.ItemizedOverlay;import com.google.android.maps.MapActivity;import com.google.android.maps.MapController;import com.google.android.maps.MapView;import com.google.android.maps.OverlayItem;import com.google.android.maps.Projection;

    public class MapInfo extends MapActivity {

     private Intent mIntent; private TextView mTv; private String mName; private String info[];  private MapView mMapView; private MapController mMapControl; private Drawable mMarker; private ArrayList<String>mList; private WaitDialog mDialog;  @Override protected void onCreate(Bundle arg0) {  // TODO Auto-generated method stub  super.onCreate(arg0);  setContentView(R.layout.map);  mIntent=getIntent();  mName=mIntent.getStringExtra("key");//  mTv=(TextView)findViewById(R.id.map_info);  for(int i=0;i<Storage.mFriend.size();i++){//   好友姓名+经度+纬度+性别+年龄+家乡+个性签名   info=Storage.mFriend.get(i).split("@");   if(info[0].equals(mName)){//    mTv.setText("姓名:"+info[0]+"经度:"+info[1]+"纬度:"+info[2]);    setTitle("姓名:"+info[0]+"经度:"+info[1]+"纬度:"+info[2]);   }  }    mMapView=(MapView)findViewById(R.id.mapview);  mMapView.setClickable(true);    mMapView.setBuiltInZoomControls(true);  mMapView.setEnabled(true);  mMapView.setTraffic(true);    mMapControl=mMapView.getController();  mMapControl.setZoom(11);    mMarker=getResources().getDrawable(R.drawable.mark);  mMarker.setBounds(0, 0, mMarker.getIntrinsicWidth(),mMarker.getIntrinsicHeight());  mMarker.setAlpha(180);  mMapView.getOverlays().add(new OverItem(mMarker,this)); }  class OverItem extends ItemizedOverlay<OverlayItem>{

      private Drawable marker;  private double latitude;  private double longititude;  private Context context;    private ArrayList <OverlayItem> geoList=new ArrayList<OverlayItem>();    public OverItem(Drawable defaultMarker) {   super(defaultMarker);   // TODO Auto-generated constructor stub  }  public OverItem(Drawable marker,Context context){   super(boundCenterBottom(marker));   this.context=context;   this.marker=marker;      String title=info[0];   String body="";   latitude=Double.parseDouble(info[2]);   longititude=Double.parseDouble(info[1]);//   用给定的经纬度生成的三个参数是:Item的位置,标题,文本字段   GeoPoint gp=new GeoPoint((int)(latitude*1E6),(int)(longititude*1E6));   mMapControl.animateTo(gp);   geoList.add(new OverlayItem(gp,title,body));   populate();  }

      @Override  public void draw(Canvas canvas, MapView mapView, boolean shadow) {   // TODO Auto-generated method stub   super.draw(canvas, mapView, shadow);   该方法用于在覆盖层上画图,比如说:画文字,矩形等//   Projection接口用于手机屏幕坐标系统和地球表面坐标系统的转变   Projection projection=mapView.getProjection();   for(int i=size()-1;i>=0;i--){        OverlayItem overlayItem=getItem(i);    String title=overlayItem.getTitle();        String info=overlayItem.getSnippet();    //    把经纬度转换成屏幕左上角像素坐标    android.graphics.Point point=projection.toPixels(overlayItem.getPoint(),null);    Paint paint=new Paint();    paint.setColor(Color.RED);    paint.setTextSize(15);        canvas.drawText(title, point.x, point.y-20, paint);   }  }    @Override  protected OverlayItem createItem(int i) {   // TODO Auto-generated method stub   return geoList.get(i);  }

      @Override  public int size() {   // TODO Auto-generated method stub   return geoList.size();  }   } @Override protected boolean isRouteDisplayed() {  // TODO Auto-generated method stub  return false; } }

     

    配置文件:

     

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

       <view  android:id="@+id/mapview"  class="com.google.android.maps.MapView"  android:layout_width="fill_parent"  android:layout_height="fill_parent"  android:layout_weight="1"  android:apiKey="0tAU5QeoJKd2s65zZI_-OXbmBtMVdhs6DgUWdzg"

    密钥 />         

    </FrameLayout>

     

    清单文件:

     

    必须添加:

    <uses-library android:name="com.google.android.maps"/>

     

     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

     

     

    最新回复(0)