对地图的基本操作,标注地址,公交步行驾车路线搜索,附近搜索,反编译地址,屏幕坐标与地图经纬度的转换等(2)

秘钥申请以及地图的显示可以参考百度地图的秘钥申请与sdk下载,显示地图(1)  ,该功能也是接着这个开始的

需要的工具包如下:(下载的百度地图sdk里包含的)

功能:显示标注:

public class MainActivity extends AppCompatActivity {

    private MapView mMapView = null;
    private BaiduMap mBaiduMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在使用SDK各组件之前初始化context信息,传入ApplicationContext,注意该方法要再setContentView方法之前实现
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        //获取xml布局文件地图控件的引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();//获取地图实例

        //定义Maker坐标点
        LatLng point = new LatLng(39.963175, 116.400244);//纬度,经度
        //构建Marker图标
        BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
        //构建MarkerOption设置参数,用于在地图上添加Marker(标志)
        OverlayOptions option = new MarkerOptions()
                .position(point)  //设置参数
                .icon(bitmap);//设置图片
        //在地图上添加Marker(标注),并显示
        mBaiduMap.addOverlay(option);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();
    }
    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        mMapView.onPause();
    }
}

删除指定标注物:

// 在地图上添加Marker(标注),并显示
addOverlay = mBaiduMap.addOverlay(option2);


if(addOverlay != null){
   addOverlay.remove();//删除上次的标注物    其实就是添加标注物时利用返回值进行删除
}

百度地图使用指南:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/retrieval

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.workspace.my.baidumaptest.MainActivity">

    <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" />
</RelativeLayout>

效果图:

其他设置:

 //获取地图view
        mMapView = (MapView) findViewById(R.id.bmapView);
        //获得MapView中的BaiduMap对象
        mBaiduMap = mMapView.getMap();
        //普通地图(默认)
//        mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
        //卫星视图
//          mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
         ////空白地图, 基础地图瓦片将不会被渲染。在地图类型中设置为NONE,将不会使用流量下载基础地图瓦片图层。使用场景:与瓦片图层一起使用,节省流量,提升自定义瓦片图下载速度。
//        mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);

        //开启交通图
//        mBaiduMap.setTrafficEnabled(true);

        //开热力图
        mBaiduMap.setBaiduHeatMapEnabled(true);

公交,步行,驾车路线查询,附近POI查询,工程目录

 代码见云盘

或者: http://www.cnblogs.com/fangg/p/5987245.html

反编译

public class MainActivity extends AppCompatActivity {

    private MapView mMapView;

    private BaiduMap mBaiduMap;
    private GeoCoder mSearch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();
        //第一步,创建地理编码检索实例
        mSearch = GeoCoder.newInstance();
        //第二步,创建地理编码检索监听者;
        OnGetGeoCoderResultListener listener = new OnGetGeoCoderResultListener() {
            public void onGetGeoCodeResult(GeoCodeResult result) {
                if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
                    //没有检索到结果
                    Log.i("tag", "同向编码--没有获取到");
                }
                //获取地理编码结果
                Log.i("tag", "纬度:"+result.getLocation().latitude+",经度:"+result.getLocation().longitude);
            }

            @Override
            public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
                if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
                    //没有找到检索结果
                    Log.i("tag", "反向编码--没有获取到");
                }
                //获取反向地理编码结果
                Log.i("tag", "根据经纬度获取的位置:"+result.getAddress());
            }
        };
        //第三步,设置地理编码检索监听者
        mSearch.setOnGetGeoCodeResultListener(listener);

        //通过位置获取经纬度
        //mSearch.geocode(new GeoCodeOption().city("北京").address("海淀区上地十街10号"));
        //通过经纬度获取地址
        mSearch.reverseGeoCode(new ReverseGeoCodeOption().location(new LatLng(26.209164,111.612552)));

        // mSearch.destroy();释放地理编码检索实例,放到监听到结果结束后
    }
}

屏幕坐标与地图中经纬度的转换:

//滑动监听
        mBaiduMap.setOnMapStatusChangeListener(new OnMapStatusChangeListener() {

            @Override
            public void onMapStatusChangeStart(MapStatus arg0) {
                //开始滑动
            }

            @Override
            public void onMapStatusChangeFinish(MapStatus arg0) {
                //滑动完成后调用      arg0.getMapStatus().tagget  获取地图的中心点坐标(可以跟下面的经纬度对比下,没测试)
                mBaiduMap.clear();// 清除标注
                android.graphics.Point pt = new android.graphics.Point();
                //获取地图控件的中心坐标(相对于地图控件)
                pt.x = mMapView.getWidth() / 2;
                pt.y = mMapView.getHeight() / 2;
                // 得到经纬度   将坐标值转换成地图中的经纬度
                LatLng fromScreenLocation = mBaiduMap.getProjection().fromScreenLocation(pt);
                
                //通过经纬度转换成相对屏幕的坐标
                //android.graphics.Point screenLocation = mBaiduMap.getProjection().toScreenLocation(fromScreenLocation);
                
                // 构建Marker图标
                BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);
                // 构建MarkerOption设置参数,用于在地图上添加Marker(标志)
                OverlayOptions option = new MarkerOptions().position(
                        fromScreenLocation) // 设置参数
                        .icon(bitmap);// 设置图片
                // 在地图上添加Marker(标注),并显示
                mBaiduMap.addOverlay(option);

                // 通过位置获取经纬度
                // mSearch.geocode(new
                // GeoCodeOption().city("北京").address("海淀区上地十街10号"));
                // 通过经纬度获取地址
                mSearch.reverseGeoCode(new ReverseGeoCodeOption()
                        .location(fromScreenLocation));

            }

            @Override
            public void onMapStatusChange(MapStatus arg0) {
                // TODO Auto-generated method stub

            }
        });

 POI检索与建议搜索: 需要OverlayManager.java  与  PoiOverlay.java 这两个类(上面所说的工具类中)

/**
     * 初始化数据与设置(POI检索与建议搜索)
     */
    private void initData() {
        //设置适配器
        dataList = new ArrayList<PoiInfo>();
        dataList.add(currentPoiInfo);
        resultAdapter = new ResultAdapter();
        listView.setAdapter(resultAdapter);
        
        // 初始化POI搜索模块,注册搜索事件监听
        mPoiSearch = PoiSearch.newInstance();
        mPoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
            @Override
            public void onGetPoiResult(PoiResult poiResult) {
                if (poiResult == null || poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
                    T.showS("未找到结果");
                    return;
                }
                if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {
                    //创建覆盖物对象
                    /*mBaiduMap.clear();
                    myPoiOverlay = new MyPoiOverlay(mBaiduMap);
                    myPoiOverlay.setData(poiResult);
                    myPoiOverlay.addToMap();
                    myPoiOverlay.zoomToSpan();
                    //给poi的结果设置点击事件,点击marker后弹出详情页
                    mBaiduMap.setOnMarkerClickListener(myPoiOverlay);*/
                    List<PoiInfo> allPoi = poiResult.getAllPoi();
                    dataList.addAll(allPoi);//将poi的搜索结果添加到集合
                    resultAdapter.notifyDataSetChanged();
                    return;
                }
                if (poiResult.error == SearchResult.ERRORNO.AMBIGUOUS_KEYWORD) {
                    // 当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表
                    for (CityInfo cityInfo : poiResult.getSuggestCityList()) {
                        if (poiResult.getSuggestCityList().size() == 1) {
                            mPoiSearch.searchInCity((new PoiCitySearchOption()).city(cityInfo.city)
                                    .keyword(et_keyword.getText().toString()).pageNum(10));
                        } else {
                            T.showS("未找到结果");
                        }
                    }

                }
            }
            
            @Override
            public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
                 if (poiDetailResult.error != SearchResult.ERRORNO.NO_ERROR) {
                       Toast.makeText(SearchAddressActivity.this, "抱歉,未找到结果",0).show();
                 } else {
                        //获取详情页的请求结果
                        String detailUrl = poiDetailResult.getDetailUrl();
                        //得到当前经纬度
                        Log.i("tag", "获取poi检索请求结果:name=" +  poiDetailResult.getName() + ",地址="
                                + poiDetailResult.getAddress() +",经纬度对象="+poiDetailResult.getLocation());
                        Toast.makeText(SearchAddressActivity.this, detailUrl, 0).show();
                  }
            }

            @Override
            public void onGetPoiIndoorResult(PoiIndoorResult arg0) {
                
            }
        });
        
        
        //初始化建议搜索模块,注册建议搜索事件监听
        mSuggestionSearch = SuggestionSearch.newInstance();
        mSuggestionSearch.setOnGetSuggestionResultListener(new OnGetSuggestionResultListener() {
            @Override
            public void onGetSuggestionResult(SuggestionResult res) {
                if (res == null || res.getAllSuggestions() == null) {
                    return;
                }
                for (SuggestionResult.SuggestionInfo info : res.getAllSuggestions()) {
                    if (info.key != null) {
                        Log.i("tag", "地址="+info.key
                                +",城市="+info.city+",区域="+info.district);
                        //info.district 区域
                        //info.pt 经纬度
                    }
                }
            }
        });
        //编辑框的监听
        et_keyword.addTextChangedListener(new TextWatcher() {
            
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if(s.length() >0){
                    //poi检索
                    mPoiSearch.searchInCity((new PoiCitySearchOption()).city(CommNames.CITY).keyword(s.toString()).pageNum(10));
                }
                dataList.removeAll(dataList);
                dataList.add(currentPoiInfo);
                resultAdapter.notifyDataSetChanged();
                
                /**
                 * 使用建议搜索服务获取建议列表,结果在onSuggestionResult()中更新
                 */
                mSuggestionSearch.requestSuggestion((new SuggestionSearchOption()).keyword(s.toString()).city(""));
                
            }
            
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                
            }
            
            @Override
            public void afterTextChanged(Editable s) {
            }
        });
        //listview的单击事件
        listView.setOnItemClickListener(new OnItemClickListener() {

            private Overlay addOverlay;

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                if(addOverlay != null){
                    addOverlay.remove();//删除上次的标注物
                }
                PoiInfo poiInfo = dataList.get(position);
                LatLng location = poiInfo.location;
                // 构建Marker图标
                BitmapDescriptor bitmap2 = BitmapDescriptorFactory.fromResource(R.drawable.icon_address);
                OverlayOptions option2 = new MarkerOptions().position(location) // 设置参数
                        .icon(bitmap2);// 设置图片
                // 在地图上添加Marker(标注),并显示
                addOverlay = mBaiduMap.addOverlay(option2);
                //显示到定位点
                // 将地图显示到定位的地方
                MapStatus mapStatus = new MapStatus.Builder().target(location).build();
                mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(mapStatus));
                
            }
        });
        
    }

 画运动轨迹与路线规划http://www.jianshu.com/p/2ad4c2077dfd

 百度地图提供的判断某点是否在圆内与多边形内


 

posted @ 2016-09-14 16:37  ts-android  阅读(231)  评论(0编辑  收藏  举报