使用百度地图SDK进行地址搜索、定位的工作小结
2017-06-24 17:55
507 查看
近期因为需求开发的原因,使用了百度地图SDK,现总结如下:
一、地址搜索页面
很多同学一上来就会想到使用SuggestionSearch类来实现,但是SuggestionSearch的本身含义是搜索联想词,即热词。在其侦听方法setOnGetSuggestionResultListener的回调里:
SuggestionInfo里的key表示地名,如“百度大厦”;pt表示经纬度;但是不包含街牌号等详细地址信息。
所以只能放弃边输入边出现地址列表的交互方式。那该使用什么呢?答曰:PoiSearch。参看滴滴的交互,使用的也是这种方式。
具体使用方法是:
调用的入口有两个:
1.在EditText的TextWatcher的afterTextChanged里;
2.软键盘上“搜索”键的点击事件里。
还有一个入口就是在列表的上拉更多事件里,去获取下一页的数据。
查询结果在回调里返回,具体可参见sdk的demo:
PoiInfo里有我们要的所有数据。
二、当前定位在地图上的显示
有两种实现方式:
1.使用MyLocationData,主要代码如下:
具体可参见sdk的demo。
2.使用Overlay方式,主要代码如下:
具体细节同样参见sdk的demo。
三、当前定位与搜索地址在地图上重合时的展示
此时有两个注意点:
1、当前定位只能和搜索地址一样,都使用Overlay的方式,原因是MyLocationData的方式会使当前定位的zIndex层级最高,显示效果就是当前定位的图标(一般是圆形蓝点图)盖在了搜索地址(一般是锚点锥形图)的图标上面,很不和谐。
2、anchor的用法
OverlayOptions的anchor接受两个0~1.0范围的参数。当都为0.5时,定位图片的中心会对准定位点,对于锥形针状的定位图来说显示效果就不好看。此时就应该调整anchor的y坐标参数值,使得图片的底部对准定位点。如上图效果中,让当前定位的anchor值为(0.5,0.5),让搜索地址的anchor值为x坐标值偏离0.5,如约为0.3。
anchor方法的参数值与图标中心显示位置的关系如下:
四、地图中心点
在页面展示时,我们的当前定位点或者Overlay点都是相对于地图中心点来展示的,而地图中心点默认就是MapView控件布局的中心位置。有时候,为了不遮挡地图中线点的图标显示,我们需要“平移”一下地图中心点。
如图所示,MapView占据了整个屏幕,如果不做任何修改,蓝色图标代表的当前定位会显示在MapView的正中间,这样的话就刚好被“请选择工作商圈”图层给遮挡住。该怎么办呢?
1、首先确定目标位置,如上图,我想让定位显示在地图下方屏幕1/4高度的位置。这样的效果,就需要初始的地图往下平移1/4距离,即原先在屏幕上方1/4高度的点作为新的地图中心点。
计算方法为:
2.通过Projection的fromScreenLocation方法换算出新的中心点的经纬度,然后对地图进行平移操作:
当前定位呢不需要任何做相应改动,正常通过问题二中的两个方式显示就行。
一、地址搜索页面
很多同学一上来就会想到使用SuggestionSearch类来实现,但是SuggestionSearch的本身含义是搜索联想词,即热词。在其侦听方法setOnGetSuggestionResultListener的回调里:
@Override public void onGetSuggestionResult(SuggestionResult res) { if (res == null || res.getAllSuggestions() == null) { return; } sugAdapter.clear(); for (SuggestionResult.SuggestionInfo info : res.getAllSuggestions()) { if (info.key != null) sugAdapter.add(info.key); } sugAdapter.notifyDataSetChanged(); }
SuggestionInfo里的key表示地名,如“百度大厦”;pt表示经纬度;但是不包含街牌号等详细地址信息。
所以只能放弃边输入边出现地址列表的交互方式。那该使用什么呢?答曰:PoiSearch。参看滴滴的交互,使用的也是这种方式。
具体使用方法是:
调用的入口有两个:
1.在EditText的TextWatcher的afterTextChanged里;
2.软键盘上“搜索”键的点击事件里。
还有一个入口就是在列表的上拉更多事件里,去获取下一页的数据。
查询结果在回调里返回,具体可参见sdk的demo:
public void onGetPoiResult(PoiResult result) { ...... List<PoiInfo> poiAddrInfoList = result.getAllPoi(); for(PoiInfo info:poiAddrInfoList){ ...... } }
PoiInfo里有我们要的所有数据。
二、当前定位在地图上的显示
有两种实现方式:
1.使用MyLocationData,主要代码如下:
private void setPersonMarker(LatLng personPoint) { if (null != personPoint) { mBaiduMap.setMyLocationEnabled(true); MyLocationData locData = new MyLocationData.Builder() .latitude(personPoint.latitude) .longitude(personPoint.longitude).build(); mBaiduMap.setMyLocationData(locData); LatLng ll = new LatLng(personPoint.latitude, personPoint.longitude); MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll); mBaiduMap.animateMapStatus(u); mBaiduMap .setMyLocationConfigeration(new MyLocationConfiguration( MyLocationConfiguration.LocationMode.NORMAL, true, mPersonalMarkerBD)); } }
具体可参见sdk的demo。
2.使用Overlay方式,主要代码如下:
LatLng centerPoint = new LatLng(personPoint.latitude, personPoint.longitude); OverlayOptions option = new MarkerOptions() .position(centerPoint) .icon(mPersonalMarkerBD) .zIndex(13)//设置marker所在层级 .anchor(0.5f, 0.5f); mBaiduMap.addOverlay(option);//在地图上添加Marker,并显示
具体细节同样参见sdk的demo。
三、当前定位与搜索地址在地图上重合时的展示
此时有两个注意点:
1、当前定位只能和搜索地址一样,都使用Overlay的方式,原因是MyLocationData的方式会使当前定位的zIndex层级最高,显示效果就是当前定位的图标(一般是圆形蓝点图)盖在了搜索地址(一般是锚点锥形图)的图标上面,很不和谐。
2、anchor的用法
OverlayOptions的anchor接受两个0~1.0范围的参数。当都为0.5时,定位图片的中心会对准定位点,对于锥形针状的定位图来说显示效果就不好看。此时就应该调整anchor的y坐标参数值,使得图片的底部对准定位点。如上图效果中,让当前定位的anchor值为(0.5,0.5),让搜索地址的anchor值为x坐标值偏离0.5,如约为0.3。
anchor方法的参数值与图标中心显示位置的关系如下:
四、地图中心点
在页面展示时,我们的当前定位点或者Overlay点都是相对于地图中心点来展示的,而地图中心点默认就是MapView控件布局的中心位置。有时候,为了不遮挡地图中线点的图标显示,我们需要“平移”一下地图中心点。
如图所示,MapView占据了整个屏幕,如果不做任何修改,蓝色图标代表的当前定位会显示在MapView的正中间,这样的话就刚好被“请选择工作商圈”图层给遮挡住。该怎么办呢?
1、首先确定目标位置,如上图,我想让定位显示在地图下方屏幕1/4高度的位置。这样的效果,就需要初始的地图往下平移1/4距离,即原先在屏幕上方1/4高度的点作为新的地图中心点。
计算方法为:
private Point mMapCenter; DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int centerX = (int) Math.round(dm.widthPixels * 0.5); int centerY = (int) Math.round(dm.heightPixels * 0.25); mMapCenter = new Point(centerX, centerY);
2.通过Projection的fromScreenLocation方法换算出新的中心点的经纬度,然后对地图进行平移操作:
private void setMapCenterPoint() { if (mBaiduMap == null) { return; } LatLng centerPoint = null; Projection projection = mBaiduMap.getProjection();//getProjection()必须在OnMapLoadedCallback.onMapLoaded回调之后执行,否则会为空 if (null != projection) { centerPoint = projection.fromScreenLocation(mMapCenter); } if (centerPoint == null) { return; } MapStatus mMapStatus = new MapStatus.Builder()//定义地图状态 .target(centerPoint) .build(); //定义MapStatusUpdate对象,以便描述地图状态将要发生的变化 MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus); mBaiduMap.setMapStatus(mMapStatusUpdate);//改变地图状态 }
mBaiduMap.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() { @Override public void onMapLoaded() { setMapCenterPoint(); } });
当前定位呢不需要任何做相应改动,正常通过问题二中的两个方式显示就行。
相关文章推荐
- 使用Nominatim进行openstreetmap地址搜索/解析
- mapkit中使用Google Geocoding API来进行搜索定位
- 使用百度地图进行区域搜索与定位
- 使用百度地图进行区域搜索与定位
- Python---对html文件内容进行搜索取出特定URL地址字符串,保存成列表,并使用每个url下载图片,并保存到硬盘上,使用bs4,beautifulsoup模块
- 使用jquery简单实现腾讯地图的地址搜索定位功能
- Python---对html文件内容进行搜索取出特定URL地址字符串,保存成列表,并使用每个url下载图片,并保存到硬盘上,使用正则re
- PB如何使用Microsoft VSS2005进行协同工作
- 教你如何使用Google进行搜索
- 使用nutch进行搜索代码
- XML文档搜索使用小结
- XML文档搜索使用小结
- XML文档搜索使用小结
- 使用CRectTracker类进行对象动态定位
- 使用ORACLE TEXT进行文本搜索
- 写了一个自动搜索特征码来定位地址的DLL,附带VB调用源代码
- ASP中FSO的神奇功能 - 使用FSO进行搜索
- 枚举进程(2)——利用EPROCESS/PEB地址特征进行内存搜索
- 教你如何使用Google进行搜索
- 使用spotligh+sqltuning+loadrunner对数据库性能问题进行定位和分析