Android引路蜂地图开发示例:基本知识

jerry 地图开发 2015年11月26日 收藏

在正式介绍Android引路蜂地图开发包示例前,有必要先对一些通用的知识进行说明。
1.首先是开放环境。Android 推荐的开发环境是Eclipse,我们的例子也就以Eclipse作为开发IDE。
2.添加Android引路蜂地图开发包库。打开Android属性窗口,添加External JARs。把libgisengine.jar 添加到项目中,如下图所示。

一般可以把libgisengine.jar放在项目的lib 子目录下。

3. 设置license文件。引路蜂地图开发包需要有正确的license文件才能正常运行。license分两部分,一个是guidebee.lic ,一般复制到res aw目录下。

license的另一部分,需在代码中设置与guidebee.lic对应的序列号。

  1. InputStream inputStream = getResources().openRawResource(
  2.      R.raw.guidebee);
  3.    LicenceManager licenceManager = LicenceManager
  4.      .getInstance(inputStream);
  5.    long keys[] = { 0x41c0df1c118b1831L, 0x21884a37bde642bcL,
  6.      0x15c4d489531ac173L, 0x5f9e69136c1e3268L,
  7.      -0x3adaa84e455c5acL, 0x2095f679b184dbdfL, };
  8.    licenceManager.addLicence("GuidebeeMap_JavaSE", keys);

4. 缺省的gis.drawing实现。libgisengine.jar 可以同时用于android和Java SE平台开发。android和Java SE平台用来绘图的API不尽相同。
   引路蜂地图开发包示例对不同平台的Graphics进行了抽象。从而可以让同一个库用于不同平台。
   在Android平台上,随libgisengine.jar一起使用的还有 AndroidGraphicsFactory.java ,AndroidGraphics.java, AndroidFont.java,AndroidImage.java .这几个类是以源码提供的,是在Android平台上对gis.drawing接口定义的缺省实现。开发人员也可以自行修改并添加到自己的地图项目中。

5. 项目AndroidGISEngineTutorial,所有的例子都在项目AndroidGISEngineTutorial中。这里对几个共用的类进行一些说明。
    在包com.pstreets.gisengine定义了
 AndroidGISEngineApplication 程序应用类,在这里对license进行了设置,并定义了一些全局共享对象,如RasterMap等,license和RasterMap就所有实例共有的,并且只需要实例化一次。所以在AndroidGISEngineApplication 中进行初始化。
    AndroidGISEngineTutorial 为实例的起始Activity,为ListActivity的子类,列出了所有其它实例。这个类基本借用了Android SDK中ApiDemos的代码。
   GuidebeeMapView 为地图显示类。为View的子类,前文说过引路蜂地图开发包中RasterMap是一个“智能地图”图像。可以将地图放在任何可以显示Image的地方。GuidebeeMapView主要重载了public void onDraw(Canvas canvas),用于显示地图。在开发中,也可以使用其它方法来显示地图,比如按钮上,ImageView上,SurfaceView 等, GuidebeeMapView也响应TouchEvent用于平移地图。在实际应用中也可以定义不同的Gester来放大,缩小,移动地图,这些都可以由开发人员自己定制。需要注意的引路蜂地图开发包内部是多线程实现,在UI线程之外调用UI线程方法要使用合适的方法。GuidebeeMapView中使用post来发消息个UI线程以更新地图。
  SharedMapInstance 定义了一些共享类对象。为所有实例公用。

