构建Android平台Google Map应用
2010-10-13 17:30:35 来源:本站整理大家可以清楚的看到,使用Android 的地图功能是非常的简单然后又很强大。那如何拿到一个地址的经度和纬度呢?有很多在线的服务可以使用。笔者比较喜欢Yahoo的Geo API :http://developer.yahoo.com/maps/rest/V1/geocode.html。Yahoo 的用户可以去免费申请一个appid,就可以使用所有Yahoo 提供的服务了。最简单的获取geocode的请求就是提供location的值:
http://local.yahooapis.com/MapsService/V1/geocode?appid你的appid&location=350+5th+Ave,+New+York,+NY+10118
在返回的XML中,我们只关心Latitude和Longitude的值:
< Latitude>40.748396< /Latitude>
< Longitude>-73.984703< /Longitude>
在Android 中,可以通过包里面org.xml.sax 包来分析xml,也可以通过substring来做。如果你需要在地图上画地标、坐标、图片等等,那就需要定义你自己的Overlay 类:
public class MyOverlay extends Overlay {
// com.google.android.maps.Overlay
然后override draw(Canvas canvas, PixelCalculatorcalculator, boolean shadow)这个方法。比如你想画个图标在当前的点上:
super.draw(canvas, calculator, shadow)
// 下面两行把当前的点转换成地图上的xy坐标
int[] xyCoordinates = new int[2];
calculator.getPointXY(p, xyCoordinates);
// 在坐标这点画图(bitmap是Bitmap类,可以读取图片资源
//(drawable resources)来生成)
canvas.drawBitmap(bitmap, xyCoordinates[0],xyCoordinates[1], new Paint());
// 在mapview中获得OverlayController:
OverlayController oc = myMapView.createOverlayController();
MyOverlay mo = new MyOverlay();
// 加入到Overlay控制器就可以了
oc.add(om, true);
当然,你也可以在draw里面写字,画几何图形等等,这里就不一一叙述。
最后,我们看看如何获取键盘事件:
public boolean onKeyDown(View v, int keyCode,KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_I)
{
// 放大
mapview.getController().zoomTo(myMapView.getZoomLevel() + 1);
return true;
}
else if (keyCode == KeyEvent.KEYCODE_O)
{
// 缩小
mapview.getController().zoomTo(myMapView.getZoomLevel() ? 1);
return true;
}
else if (keyCode == KeyEvent.KEYCODE_S)
{
// 转换到卫星地图
mapview.toggleSatellite();
return true;
}
else if (keyCode == KeyEvent.KEYCODE_T)
{
// 转换到路况图
mapview.toggleTraffic();
return true;
}
return false;
}
有兴趣的读者,可以去andoridcn 看看笔者发表的minigoogle map(包含所有source)。如果有机会,可以继续深入关于GPS的操作,如何在没有GPS硬件的情况下估计当前GPS位置,以及使用kml,nmea来模拟GPS路线等等。
总结和技术展望
Android本身设计和系统的实现是一个极其复杂的工作。就发稿时的m3-rc22a 版来看,系统还有需要充实的地方,相信在明年全面发布,真机发布之时,Android会变得更加强壮和易用。感谢Androidcn 社区的 lordhong( 吴宏) 和 风雷( 李锟) 对本文成稿的贡献。
赞助商链接