Facebook Twitter LinkedIn E-mail
magnify
Home Posts tagged "地图开发包"

关于Android引路蜂地图应用源码的简单说明

前面完整的Android引路蜂地图应用源码下载 提供了源码下载,这里对这个项目做个简单的说明以方便阅读。

整个应用代码量在4000行左右,不算很大,下面是对代码中主要Package的说明:

文件名 空行 注释 代码行 说明
AboutActivity.java 13 4 47 关于软件说明
app\GNavigatorApplication.java 27 23 93 主应用类
app\SessionInfo.java 9 3 11 保持一些全局变量
app\SharedMapInstance.java 13 38 18 保存RasterMap类实例
app\SharedSearchResults.java 12 0 22 保存查询结果
database\DatabaseAssistant.java 42 63 122 用于数据库访问,用来管理设备,这部分可以不看
database\DBAdapter.java 27 126 77
database\DBMapper.java 4 38 7
database\DeviceDBMapper.java 20 86 130
database\DeviceLocationHistoryDBMapper.java 19 56 60
database\PersistentFacade.java 28 168 67
dataobject\Device.java 14 0 15 设备定义,设备命令,这部分可以不看
dataobject\DeviceCommand.java 7 0 17
dataobject\DeviceLocationHistory.java 5 0 7
device\AddDeviceActivity.java 14 1 70 软件可以用来跟踪其他设备或者报告设备当前位置,这部分可以不看
device\DeviceCommandListActivity.java 39 4 202
device\DeviceControlTabActivity.java 16 1 80
device\DeviceInfoActivity.java 8 1 49
device\DeviceLocationHistoryListActivity.java 19 1 81
device\ManageDeviceListActivity.java 44 4 208
drawing\AndroidFont.java 9 27 17 和Android平台相关的引路蜂图形接口实现
drawing\AndroidGraphics.java 20 150 57
drawing\AndroidGraphicsFactory.java 10 83 23
drawing\AndroidImage.java 20 114 65
gis\FileMapTiledZone.java 17 23 43 用来访问离线地图文件
GNavigatorActivity.java 82 31 516 主Activity
GuidebeeMapView.java 52 25 301 地图View,可以自定义并扩展,支持Gesture缩放等
location\LocationService.java 54 55 90 GPS服务
mapmode\MapModeListActivity.java 16 11 50 选项地图模式界面
routing\RouteDetailActivity.java 52 34 274 显示详细路径
routing\RoutingActivity.java 26 1 159 路径查询界面
search\SearchResultListActivity.java 41 25 246 查询结果
search\SearchSuggestionProvider.java 2 0 9 查询提示
settings\SettingsActivity.java 19 26 86 软件设置界面
sms\DeviceMessage.java 4 0 5 控制设备的短消息处理,这部分可以不看
sms\DeviceMessageCenter.java 7 0 18
sms\DeviceMessageProcessor.java 45 1 209
sms\SmsMessageReceiver.java 13 15 28
ToolbarButton.java 36 1 259 工具条自定义View

其中和Device相关的部分,包database, dataobject, device, sms 部分可以跳过不需要看,这部分和地图API使用关系不大,主要用来监视GPS设备或其它手机的位置。

drawing 包实现了地图API中和图形系统相关接口的Android平台上实现 ,引路蜂地图开发包中Gis.Drawing 类定义了几个抽象类或接口,对不同平台的图形系统进行了抽象。这些绘图的接口不同,如果在引路蜂地图开发包直接引用这些类方法,这样不同平台就会需要编译不同的开发包。通过抽象处理,引路蜂地图开发包并直接调用平台相关的图形类方法。而是通过 开发包 + 平台相关图形系统实现的方法,就可以实现跨平台.具体可以参见图形子系统

GuidebeeMapView 主要用来显示地图,这个给出的是一个参考实现,支持触摸屏平移,事件你可以把地图放在任何可以显示Image对象的控件上,添加你自己的Logo,支持MultiTouch 缩放等,本身是个自定义View (为View的子类),你可以自由扩展其功能。

FileMapTiledZone 用来支持从文件读取离线地图,这部分代码可以不需修改应用到你自己编写的引路蜂地图应用中。

应用程序框架基于RoboGuice 以简化代码,关于RoboGuice的使用可以参见本博客 的Android RoboGuice 使用指南

搜索使用Android平台的Search Framework。可以参见

App/Search/Invoke Search
App/Search/Query Search Results

