您的位置:首页 > 其它

添加自定义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();
}
}


效果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息