6. AndroidGISEngineApplication定义
   AndroidGISEngineApplication的详细定义如下

  1. //------------------------------------------------------------------------------
  2. //                         COPYRIGHT 2011 GUIDEBEE
  3. //                           ALL RIGHTS RESERVED.
  4. //                     GUIDEBEE CONFIDENTIAL PROPRIETARY
  5. ///////////////////////////////////// REVISIONS ////////////////////////////////
  6. // Date       Name                 Tracking #         Description
  7. // ---------  -------------------  ----------         --------------------------
  8. //22JAN2011  James Shen                              Initial Creation
  9. ////////////////////////////////////////////////////////////////////////////////
  10. //--------------------------------- PACKAGE ------------------------------------
  11. package com.pstreets.gisengine;
  12.  
  13. //--------------------------------- IMPORTS ------------------------------------
  14. import java.io.InputStream;
  15.  
  16. import android.app.Application;
  17. import android.preference.PreferenceManager;
  18.  
  19. import com.mapdigit.gis.MapLayer;
  20. import com.mapdigit.gis.raster.MapConfiguration;
  21. import com.mapdigit.gis.raster.MapTileDownloadManager;
  22. import com.mapdigit.gis.raster.RasterMap;
  23. import com.mapdigit.licence.InvalidLicenceException;
  24. import com.mapdigit.licence.LicenceManager;
  25. import com.pstreets.gisengine.drawing.AndroidGraphicsFactory;
  26.  
  27. //[------------------------------ MAIN CLASS ----------------------------------]
  28. //--------------------------------- REVISIONS ----------------------------------
  29. //Date       Name                 Tracking #         Description
  30. //--------   -------------------  -------------      --------------------------
  31. //22JAN2011  James Shen                              Initial Creation
  32. ////////////////////////////////////////////////////////////////////////////////
  33. /**
  34.  * GIS Engine tutorial application. Just feed the licence info.
  35.  * <hr>
  36.  * <b>&copy; Copyright 2011 Guidebee, Inc. All Rights Reserved.</b>
  37.  *
  38.  * @version 1.00, 22/01/11
  39.  * @author Guidebee Pty Ltd.
  40.  */
  41. public class AndroidGISEngineApplication extends Application {
  42.  
  43.  @Override
  44.  public void onCreate() {
  45.   PreferenceManager.setDefaultValues(this, R.xml.default_values, false);
  46.   try {
  47.    InputStream inputStream = getResources().openRawResource(
  48.      R.raw.guidebee);
  49.    LicenceManager licenceManager = LicenceManager
  50.      .getInstance(inputStream);
  51.    long keys[] = { 0x41c0df1c118b1831L, 0x21884a37bde642bcL,
  52.      0x15c4d489531ac173L, 0x5f9e69136c1e3268L,
  53.      -0x3adaa84e455c5acL, 0x2095f679b184dbdfL, };
  54.    licenceManager.addLicence("GuidebeeMap_JavaSE", keys);
  55.    MapConfiguration.setParameter(MapConfiguration.IS_CACHE_ON, true);
  56.    MapConfiguration.setParameter(
  57.      MapConfiguration.WORKER_THREAD_NUMBER, 4);
  58.    MapConfiguration.setParameter(
  59.      MapConfiguration.IGNORE_MAP_TYPE_FOR_STORED_MAP, false);
  60.    MapLayer.setAbstractGraphicsFactory(AndroidGraphicsFactory
  61.      .getInstance());
  62.    inputStream.close();
  63.    SharedMapInstance.mapImage = MapLayer.getAbstractGraphicsFactory()
  64.      .createImage(512, 512);
  65.    SharedMapInstance.mapGraphics = SharedMapInstance.mapImage
  66.      .getGraphics();
  67.    SharedMapInstance.mapTileDownloadManager
  68.           = new MapTileDownloadManager();
  69.  
  70.    try {
  71.     SharedMapInstance.map = new RasterMap(1024, 1024,
  72.       SharedMapInstance.mapTileDownloadManager);
  73.    } catch (InvalidLicenceException e) {
  74.     // TODO Auto-generated catch block
  75.     e.printStackTrace();
  76.    }
  77.  
  78.    SharedMapInstance.map.setViewSize(512,512);
  79.    SharedMapInstance.mapTileDownloadManager.start();
  80.  
  81.   } catch (Exception e) {
  82.  
  83.   }
  84.  }
  85.  
  86.  @Override
  87.  public void onTerminate() {
  88.   if (SharedMapInstance.mapTileDownloadManager != null) {
  89.    SharedMapInstance.mapTileDownloadManager.stop();
  90.   }
  91.  }
  92. }

 47-54   行   设置license信息。
 55-59   行   对地图进行配置。可以配置是否使用缓存,工作线程数目,工作线程数目指可以同时下载地图图片的线程数目。
 60      行   将Android平台的Gis.Drawing实现连接到地图开发库。
 63-79   行   初始化地图对象。mapImage ,mapGraphics是用来显示地图的Bitmap对象,GuidebeeMapView最终在屏幕上显示这个Bitmap对象。一般mapImage 大小需要大于屏幕上显示区域。由于Android手机可以响应屏幕转动,为避免每次需从新设置mapImage ,可以将mapImage 大小设置成比手机屏幕长边大些。以256倍数为优。一般setViewSize可以设成和mapImage 大小一致。而RasterMap本身可以设成比mapImage大些,从而可以提高地图响应性能,以mapImage 的两倍到三倍为好。越大需要的内存越大,在开发过程要综合考虑性能和内存的关系。 RasterMap大小>mapImage大小>=屏幕显示区域大小。
7. GuidebeeMapView 的Layout很简单,如下所示

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android=http://schemas.android.com/apk/res/android
  3.     android:orientation="vertical"
  4.     android:layout_width="fill_parent"
  5.     android:layout_height="fill_parent"
  6.     >
  7.   <com.pstreets.gisengine.GuidebeeMapView
  8.      android:id="@+id/guidebeemap_view"
  9.      android:layout_width="fill_parent"
  10.      android:layout_height="fill_parent" />
  11.   
  12. </LinearLayout>

