您的位置:首页 > 其它

[AS2.3.3]高德地图使用学习记录

2018-02-01 15:58 204 查看
一篇来自自己学习官方文档的文章。

使用的sdk

AMap3DMap_5.7.0

AMapNavi_5.6.0

AMapSearch_5.7.0

AMapLocation_3.7.0

主要内容如下

地图相关

创建显示地图

地图属性设置

Marker相关

创建Marker显示在地图上

Marker操作

绘画相关

绘制了线和圆

poi相关

关键字搜索

周边检索

ID检索

自动提示

公交检索

地图相关

创建显示地图

public class MainActivity extends AppCompatActivity {

private MapView mapView;
private AMap aMap;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapView = (MapView) findViewById(R.id.map);
//创建地图
mapView.onCreate(savedInstanceState);

if (aMap == null) {
aMap = mapView.getMap();
}
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}

@Override
protected void onResume() {
super.onResume();
mapView.onResume();
}

@Override
protected void onPause() {
super.onPause();
mapView.onPause();
}

@Override
protected void onDestroy() {
mapView.onDestroy();
super.onDestroy();
}
}


地图属性设置

设置地图层级

//设置地图层级 3-19
aMap.moveCamera(CameraUpdateFactory.zoomTo(15));


移动地图中心点到经纬度

//设置中心点到26.099794 119.296154
LatLng latLng = new LatLng(26.099794,119.296154);
aMap.moveCamera(CameraUpdateFactory
//CameraPosition参数说明 LatLng var1, float var2, float var3, float var4
//目标位置的屏幕中心点经纬度坐标
//目标可视区域的缩放级别
//目标可视区域的倾斜度,以角度为单位
//可视区域指向的方向,以角度为单位,从正北向逆时针方向计算,从0度到360度
.newCameraPosition(new CameraPosition(latLng,16,45,0)));


地图UI

//地图ui相关
UiSettings uiSettings = aMap.getUiSettings();
//缩放+ -
uiSettings.setZoomControlsEnabled(true);
//定位按钮
uiSettings.setMyLocationButtonEnabled(true);
//指南针
uiSettings.setCompassEnabled(true);
//比例尺
uiSettings.setScaleControlsEnabled(true);
//地图Logo位置
uiSettings.setLogoPosition(AMapOptions.LOGO_POSITION_BOTTOM_LEFT);
//手势相关
//双击手势
uiSettings.setZoomGesturesEnabled(true);
//滑动手势
uiSettings.setScaleControlsEnabled(true);
//旋转手势
uiSettings.setRotateGesturesEnabled(false);
//倾斜手势
uiSettings.setTiltGesturesEnabled(false);


地图点击事件

//地图点击
aMap.setOnMapClickListener(new AMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
Log.d(TAG, "click: "+latLng.latitude+","+latLng.longitude);
}
});

//地图poi点击
aMap.setOnPOIClickListener(new AMap.OnPOIClickListener() {
@Override
public void onPOIClick(Poi poi) {
//poiId
poi.getPoiId();
//poi名称
poi.getName();
//poi经纬度
poi.getCoordinate();
}
});


地图定位

//定位相关
MyLocationStyle myLocationStyle = new MyLocationStyle();
//连续定位的触发间隔
myLocationStyle.interval(5000)
//定位类型 循环定位
.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);
//设置定位蓝点属性
aMap.setMyLocationStyle(myLocationStyle);
//设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false
aMap.setMyLocationEnabled(true);


定位蓝点扩展

//定位模式设置
//只定位一次。MyLocationStyle.LOCATION_TYPE_SHOW
//定位一次,且将视角移动到地图中心点。
MyLocationStyle.LOCATION_TYPE_LOCATE
//连续定位、且将视角移动到地图中心点,定位蓝点跟随设备移动。(1秒1次定位)
MyLocationStyle.LOCATION_TYPE_FOLLOW
//连续定位、且将视角移动到地图中心点,地图依照设备方向旋转,定位点会跟随设备移动。(1秒1次定位)
MyLocationStyle.LOCATION_TYPE_MAP_ROTATE
//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)默认执行此种模式。
MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE
//以下三种模式从5.1.0版本开始提供
//连续定位、蓝点不会移动到地图中心点,定位点依照设备方向旋转,并且蓝点会跟随设备移动。
MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER
//连续定位、蓝点不会移动到地图中心点,并且蓝点会跟随设备移动。
MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER
//连续定位、蓝点不会移动到地图中心点,地图依照设备方向旋转,并且蓝点会跟随设备移动。
MyLocationStyle.LOCATION_TYPE_MAP_ROTATE_NO_CENTER

