Android引路蜂地图开发包

在正式介绍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对应的序列号。

view plaincopy to clipboardprint?
LicenceManager licenceManager = LicenceManager 
                    .getInstance(inputStream); 
            long keys[] = { 0x41c0df1c118b1831L, 0x21884a37bde642bcL, 
                    0x15c4d489531ac173L, 0x5f9e69136c1e3268L, 
                    -0x3adaa84e455c5acL, 0x2095f679b184dbdfL, }; 
            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的详细定义如下
  
view plaincopy to clipboardprint?
public class AndroidGISEngineApplication extends Application { 
 
    @Override 
    public void onCreate() { 
        PreferenceManager.setDefaultValues(this, R.xml.default_values, false); 
        try { 
            InputStream inputStream = getResources().openRawResource( 
                    R.raw.guidebee); 
            LicenceManager licenceManager = LicenceManager 
                    .getInstance(inputStream); 
            long keys[] = { 0x41c0df1c118b1831L, 0x21884a37bde642bcL, 
                    0x15c4d489531ac173L, 0x5f9e69136c1e3268L, 
                    -0x3adaa84e455c5acL, 0x2095f679b184dbdfL, }; 
            licenceManager.addLicence("GuidebeeMap_JavaSE", keys); 
            MapConfiguration.setParameter(MapConfiguration.IS_CACHE_ON, true); 
            MapConfiguration.setParameter( 
                    MapConfiguration.WORKER_THREAD_NUMBER, 4); 
            MapConfiguration.setParameter( 
                    MapConfiguration.IGNORE_MAP_TYPE_FOR_STORED_MAP, false); 
            MapLayer.setAbstractGraphicsFactory(AndroidGraphicsFactory 
                    .getInstance()); 
            inputStream.close(); 
            SharedMapInstance.mapImage = MapLayer.getAbstractGraphicsFactory() 
                    .createImage(512, 512); 
            SharedMapInstance.mapGraphics = SharedMapInstance.mapImage 
                    .getGraphics(); 
            SharedMapInstance.mapTileDownloadManager = new MapTileDownloadManager( 
                    SharedMapInstance.readListener); 
 
            try { 
                SharedMapInstance.map = new RasterMap(1024, 1024, 
                        SharedMapInstance.mapTileDownloadManager); 
            } catch (InvalidLicenceException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
            } 
 
            SharedMapInstance.map.setViewSize(512,512); 
            SharedMapInstance.mapTileDownloadManager.start(); 
 
        } catch (Exception e) { 
 
        } 
    } 
 
    @Override 
    public void onTerminate() { 
        if (SharedMapInstance.mapTileDownloadManager != null) { 
            SharedMapInstance.mapTileDownloadManager.stop(); 
        } 
    } 

 
 
  7-14   行   设置license信息。

  15-19 行   对地图进行配置。可以配置是否使用缓存,工作线程数目,工作线程数目指可以同时下载地图图片的线程数目。

  20      行   将Android平台的Gis.Drawing实现连接到地图开发库。

