欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  技术分享

Android百度地图高仿微信发送位置定位及所在位置功能

程序员文章站 2022-02-07 12:24:38
...

公司项目需要一个发生活圈的功能、就想着用百度地图的poi搜索去做、这2天试着模仿了微信给好友发送位置功能、然后通过在地图上定位、poi搜索出附近的地址、这样的体验相比直接罗列出附近的地址体验稍稍要好一点、我在实现这个功能的时候、遇到一些困难、可能也是别人将会遇到的困难


1、在微信发送位置功能中、不管用户如何拖拽地图、总有个覆盖物固定了MapView*、怎么实现?

其实这很容易实现、只要MapView的布局文件中、将一个ImageView覆盖在MapView的*、就能够实现不管用户如何拖拽地图、覆盖物(ImageView)总固定总MapView*


2、如何获取MapView*的地理坐标、也即是屏幕覆盖物处的坐标?

要获取MapView*的地理坐标、首先先获取覆盖物在屏幕上的物理坐标、这里得区别一下地理坐标(经纬度)和物理坐标(xy轴)、可以通过view plaincopy、来获取物理坐标、这个物理坐标是不变的、而物理坐标对应的地理坐标却是随着用户拖拽地图而改变、所以、当我们需要地理坐标时、可以通过以下代码

currentLatLng = mBaiduMap.getProjection().fromScreenLocation(mCenterPoint); //获取


3、如何获取该地理坐标周围的所有poi信息(也就是周围建筑物的信息)、而不只是某个类型的兴趣点?

为了实现这个功能、真是费了我好大劲、因为我之前一直以为用POI周边搜索实现的、有人提示我可以通过循环轴线搜索实现不同关键字搜索、但这样子确实很难实现跟微信那样的效果

通过查看API、发现可以通过反地理编码解决这个问题、至于什么事反地理编码、可以到百度地图官网了解、通过调用它、可以返回一个该地理坐标附近建筑信息的一个列表


4、当用户拖拽地图、如何让列表更新到目前中心地理位置的周边信息?

这个困难其实也不难实现、只是重写mBaiduMap.setOnMapTouchListener(touchListener);触摸事件、在触摸监听器的回调函数中、将MapView*的物理坐标转换成对应的地理坐标、再通过反地理编码获取周边信息、道理同问题3


5、当点击listview某一项时、如何将项地理位置显示在MapView也就是屏幕*?

很简单、通过listview的适配器获取item的位置信息、包括经纬度、然后用动画跳转到屏幕*位置即可


上面5个问题是实现这个功能的关键所在、只是解决了这5个问题、想怎么改就怎么改咯、下面是整个Demo的运行效果图

Android百度地图高仿微信发送位置定位及所在位置功能


定位代码

public void locate() {
    BaiduMapUtilByRacer.locateByBaiduMap(mContext, 2000,
        new LocateListener() {

            @Override
            public void onLocateSucceed(LocationBean locationBean) {
                mLocationBean = locationBean;
                if (mMarker != null) {
                    mMarker.remove();
                } else {
                    mBaiduMap.clear();
                }
                mMarker = BaiduMapUtilByRacer.showMarkerByResource(
                        locationBean.getLatitude(),
                        locationBean.getLongitude(), R.drawable.point,
                        mBaiduMap, 0, true);
            }

            @Override
            public void onLocateFiled() {

            }

            @Override
            public void onLocating() {

            }
        });
    }


poi搜索代码

public void getPoiByPoiSearch() {
    BaiduMapUtilByRacer.getPoiByPoiSearch(mLocationBean.getCity(),
        etMLCityPoi.getText().toString().trim(), 0,
        new PoiSearchListener() {

            @Override
            public void onGetSucceed(List<LocationBean> locationList,
                    PoiResult res) {
                if (etMLCityPoi.getText().toString().trim().length() > 0) {
                    if (searchPoiList == null) {
                        searchPoiList = new ArrayList<LocationBean>();
                    }
                    searchPoiList.clear();
                    searchPoiList.addAll(locationList);
                    updateCityPoiListAdapter();
                }
            }

            @Override
            public void onGetFailed() {
                Toast.makeText(mContext, "抱歉,未能找到结果",
                        Toast.LENGTH_SHORT).show();
            }
        });
}


反Geo搜索代码

public void reverseGeoCode(LatLng ll, final boolean isShowTextView) {
    BaiduMapUtilByRacer.getPoisByGeoCode(ll.latitude, ll.longitude,
        new GeoCodePoiListener() {

            @Override
            public void onGetSucceed(LocationBean locationBean,
                    List<PoiInfo> poiList) {
                mLocationBean = (LocationBean) locationBean.clone();
                Toast.makeText(
                        mContext,
                        mLocationBean.getProvince()   "-"
                                  mLocationBean.getCity()   "-"
                                  mLocationBean.getDistrict()   "-"
                                  mLocationBean.getStreet()   "-"
                                  mLocationBean.getStreetNum(),
                        Toast.LENGTH_SHORT).show();
                // mBaiduMap.setMapStatus(MapStatusUpdateFactory
                // .newLatLng(new LatLng(locationBean
                // .getLatitude(), locationBean
                // .getLongitude())));
                if (isShowTextView) {
                    tvShowLocation.setText(locationBean.getLocName());
                }
                if (aroundPoiList == null) {
                    aroundPoiList = new ArrayList<PoiInfo>();
                }
                aroundPoiList.clear();
                if (poiList != null) {
                    aroundPoiList.addAll(poiList);
                } else {
                    Toast.makeText(mContext, "該周邊沒有熱點",
                            Toast.LENGTH_SHORT).show();
                }
                updatePoiListAdapter(aroundPoiList, -1);
            }

            @Override
            public void onGetFailed() {
                Toast.makeText(mContext, "抱歉,未能找到结果",
                        Toast.LENGTH_SHORT).show();
            }
        });
}


下载的源代码可以直接使用、但是一定要自己申请百度key、也可以直接安装包里面的apk体验一下

百度地图Android sdk高仿微信发送位置功能代码下载链接: 仿微信发送位置 密码: xeb9