//设置是否显示定位小蓝点,用于满足只想使用定位,不想使用定位小蓝点的场景,设置false以后图面上不再有定位蓝点的概念,但是会持续回调位置信息。
showMyLocation(boolean visible);
//设置定位蓝点的icon图标方法,需要用到BitmapDescriptor类对象作为参数。
myLocationIcon(BitmapDescriptor myLocationIcon);
//设置定位蓝点图标的锚点方法。
anchor(float u, float v);
//设置定位蓝点精度圆圈的边框颜色的方法。
strokeColor(int color);
//设置定位蓝点精度圆圈的填充颜色的方法。
radiusFillColor(int color);
//设置定位蓝点精度圈的边框宽度的方法。
strokeWidth(float width);
//从location对象中获取经纬度信息,地址描述信息,建议拿到位置之后调用逆地理编码接口获取
public void onMyLocationChange(android.location.Location location){}


Marker相关

创建Marker显示在地图上

MarkerOptions markerOptions = new MarkerOptions();
LatLng latLng = new LatLng(26.061328,119.291608);
markerOptions.position(latLng)  //经纬度
.title("Title") //标题
.snippet("Snippet") //内容
.visible(true)  //是否显示
.draggable(false)   //是否拖拽
.anchor(0.5f,1.0f)  //锚点 默认0.5f,1.0f
.alpha(1.0f)    //透明度
//自定义图标
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));
aMap.addMarker(markerOptions);


Marker操作

Marker删除方法

marker.remove();


//删除特定marker
//可以设置marker的object方法
marker.setObject(xxx.class);
//碰到删除的地方可以进行判断
if (marker.getObject() == xxx.class) {
marker.remove();
}
//或者加入数组中保存
markers.add(marker);
//碰到删除的地方
for(Marker marker : markers){
marker.remove();
}


Marker动画

Marker marker = aMap.addMarker(markerOptions);
//设置Marker缩放动画
Animation animation = new ScaleAnimation(0,1,0,1);
//动画时间
animation.setDuration(1000);
animation.setInterpolator(new LinearInterpolator());
marker.setAnimation(animation);
marker.startAnimation();


Marker点击事件

aMap.setOnMarkerClickListener(new AMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
//是否显示info
if (marker.isInfoWindowShown()) {
marker.hideInfoWindow();
}else{
marker.showInfoWindow();
}
//marker经纬度
marker.getPosition();
return true;
}
});


Marker拖拽事件

aMap.setOnMarkerDragListener(new AMap.OnMarkerDragListener() {
@Override
public void onMarkerDragStart(Marker marker) {

}

@Override
public void onMarkerDrag(Marker marker) {

}

@Override
public void onMarkerDragEnd(Marker marker) {

}
});


Marker的InfoWindow设置相关

//InfoWindow 点击事件
aMap.setOnInfoWindowClickListener(new AMap.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick(Marker marker) {

}
});
//自定义InfoWindow布局
aMap.setInfoWindowAdapter(new AMap.InfoWindowAdapter() {
@Override
public View getInfoWindow(Marker marker) {
return null;
}

@Override
public View getInfoContents(Marker marker) {
return null;
}
});
//    View getInfoWindow(Marker marker)
//    当实现此方法并返回有效值时(返回值不为空,则视为有效),SDK 将不会使用默认的样式,而采用此方法返回的样式(即 View)。
//    默认会将Marker 的 title 和 snippet 显示到 InfoWindow 中。
//    如果此时修改了 Marker 的 title 或者 snippet 内容,再次调用类 Marker 的 showInfoWindow() 方法,InfoWindow 内容不会更新。
//    自定义 InfoWindow 之后所有的内容更新都需要用户自己完成。
//    当调用 Marker 类的 showInfoWindow() 方法时,SDK 会调用 getInfoWindow(Marker marker) 方法和 getInfoContents(Marker marker) 方法(之后会提到),在这些方法中更新 InfoWindow 的内容即可。
//    注意:如果此方法返回的 View 没有设置 InfoWindow 背景图,SDK 会默认添加一个背景图。
//    View getInfoContents(Marker marker)
//    此方法和 getInfoWindow(Marker marker) 方法的实质是一样的,唯一的区别是:此方法不能修改整个 InfoWindow 的背景和边框,无论自定义的样式是什么样,SDK 都会在最外层添加一个默认的边框。