  23-39 行   初始化地图对象。mapImage ,mapGraphics是用来显示地图的Bitmap对象,GuidebeeMapView最终在屏幕上显示这个Bitmap对象。一般 mapImage 大小需要大于屏幕上显示区域。由于Android手机可以响应屏幕转动,为避免每次需从新设置mapImage ,可以将mapImage 大小设置成比手机屏幕长边大些。以256倍数为优。一般setViewSize可以设成和mapImage 大小一致。而RasterMap本身可以设成比mapImage大些,从而可以提高地图响应性能,以mapImage 的两倍到三倍为好。越大需要的内存越大,在开发过程要综合考虑性能和内存的关系。 RasterMap大小>mapImage大小>=屏幕显示区域大小。
7. GuidebeeMapView 的Layout很简单,如下所示
 
view plaincopy to clipboardprint?
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
  <com.pstreets.gisengine.GuidebeeMapView  
     android:id="@+id/guidebeemap_view" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 
     
</LinearLayout> 

  
  GuidebeeMapView类定义如下:

view plaincopy to clipboardprint?
package com.pstreets.gisengine; 
 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 
 
import com.mapdigit.gis.raster.IMapDrawingListener; 
import com.mapdigit.gis.raster.IReaderListener; 
 
public class GuidebeeMapView extends View implements IReaderListener, 
        IMapDrawingListener { 
 
     
    Paint p = new Paint(); 
    boolean isPan = false; 
    private float oldX = -1; 
    private float oldY = -1; 
 
    public boolean onTouchEvent(MotionEvent event) { 
        int action = event.getAction(); 
        switch (action) { 
        case MotionEvent.ACTION_DOWN: 
            oldX = event.getRawX(); 
            oldY = event.getRawY(); 
            isPan = true; 
            break; 
        case MotionEvent.ACTION_UP: 
            oldX = event.getRawX(); 
            oldY = event.getRawY(); 
            isPan = false; 
            break; 
        case MotionEvent.ACTION_MOVE: 
            if (isPan) { 
                panMap(event.getRawX(), event.getRawY()); 
                oldX = event.getRawX(); 
                oldY = event.getRawY(); 
            } 
            break; 
        } 
        return true; 
    } 
 
    private void panMap(float x, float y) { 
        float dx = x - oldX; 
        float dy = y - oldY; 
        if (!(dx == 0 && dy == 0)) 
            SharedMapInstance.map.panDirection((int) dx, (int) dy); 
 
    } 
 
    final Runnable updateMapCanvas = new Runnable() { 
        public void run() { 
            invalidate(); 
        } 
    }; 
 
    public GuidebeeMapView(Context context, AttributeSet attrs, int defStyle) { 
        super(context, attrs, defStyle); 
        initGuidebeeMap(); 
 
    } 
 
    public GuidebeeMapView(Context context, AttributeSet attrs) { 
        super(context, attrs); 
        initGuidebeeMap(); 
 
    } 
 
    public GuidebeeMapView(Context context) { 
        super(context); 
        initGuidebeeMap(); 
 
    } 
 
     
    public void onDraw(Canvas canvas) { 
        super.onDraw(canvas); 
 
        Bitmap bitmap = (Bitmap) SharedMapInstance.mapImage.getNativeImage(); 
        int mapWidth=SharedMapInstance.mapImage.getWidth(); 
        int mapHeight=SharedMapInstance.mapImage.getHeight(); 
        int screenWidth=getWidth(); 
        int screenHeight=getHeight(); 
        canvas.drawBitmap(bitmap, (screenWidth-mapWidth)/2,  (screenHeight-mapHeight)/2, p); 
    } 
 
    private void initGuidebeeMap() { 
 
 
        SharedMapInstance.map.setMapDrawingListener(this); 
        SharedMapInstance.readListener=this; 
         
    } 
 
 
      
 
    @Override 
    public void readProgress(int bytes, int total) { 
        System.out.println(bytes); 
 
    } 
 
    @Override 
    public void done() { 
        SharedMapInstance.map.paint(SharedMapInstance.mapGraphics); 
 
        post(updateMapCanvas); 
 
    } 
 
 


SharedMapInstance 定义如下:

view plaincopy to clipboardprint?
package com.pstreets.gisengine; 
 
import com.mapdigit.gis.drawing.IGraphics; 
import com.mapdigit.gis.drawing.IImage; 
import com.mapdigit.gis.raster.IReaderListener; 
import com.mapdigit.gis.raster.MapTileDownloadManager; 
import com.mapdigit.gis.raster.RasterMap; 
 
public abstract class SharedMapInstance { 
 
    public static RasterMap map; 
    public static IImage mapImage; 
    public static IGraphics mapGraphics; 
    public static MapTileDownloadManager mapTileDownloadManager; 
    public static IReaderListener readListener; 
 


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜡台

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值