简介
本项目基于Davanum Srinivas开发的BrowseMap,BrowseMap是一个为Android开发的Google Maps浏览器,能提供:
- 在Android上浏览Google Maps
- 地图的放大和缩小
- 跟随鼠标移动(在真实设备上应该是触摸屏)
- 交通和卫星视图之间转换
- 定位
(这样的地图应用程序基础功能实际上已经在Android上实现了)
但是MapMe在这些基础功能之上提供了不少新特性,这都得感谢db4o对象持久引擎:
- 把位置信息登记到db4o(完整的地图持久化,包括缩放级别以及卫星交通视图)
- 浏览书签列表
- 编辑书签
- 从书签中导航到地图上某个位置
- 根据当前GPS所报告的位置居中显示地图
屏幕截图
想看应用程序是如何运作的,你可以观看在YouTube上的MapMe视频、从一个外部服务器下载高分辨率视频(30 Mb)或下面的屏幕截图:
db4o总部(卫星+交通视图)
MapMe主菜单:
建立书签/导航点(navpoint):
保存的书签/导航点(navpoint)列表:
MapMe是如何运用db4o的
如果你查看源代码(下面有下载),你会发现DB helper类处理了所有的持久化操作(开启、存储、查询、计数数据库),而这一切都不超过80行代码!
这一切都很简单,而且不会丧失性能。让我们来看一些项目中用到的持久化方法。
开启数据库
开启数据库的确简单,并且在必要的时候还能自动生成数据库文件。一旦打开,db4o将锁定数据库文件。
public
ObjectContainer db(){
try
{
if
(oc
==
null
||
oc.ext().isClosed())
oc
=
Db4o.openFile(dbConfig(), db4oDBFullPath(context));
return
oc;
}
catch
(Exception e) {
Log.e(Db4oHelper.
class
.getName(), e.toString());
return
null
;
}
}
private
String db4oDBFullPath(Context ctx) {
return
ctx.getDataDir()
+
"
/
"
+
"
browsemap.db4o
"
;
}
注意我们所存放的数据库文件路径是和上下文数据目录有关的。
配置数据库这里我们提供一个配置对象,以便在打开数据库的时候把它传递进去(代码如下)。
private Configuration dbConfig(){
Configuration c = Db4o.newConfiguration();
c.objectClass(MapBookmark.class).objectField("name").indexed(true);
c.objectClass(MapBookmark.class).updateDepth(2);
c.objectClass(MapBookmark.class).minimumActivationDepth(3);
c.objectClass(MapBookmark.class).cascadeOnDelete(true);
return c;
}
注意,为MapBookmark对象建立的索引字段是“name”,并设置激活和更新级别。
保存书签
在这里我们调用一系列的操作,无论对象是否存在于数据库,对象都会被更新或插入。
public void setBookmark(
String name,
String description,
int latitude,
int longitude,
int zoomLevel,
boolean satellite,
boolean traffic){
MapBookmark bkm = getBookmark(name);
if(bkm == null)
bkm = new MapBookmark(name);
bkm.setDescription(description);
bkm.setLatitude(latitude);
bkm.setLongitude(longitude);
bkm.setZoomLevel(zoomLevel);
bkm.setSatellite(satellite);
bkm.setTraffic(traffic);
db().set(bkm);
db().commit();
}
在保存到数据库之前,我们设置好所有字段。
根据名字查询书签
我们通过Query by Example(QBE)传入一个原型来取回以名字为条件的书签。
public MapBookmark getBookmark(String name){
MapBookmark proto = new MapBookmark(name);
ObjectSet result = db().get(proto);
if(result.hasNext()){
return (MapBookmark)result.next();
}
return null;
}
QBE利用反射来检查原型对象的字段。
查询所有书签
这里我们把SODA查询结果拷贝到ArrayList中。但要注意,当使用Native Queries时你不必这样做(在这种情况下将直接返回List<MapBookmark>)。
public List<MapBookmark> getBookmarkList(){
ArrayList<MapBookmark> ret = new ArrayList<MapBookmark>();
ObjectSet result = getBookmarks();
while (result.hasNext())
ret.add((MapBookmark)result.next());
return ret;
}
private ObjectSet getBookmarks(){
Query query = db().query();
query.constrain(MapBookmark.class);
query.descend("name").orderAscending();
return query.execute();
}
删除书签
public void deleteBookmark(String name) {
MapBookmark bkm = getBookmark(name);
if(bkm != null){
db().delete(bkm);
db().commit();
}
}
如果你的对象在db4o参考系统中存在,你可以轻松的调用delete()操作从数据库中删除它。
书签计数
public int bookamrkCount(){
return getBookmarks().size();
}
private ObjectSet getBookmarks(){
Query query = db().query();
query.constrain(MapBookmark.class);
query.descend("name").orderAscending();
return query.execute();
}
要通过查询来进行对象计数,你只要询问查询结果的大小即可。
待完成
- 基于书签的查询功能(通过db4o查询)
- 支持手势识别(gesture recognition)(链接)
- 当前位置提示(Tweet current location)(链接)
- 把跟踪到的GPS位置接收到屏幕上并把GPS路线存储到数据库上(以便今后查看)
- 把位置发送给联系人(短消息、e-mail等)
下载
MapMe.Zip
YouTube上的MapMe视频
高分辨率视频(30 Mb)
请注意!引用、转贴本文应注明原译者:RosenJiang 以及出处:http://www.blogjava.net/rosen
分享到:
相关推荐
MapMe支持和下载// base dependencycompile ' nz.co.trademe.mapme:mapme:1.2.0 '// for Google Maps supportcompile ' nz.co.trademe.mapme:googlemaps:1.2.0 '// for Mapbox supportcompile ' nz.co.trademe....
**Android-MapMe库详解** `MapMe`是专为Android平台设计的一个地图操作库,它为开发者提供了丰富的功能,使地图集成变得更加简单和高效。这个库尤其适用于那些需要在应用中实现复杂地图交互和自定义功能的开发者。...
【Mapme公共资源存储库】是一个面向开发者的重要资源集合,尤其对于使用JavaScript进行Web开发的人员来说,这是一个极具价值的工具。这个存储库包含了各种JavaScript组件、模块和实用工具,可以帮助开发者快速构建...
标题中的“mapme-discussion”是一个项目或工具的名称,显然与地图相关的讨论和决策管理有关。这个存储库可能是为了组织、记录以及跟踪与MapMe相关的各种议题和决策过程而创建的。描述进一步确认了这一点,它是一个...
用于高级数学和物理的 C++ 库。 具有解决简单和复杂问题的能力。 在开发的某个时刻,重点将从扩展库转变为构建和适合它的 GUI。