绘画相关

这边就提及绘制线和绘制圆,其他可以查看官方文档

绘制线

//点数组
List<LatLng> latLngs = new ArrayList<>();
LatLng latLng1 = new LatLng(26.099794,119.296154);
LatLng latLng2 = new LatLng(26.061328,119.291608);
latLngs.add(latLng1);
latLngs.add(latLng2);
//设置点属性
PolylineOptions opt = new PolylineOptions();
opt.addAll(latLngs)//添加点
//设置颜色
.color(Color.BLUE)
//设置线大小
.width(10);
Polyline polyline = aMap.addPolyline(opt);


删除线方法
polyline.remove();


绘制圆

//设置圆属性
CircleOptions copt = new CircleOptions();
copt.center(latLng1)//经纬度
.radius(100)//圆半径
//填充颜色
.fillColor(Color.argb(50,1,1,1))
.strokeColor(Color.argb(100,1,1,1))
//线大小
.strokeWidth(15);
Circle circle = aMap.addCircle(copt);


删除线方法
circle.remove();


POI相关

关键字搜索

//查询条件
//第一个参数表示搜索字符串,
//第二个参数表示POI搜索类型,第一个参数和第二个参数二者选填其一,选用POI搜索类型时建议填写类型代码,码表可以参考官方文档
//第三个参数表示POI搜索区域,可以是城市编码也可以是城市名称,也可以传空字符串,空字符串代表全国在全国范围内进行搜索
PoiSearch.Query query = new PoiSearch.Query("肯德基","","福州");
//每页的数量
query.setPageSize(10);
//第几页
query.setPageNum(1);
//检索设置
PoiSearch poiSearch = new PoiSearch(this,query);
//异步检索
poiSearch.searchPOIAsyn();
//结果监听
PoiSearch.OnPoiSearchListener listener = new PoiSearch.OnPoiSearchListener() {
@Override
public void onPoiSearched(PoiResult poiResult, int code) {
if (code == 1000) {
//成功
for (PoiItem poiItem : poiResult.getPois()) {
//poi标题
poiItem.getTitle();
//poi内容
poiItem.getSnippet();
//poi经纬度
poiItem.getLatLonPoint();
//poiID
id = poiItem.getPoiId();

LatLng l = new LatLng(poiItem.getLatLonPoint().getLatitude(),
poiItem.getLatLonPoint().getLongitude());
String t = poiItem.getTitle();
String s = poiItem.getSnippet();

MarkerOptions options = new MarkerOptions();
options.position(l)
.title(t)
.snippet(s)
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
aMap.addMarker(options);
}
}else{
//失败
}
}

@Override
public void onPoiItemSearched(PoiItem poiItem, int code) {
if (code == 1000) {
//成功
//poi标题
poiItem.getTitle();
//poi内容
poiItem.getSnippet();
//poi经纬度
poiItem.getLatLonPoint();

}else{
//失败
}
}
};
poiSearch.setOnPoiSearchListener(listener);


周边检索

搜索的条件、初始化、监听和上面一样

//圆形区域周边检索
LatLonPoint latLonPoint = new LatLonPoint(26.099794,119.296154);
int r = 2000;
poiSearch.setBound(new PoiSearch.SearchBound(latLonPoint,r));
//执行检索
poiSearch.searchPOIAsyn();

//多边形区别检索
List<LatLonPoint> points = new ArrayList<LatLonPoint>();
points.add(new LatLonPoint(39.941711, 116.382248));
points.add(new LatLonPoint(39.884882, 116.359566));
points.add(new LatLonPoint(39.878120, 116.437630));
points.add(new LatLonPoint(39.941711, 116.382248));
poiSearch.setBound(new SearchBound(points));//设置多边形区域
//执行检索
poiSearch.searchPOIAsyn();


