您的位置:首页 > 移动开发 > Android开发

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

2012-11-01 14:08 507 查看


做过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)
 处理一个“点击”事件。

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

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

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

<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类的实现类:

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) {
new AlertDialog.Builder(mContext)
.setTitle("详情信息")
.setMessage(
"当前纬度为:" + gp.getLatitudeE6() * 1.0 / (1E6)
+ "\n经度为:" + gp.getLongitudeE6() * 1.0
/ (1E6)).setPositiveButton("确定", null)
.create().show();
return super.onTap(gp, mapView);
}

}

}


布局文件里需添加Map标签:

<com.amap.mapapi.map.MapView
android:id="@+id/mapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />


图片资源放在drawable文件夹里.

                 


具体项目源文件在:http://download.csdn.net/detail/czjuttsw/4710762
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: