当前位置:操作系统 > 安卓/Android >>

Android地图开发之Overlay应用(高德)

 

做过Android地图应用开发的人员都知道,现在流行的地图框架不外乎是Google,百度以及高德地图。

对于Google和百度的地图开发,首先需要获得一个API KEY,然后才能被授权开发应用。而高德地图则不用这么麻烦。因此,本篇采用高德地图来开发一个简单的DEMO。


在开始之前,需要在高德官网上下载相应的jar开发包,下载地址为:http://api.amap.com/Android/download


首先介绍下Overlay:

Overlay是一个基类,它表示可以覆盖在地图上方显示的overlay。添加一个overlay时,从这个基类派生出一个子类,创建一个实例,然后把它加入到一个列表中。 这个列表通过调用getOverlays()得到。 为了允许用户触摸去对齐一个点,子类应当实现Overlay.Snappable接口。

构造方法只有一个,Overlay()   --->空构造方法

关键方法:

draw(android.graphics.Canvas canvas, MapView mapView, boolean shadow) ,负责在地图上绘画

onTap(GeoPoint p, MapView mapView) 处理一个“点击”事件。


下面利用这两个方法做一个小小的应用。在地图上某个点绘制一个图像。处理点击事件,弹出一个对话框,显示点击的经纬度。


具体信息在代码的注释里:


首先是在清单里添加相应的权限:


[html] 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> 
   <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> 

然后是往项目里添加下载的Map开发包(右键项目->properties->Java Build Path->Libraries->Add external Jars->定位到你的Map开发包)

接下来是核心继承自MapActivity类的实现类:


[java]
package zjut.tsw.overlay; 
 
import java.util.List; 
 
import android.app.AlertDialog; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.Point; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.widget.Toast; 
 
import com.amap.mapapi.core.GeoPoint; 
import com.amap.mapapi.map.MapActivity; 
import com.amap.mapapi.map.MapController; 
import com.amap.mapapi.map.MapView; 
import com.amap.mapapi.map.Overlay; 
import com.amap.mapapi.map.Projection; 
 
/**
 * 高德地图示例之Overlay
 * 
 * @author tsw
 * 
 */ 
public class MainActivity extends MapActivity { 
 
    private MapView mapView; 
 
    private MapController mController; 
 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
 
        mapView = (MapView) findViewById(R.id.mapView); // 得到MapView对象 
 
        mapView.setBuiltInZoomControls(true); // 开启缩放控件 
 
        mController = mapView.getController(); // 获取地图控制对象 
 
        mController.setZoom(10); // 设置初始缩放级别 
 
        GeoPoint gp = new GeoPoint((int) (30.227123 * 1E6), 
                (int) (120.040687 * 1E6)); // 定位到浙工大,左参数为纬度,右参数为经度,单位为微度(1度=10^6微度) 
 
        mController.setCenter(gp); // 设置为地图中心 
 
        List<Overlay> list = mapView.getOverlays(); // 获取图层列表 
 
        DemoOverlay demo = new DemoOverlay(this); // 新建自定义Overlay 
 
        list.add(demo); // 往列表添加自定义图层 
    } 
 
    public class DemoOverlay extends Overlay { 
 
        Context mContext; // 上下文 
 
        public DemoOverlay() { 
            super(); 
        } 
 
        public DemoOverlay(Context c) { 
            this(); 
            mContext = c; 
        } 
 
        @Override 
        public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
 
            Projection proj = mapView.getProjection(); // 获取投影对象 
            Point mPoint = new Point(); 
            GeoPoint gp = new GeoPoint((int) (30.227123 * 1E6), 
                    (int) (120.040687 * 1E6)); 
            proj.toPixels(gp, mPoint); // 将经纬度转换成手机屏幕上的像素,存储在Point对象中 
            Paint mPaint = new Paint(); 
            // mPaint.setColor(Color.RED); //设置为红色 
            Bitmap pic = BitmapFactory.decodeResource(getResources(), 
                    R.drawable.da_marker_red); // 得到Bitmap对象 
 
            canvas.drawBitmap(pic, mPoint.x, mPoint.y, mPaint); // 绘图 
            super.draw(canvas, mapView, shadow); 
        } 
 
        @Override 
        public boolean onTap(GeoPoint gp, MapView mapView) { 
       

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,