Facebook Twitter LinkedIn E-mail
magnify
Home Archive for category "地图开发"

开源引路蜂地图开发包

由于时间上的问题,已经有很长时间没有对引路蜂地图开发添加功能,因此决定对引路蜂地图开发包,此外征召有兴趣的开发人员共同开发引路蜂地图包 (联系Email:james.shen@guidebee.com)

引路蜂地图包分为Java和.Net版本,支持移动平台和手机平台,其主要功能如下:

地图开发

提起地图开发包,Google 地图和Bing 地图主要应用于Web应用,在离线方式和移动平台上它们并没有提供足够的支持,比如在Java ME平台上使用Google地图API或是在Android,iPhone平台上使用Bing地图。如在中国,想在Windows Mobile 平台上使用 MapABC地图API都不是很方便。
引路蜂地图开发包提供了对几乎所有软件平台(桌面和移动平台)的支持,采用统一的接口使用包括Google 地图,Bing地图,MapABC地图在内多达二十多种地图类型,并在同一开发包中支持离线地图,矢量地图显示。
下图显示了引路蜂地图开发包支持的开发平台,软件包以三个不同的开发包提供对各个平台的支持:

Java ME 地图开发包 MIDP/LWUIT/Blackberry
Java SE 地图开发包 Android/Java SE
.Net Framework 地图开发包 Windows Mobile/Windows Phone 7/.Net desktop/Mac OS/iPhone/iPad

引路蜂地图开发包支持的主要功能如下表

开源代码经过整理,将逐步投放在github ,目前采用GPL 开源协议。

GitHub 地址 为 https://github.com/guidebee/  下

  • guidebeemap      Java库源码
  • guidebeemapdonnet  .Net 库源码
  • guidebeemaptutorial  教程及示例应用代码
  • maptiledownloader    离线地图下载应用代码
 

关于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等平台)支持这种自定义的服务器,离线地图工具生成的离线地图包可以直接用在引路蜂地图开发包中。