ID检索

//ID检索 初始化的时候去掉query条件
//初始化
PoiSearch poiSearch1 = new PoiSearch(this,null);
//ID异步检索
poiSearch1.searchPOIIdAsyn(id);
//监听还是一样不过 实现的方法是onPoiItemSearched
poiSearch1.setOnPoiSearchListener(listener);


自动提示

//条件
InputtipsQuery inputquery = new InputtipsQuery("医院", "福州");
//限制在当前城市
inputquery.setCityLimit(true);
//初始化
Inputtips inputTips = new Inputtips(this, inputquery);
//异步检索
inputTips.requestInputtipsAsyn();
//监听
inputTips.setInputtipsListener(new Inputtips.InputtipsListener() {
@Override
public void onGetInputtips(List<Tip> list, int code) {
if (code == 1000) {
//成功
for (Tip tip : list) {
//完整名词
tip.getName();
//地址
tip.getAddress();
//poiID
tip.getPoiID();
//经纬度
tip.getPoint();
Log.e("TAG", "==>"+tip.getName());
}
}else{
//失败
}
}
});


结果如下

E/TAG: ==>福建医科大学附属协和医院
E/TAG: ==>福州鼓楼医院
E/TAG: ==>福建省第二人民医院东二环院区
E/TAG: ==>福州市人民医院
E/TAG: ==>福建中医药大学附属康复医院
E/TAG: ==>福建中医药大学附属第二人民医院
E/TAG: ==>福州总医院
E/TAG: ==>福建省立医院
E/TAG: ==>福州中医药大学附属福州中医院
E/TAG: ==>福州市第一医院


公交检索

//站点检索
//条件 第一个填公交站点
BusStationQuery busStationQuery = new BusStationQuery("站点", "福州");
//检索初始化
BusStationSearch busStationSearch = new BusStationSearch(this, busStationQuery);
//异步检索
busStationSearch.searchBusStationAsyn();
//监听
busStationSearch.setOnBusStationSearchListener(new BusStationSearch.OnBusStationSearchListener() {
@Override
public void onBusStationSearched(BusStationResult busStationResult, int code) {
if (code == 1000) {
//成功
for (BusStationItem item : busStationResult.getBusStations()) {
//公交车站点名称
item.getBusStationName();
//公交车站点经纬度
item.getLatLonPoint();
//公交车站点ID
item.getBusStationId();
//公交车站点路过的全部线路
item.getBusLineItems();
Log.e("TAG", "==>"+item.getBusStationName());
for (BusLineItem busLineItem : item.getBusLineItems()) {
//公交线路名称
busLineItem.getBusLineName();
Log.e("TAG", "line==>"+busLineItem.getBusLineName());
}
}
}else{
//失败
}
}
});

//线路查询,第二个参数 BY_LINE_NAME 和 BY_LINE_ID两个参数,名称查询可以模糊查询 id查询就是精确查询
BusLineQuery query = new BusLineQuery("K1", BusLineQuery.SearchType.BY_LINE_NAME,"福州");
//初始化检索
BusLineSearch search = new BusLineSearch(this,query);
//异步检索
search.searchBusLineAsyn();
//监听
search.setOnBusLineSearchListener(new BusLineSearch.OnBusLineSearchListener() {
@Override
public void onBusLineSearched(BusLineResult busLineResult, int code) {
if (code == 1000) {
//成功
for (BusLineItem busLineItem : busLineResult.getBusLines()) {
//线路名称
busLineItem.getBusLineName();
//线路id
busLineItem.getBusLineId();
//线路站点
busLineItem.getBusStations();
Log.e("TAG",busLineItem.getBusLineName());
Log.e("TAG", "=>"+busLineItem.getBusStations().size());
}
}else{
//失败
}
}
});


模糊查找K1结果如下

E/TAG: K1路(火车站北广场--福州东南眼科医院金山新院)
E/TAG: =>28
E/TAG: K1路(福州东南眼科医院金山新院--火车站北广场)
E/TAG: =>28
E/TAG: 平潭K1路(区管委会--海关)
E/TAG: =>7
E/TAG: 平潭K1路(海关--区管委会)
E/TAG: =>7
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: