Android Map 开发之高德地图
来源:互联网 发布:网页禁止注入js脚本 编辑:程序博客网 时间:2024/05/16 11:30
android Map 开发之google Map 可参考文档 Android Google Map API V2 开发入门.doc
如何把 API 添加到我的Android 工程中?
创建工程,将从网站下载的AMap_Android_Api_Lib 文件中的MapApi.jar 包拷贝到Libs 文件夹下,Libs 下的文件目录如下所示:
MapApi.jar MapApi.jar
当MapApi.jar在Libs 文件夹中后,就表示将高德地图Android API库文件引入工程中了,您就可以在您的程序中使用高德地图API 了。
在manifest 中设置相应的权限
下面介绍在程序开发中需注意的问题:必须在AndroidManifest.xml 中设置相应的权限,添加代码如下:<uses-permission
android:name=
"android.permission.ACCESS_COARSE_LOCATION"
></uses-permission>
<uses-permission
android:name=
"android.permission.ACCESS_FINE_LOCATION"
></uses-permission>
<uses-permission
android:name=
"android.permission.INTERNET"
></uses-permission>
<uses-permission
android:name=
"android.permission.ACCESS_NETWORK_STATE"
></uses-permission>
<uses-permission
android:name=
"android.permission.WRITE_EXTERNAL_STORAGE"
></uses-permission>
<uses-permission
android:name=
"android.permission.READ_PHONE_STATE"
></uses-permission>
<uses-permission
android:name=
"android.permission.CHANGE_WIFI_STATE"
></uses-permission>
<uses-permission
android:name=
"android.permission.ACCESS_WIFI_STATE"
></uses-permission>
注意此添加权限代码与<application>同级。
栅格地图显示
MapActivity是一个抽象类,任何想要显示MapView 的activity 都需要派生自MapActivity。并且在其派生类的onCreate() 中,都要创建一个MapView 实例。public
class
GridMapView
extends
MapActivity{
private
MapView mMapView;
private
MapController mMapController;
private
GeoPoint point;
@Override
/**
*显示栅格地图,启用内置缩放控件,并用MapController 控制地图的中心点及Zoom 级别
*/
protected
void
onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super
.onCreate(savedInstanceState);
setContentView(R.layout.mapview);
//布局文件夹 res/layout/mapview.xml 文件。
mMapView = (MapView) findViewById(R.id.mapView);
mMapView.setBuiltInZoomControls(
true
);
//设置启用内置的缩放控件
mMapController = mMapView.getController();
// 得到mMapView 的控制权,可以用它控制和驱动平移和缩放
point =
new
GeoPoint((
int
) (
39.982378
* 1E6),
(
int
) (
116.304923
* 1E6));
//用给定的经纬度构造一个GeoPoint,单位是微度(度* 1E6)
mMapController.setCenter(point);
//设置地图中心点
mMapController.setZoom(
12
);
//设置地图zoom 级别
}
}
在布局文件夹 res/layout/mapview.xml 文件中添加地图控件代码如下:
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:autonavi=
"http://schemas.android.com/apk/res/com.AMap"
android:orientation=
"vertical"
android:layout_width=
"fill_parent"
android:layout_height=
"fill_parent"
>
<com.amap.mapapi.map.MapView android:id=
"@+id/mapView"
android:layout_width=
"fill_parent"
android:layout_height=
"fill_parent"
android:clickable=
"true"
/>
</LinearLayout>
结果见图3-1 栅格地图显示效果图:
图3-1 栅格地图显示效果图
具体示例请查看参考示例 MapView 中的 GridMapView。
矢量地图显示
将libminimapv320.so 复制到工程目录下的libs\armeabi,目录结构见图3-2图3-2 工程目录结构图
代码如下:
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.vmapview);
mMapView = (MapView) findViewById(R.id.vmapView);
mMapView.setVectorMap(
true
);
//设置地图为矢量模式
mMapView.setBuiltInZoomControls(
true
);
//设置启用内置的缩放控件
mMapController = mMapView.getController();
// 得到mMapView的控制权,可以用它控制和驱动平移和缩放
point =
new
GeoPoint((
int
) (
39.90923
* 1E6),
(
int
) (
116.397428
* 1E6));
//用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)
mMapController.setCenter(point);
//设置地图中心点
mMapController.setZoom(
12
);
//设置地图zoom级别
}
结果见图3-3
图3-3 矢量地图显示效果图
具体示例请查看参考示例MapView 中的VectorMapView。
地图覆盖物概述
所有叠加或覆盖到地图的内容,统称为地图覆盖物。如标注、矢量图形元素((包括:折线和多边形和圆))、定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,它们会相应的移动。
高德地图Android API 提供了如下几种覆盖物:
Overlay:覆盖物的抽象基类,所有的覆盖物均继承此类的方法,实现用户自定义图层显示。
MyLocationOverlay:一个负责显示用户当前位置的Overlay。
ItemizedOverlay:Overlay 的一个基类,包含了一个OverlayItem 列表,相当于一组分条的Overlay,通过继承此类,将一组兴趣点显示在地图上。
PoiOverlay:本地搜索图层,提供某一特定地区的位置搜索服务,比如在北京市搜索“天安门”,通过此图层将包含“天安门”关键字的标注显示在地图上。
RouteOverlay:公交,驾车导航线路图层,将公交、驾车出行方案的路线及关键点显示在地图上。
覆盖物的抽象基类(Overlay)
一般来说,在MapView 中添加一个Overlay 需要经过以下步骤:
自定义类继承Overlay,并Override 其draw()方法可以实现点,线,面等的显示,如果需要点击、按键、触摸等交互操作,还需OverrideonTap()等方法。
添加到MapView 的覆盖物中:
publicclass MyOverlay
extends
Overlay{
@Override
public
void
draw(Canvas canvas, MapView mapView,
boolean
shadow) {
// TODO Auto-generated method stub
super
.draw(canvas, mapView, shadow);
Point screenPts =
new
Point();
mapView.getProjection().toPixels(point, screenPts);
//---add the marker---
Bitmap bmp = BitmapFactory.decodeResource(
getResources(), R.drawable.da_marker_red);
canvas.drawBitmap(bmp, screenPts.x, screenPts.y-
50
,
null
);
Paint paintText =
new
Paint();
paintText.setTextSize(
18
);
paintText.setColor(Color.BLACK);
canvas.drawText(
"★AMap"
, screenPts.x, screenPts.y, paintText);
// 绘制文本
Paint mCirclePaint =
new
Paint();
mCirclePaint.setAntiAlias(
true
);
mCirclePaint.setColor(Color.BLUE);
mCirclePaint.setAlpha(
50
);
mCirclePaint.setStyle(Style.FILL);
canvas.drawCircle(screenPts.x+
150
, screenPts.y,
50
, mCirclePaint);
Paint paintLine =
new
Paint();
paintLine.setColor(Color.RED);
paintLine.setStrokeWidth(
3
.0f);
paintLine.setStyle(Paint.Style.STROKE);
canvas.drawLine(screenPts.x-
100
, screenPts.y, screenPts.x, screenPts.y-
200
, paintLine);
}
@Override
public
boolean
onTap(GeoPoint arg0, MapView arg1) {
// TODO Auto-generated method stub
return
super
.onTap(arg0, arg1);
}
}
添加到MapView 的覆盖物中:
mMapView.getOverlays().add(
new
MyOverlay());
运行结果见图 6-1 覆盖物效果图:
当前位置(MyLocationOverlay)
将MyLocationOverlay添加到覆盖物中,能够实现在地图上显示当前位置的图标以及指南针:
MyLocationOverlay mylocTest =
new
MyLocationOverlay(MylocationDemo.
this
, map);
mylocTest.enableMyLocation();
mylocTest.enableCompass();
// 打开指南针
map.getOverlays().add(mylocTest);
运行结果 见图 6-2 当前位置效果图 :
图6-2 当前位置效果图
分条目覆盖物(ItemizedOverlay)
某个类型的覆盖物,包含多个类型相同、显示方式相同、处理方式相同的项时,使用此类:
自定义类继承ItemizedOverlay,并Override其draw() 方法,如果需要点击、按键、触摸等交互操作,还需OverrideonTap() 等方法。
class
OverItemT
extends
ItemizedOverlay<overlayitem> {
private
List<overlayitem> GeoList =
new
ArrayList<overlayitem>();
private
Drawable marker;
private
Context mContext;
private
double
mLat1 =
39.9022
;
// point1 纬度
private
double
mLon1 =
116.3922
;
// point1 经度
private
double
mLat2 =
39.607723
;
private
double
mLon2 =
116.397741
;
private
double
mLat3 =
39.917723
;
private
double
mLon3 =
116.6552
;
public
OverItemT(Drawable marker, Context context) {
super
(boundCenterBottom(marker));
this
.marker = marker;
this
.mContext = context;
// 用给定的经纬度构造GeoPoint,单位是微度(度* 1E6)
GeoPoint p1 =
new
GeoPoint((
int
) (mLat1 * 1E6), (
int
) (mLon1 * 1E6));
GeoPoint p2 =
new
GeoPoint((
int
) (mLat2 * 1E6), (
int
) (mLon2 * 1E6));
GeoPoint p3 =
new
GeoPoint((
int
) (mLat3 * 1E6), (
int
) (mLon3 * 1E6));
// 构造OverlayItem 的三个参数依次为:item 的位置,标题文本,文字片段
GeoList.add(
new
OverlayItem(p1,
"P1"
,
"point1"
));
GeoList.add(
new
OverlayItem(p2,
"P2"
,
"point2"
));
GeoList.add(
new
OverlayItem(p3,
"P3"
,
"point3"
));
populate();
//createItem(int)方法构造item。一旦有了数据,在调用其它方法前,首先调用这个方法
}
@Override
public
void
draw(Canvas canvas, MapView mapView,
boolean
shadow) {
// Projection 接口用于屏幕像素点坐标系统和地球表面经纬度点坐标系统之间的变换
Projection projection = mapView.getProjection();
for
(
int
index = size() -
1
; index >=
0
; index--) {
// 遍历GeoList
OverlayItem overLayItem = getItem(index);
// 得到给定索引的item
String title= overLayItem.getTitle();
// 把经纬度变换到相对于MapView 左上角的屏幕像素坐标
Point point = projection.toPixels(overLayItem.getPoint(),
null
);
// 可在此处添加您的绘制代码
Paint paintText =
new
Paint();
paintText.setColor(Color.BLACK);
paintText.setTextSize(
15
);
canvas.drawText(title, point.x-
30
, point.y -
25
, paintText);
// 绘制文本
}
super
.draw(canvas, mapView, shadow);
//调整一个drawable 边界,使得(0,0)是这个drawable 底部最后一行中心的一个像素
boundCenterBottom(marker);
}
@Override
protected
OverlayItem createItem(
int
i) {
// TODO Auto-generated method stub
return
GeoList.get(i);
}
@Override
public
int
size() {
// TODO Auto-generated method stub
return
GeoList.size();
}
@Override
// 处理当点击事件
protected
boolean
onTap(
int
i) {
setFocus(GeoList.get(i));
Toast.makeText(
this
.mContext, GeoList.get(i).getSnippet(),
Toast.LENGTH_SHORT).show();
return
true
;
}
@Override
public
boolean
onTap(GeoPoint point, MapView mapView) {
// TODO Auto-generated method stub
return
super
.onTap(point, mapView);
}
}
添加到MapView 的覆盖物中:
Drawable marker = getResources().getDrawable(R.drawable.da_marker_red);
//得到需要标在地图上的资源
marker.setBounds(
0
,
0
, marker.getIntrinsicWidth(), marker
.getIntrinsicHeight());
//为maker 定义位置和边界
mMapView.getOverlays().add(
new
OverItemT(marker,
this
));
//添加ItemizedOverlay 实例到mMapView
点击其中一个图标,运行结果见图6-3 分条目覆盖效果图:
图6-3 分条目覆盖效果图
本地搜索覆盖物(PoiOverlay)
请参见PoiSearch 及PoiOverlay 的类参考。
驾车、公交路线覆盖物(RouteOverlay)
请参见驾车路线搜索及RouteOverlay 和公交路线搜索及RouteOverlay 的类参考。
参考资料:http://api.amap.com/Android/Hello_World MapApi.jar
版权所有 违者必究 !http://blog.csdn.net/yaohucaizi/article/details/8890376
- Android Map 开发之高德地图
- Android Map 开发之高德地图
- 高德地图api之basic map
- 开发Android高德地图
- Android高德地图开发 地图事件
- Android地图开发之Overlay应用(高德)
- Android之高德接口开发地图(-)
- Android开发之高德地图实现定位
- Android开发之高德地图实现定位
- android开发笔记之高德地图使用
- 最新基于高德地图的android进阶开发(1)获取 Map API Key
- Android学习历程——高德地图学习开发之显示地图,定位
- (android地图开发) 高德地图开发准备
- iOS开发之高德地图
- 高德地图开发之第一篇
- 高德地图开发之基本控件
- 高德地图JS开发之入门
- 高德地图api之basic map UIsettings
- Apt和dpkg 参考
- 外观模式(Facade)
- adb无线连接(来自网络)
- 代理模式(Proxy)
- Hashtable和Directory性能比较
- Android Map 开发之高德地图
- 适配器模式(Adapter)
- php的JSON模块编译错误
- KMP Hdu-3336 Count the string
- java this 用法
- virtualbox识别U盘的问题
- 字节那些事儿
- C++ 用libcurl库进行http通讯网络编程
- Windows 8 各个版本区别对比