原文:
http://www.jappit.com/blog/midmaps-google-maps-java-me-library/
MidMaps:Google Maps Java ME library
MidMaps
是
Java ME
应用程序的一个小型
Google Maps
类库包。
通过使用
MidMaps
你只需很少的几个简单步骤就可以使
Google Maps
完整的结合到你的
J2ME
应用程序中。
如何使用呢?
MidMaps
是被设计成为简单的。你不必要处理线程、连接或者其他令人厌烦的事情,而像这样:所有你应该做的就是
生成一个地图对象以及把它显示在你的应用程序中。
生成一个简单的地图
要生成一个地图对象,你必须完成两步:
1、
首先,实例化一个新的
GoogleMaps
对象:
GoogleMaps gMaps = new GoogleMaps();
2、
其次,用其方法
createMap()
生成一个
GoogleStaticMap
实例:
GoogleStaticMap map = gMaps.createMap(mapWidth,mapHeight,GoogleStaticMap.FORMAT_PNG);
一旦你生成了一个地图
(map)
,需要定义它的处理器
(handler)
。这个处理器扮演一个重要的角色:每一次
map
对象更新,或者有产生错误时它都会自动被触发。这样,你就可以知道什么时候你需要重绘地图,或者如何通知用户发生了什么回事。这个处理器必须实现
GoogleStaticMapHandler
接口,该接口有两个方法:
public void GoogleStaticMapUpdated(GoogleStaticMap map);
public void GoogleStaticMapUpdateError(GoogleStaticMap map,int errorCode,String errorMessage);
第一方法是当一个地图
(map)
更新时触发。因此你的
MIDlet
就知道它需要重绘屏幕了。第二个方法是当一个错误(比如:网络故障和图片无法下载)发生时触发。一旦你生成了处理器
(handler)
,你必须通过
GoogleStaticMap
实例对象的方法
setHandler()
来传递它。
map.setHandler(mapHandler);
现在,如何实际地加载一个地图(
map
)呢?首先,需要为该地图定义一个位置信息:
1、
以首选的经纬度值生成一个
GoogleMapsCoordinates
实例
2、
使用
GoogleStaticMap setCenter()
方法
map.setCenter(new GoogleMapsCoordinates(41.8954656, 12.4823243));
然后,你必须
update()
地图:
map.update();
更新完之后,地图图片将被下载,并且,当完成时(或者当错误发生)
GoogleStaticMapHandler
触发。如果地图正确下载,你就可以通过
draw(Graphics g, int left, int top, int attach)
实际地绘制它。
完整例子
在下面你可以看到一个关于
MidMaps
如何被成功使用把一个地图显示到布画(
Canvas
)上的
完整例子。
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import com.jappit.midmaps.googlemaps.GoogleMaps;
import com.jappit.midmaps.googlemaps.GoogleStaticMap;
public class GoogleMapsSimpleCanvas extends Canvas implements GoogleStaticMapHandler
{
考虑篇幅,部分代码省略
}
标签(Markers)
通过使用
GoogleMapsMarker
类你可以在地图上添加标签。根据指定的位置生成一个标签(
marker
)
:
GoogleMapsMarker marker = new GoogleMapsMarker(new GoogleMapsCoordinates(41.8954656, 12.4823243));
可选择地,你可以通过设置颜色、大小以及标注(需为一个字符)自定义标签:
marker.setColor(GoogleStaticMap.COLOR_GREEN);
marker.setColor(GoogleMapsMarker.SIZE_TINY);
marker.setLabel(‘P’);
然后,通过
addMerker()
方法把标签添加到
GoogleStaticMap
的实例上去:
map.addMerker(marker);
这里是两个不同标签添加都当前地图的一个例子:
GoogleMapsMarker redMarker = new GoogleMapsMarker(new GoogleMapsCoordinates(41.8954656, 12.4823243));
redMarker.setColor(GoogleStaticMap.COLOR_RED);
redMarker.setSize(GoogleMapsMarker.SIZE_MID);
GoogleMapsMarker blueMarker = new GoogleMapsMarker(new GoogleMapsCoordinates(41.8964656, 12.4843243));
blueMarker.setColor(GoogleStaticMap.COLOR_BLUE);
blueMarker.setSize(GoogleMapsMarker.SIZE_SMALL);
blueMarker.setLabel('R');
map.addMarker(redMarker);
map.addMarker(blueMarker);
路径(Paths)
通过使用
GoogleMapsPath
类可以很方便的定义路径对象。要生成一个新
Path
,仅
实例化一个新
GoogleMapsPath
(
new GoogleMapsPath
)对象即可:
GoogleMapsPaht path = new GoogleMapsPath();
随后通过
addPoint()
方法来添加路径点:
path.addPoint(new GoogleMapsCoordinates(41.8954656, 12.4823243));
path.addPoint(new GoogleMapsCoordinates(41.8934656, 12.4833243));
可以使用以下方法自定义
路径重量、颜色以及填充颜色:
bluePath.setColor(GoogleStaticMap.COLOR_BLUE);
bluePath.setWeight(5);
bluePath.setFillColor(GoogleStaticMap.COLOR_GREEN);
下面你可以看到两条不同路径添加到当前地图的例子:
GoogleMapsPath path = new GoogleMapsPath();
path.addPoint(new GoogleMapsCoordinates(41.8954656, 12.4823243));
path.addPoint(new GoogleMapsCoordinates(41.8934656, 12.4833243));
path.addPoint(new GoogleMapsCoordinates(41.8944656, 12.4843243));
path.setColor(GoogleStaticMap.COLOR_RED);
path.setWeight(10);
map.addPath(path);
GoogleMapsPath bluePath = new GoogleMapsPath();
bluePath.addPoint(new GoogleMapsCoordinates(41.8954656, 12.4823243));
bluePath.addPoint(new GoogleMapsCoordinates(41.8964656, 12.4813243));
bluePath.addPoint(new GoogleMapsCoordinates(41.8934656, 12.4803243));
bluePath.setColor(GoogleStaticMap.COLOR_BLUE);
bluePath.setFillColor(GoogleStaticMap.COLOR_GREEN);
bluePath.setWeight(5);
map.addPath(bluePath);
地理编码(Geocoding)
地理编码需要一个
Google
地图
API
密匙,因此你必须在使用这个功能之前获取自己的密匙。
开始,你必须使用自己的
API
密匙实例化一个
GoogleMaps
对象:
GoogleMaps gMaps = new GoogleMaps("<your_api_key>");
然后,你必须通过
createGeocoder()
方法获取
GoogleMapsGeocoder
实例:
GoogleMapsGeocoder geocoder = gMaps.createGeocoder();
然后,和完成
GoogleStaticMap
一样,
GoogleMapsGeocoder
对象也需要定义一个处理器(
handler
)。
GoogleMapsGeocoderHandler
接口定义两个方法:
public void GoogleMapsGeocodeSuccess(String address, GoogleMapsCoordinates coordinates, int accuracy);
public void GoogleMapsGeocodeError(String address, int errorCode, String errorDescription);
当有一个地理编码请求或者错误时这两个方法被分别调用。一旦你实现了
GoogleMapsGeocodeHandler
,你必须把它传递给
GoogleMapsGeocoder
实例之上。
geocoder.setHandler(geocoderHandler);
完成之后,所有准备地理编码地址:为了实现这个功能,只要调用
geocodeAddress()
方法即可:
geocoder.geocodeAddress("Rome, Italy");
当地理编码结束,你的处理器将通过
GoogleMapsGeocodeSuccess()
方法被触发。这种方法可能实施的可见如下
:
public void GoogleMapsGeocodeSuccess(String address, GoogleMapsCoordinates coordinates, int accuracy){
map.setCenter(coordinates);
map.addMarker(new GoogleMapsMarker(coordinates));
map.setZoom(GoogleMaps.getZoomForAccuracy(accuracy));
map.update();
}
自从地理编码操作返回一个“
accuracy
”的值,你就可以使用这个值为地图获取一个默认放大值。为了做这个,你可以使用
GoogleMaps.getZoomForAccuracy()
方法,如上所示。
下面你可以看到有前面的代码产生的地图: