package com.android.mapdemo;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdate;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.UiSettings;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
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.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import overlay.PoiOverlay;
/**
* 创建人: 汪勇奇
* 创建时间:2018/8/28.
* 文件说明:
* 开发平台:https://lbs.amap.com/
* 开发指南:https://lbs.amap.com/api/android-sdk/guide/map-data/poi/
* 地点查询API: https://lbs.amap.com/dev/demo/place-search#Android
* 注意:地图SDK V4.1.3版本开始,SDK不再提供 com.amap.api.maps.overlay 包下的overlay,已在官方demo中进行开源
*
* 注意:需要在配置文件中声明自己在高德后台申请的key,配置好key之后就可以看到效果了
*/
public class MainActivity extends AppCompatActivity implements PoiSearch.OnPoiSearchListener {
// 地图
private AMap mMap = null;
// 地图控件
private MapView mapView = null;
// 底部视图
private LinearLayout llBottom;
// 位置标记
private Marker mMarker;
// 当前位置
private LatLng mLatLng;
// 图标集合
private Map<String, Bitmap> bitmapMap = new HashMap<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 经纬度(深圳)
mLatLng = new LatLng(22.5607099, 114.1144903);
// 地图控件
mapView = findViewById(R.id.map_view);
// 此方法必须重写
mapView.onCreate(savedInstanceState);
mMap = mapView.getMap();
// 是否显示实时交通状况
mMap.setTrafficEnabled(false);
// 卫星地图模式,地图模式可选类型:MAP_TYPE_NORMAL(正常),MAP_TYPE_SATELLITE(卫星),MAP_TYPE_NIGHT(夜晚)
mMap.setMapType(AMap.MAP_TYPE_NORMAL);
// 移动到指定位置
CameraUpdate location = CameraUpdateFactory.newLatLng(mLatLng);
CameraUpdate zoom = CameraUpdateFactory.zoomTo(15);
mMap.moveCamera(location);
mMap.animateCamera(zoom);
// AMap的UI界面是由UiSettings来控制的
UiSettings uiSettings = mMap.getUiSettings();
// 隐藏logo
uiSettings.setLogoBottomMargin(-100);
// 隐藏缩放控件
uiSettings.setZoomControlsEnabled(false);
// 添加当前标记
addCurMarker();
// 添加底部视图
llBottom = findViewById(R.id.ll_bottom);
updateBottomView(-1);
}
/**
* 添加当前位置的标记
*/
private void addCurMarker() {
// 添加标记,draggable默认不允许被拖拽
MarkerOptions options = new MarkerOptions()
.position(mLatLng)
.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory
.decodeResource(getResources(), R.drawable.navi_along_search_default_big)))
.draggable(false);
mMarker = mMap.addMarker(options);
}
/**
* 更新底部视图
*
* @param position 选择位置
*/
private void updateBottomView(final int position) {
List<Map<String, Object>> list = MapBottomData.getListData();
if (list != null && list.size() > 0) {
// 移除所有视图
llBottom.removeAllViews();
// 获取屏幕宽度
WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics dm = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(dm);
final int screenWidth = dm.widthPixels;
// 循环添加视图
for (int i = 0; i < list.size(); i++) {
final Map<String, Object> map = list.get(i);
View view = LayoutInflater.from(this).inflate(R.layout.item_map_bottom, null);
final ImageView ivIcon = view.findViewById(R.id.iv_icon);
final TextView tvLabel = view.findViewById(R.id.tv_label);
tvLabel.setText(MapBottomData.getStringValue(map, "label_name"));
String categoryCode = MapBottomData.getStringValue(map, "category_code");
if (!bitmapMap.containsKey(categoryCode)) {
bitmapMap.put(categoryCode, BitmapFactory
.decodeResource(getResources(), MapBottomData.getIntValue(map, "marker_res_id")));
}
if (position == i) {
// 选中
ivIcon.setImageResource(MapBottomData.getIntValue(map, "icon_selected"));
tvLabel.setTextColor(Color.parseColor("#1976D2"));
// 搜索查询,并添加地图标记
doSearchQuery(categoryCode);
} else {
// 默认
ivIcon.setImageResource(MapBottomData.getIntValue(map, "icon_normal"));
tvLabel.setTextColor(Color.BLACK);
}
// 设置标记
view.setTag(i);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (v.getTag() instanceof Integer) {
int index = (Integer) v.getTag();
if (position != index) {
updateBottomView(index);
}
}
}
});
view.setMinimumWidth(screenWidth / 4);
llBottom.addView(view);
}
}
}
/**
* 地图搜索查询
*
* @param category
*/
private void doSearchQuery(String category) {
/**
* 第一个参数表示搜索字符串,
* 第二个参数表示POI搜索类型,二者选填其一,选用POI搜索类型时建议填写类型代码
* 第三个参数表示POI搜索区域,可以是城市编码也可以是城市名称,也可以传空字符串,空字符串代表全国在全国范围内进行搜索
* new PoiSearch.Query(QueryString, Category, City);
* 1852:代号,香港特别行政区
*/
PoiSearch.Query query = new PoiSearch.Query("", category, "0755");
// 设置每页最多返回多少条poiItem
query.setPageSize(30);
// 设置查第一页
query.setPageNum(0);
// 对获取结果进行严格城市限制
query.setCityLimit(true);
// 定义搜索对象
PoiSearch poiSearch = new PoiSearch(this, query);
// 设置搜索监听
poiSearch.setOnPoiSearchListener(this);
// 设置搜索的范围