package com.example.gdmap;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps.AMap;
import com.amap.api.maps.AMap.OnMapClickListener;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.LocationSource;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptor;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.CircleOptions;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.LatLngBounds;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.maps.overlay.BusRouteOverlay;
import com.amap.api.maps.overlay.DrivingRouteOverlay;
import com.amap.api.maps.overlay.WalkRouteOverlay;
import com.amap.api.navi.AMapNavi;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.core.PoiItem;
import com.amap.api.services.core.SuggestionCity;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;
import com.amap.api.services.route.BusPath;
import com.amap.api.services.route.BusRouteResult;
import com.amap.api.services.route.DrivePath;
import com.amap.api.services.route.DriveRouteResult;
import com.amap.api.services.route.RouteResult;
import com.amap.api.services.route.RouteSearch;
import com.amap.api.services.route.RouteSearch.BusRouteQuery;
import com.amap.api.services.route.RouteSearch.DriveRouteQuery;
import com.amap.api.services.route.RouteSearch.FromAndTo;
import com.amap.api.services.route.RouteSearch.OnRouteSearchListener;
import com.amap.api.services.route.RouteSearch.WalkRouteQuery;
import com.amap.api.services.route.WalkPath;
import com.amap.api.services.route.WalkRouteResult;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity implements OnMapClickListener,
AMap.OnInfoWindowClickListener,AMap.InfoWindowAdapter,AMap.OnMarkerClickListener,PoiSearch.OnPoiSearchListener, LocationSource, AMapLocationListener, OnRouteSearchListener {
private MapView mapView;
private AMap mAMap;
private PoiResult poiResult;//the result of the poi
private int currentPage = 0;//the page start with 0
private PoiSearch.Query query;//poi query
private Marker detailMarker;
private Marker mlastMarker;
private PoiSearch poiSearch;
private myPoiOverlay poiOverlay;//poi图层
private List<PoiItem> poiItems;//poi数据
private String city;
private RelativeLayout mPoiDetail;
private TextView mPoiName,mPoiAddress;
private Button walkBtn;
private Button busBtn;
private Button driveBtn;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.poi_around_search);
// 基本操作
mapView = (MapView)findViewById(R.id.mapView);
mapView.onCreate(savedInstanceState);
//
init();
}
//AMap对象的初始化
private void init(){
if(mAMap == null){
mAMap = mapView.getMap();
// AMap对象的监事件
mAMap.setLocationSource( MainActivity.this);//设置定位监听
mAMap.setMyLocationEnabled(true);//设置显示定位层,并可以出发定位
mAMap.getUiSettings().setMyLocationButtonEnabled(true);//设置显示定位按 钮
mAMap.setMyLocationType(AMap.LOCATION_TYPE_LOCATE);//设置定位类型
mAMap.setOnMapClickListener(this);
mAMap.setOnMarkerClickListener(this);
mAMap.setOnInfoWindowClickListener(this);
mAMap.setInfoWindowAdapter(this);
routeSearch = new RouteSearch(this);//初始化routeSearch 对象
routeSearch.setRouteSearchListener(this);//设置数据回调监听器
}
setup();
doSearchQuery();
// 显示摄像头的大小
// mAMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lp.getLatitude(),lp.getLongitude()),14));
}
private void setup(){
mPoiDetail = (RelativeLayout)findViewById(R.id.poi_detail);
mPoiDetail.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
}
});
mPoiName =(TextView)findViewById(R.id.poi_name);
mPoiAddress = (TextView)findViewById(R.id.poi_address);
walkBtn=(Button) findViewById(R.id.walk);
driveBtn=(Button) findViewById(R.id.drive);
busBtn=(Button) findViewById(R.id.bus);
driveBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if(wro!=null){
wro.removeFromMap();
}
if(bro!=null){
bro.removeFromMap();
}
if(dro!=null){
dro.removeFromMap();
}
if(detailMarker!=null){
pi=(PoiItem) detailMarker.getObject();
ll=new LatLonPoint(mLocationClient.getLastKnownLocation().getLatitude(), mLocationClient.getLastKnownLocation().getLongitude());
FromAndTo ft=new FromAndTo(ll,pi.getLatLonPoint());
DriveRouteQuery query = new DriveRouteQuery(ft, RouteSearch.DrivingDefault,null,null,null);//初始化query对象,fromAndTo是包含起终点信息,walkMode是不行路径规划的模式
routeSearch.calculateDriveRouteAsyn(query);//开始算路);
Toast.makeText(getApplicationContext(), "query route", Toast.LENGTH_LONG).show();
}
}
});
walkBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Toast.makeText(getApplicationContext(), "button listener", Toast.LENGTH_LONG).show();
if(wro!=null){
wro.removeFromMap();
}
if(bro!=null){
bro.removeFromMap();
}
if(dro!=null){
dro.removeFromMap();
}
QueryRoute();
}
});
busBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "button listener", Toast.LENGTH_LONG).show();
if(bro!=null){
bro.removeFromMap();
}
if(wro!=null){
wro.removeFromMap();
}
if(dro!=null){
dro.removeFromMap();
}
if(detailMarker!=null){
pi=(PoiItem) detailMarker.getObject();
ll=new LatLonPoint(mLocationClient.getLastKnownLocation().getLatitude(), mLocationClient.getLastKnownLocation().getLongitude());
FromAndTo ft=new FromAndTo(ll,pi.getLatLonPoint());
BusRouteQuery query = new BusRouteQuery(ft, RouteSearch.BusDefault,mLocationClient.getLastKnownLocation().getCity(),1);//初始化query对象,fromAndTo是包含起终点信息,walkMode是不行路径规划的模式
routeSearch.calculateBusRouteAsyn(query);//开始算路);
Toast.makeText(getApplicationContext(), "query route", Toast.LENGTH_LONG).show();
}
}
});
// mSearchText = (EditText)findViewById(R.id.input_edittext);
}
PoiItem pi;
LatLonPoint ll;
RouteSearch routeSearch;
// begin poi serch
public void QueryRoute() {
if(detailMarker!=null){
pi=(PoiItem) detailMarker.getObject();
ll=new LatLonPoint(mLocationClient.getLastKnownLocation().getLatitude(), mLocationClient.getLastKnownLocation().getLongitude());
FromAndTo ft=new FromAndTo(ll,pi.getLatLonPoint());
WalkRouteQuery query = new WalkRouteQuery(ft, RouteSearch.WalkDefault);//初始化query对象,fromAndTo是包含起终点信息,walkMode是不行路径规划的模式
routeSearch.calculateWalkRouteAsyn(query);//开始算路);
Toast.makeText(getApplicationContext(), "query route", Toast.LENGTH_LONG).show();
}
}
protected void doSearchQuery(){
//Trim() 函数的功能是去掉首尾空格
// keyWord = mSearchText.getText().toString().trim();
Toast.makeText(getApplicationContext(),city, Toast.LENGTH_LONG).show();
currentPage = 0;
// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
query = new PoiSearch.Query("医院","医疗保健服务",mLocationClient.getLastKnownLocation().getCity());
query.setPageSize(20);//setting how mang itmes to return;
query.setPageNum(currentPage);//setup query the first page;
//if(lp!=null){
poiSearch = new PoiSearch(this,query);
poiSearch.setOnPoiSearchListener(this);
// 设置搜索区域为以lp点为圆心,其周围5000米范围
//poiSearch.setBound(new PoiSearch.SearchBound(lp,5000,true));
poiSearch.searchPOIAsyn();//asyn search
//}
}
@Override
protected void onResume(){
super.onResume();
mapView.onResume();
whetherToShowDetailInfo(false);
}
@Override
protected void onPause(){
super.onPause();
mapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
mapView.onSaveInstanceState(outState);
}
@Override
protected void onDestroy(){
super.onDestroy();
mapView.onDestroy();
}
@Override
public void onPoiItemSearched(PoiItem arg0,int arg1){
}
// 搜索成功时的回调
@Override
public void onPoiSearched(PoiResult result, int rcode){
if(rcode ==1000){
// 检测搜索结果
if(result!=null && result.getQuery()!=null){
// 是否是同一条
if(result.getQuery().equals(query)){
poiResult = result;
poiItems = poiResult.getPois();
// 获取poitem数据
List<SuggestionCity> suggestionCities = poiResult.getSearchSuggestionCitys();
if(poiItems !=null && poiItems.size()>0) {
//清楚POI信息
whetherToShowDetailInfo(false);
// 并还原点击marker样式
if (mlastMarker != null) {
resetlastmarker();
}
// 清除之前的结果marker样式
if (poiOverlay != null) {
poiOverlay.removeFromMap();
}
// 新的marker
mAMap.clear();
poiOverlay = new myPoiOverlay(mAMap, poiItems);
poiOverlay.addToMap();
poiOverlay.zoomToSpan();
/** mAMap.addMarker(new MarkerOptions().anchor(0.5f, 0.5f)
.icon(BitmapDescriptorFactory
.defaultMarker())
//.position(new LatLng(lp.getLatitude(), lp.getLongitude()))
);
//在地图上显示搜索范围圈
/** mAMap.addCircle(new CircleOptions().center(new LatLng(lp.getLatitude(), lp.getLongitude())).radius(5000)
.strokeColor(Color.BLUE)
.fillColor(Color.argb(50, 1, 1, 1))
.strokeWidth(2));**/
}else if (suggestionCities !=null && suggestionCities.size()>0){
showSuggestCity(suggestionCities);
} else {
}
}
}else {
}
}
}
public boolean onMarkerClick(Marker marker) {
if (marker.getObject() != null) {
// 显示相关的位置信息
whetherToShowDetailInfo(true);
try {
PoiItem mCurrentPoi = (PoiItem) marker.getObject();
if (mlastMarker == null) {
mlastMarker = marker;
} else {
// 还原原来的marker
resetlastmarker();
mlastMarker = marker;
}
detailMarker = marker;
// 按下后的显示图标
detailMarker.setIcon(BitmapDescriptorFactory.defaultMarker());
setPoiItemDisplayContent(mCurrentPoi);
} catch (Exception e) {
}
} else {
whetherToShowDetailInfo(false);
resetlastmarker();
}
return true;
}
// 将之前点击的marker还原为原来的状态
private void resetlastmarker() {
int index = poiOverlay.getPoiIndex(mlastMarker);
// 10个以内的marker显示图标
if(index<10){
mlastMarker.setIcon(BitmapDescriptorFactory
.defaultMarker());
}else{
// 大于10个后的marker显示图标信息
mlastMarker.setIcon(BitmapDescriptorFactory.defaultMarker());
}
mlastMarker = null;
}
private void setPoiItemDisplayContent(final PoiItem mCurrentPoi){
mPoiName.setText(mCurrentPoi.getTitle());
mPoiAddress.setText(mCurrentPoi.getSnippet());
}
@Override
public View getInfoContents(Marker arg0){
return null;
}
@Override
public View getInfoWindow(Marker arg0){
return null;
}
@Override
public void onInfoWindowClick(Marker arg0){
}
// @Override
/** public void onClick(View v){
switch (v.getId()) {
case R.id.btn_search:
doSearchQuery("4");
break;
default:
break;
}
}**/
private void whetherToShowDetailInfo(boolean isToShow){
if(isToShow){
mPoiDetail.setVisibility(View.VISIBLE);
}else {
mPoiDetail.setVisibility(View.GONE);
}
}
@Override
public void onMapClick(LatLng arg0){
whetherToShowDetailInfo(false);
if(mlastMarker!=null){
resetlastmarker();
}
}
private void showSuggestCity(List<SuggestionCity> cities){
String infomation = "推荐城市\n";
for(int i = 0;i<cities.size();i++){
infomation += "城市名称:" + cities.get(i).getCityName() + "城市区号:" + cities.get(i).getCityCode() + "城市编码:" + cities.get(i).getAdCode() + "\n";
}
}
//myPoiOverlay类,该类下面有多个方法
private class myPoiOverlay{
private AMap mamap;
private List<PoiItem> mPois;
private ArrayList<Marker> mPoiMarks = new ArrayList<Marker>();
// 构造函数,传进来的是amap对象和查询到的结果itmes mPois
public myPoiOverlay(AMap amap,List<PoiItem>pois){
mamap = amap;
mPois = pois;
}
//增加Maker到地图中
public void addToMap(){
for(int i=0;i<mPois.size();i++){
Marker marker = mamap.addMarker(getMarkerOptions(i));
PoiItem item = mPois.get(i);
marker.setObject(item);
mPoiMarks.add(marker);
}
}
//移除所有的marker
public void removeFromMap(){
for(Marker mark: mPoiMarks){
mark.remove();
}
}
//移动镜头到当前的视角
public void zoomToSpan(){
if(mPois !=null && mPois.size()>0){
if(mamap ==null) return;
LatLngBounds bounds = getLatLngBounds();
// 瞬间移动到目标位置
mamap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds,100));
}
}
private LatLngBounds getLatLngBounds(){
LatLngBounds.Builder b = LatLngBounds.builder();
for(int i=0;i<mPois.size();i++){
b.include(new LatLng(mPois.get(i).getLatLonPoint().getLatitude(),mPois.get(i).getLatLonPoint().getLongitude()));
}
return b.build();
}
private MarkerOptions getMarkerOptions(int index){
return new MarkerOptions()
.position(new LatLng(mPois.get(index).getLatLonPoint()
.getLatitude(),mPois.get(index)
.getLatLonPoint().getLongitude()))
.title(getTitle(index)).snippet(getSnippet(index))
.icon(getBitmapDescriptor(index));
}
protected String getTitle(int index){
return mPois.get(index).getTitle();
}
protected String getSnippet(int index){
return mPois.get(index).getSnippet();
}
//获取位置,第几个index就第几个poi
public int getPoiIndex(Marker marker){
for(int i=0;i<mPoiMarks.size();i++){
if(mPoiMarks.get(i).equals(marker)){
return i;
}
}
return -1;
}
public PoiItem getPoiItem(int index) {
if (index < 0 || index >= mPois.size()) {
return null;
}
return mPois.get(index);
}
protected BitmapDescriptor getBitmapDescriptor(int arg0){
if(arg0<10){
BitmapDescriptor icon = BitmapDescriptorFactory.defaultMarker();
return icon;
}else {
BitmapDescriptor icon = BitmapDescriptorFactory.defaultMarker();
return icon;
}
}
}
OnLocationChangedListener olcl;
AMapLocationClient mLocationClient;
AMapLocationClientOption mLocationClientOption;
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
olcl=onLocationChangedListener ;
if(mLocationClient==null){
Toast.makeText(getApplicationContext(), "activate", Toast.LENGTH_LONG).show();
mLocationClient=new AMapLocationClient(MainActivity.this);
mLocationClientOption=new AMapLocationClientOption();
mLocationClientOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//设置定位模式为 高精度
mLocationClientOption.setInterval(5000);
mLocationClientOption.setWifiActiveScan(true);
mLocationClient.setLocationOption(mLocationClientOption);//设置配置
mLocationClient.setLocationListener(this);//设置位置变化监听
mLocationClient.startLocation();
}
}
@Override
public void deactivate() {
// TODO Auto-generated method stub
}
@Override
public void onLocationChanged(AMapLocation amapLocation) {
// TODO Auto-generated method stub
if(olcl==null) Toast.makeText(getApplicationContext(), "olcl==null", Toast.LENGTH_LONG).show();
if(amapLocation != null
&& olcl!=null){
olcl.onLocationChanged(amapLocation);
city=amapLocation.getCity();
// lp.setLatitude( amapLocation.getLatitude());
// lp.setLatitude(amapLocation.getLongitude());
// if(mLocationClient.getLastKnownLocation().getCity()!=city) doSearchQuery(city);
/** locationMarker = mAMap.addMarker(new MarkerOptions().anchor(0.5f,0.5f).icon(BitmapDescriptorFactory
.defaultMarker()).position(new LatLng(amapLocation.getLatitude(),amapLocation.getLongitude())));
locationMarker.showInfoWindow();**/
// Toast.makeText(getApplicationContext(), "警卫度 " +amapLocation.getLatitude()+" "+amapLocation.getLongitude(), Toast.LENGTH_LONG).show();
}else {
String errText = "定位失败," + amapLocation.getErrorCode()+ ": " + amapLocation.getErrorInfo();
}
}
BusRouteOverlay bro;
@Override
public void onBusRouteSearched(BusRouteResult brr, int arg1) {
// TODO Auto-generated method stub
List<BusPath> bp=brr.getPaths();
BusPath buspath=bp.iterator().next();
bro=new BusRouteOverlay(getApplicationContext(), mAMap, buspath, ll, pi.getLatLonPoint());
bro.setNodeIconVisibility(true);
bro.removeFromMap();
bro.addToMap();
bro.zoomToSpan();
}
DrivingRouteOverlay dro;
@Override
public void onDriveRouteSearched(DriveRouteResult drr, int arg1) {
List<DrivePath> bp=drr.getPaths();
DrivePath buspath=bp.iterator().next();
dro=new DrivingRouteOverlay(getApplicationContext(), mAMap, buspath, ll, pi.getLatLonPoint());
dro.setNodeIconVisibility(true);
dro.removeFromMap();
dro.addToMap();
dro.zoomToSpan();
}
WalkRouteOverlay wro;
@Override
public void onWalkRouteSearched(WalkRouteResult walkRoute, int arg1) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "onWalkRouteSearched", Toast.LENGTH_LONG).show();
List<WalkPath> wp=walkRoute.getPaths();
WalkPath walkpath=wp.iterator().next();
wro=new WalkRouteOverlay(getApplicationContext(), mAMap,walkpath ,ll , pi.getLatLonPoint());
wro.setNodeIconVisibility(false);
wro.removeFromMap();
wro.addToMap();
wro.zoomToSpan();
}
}
高德api 实现定位 marker 路线规划
最新推荐文章于 2024-02-22 23:55:59 发布