再看一下项目的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.pstreets.navigator"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="4" />

    <application
        android:name=".app.GNavigatorApplication"
        android:icon="@drawable/navigator"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.Black.NoTitleBar" >
        <activity android:name=".GNavigatorActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <meta-data
                android:name="android.app.default_searchable"
                android:value=".search.SearchResultListActivity" />
        </activity>
        <activity
            android:name=".search.SearchResultListActivity"
            android:launchMode="singleTop" >
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

            <meta-data
                android:name="android.app.searchable"
                android:resource="@xml/searchable" />
        </activity>
        <activity
            android:name=".AboutActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".mapmode.MapModeListActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".routing.RoutingActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".routing.RouteDetailActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".device.ManageDeviceListActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".device.AddDeviceActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".device.DeviceControlTabActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".device.DeviceCommandListActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".device.DeviceInfoActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".device.DeviceLocationHistoryListActivity"
            android:launchMode="singleTop" >
        </activity>
        <activity
            android:name=".settings.SettingsActivity"
            android:launchMode="singleTop" >
        </activity>

        <receiver
            android:name=".sms.SmsMessageReceiver"
            android:enabled="true" >
            <intent-filter android:priority="1000" >
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

        <provider
            android:name=".search.SearchSuggestionProvider"
            android:authorities="com.pstreets.navigator.search.SearchSuggestionProvider" />
    </application>

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_OWNER_DATA" />
    <uses-permission android:name="android.permission.WRITE_OWNER_DATA" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

</manifest>

使用的permission 需要有INTERNET(地图API需要访问网络) ,WRITE_EXTERNAL_STORAGE (离线地图需要访问SD卡)其它权限可以根据需要添加。
最后看一下软件的项目目录结构:

项目引用三个库,其中libgisengine.jar 为引路蜂地图API,其它两个为roboguice 库。 支持中英文两种资源 values-zh-rCN 为中文string 资源。

 

完整的Android引路蜂地图应用源码下载

这里提供一个比较完整的引路蜂地图Android应用源码下载,基本涵盖了引路蜂地图API的所有功能,包括离线地图,路径查询,地址查询,地图模式选择等。

设备上在Galaxy Nexus 和 Nexus S ,Nexus 7 Tablet 测试通过,可以做为你学习或开发引路蜂地图应用的参考。

完整的Android引路蜂地图应用源码 下载

主界面

搜索 ,包括: 地址查询, 本地查询,IP地图查询,经纬度查询

查询结果显示

路径查询

路径地图显示

地图模式:支持多种地图模式,并可以支持自定义地图

地址反编码

关于离线地图

应用缺省读取所有存放在SD卡guidebee 目录下所有 .map 文件,代码如下:

MapTileStreamReader streamReader = SharedMapInstance.mapTileDownloadManager
					.getInteralMapTileStreamReader();

	SharedMapInstance.worldMapFileStream = getResources()
			.openRawResource(R.raw.world);
	MapTiledZone worldmapZone = new MapTiledZone(new DataInputStream(
			SharedMapInstance.worldMapFileStream));
	streamReader.addZone(worldmapZone);
	try {
		File sdcardDir = Environment.getExternalStorageDirectory();
		File guidebeeDir = new File(sdcardDir, "guidebee");
		if (guidebeeDir.exists()) {
			FilenameFilter filter = new FilenameFilter() {
				public boolean accept(File dir, String filename) {
					if (filename.endsWith(".map")) {
						return true;
					}
					return false;

				}
			};

			String[] allMapfiles = guidebeeDir.list(filter);
			String path = guidebeeDir.getAbsolutePath();
			if (allMapfiles != null) {
				for (int i = 0; i < allMapfiles.length; i++) {

					FileMapTiledZone mapTileZone = new FileMapTiledZone(
							path + File.separator + allMapfiles[i],
							false);
					Log.p(allMapfiles[i]);
					streamReader.addZone(mapTileZone);
				}

			}
		}

	} catch (Exception e) {

	}finally{
		streamReader.open();
	}

} catch (Exception e) {

}

你也可以根据你自己的需求放在其它目录下,记得要更改代码中对应的路径。

GPS支持,应用也提供了GPS支持,可以显示当前位置

关于软件使用许可,源码中包含试用许可

地图上会随机显示“Guidebee” 水印。正式版去除水印,关于正式版可以参见版本说明。

离线地图下载可以参见 离线地图工具 和离线地图下载 ,你可以通过离线地图工具自己制作离线地图,或是从本网站下载。

软件采用RoboGuice ,关于RoboGuice可以参见

Android RoboGuice 使用指南

  1. Android RoboGuice 使用指南(1):概述
  2. Android RoboGuice 使用指南(2):第一个例子Hello World
  3. Android RoboGuice 使用指南(3):Bindings 概述
  4. Android RoboGuice 使用指南(4):Linked Bindings
  5. Android RoboGuice 使用指南(5):Binding Annotations
  6. Android RoboGuice 使用指南(6):Instance Bindings
  7. Android RoboGuice 使用指南(7):@Provides Methods
  8. Android RoboGuice 使用指南(8):Provider Bindings
  9. Android RoboGuice 使用指南(9):Untargetted Bindings
  10. Android RoboGuice 使用指南(10):Just-in-time Bindings
  11. Android RoboGuice 使用指南(11):Scopes
  12. Android RoboGuice 使用指南(12):如何绑定generic类型
  13. Android RoboGuice 使用指南(13):RoboGuice 功能描述
  14. Android RoboGuice 使用指南(14):Inject View
  15. Android RoboGuice 使用指南(15):Inject Context
  16. Android RoboGuice 使用指南(16):Standard Injection
  17. Android RoboGuice 使用指南(17):Inject Extra
  18. Android RoboGuice 使用指南(18):Inject Resources
  19. Android RoboGuice 使用指南(19):发送接收Events
  20. Android RoboGuice2 使用指南(1): 概述
  21. Android RoboGuice2 使用指南(2): 第一个例子Hello World
  22. Android RoboGuice2 使用指南(3): Inject 自定义View
  23. Android RoboGuice2 使用指南(4): 综合示例Astroboy

完整的Android引路蜂地图应用源码 下载

 

新版离线地图工具下载

基本使用方法参见离线地图生成工具使用方法

  • 支持下载1-23 级地图。
  • 允许指定下载文件名。
  • 性能大幅提高> 50 倍。

 

离线工具下载 http://www.guidebee.info/download/tools/downloader.msi 安装版
http://www.guidebee.info/download/tools/MapTileDownloader.rar 绿色版
离线工具需要.Net Framework Runtime,如果您的计算机上未安装,请下载安装

 

引路蜂地图应用GNavigator完整源码

GNavigator是 曾经发布在Nokia Ovi Store的Java ME应用,基本使用到了引路蜂地图API的所有功能,尽管这是一个基于LWUIT的应用,使用Java语言开发,其它平台也可以参考这个应用的代码。

总代码量大约为24000行,其中纯代码为12000行。

几个用户界面如下:

包括导航演示(可以连接GPS)

代码下载 ,用户手册 ,为Netbean 项目。

如果您喜欢本博客,希望捐赠本站,请点击右方的捐赠按钮,或点击下面按钮,谢谢您的支持!





Donate!

 

再谈离线地图工具(2):为GeoServer添加ShapeFile数据源

这里简要介绍一下如何给GeoServer添加一个ShapeFile:

准备测试数据

1. 下载示例ShapeFile nyc_roads.zip ,这个文件含有纽约市道路图。

2. 将其解压得到四个文件 nyc_roads.shp ,nyc_roads.shx, nyc_roads.dbf, nyc_roads.prj

3. 将 nyc_roads 拷贝到 <GEOSERVER_DATA_DIR> (在GeoServer 安装目录的data_dir)的data 子目录下: 在windows 的缺省目录名为:

C:\Program Files (x86)\GeoServer 2.1.0\data_dir\data

使用GeoServer创建Workspace, Workspace 用来管理一组相关的地图图层(Layers),比如道路层,湖泊层,文字层等,多层叠加可以构成完整的地图。

  1. 使用浏览器 进入GeoServer的管理页面http://localhost:8080/geoserver/web.
  2. 登录到GeoServer
  3. 转到Data->Workspace页面
  4. 创建一个新的Workspace,选择Add New Workspace 按钮,将会提升输入Workspace名称,和Namespace URI:
  5. 输入Name: nyc_roads ,URI: http://opengeo.org/nyc_roads, 这个URI可以用来唯一指定中个Workspace, http://opengeo.org可以替换成你自己的域名。
  6. 点击“Submit”提交,GeoServer将会创建nyc_roads Workspace.

创建 Data Store

  1. 转到 Data -> Store 页面。
  2. 为了添加 nyc_roads 数据,需要在GeoServer中创建一个新的Data Store, 点击“Add new Store”按钮,可以看到GeoServer支持很多种数据源: PostGIS NG , Shapefiles 等等。
  3. 因为我们使用的是shapefile,因此选择Shaprfile -ESRI(tm) Shapefile (*.shp)
  4. 在”New Vector Data Source”页面 来配置这个Store的基本信息,如Workspace, Data Source Name, Description (这些都可以根据需要自己定义)
  5. 在”Connection Parameters”下指定nyc_roads.shp 的路径
  6. 点击“Save”,页面将转到Layer 的配置页面。

Layer 配置

  1. 在“New Layer Chooser” ,选择 nyc_road.
  2. 配置“publish”的参数
  3. 为shape文件生成边界矩形参数 (点击” Compute from Data” 自动产生)
  4. 为Shaprfile 指定显示风格 (在Publsih页面)
  5. 选择”line”的缺省风格
  6. 保持配置”Save”

预览Layer

可以通过 Layer Preview 来检验nyc_roads 发布成功,

选择使用OpenLayers来显示地图

使用引路蜂离线地图工具,参见上篇将 MapDigit.ext.config 中 Layers名称改为nyc_roads:nyc_roads

<add key=”GOOGLESATELLITE” value=”http://localhost:8080/geoserver/gwc/service/gmaps?layers=nyc_roads:nyc_roads#zoom={ZOOM}#x={X}#y={Y}” />

同样的方法可以为nyc_roads 生成离线地图包

由此可见,GeoServer可以用来架设自定义的地图服务器,引路蜂地图开发包(Android,Java ME, Blackberry等平台)支持这种自定义的服务器,离线地图工具生成的离线地图包可以直接用在引路蜂地图开发包中。

 

再谈离线地图工具(1):如何使用已有地图数据源生成离线地图包

在前文离线地图下载方法解析离线地图生成工具结构图离线地图生成工具使用方法

我们重点介绍如果使用引路蜂离线地图制作工具的原理和使用方法,离线地图工具缺省支持从Google地图,Bing地图,MapABC地图,Yahoo地图等地图服务器下载制作离线地图包。

但有些情况下,用户自己已经购买了地图数据(如ArgGIS, MapInfo,PostGIS ,ShapeFile等)需要从这些数据来生成离线地图包。

可以利用GeoServer和引路蜂离线地图包来制作离线地图包:步骤如下:

1. 下载安装GeoServer ,GeoServer是Java应用,可以用于Windows ,Mac OS, Linux,本教程使用Windows 系统,在 http://geoserver.org/display/GEOS/Stable 选择 Windows Installer

2. GeoServer安装成功后,在GeoServer 启动菜单有如下几个菜单项:

  • Start GeoServer   启动GeoServer
  • Stop GeoServer   停止GeoServer
  • GeoServer Web Admin Page: GeoServer管理页面

首先启动GeoServer,然后进入GeoServer管理页面, 缺省用户名和密码为admin , geoserver.

3. 首先看看随GeoServer安装时自带的地图数据   Data –>Layers

我们想生成Topp:states 数据的离线地图包,可以在Data -> Layer Preview 中使用 OpenLayers来预览该图层:

4. GeoServer 集成了一个GeoWebCache ,是一个采用Java实现用于缓存WMS(Web Map Service)Tile的开源项目。当地图客户端请求一张新地图和Tile时,GeoWebCache将拦截这些调用然后返回缓存过的Tiles。如果找不到缓存再调用服务器上的Tiles,从而提高地图展示的速度。实现更好的用户体验.

这里不详细介绍GeoWebCache ,只要知道它提供一种和Google Map类似的Tile访问方法 。可以根据Tile的X,Y和Zoom来访问一个图片:

比如安装好GeoServer,在IE地址栏输入:

http://localhost:8080/geoserver/gwc/service/gmaps?layers=topp:states&zoom=1&x=0&y=0 ,表示Zoom为1即是X=0和Y=0的Tile:

5. 下载引路蜂离线地图工具

离线工具下载 http://www.imobilebbs.com/download/tools/downloader.msi 安装版

http://www.guidebee.info/download/tools/MapTileDownloader.rar 绿色版

离线工具需要.Net Framework Runtime,如果您的计算机上未安装,请下载安装

6.  打开引路蜂离线地图工具的安装目录: 找到 MapDigit.exe.config ,这是 MapDigit.exe的配置文件,这个配置文件缺省定义了多个地图服务器(软件Google地图,Bing地图等)。

我们重用GOOGLESATELLITE这个类型,将它重新定义为:

<add key=”GOOGLESATELLITE” value=”http://localhost:8080/geoserver/gwc/service/gmaps?layers=topp:states#zoom={ZOOM}#x={X}#y={Y}” />

可以对比一下 URL:

http://localhost:8080/geoserver/gwc/service/gmaps?layers=topp:states&zoom=1&x=0&y=0

将& 改成#  Zoom=1 , x=0 ,y=  改成zoom={ZOOM},x={X},y={Y}从而就为Layer: topp:states 定义好了URL模板,然后启动MapDigit.exe ,在下来框中选择 GOOGLESATELLITE。

后面就可以和下载Google地图,Bing地图一样来制作离线地图包了,地图数据源来自GeoServer。离线地图生成工具使用方法

限于篇幅,将在下一篇介绍如果使用ShapeFile做为GeoServer的数据源。