添加自定义POI标注
2016-07-16 18:54
537 查看
导入
高德地图兴趣点搜索中,如果使用如下方法展示POI位置PoiOverlay poiOverlay = new PoiOverlay(aMap, poiItems); poiOverlay.removeFromMap(); poiOverlay.addToMap(); poiOverlay.zoomToSpan();
其效果,如下图所示
可以标注距离的相对远近就好了。
下面是高德地图APP的搜索情况:
下面咱们就探究一下,高德地图标注POI相对距离&&点击后变色的实现方法。
分步讲解
1.关于高德地图搜索不明白的同学,请参考高德地图搜索
2.上图的红色图标可以从官方地图Demo中获取
红色标注1,对应的图片是poi_marker_1.png,没有选中的图片,咱们统一使用下面的图标poi_marker_pressed.png
1.声明两个变量,标记用户上一次点击的Marker,用于恢复该Marker的图标到未选中状态
Marker lastCheckedMarker; ArrayList<BitmapDescriptor> lastCheckedBitmapDescriptorList;
2.标记查询结果POI
for (int j = 0; j < Math.min(poiItems.size(), 10); j++) { //1.通过图片名称字符串,获取对应的resId. String iconName = "poi_marker_" + (j + 1); int iconId = getResources().getIdentifier(iconName, "drawable", this.getPackageName()); //创建markerOptions对象 MarkerOptions markerOptions = new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(iconId)); markerOptions.position(new LatLng(poiItems.get(j).getLatLonPoint().getLatitude(), poiItems.get(j) .getLatLonPoint().getLongitude())); //添加Marker Marker marker = aMap.addMarker(markerOptions); //默认选中第一个,保存该Marker信息 if (j == 0) { lastCheckedMarker = marker; lastCheckedBitmapDescriptorList = lastCheckedMarker.getIcons(); ArrayList<BitmapDescriptor> bitmapDescriptorArrayList = new ArrayList<>(); bitmapDescriptorArrayList.add(BitmapDescriptorFactory.fromResource(R.drawable.poi_marker_pressed)); marker.setIcons(bitmapDescriptorArrayList); } }
3.用户点击Marker时,恢复上一个Marker的图标&&设置当前Marker的图标
@Override public boolean onMarkerClick(Marker marker) { //恢复上一个Marker的图标 lastCheckedMarker.setIcons(lastCheckedBitmapDescriptorList); //保存当前marker未选中时的图标 lastCheckedBitmapDescriptorList = marker.getIcons(); //保存Marker lastCheckedMarker = marker; //设置当前Marker选中时的图标 ArrayList<BitmapDescriptor> bitmapDescriptorArrayList = new ArrayList<>(); bitmapDescriptorArrayList.add(BitmapDescriptorFactory.fromResource(R.drawable.poi_marker_pressed)); marker.setIcons(bitmapDescriptorArrayList); return false; }
完整代码
package com.pansoft.oilgas.gaodenavigation; import android.app.Activity; import android.os.Bundle; import com.amap.api.maps.AMap; import com.amap.api.maps.CameraUpdateFactory; 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.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.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.poisearch.PoiSearch.Query; import com.amap.api.services.poisearch.PoiSearch.SearchBound; import java.util.ArrayList; import java.util.List; public class SecondActivity extends Activity implements PoiSearch.OnPoiSearchListener, AMap.OnMarkerClickListener { MapView mapView; AMap aMap; Marker lastCheckedMarker; ArrayList<BitmapDescriptor> lastCheckedBitmapDescriptorList; @Override public boolean onMarkerClick(Marker marker) { lastCheckedMarker.setIcons(lastCheckedBitmapDescriptorList); lastCheckedBitmapDescriptorList = marker.getIcons(); lastCheckedMarker = marker; ArrayList<BitmapDescriptor> bitmapDescriptorArrayList = new ArrayList<>(); bitmapDescriptorArrayList.add(BitmapDescriptorFactory.fromResource(R.drawable.poi_marker_pressed)); marker.setIcons(bitmapDescriptorArrayList); return false; } Query query = null; PoiResult poiResult = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mapView = new MapView(this); setContentView(mapView); mapView.onCreate(savedInstanceState); aMap = mapView.getMap(); aMap.setOnMarkerClickListener(this); //poi search int currentPage = 0; LatLng latLng = new LatLng(36.672262, 117.136 ); // 第一个参数表示搜索字符串,第二个参数表示POI搜索类型二选其一 // 第三个参数表示POI搜索区域的编码,必设 query = new Query("", "加油站", "济南"); query.setPageSize(10);// 设置每页最多返回多少条poiitem query.setPageNum(currentPage);// 设置查第一页 PoiSearch poiSearch = new PoiSearch(this, query); //boundary search //设置搜索的范围 poiSearch.setBound(new SearchBound( new LatLonPoint(latLng.latitude, latLng.longitude), 20000)); poiSearch.setOnPoiSearchListener(this); poiSearch.searchPOIAsyn(); } @Override public void onPoiItemSearched(PoiItem arg0, int arg1) { } public void onPoiSearched(PoiResult result, int rCode) { // 搜索POI的结果 if (result != null && result.getQuery() != null) { // 是否是同一条 if (result.getQuery().equals(query)) { poiResult = result; // 取得搜索到的poi items有多少页 int resultPages = poiResult.getPageCount(); // 取得第一页的poiitem数据,页数从数字0开始 List<PoiItem> poiItems = poiResult.getPois(); if (poiItems != null && poiItems.size() > 0) { LatLngBounds.Builder boundsBuilder = new LatLngBounds.Builder(); for (int j = 0; j < Math.min(poiItems.size(), 10); j++) { //1.通过图片名称字符串,获取对应的resId. String iconName = "poi_marker_" + (j + 1); int iconId = getResources().getIdentifier(iconName, "drawable", this.getPackageName()); MarkerOptions markerOptions = new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(iconId)); markerOptions.position(new LatLng(poiItems.get(j).getLatLonPoint().getLatitude(), poiItems.get(j) .getLatLonPoint().getLongitude())); Marker marker = aMap.addMarker(markerOptions); //为了POI填充整个地图区域 boundsBuilder.include(new LatLng(poiItems.get(j).getLatLonPoint().getLatitude(), poiItems.get(j) .getLatLonPoint().getLongitude())); if (j == 0) { lastCheckedMarker = marker; lastCheckedBitmapDescriptorList = lastCheckedMarker.getIcons(); ArrayList<BitmapDescriptor> bitmapDescriptorArrayList = new ArrayList<>(); bitmapDescriptorArrayList.add(BitmapDescriptorFactory.fromResource(R.drawable.poi_marker_pressed)); marker.setIcons(bitmapDescriptorArrayList); } } LatLngBounds bounds = boundsBuilder.build(); // 移动地图,所有marker自适应显示。LatLngBounds与地图边缘10像素的填充区域 aMap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 10)); } else { // 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息 List<SuggestionCity> suggestionCities = poiResult .getSearchSuggestionCitys(); } } } } @Override protected void onResume() { super.onResume(); mapView.onResume(); } @Override protected void onPause() { super.onPause(); mapView.onPause(); } @Override protected void onDestroy() { super.onDestroy(); mapView.onDestroy(); } }
效果如下:
相关文章推荐
- jquery计算鼠标和指定元素之间距离的方法
- PHP根据两点间的经纬度计算距离
- PHP查询附近的人及其距离的实现方法
- Android SDK 百度地图通过poi城市内检索简介接口的使用
- Android实现带列表的地图POI周边搜索功能
- Android百度地图poi范围搜索
- Android 百度地图POI搜索功能实例代码
- Java使用poi操作excel实例解析
- Java 使用poi把数据库中数据导入Excel的解决方法
- Java编程获取经纬度之间距离的方法
- java使用POI读取properties文件并写到Excel的方法
- java使用poi读取ppt文件和poi读取excel、word示例
- Java中使用Apache POI读取word文件简单示例
- POI WORD
- 利用POI实现Word和 Html互转(可以实现在线预览)
- POI封装二:导出 Export
- iOS 高德地图(-)(基础篇)