Chinaunix首页 | 论坛 | 博客
  • 博客访问: 376716
  • 博文数量: 214
  • 博客积分: 770
  • 博客等级: 军士长
  • 技术积分: 1969
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-08 01:22
文章分类

全部博文(214)

文章存档

2013年(110)

2012年(104)

我的朋友

分类: 嵌入式

2013-01-02 23:59:48

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

在开始之前,需要在高德官网上相应的jar开发包,下载地址为:


首先介绍下Overlay:

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

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

关键方法:

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

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


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


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


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


 

点击(此处)折叠或打开

  1. [html]
  2. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
  3. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
  4.    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
  5. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
  6.    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
  7. <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
  8. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
  9. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>


 

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

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


[java]


 

点击(此处)折叠或打开

  1. package zjut.tsw.overlay;

  2. import java.util.List;

  3. import android.app.AlertDialog;
  4. import android.content.Context;
  5. import android.graphics.Bitmap;
  6. import android.graphics.BitmapFactory;
  7. import android.graphics.Canvas;
  8. import android.graphics.Paint;
  9. import android.graphics.Point;
  10. import android.os.Bundle;
  11. import android.view.KeyEvent;
  12. import android.widget.Toast;

  13. import com.amap.mapapi.core.GeoPoint;
  14. import com.amap.mapapi.map.MapActivity;
  15. import com.amap.mapapi.map.MapController;
  16. import com.amap.mapapi.map.MapView;
  17. import com.amap.mapapi.map.Overlay;
  18. import com.amap.mapapi.map.Projection;

  19. /**
  20.  * 高德地图示例之Overlay
  21.  *
  22.  * @author tsw
  23.  *
  24.  */
  25. public class MainActivity extends MapActivity {

  26.     private MapView mapView;

  27.     private MapController mController;


  28.     @Override
  29.     public void onCreate(Bundle savedInstanceState) {
  30.         super.onCreate(savedInstanceState);
  31.         setContentView(R.layout.activity_main);

  32.         mapView = (MapView) findViewById(R.id.mapView); // 得到MapView对象

  33.         mapView.setBuiltInZoomControls(true); // 开启缩放控件

  34.         mController = mapView.getController(); // 获取地图控制对象

  35.         mController.setZoom(10); // 设置初始缩放级别

  36.         GeoPoint gp = new GeoPoint((int) (30.227123 * 1E6),
  37.                 (int) (120.040687 * 1E6)); // 定位到浙工大,左参数为纬度,右参数为经度,单位为微度(1度=10^6微度)

  38.         mController.setCenter(gp); // 设置为地图中心

  39.         List<Overlay> list = mapView.getOverlays(); // 获取图层列表

  40.         DemoOverlay demo = new DemoOverlay(this); // 新建自定义Overlay

  41.         list.add(demo); // 往列表添加自定义图层
  42.     }

  43.     public class DemoOverlay extends Overlay {

  44.         Context mContext; // 上下文

  45.         public DemoOverlay() {
  46.             super();
  47.         }

  48.         public DemoOverlay(Context c) {
  49.             this();
  50.             mContext = c;
  51.         }

  52.         @Override
  53.         public void draw(Canvas canvas, MapView mapView, boolean shadow) {

  54.             Projection proj = mapView.getProjection(); // 获取投影对象
  55.             Point mPoint = new Point();
  56.             GeoPoint gp = new GeoPoint((int) (30.227123 * 1E6),
  57.                     (int) (120.040687 * 1E6));
  58.             proj.toPixels(gp, mPoint); // 将经纬度转换成手机屏幕上的像素,存储在Point对象中
  59.             Paint mPaint = new Paint();
  60.             // mPaint.setColor(Color.RED); //设置为红色
  61.             Bitmap pic = BitmapFactory.decodeResource(getResources(),
  62.                     R.drawable.da_marker_red); // 得到Bitmap对象

  63.             canvas.drawBitmap(pic, mPoint.x, mPoint.y, mPaint); // 绘图
  64.             super.draw(canvas, mapView, shadow);
  65.         }

  66.         @Override
  67.         public boolean onTap(GeoPoint gp, MapView mapView) {
  68.             new AlertDialog.Builder(mContext)
  69.                     .setTitle("详情信息")
  70.                     .setMessage(
  71.                             "当前纬度为:" + gp.getLatitudeE6() * 1.0 / (1E6)
  72.                                     + "\n经度为:" + gp.getLongitudeE6() * 1.0
  73.                                     / (1E6)).setPositiveButton("确定", null)
  74.                     .create().show();
  75.             return super.onTap(gp, mapView);
  76.         }

  77.     }


  78. }



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


[html] 


 

点击(此处)折叠或打开

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



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

                

阅读(2415) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~