GuidebeeMapView类定义如下:

  1. package com.pstreets.gisengine;
  2.  
  3. import android.content.Context;
  4. import android.graphics.Bitmap;
  5. import android.graphics.Canvas;
  6. import android.graphics.Paint;
  7. import android.util.AttributeSet;
  8. import android.view.MotionEvent;
  9. import android.view.View;
  10.  
  11. import com.mapdigit.gis.raster.IMapDrawingListener;
  12. import com.mapdigit.gis.raster.IReaderListener;
  13.  
  14. public class GuidebeeMapView extends View implements IReaderListener,
  15.   IMapDrawingListener {
  16.  
  17.  
  18.  Paint p = new Paint();
  19.  boolean isPan = false;
  20.  private float oldX = -1;
  21.  private float oldY = -1;
  22.  
  23.  public boolean onTouchEvent(MotionEvent event) {
  24.   int action = event.getAction();
  25.   switch (action) {
  26.   case MotionEvent.ACTION_DOWN:
  27.    oldX = event.getRawX();
  28.    oldY = event.getRawY();
  29.    isPan = true;
  30.    break;
  31.   case MotionEvent.ACTION_UP:
  32.    oldX = event.getRawX();
  33.    oldY = event.getRawY();
  34.    isPan = false;
  35.    break;
  36.   case MotionEvent.ACTION_MOVE:
  37.    if (isPan) {
  38.     panMap(event.getRawX(), event.getRawY());
  39.     oldX = event.getRawX();
  40.     oldY = event.getRawY();
  41.    }
  42.    break;
  43.   }
  44.   return true;
  45.  }
  46.  
  47.  private void panMap(float x, float y) {
  48.   float dx = x - oldX;
  49.   float dy = y - oldY;
  50.   if (!(dx == 0 && dy == 0))
  51.    SharedMapInstance.map.panDirection((int) dx, (int) dy);
  52.  
  53.  }
  54.  
  55.  final Runnable updateMapCanvas = new Runnable() {
  56.   public void run() {
  57.    invalidate();
  58.   }
  59.  };
  60.  
  61.  public GuidebeeMapView(Context context, AttributeSet attrs, int defStyle) {
  62.   super(context, attrs, defStyle);
  63.   initGuidebeeMap();
  64.  
  65.  }
  66.  
  67.  public GuidebeeMapView(Context context, AttributeSet attrs) {
  68.   super(context, attrs);
  69.   initGuidebeeMap();
  70.  
  71.  }
  72.  
  73.  public GuidebeeMapView(Context context) {
  74.   super(context);
  75.   initGuidebeeMap();
  76.  
  77.  }
  78.  
  79.  
  80.  public void onDraw(Canvas canvas) {
  81.   super.onDraw(canvas);
  82.  
  83.   Bitmap bitmap = (Bitmap) SharedMapInstance.mapImage.getNativeImage();
  84.   int mapWidth=SharedMapInstance.mapImage.getWidth();
  85.   int mapHeight=SharedMapInstance.mapImage.getHeight();
  86.   int screenWidth=getWidth();
  87.   int screenHeight=getHeight();
  88.   canvas.drawBitmap(bitmap, (screenWidth-mapWidth)/2,  (screenHeight-mapHeight)/2, p);
  89.  }
  90.  
  91.  private void initGuidebeeMap() {
  92.   SharedMapInstance.map.setMapDrawingListener(this);
  93.   SharedMapInstance.mapTileDownloadManager.setReaderListener(this);
  94.   
  95.  }
  96.  
  97.  
  98.  @Override
  99.  public void readProgress(int bytes, int total) {
  100.   //System.out.println(bytes);
  101.  
  102.  }
  103.  
  104.  @Override
  105.  public void done() {
  106.   SharedMapInstance.map.paint(SharedMapInstance.mapGraphics);
  107.  
  108.   post(updateMapCanvas);
  109.  
  110.  }
  111. }

94 ,95 添加事件处理函数。
其中 SharedMapInstance.mapTileDownloadManager.setReaderListener(this) 用于监视下载进度。
 public void readProgress(int bytes, int total)  bytes是下载字节数,total 为该此下载总字节数(可能为0,0表示总长事先未知)
SharedMapInstance.map.setMapDrawingListener(this); 监视图片下载进度。public void done() 表示单个地图图片下载完成。一般在该事件处理中的屏幕上刷新地图。
8. 引路蜂地图开发包对Android平台依赖性不大,可以用于Android各个版本。例子以目前的最低版本1.5为例,可以运行于1.5以上各个平台。
9. 为和Google MapView 有所区别,例子将以Bing中国地图为例,要改成Google地图,只需将例子中地图类型从MapType.MICROSOFTCHINA 改成 MapType.GOOGLECHINA