高德地图
2018年03月28日 19:04:32阅读数:105
MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void map(View view) {
Intent intent = new Intent(this,MapActivity.class);
startActivity(intent);
}
public void poi(View view) {
Intent intent = new Intent(this,PoiActivity.class);
startActivity(intent);
}
public void locate(View view) {
Intent intent = new Intent(this,LocateActivity.class);
startActivity(intent);
}
}
MainActivity的布局;
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.dell.gaodeditu_dome.MainActivity">
<Button
android:onClick="map"
android:text="展示地图"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:onClick="poi"
android:text="poi检索"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:onClick="locate"
android:text="定位"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
MapActivity:
public class MapActivity extends AppCompatActivity {
private MapView mMapView;
private AMap aMap;
private MyLocationStyle myLocationStyle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.map);
//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图
mMapView.onCreate(savedInstanceState);
if (aMap == null) {
aMap = mMapView.getMap();
}
myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
myLocationStyle.interval(2000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。
aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
//aMap.getUiSettings().setMyLocationButtonEnabled(true);设置默认定位按钮是否显示,非必需设置。
aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
mMapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
mMapView.onSaveInstanceState(outState);
}
//地图模式可选类型:MAP_TYPE_NORMAL,MAP_TYPE_SATELLITE,MAP_TYPE_NIGHT
//aMap.setMapType(AMap.MAP_TYPE_SATELLITE);// 卫星地图模式
public void normal(View view) {
aMap.setMapType(AMap.MAP_TYPE_NORMAL);// 普通地图模式
}
public void weiXing(View view) {
aMap.setMapType(AMap.MAP_TYPE_SATELLITE);// 卫星地图模式
}
public void night(View view) {
aMap.setMapType(AMap.MAP_TYPE_NIGHT);// 夜间地图模式
}
boolean flag = false;
public void luKuang(View view) {
if (flag){
aMap.setTrafficEnabled(true);// 显示实时交通状况
flag = false;
}else {
aMap.setTrafficEnabled(false);
flag = true;
}
}
}
MapActivity布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context="com.example.dell.gaodeditu_dome.MapActivity">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:onClick="normal"
android:text="普通"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content" />
<Button
android:onClick="weiXing"
android:text="卫星"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content" />
<Button
android:onClick="night"
android:text="夜间"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content" />
<Button
android:onClick="luKuang"
android:text="路况"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content" />
</LinearLayout>
<com.amap.api.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
PoiActivity:
public class PoiActivity extends AppCompatActivity implements PoiSearch.OnPoiSearchListener, AMap.OnMyLocationChangeListener{
private MapView mMapView;
private MyLocationStyle myLocationStyle;
private AMap aMap;
private EditText mSearchText;
private String keyWord;
private int currentPage;//页数
private PoiSearch.Query query;
private PoiSearch poiSearch;
private LatLonPoint lp;// = new LatLonPoint(39.993743, 116.472995);// 116.472995,39.993743
private PoiResult poiResult;
private ArrayList<PoiItem> poiItems;
private RelativeLayout mPoiDetail;
private Marker mlastMarker;
private myPoiOverlay poiOverlay;// poi图层
private Location location;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_poi);
mSearchText = findViewById(R.id.edit_text);
mPoiDetail = (RelativeLayout) findViewById(R.id.poi_detail);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.map);
//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图
mMapView.onCreate(savedInstanceState);
if (aMap == null) {
aMap = mMapView.getMap();
}
myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW);
myLocationStyle.interval(2000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。
aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
//aMap.getUiSettings().setMyLocationButtonEnabled(true);设置默认定位按钮是否显示,非必需设置。
aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。
aMap.setOnMyLocationChangeListener(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
mMapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
mMapView.onSaveInstanceState(outState);
}
/**
* 搜搜的点击事件
* @param view
*/
public void souSuo(View view) {
doSearchQuery();
}
protected void doSearchQuery() {
keyWord = mSearchText.getText().toString().trim();
currentPage = 0;
query = new PoiSearch.Query(keyWord, "", "");// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
query.setPageSize(20);// 设置每页最多返回多少条poiitem
query.setPageNum(currentPage);// 设置查第一页
if (location != null){
lp = new LatLonPoint(location.getLatitude(),location.getLongitude());//经纬度
if (lp != null) {
poiSearch = new PoiSearch(this, query);
//搜索的监听
poiSearch.setOnPoiSearchListener(this);
//lp表示坐标对象,经纬度构建的一个对象
poiSearch.setBound(new PoiSearch.SearchBound(lp, 5000, true));//
// 设置搜索区域为以lp点为圆心,其周围5000米范围
poiSearch.searchPOIAsyn();// 异步搜索
}
}
}
/**
* 搜索到之后的操作在这个方法里面处理
* @param
*/
@Override
public void onPoiSearched(PoiResult result, int rcode) {
if (rcode == AMapException.CODE_AMAP_SUCCESS) {
if (result != null && result.getQuery() != null) {// 搜索poi的结果
if (result.getQuery().equals(query)) {// 是否是同一条
poiResult = result;
poiItems = poiResult.getPois();// 取得第一页的poiitem数据,页数从数字0开始
List<SuggestionCity> suggestionCities = poiResult
.getSearchSuggestionCitys();// 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息
if (poiItems != null && poiItems.size() > 0) {
//清除POI信息显示
whetherToShowDetailInfo(false);
//并还原点击marker样式
if (mlastMarker != null) {
resetlastmarker();
}
//清理之前搜索结果的marker
if (poiOverlay !=null) {
poiOverlay.removeFromMap();
}
aMap.clear();
poiOverlay = new myPoiOverlay(aMap, poiItems);
poiOverlay.addToMap();
poiOverlay.zoomToSpan();
aMap.addMarker(new MarkerOptions()
.anchor(0.5f, 0.5f)
.icon(BitmapDescriptorFactory
.fromBitmap(BitmapFactory.decodeResource(
getResources(), R.drawable.point4)))
.position(new LatLng(lp.getLatitude(), lp.getLongitude())));
aMap.addCircle(new CircleOptions()
.center(new LatLng(lp.getLatitude(),
lp.getLongitude())).radius(5000)
.strokeColor(Color.BLUE)
.fillColor(Color.argb(50, 1, 1, 1))
.strokeWidth(2));
} else if (suggestionCities != null
&& suggestionCities.size() > 0) {
showSuggestCity(suggestionCities);
} else {
//吐司
}
}
} else {
//吐司
}
} else {
//吐司
}
}
/**
* poi没有搜索到数据,返回一些推荐城市的信息
*/
private void showSuggestCity(List<SuggestionCity> cities) {
String infomation = "推荐城市\n";
for (int i = 0; i < cities.size(); i++) {
infomation += "城市名称:" + cities.get(i).getCityName() + "城市区号:"
+ cities.get(i).getCityCode() + "城市编码:"
+ cities.get(i).getAdCode() + "\n";
}
//吐司
}
@Override
public void onPoiItemSearched(PoiItem poiItem, int i) {
}
private void whetherToShowDetailInfo(boolean isToShow) {
if (isToShow) {
mPoiDetail.setVisibility(View.VISIBLE);
} else {
mPoiDetail.setVisibility(View.GONE);
}
}
private int[] markers = {R.drawable.poi_marker_1,
R.drawable.poi_marker_2,
R.drawable.poi_marker_3,
R.drawable.poi_marker_4,
R.drawable.poi_marker_5,
R.drawable.poi_marker_6,
R.drawable.poi_marker_7,
R.drawable.poi_marker_8,
R.drawable.poi_marker_9,
R.drawable.poi_marker_10
};
// 将之前被点击的marker置为原来的状态
private void resetlastmarker() {
int index = poiOverlay.getPoiIndex(mlastMarker);
if (index < 10) {
mlastMarker.setIcon(BitmapDescriptorFactory
.fromBitmap(BitmapFactory.decodeResource(
getResources(),
markers[index])));
}else {
mlastMarker.setIcon(BitmapDescriptorFactory.fromBitmap(
BitmapFactory.decodeResource(getResources(), R.drawable.marker_other_highlight)));
}
mlastMarker = null;
}
@Override
public void onMyLocationChange(Location location) {
this.location = location;
}
/**
* 自定义PoiOverlay
*
*/
private class myPoiOverlay {
private AMap mamap;
private List<PoiItem> mPois;
private ArrayList<Marker> mPoiMarks = new ArrayList<Marker>();
public myPoiOverlay(AMap amap ,List<PoiItem> pois) {
mamap = amap;
mPois = pois;
}
/**
* 添加Marker到地图中。
* @since V2.1.0
*/
public void addToMap() {
for (int i = 0; i < mPois.size(); i++) {
Marker marker = mamap.addMarker(getMarkerOptions(i));
PoiItem item = mPois.get(i);
marker.setObject(item);
mPoiMarks.add(marker);
}
}
/**
* 去掉PoiOverlay上所有的Marker。
*
* @since V2.1.0
*/
public void removeFromMap() {
for (Marker mark : mPoiMarks) {
mark.remove();
}
}
/**
* 移动镜头到当前的视角。
* @since V2.1.0
*/
public void zoomToSpan() {
if (mPois != null && mPois.size() > 0) {
if (mamap == null)
return;
LatLngBounds bounds = getLatLngBounds();
mamap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100));
}
}
private LatLngBounds getLatLngBounds() {
LatLngBounds.Builder b = LatLngBounds.builder();
for (int i = 0; i < mPois.size(); i++) {
b.include(new LatLng(mPois.get(i).getLatLonPoint().getLatitude(),
mPois.get(i).getLatLonPoint().getLongitude()));
}
return b.build();
}
private MarkerOptions getMarkerOptions(int index) {
return new MarkerOptions()
.position(
new LatLng(mPois.get(index).getLatLonPoint()
.getLatitude(), mPois.get(index)
.getLatLonPoint().getLongitude()))
.title(getTitle(index)).snippet(getSnippet(index))
.icon(getBitmapDescriptor(index));
}
protected String getTitle(int index) {
return mPois.get(index).getTitle();
}
protected String getSnippet(int index) {
return mPois.get(index).getSnippet();
}
/**
* 从marker中得到poi在list的位置。
*
* @param marker 一个标记的对象。
* @return 返回该marker对应的poi在list的位置。
* @since V2.1.0
*/
public int getPoiIndex(Marker marker) {
for (int i = 0; i < mPoiMarks.size(); i++) {
if (mPoiMarks.get(i).equals(marker)) {
return i;
}
}
return -1;
}
/**
* 返回第index的poi的信息。
* @param index 第几个poi。
* @return poi的信息。poi对象详见搜索服务模块的基础核心包(com.amap.api.services.core)中的类 <strong><a href="../../../../../../Search/com/amap/api/services/core/PoiItem.html" title="com.amap.api.services.core中的类">PoiItem</a></strong>。
* @since V2.1.0
*/
public PoiItem getPoiItem(int index) {
if (index < 0 || index >= mPois.size()) {
return null;
}
return mPois.get(index);
}
protected BitmapDescriptor getBitmapDescriptor(int arg0) {
if (arg0 < 10) {
BitmapDescriptor icon = BitmapDescriptorFactory.fromBitmap(
BitmapFactory.decodeResource(getResources(), markers[arg0]));
return icon;
}else {
BitmapDescriptor icon = BitmapDescriptorFactory.fromBitmap(
BitmapFactory.decodeResource(getResources(), R.drawable.marker_other_highlight));
return icon;
}
}
}
}
PoiActivity布局:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.dell.gaodeditu_dome.PoiActivity">
<LinearLayout
android:id="@+id/linear"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/edit_text"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content" />
<Button
android:onClick="souSuo"
android:text="搜索"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<com.amap.api.maps.MapView
android:layout_below="@+id/linear"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<RelativeLayout
android:id="@+id/poi_detail"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_alignParentBottom="true"
android:background="@drawable/border_bg"
android:visibility="gone">
<TextView
android:id="@+id/poi_name"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginLeft="12dp"
android:layout_marginStart="12dp"
android:ellipsize="end"
android:gravity="center_vertical"
android:singleLine="true"
android:textColor="#5566b8"
android:textSize="15sp" />
<TextView
android:id="@+id/poi_address"
android:layout_width="wrap_content"
android:layout_height="25dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@id/poi_name"
android:layout_marginLeft="12dp"
android:layout_marginStart="12dp"
android:gravity="center_vertical"
android:singleLine="true"
android:textColor="#333333"
android:textSize="15sp" />
<TextView
android:id="@+id/poi_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@id/poi_address"
android:layout_marginLeft="12dp"
android:layout_marginStart="12dp"
android:gravity="center_vertical"
android:textColor="#333333"
android:textSize="12sp" />
</RelativeLayout>
</RelativeLayout>
LocateActivity:
public class LocateActivity extends AppCompatActivity implements AMapLocationListener {
private AMapLocationClient mLocationClient;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_locate);
textView = findViewById(R.id.text_view);
//1.初始化定位
mLocationClient = new AMapLocationClient(this);
//2.设置定位回调监听
mLocationClient.setLocationListener(this);
//2....2给定位客户端对象设置定位参数
AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
//设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//获取一次定位结果:
mLocationOption.setOnceLocation(true);
//获取最近3s内精度最高的一次定位结果:
mLocationOption.setOnceLocationLatest(true);
mLocationClient.setLocationOption(mLocationOption);
//3.启动定位
mLocationClient.startLocation();
}
@Override
public void onLocationChanged(AMapLocation amapLocation) {
//获取定位的结果
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("经纬度:"+amapLocation.getLatitude()+"--"+amapLocation.getLongitude());
stringBuilder.append("地址:"+amapLocation.getAddress()+"--");
stringBuilder.append("地址:"+amapLocation.getCountry()+"--");
stringBuilder.append("地址:"+amapLocation.getProvince()+"--");
stringBuilder.append("地址:"+amapLocation.getCity()+"--");
stringBuilder.append("地址:"+amapLocation.getDistrict()+"--");
stringBuilder.append("地址:"+amapLocation.getStreet()+"--");
stringBuilder.append("地址:"+amapLocation.getStreetNum()+"--");
textView.setText(stringBuilder.toString());
}
}
LocateActivity布局:
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.dell.gaodeditu_dome.LocateActivity">
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</android.support.constraint.ConstraintLayout>
依赖:
//3D地图so及jar
compile 'com.amap.api:3dmap:latest.integration'
//定位功能
compile 'com.amap.api:location:latest.integration'
//搜索功能
compile 'com.amap.api:search:latest.integration'
ndk {
//设置支持的SO库架构(开发者可以根据需要,选择一个或多个平台的so)
abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86","arm64-v8a","x86_64"
}
权限:
//地图包、搜索包需要的基础权限
<!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!--用于获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用于访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<!--用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!--用于写入缓存数据到扩展存储卡-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!--用于申请调用A-GPS模块-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
<!--用于申请获取蓝牙信息进行室内定位-->
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
<!--配置高德地图的key-->
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="b819f5564a8efb829be58b81a3e44905"/>

MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void map(View view) {
Intent intent = new Intent(this,MapActivity.class);
startActivity(intent);
}
public void poi(View view) {
Intent intent = new Intent(this,PoiActivity.class);
startActivity(intent);
}
public void locate(View view) {
Intent intent = new Intent(this,LocateActivity.class);
startActivity(intent);
}
}
MainActivity的布局;
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.dell.gaodeditu_dome.MainActivity">
<Button
android:onClick="map"
android:text="展示地图"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:onClick="poi"
android:text="poi检索"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:onClick="locate"
android:text="定位"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
MapActivity:
public class MapActivity extends AppCompatActivity {
private MapView mMapView;
private AMap aMap;
private MyLocationStyle myLocationStyle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.map);
//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图
mMapView.onCreate(savedInstanceState);
if (aMap == null) {
aMap = mMapView.getMap();
}
myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
myLocationStyle.interval(2000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。
aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
//aMap.getUiSettings().setMyLocationButtonEnabled(true);设置默认定位按钮是否显示,非必需设置。
aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
mMapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
mMapView.onSaveInstanceState(outState);
}
//地图模式可选类型:MAP_TYPE_NORMAL,MAP_TYPE_SATELLITE,MAP_TYPE_NIGHT
//aMap.setMapType(AMap.MAP_TYPE_SATELLITE);// 卫星地图模式
public void normal(View view) {
aMap.setMapType(AMap.MAP_TYPE_NORMAL);// 普通地图模式
}
public void weiXing(View view) {
aMap.setMapType(AMap.MAP_TYPE_SATELLITE);// 卫星地图模式
}
public void night(View view) {
aMap.setMapType(AMap.MAP_TYPE_NIGHT);// 夜间地图模式
}
boolean flag = false;
public void luKuang(View view) {
if (flag){
aMap.setTrafficEnabled(true);// 显示实时交通状况
flag = false;
}else {
aMap.setTrafficEnabled(false);
flag = true;
}
}
}
MapActivity布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context="com.example.dell.gaodeditu_dome.MapActivity">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:onClick="normal"
android:text="普通"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content" />
<Button
android:onClick="weiXing"
android:text="卫星"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content" />
<Button
android:onClick="night"
android:text="夜间"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content" />
<Button
android:onClick="luKuang"
android:text="路况"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content" />
</LinearLayout>
<com.amap.api.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
PoiActivity:
public class PoiActivity extends AppCompatActivity implements PoiSearch.OnPoiSearchListener, AMap.OnMyLocationChangeListener{
private MapView mMapView;
private MyLocationStyle myLocationStyle;
private AMap aMap;
private EditText mSearchText;
private String keyWord;
private int currentPage;//页数
private PoiSearch.Query query;
private PoiSearch poiSearch;
private LatLonPoint lp;// = new LatLonPoint(39.993743, 116.472995);// 116.472995,39.993743
private PoiResult poiResult;
private ArrayList<PoiItem> poiItems;
private RelativeLayout mPoiDetail;
private Marker mlastMarker;
private myPoiOverlay poiOverlay;// poi图层
private Location location;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_poi);
mSearchText = findViewById(R.id.edit_text);
mPoiDetail = (RelativeLayout) findViewById(R.id.poi_detail);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.map);
//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图
mMapView.onCreate(savedInstanceState);
if (aMap == null) {
aMap = mMapView.getMap();
}
myLocationStyle = new MyLocationStyle();//初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW);
myLocationStyle.interval(2000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。
aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
//aMap.getUiSettings().setMyLocationButtonEnabled(true);设置默认定位按钮是否显示,非必需设置。
aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。
aMap.setOnMyLocationChangeListener(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
mMapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
mMapView.onSaveInstanceState(outState);
}
/**
* 搜搜的点击事件
* @param view
*/
public void souSuo(View view) {
doSearchQuery();
}
protected void doSearchQuery() {
keyWord = mSearchText.getText().toString().trim();
currentPage = 0;
query = new PoiSearch.Query(keyWord, "", "");// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
query.setPageSize(20);// 设置每页最多返回多少条poiitem
query.setPageNum(currentPage);// 设置查第一页
if (location != null){
lp = new LatLonPoint(location.getLatitude(),location.getLongitude());//经纬度
if (lp != null) {
poiSearch = new PoiSearch(this, query);
//搜索的监听
poiSearch.setOnPoiSearchListener(this);
//lp表示坐标对象,经纬度构建的一个对象
poiSearch.setBound(new PoiSearch.SearchBound(lp, 5000, true));//
// 设置搜索区域为以lp点为圆心,其周围5000米范围
poiSearch.searchPOIAsyn();// 异步搜索
}
}
}
/**
* 搜索到之后的操作在这个方法里面处理
* @param
*/
@Override
public void onPoiSearched(PoiResult result, int rcode) {
if (rcode == AMapException.CODE_AMAP_SUCCESS) {
if (result != null && result.getQuery() != null) {// 搜索poi的结果
if (result.getQuery().equals(query)) {// 是否是同一条
poiResult = result;
poiItems = poiResult.getPois();// 取得第一页的poiitem数据,页数从数字0开始
List<SuggestionCity> suggestionCities = poiResult
.getSearchSuggestionCitys();// 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息
if (poiItems != null && poiItems.size() > 0) {
//清除POI信息显示
whetherToShowDetailInfo(false);
//并还原点击marker样式
if (mlastMarker != null) {
resetlastmarker();
}
//清理之前搜索结果的marker
if (poiOverlay !=null) {
poiOverlay.removeFromMap();
}
aMap.clear();
poiOverlay = new myPoiOverlay(aMap, poiItems);
poiOverlay.addToMap();
poiOverlay.zoomToSpan();
aMap.addMarker(new MarkerOptions()
.anchor(0.5f, 0.5f)
.icon(BitmapDescriptorFactory
.fromBitmap(BitmapFactory.decodeResource(
getResources(), R.drawable.point4)))
.position(new LatLng(lp.getLatitude(), lp.getLongitude())));
aMap.addCircle(new CircleOptions()
.center(new LatLng(lp.getLatitude(),
lp.getLongitude())).radius(5000)
.strokeColor(Color.BLUE)
.fillColor(Color.argb(50, 1, 1, 1))
.strokeWidth(2));
} else if (suggestionCities != null
&& suggestionCities.size() > 0) {
showSuggestCity(suggestionCities);
} else {
//吐司
}
}
} else {
//吐司
}
} else {
//吐司
}
}
/**
* poi没有搜索到数据,返回一些推荐城市的信息
*/
private void showSuggestCity(List<SuggestionCity> cities) {
String infomation = "推荐城市\n";
for (int i = 0; i < cities.size(); i++) {
infomation += "城市名称:" + cities.get(i).getCityName() + "城市区号:"
+ cities.get(i).getCityCode() + "城市编码:"
+ cities.get(i).getAdCode() + "\n";
}
//吐司
}
@Override
public void onPoiItemSearched(PoiItem poiItem, int i) {
}
private void whetherToShowDetailInfo(boolean isToShow) {
if (isToShow) {
mPoiDetail.setVisibility(View.VISIBLE);
} else {
mPoiDetail.setVisibility(View.GONE);
}
}
private int[] markers = {R.drawable.poi_marker_1,
R.drawable.poi_marker_2,
R.drawable.poi_marker_3,
R.drawable.poi_marker_4,
R.drawable.poi_marker_5,
R.drawable.poi_marker_6,
R.drawable.poi_marker_7,
R.drawable.poi_marker_8,
R.drawable.poi_marker_9,
R.drawable.poi_marker_10
};
// 将之前被点击的marker置为原来的状态
private void resetlastmarker() {
int index = poiOverlay.getPoiIndex(mlastMarker);
if (index < 10) {
mlastMarker.setIcon(BitmapDescriptorFactory
.fromBitmap(BitmapFactory.decodeResource(
getResources(),
markers[index])));
}else {
mlastMarker.setIcon(BitmapDescriptorFactory.fromBitmap(
BitmapFactory.decodeResource(getResources(), R.drawable.marker_other_highlight)));
}
mlastMarker = null;
}
@Override
public void onMyLocationChange(Location location) {
this.location = location;
}
/**
* 自定义PoiOverlay
*
*/
private class myPoiOverlay {
private AMap mamap;
private List<PoiItem> mPois;
private ArrayList<Marker> mPoiMarks = new ArrayList<Marker>();
public myPoiOverlay(AMap amap ,List<PoiItem> pois) {
mamap = amap;
mPois = pois;
}
/**
* 添加Marker到地图中。
* @since V2.1.0
*/
public void addToMap() {
for (int i = 0; i < mPois.size(); i++) {
Marker marker = mamap.addMarker(getMarkerOptions(i));
PoiItem item = mPois.get(i);
marker.setObject(item);
mPoiMarks.add(marker);
}
}
/**
* 去掉PoiOverlay上所有的Marker。
*
* @since V2.1.0
*/
public void removeFromMap() {
for (Marker mark : mPoiMarks) {
mark.remove();
}
}
/**
* 移动镜头到当前的视角。
* @since V2.1.0
*/
public void zoomToSpan() {
if (mPois != null && mPois.size() > 0) {
if (mamap == null)
return;
LatLngBounds bounds = getLatLngBounds();
mamap.moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 100));
}
}
private LatLngBounds getLatLngBounds() {
LatLngBounds.Builder b = LatLngBounds.builder();
for (int i = 0; i < mPois.size(); i++) {
b.include(new LatLng(mPois.get(i).getLatLonPoint().getLatitude(),
mPois.get(i).getLatLonPoint().getLongitude()));
}
return b.build();
}
private MarkerOptions getMarkerOptions(int index) {
return new MarkerOptions()
.position(
new LatLng(mPois.get(index).getLatLonPoint()
.getLatitude(), mPois.get(index)
.getLatLonPoint().getLongitude()))
.title(getTitle(index)).snippet(getSnippet(index))
.icon(getBitmapDescriptor(index));
}
protected String getTitle(int index) {
return mPois.get(index).getTitle();
}
protected String getSnippet(int index) {
return mPois.get(index).getSnippet();
}
/**
* 从marker中得到poi在list的位置。
*
* @param marker 一个标记的对象。
* @return 返回该marker对应的poi在list的位置。
* @since V2.1.0
*/
public int getPoiIndex(Marker marker) {
for (int i = 0; i < mPoiMarks.size(); i++) {
if (mPoiMarks.get(i).equals(marker)) {
return i;
}
}
return -1;
}
/**
* 返回第index的poi的信息。
* @param index 第几个poi。
* @return poi的信息。poi对象详见搜索服务模块的基础核心包(com.amap.api.services.core)中的类 <strong><a href="../../../../../../Search/com/amap/api/services/core/PoiItem.html" title="com.amap.api.services.core中的类">PoiItem</a></strong>。
* @since V2.1.0
*/
public PoiItem getPoiItem(int index) {
if (index < 0 || index >= mPois.size()) {
return null;
}
return mPois.get(index);
}
protected BitmapDescriptor getBitmapDescriptor(int arg0) {
if (arg0 < 10) {
BitmapDescriptor icon = BitmapDescriptorFactory.fromBitmap(
BitmapFactory.decodeResource(getResources(), markers[arg0]));
return icon;
}else {
BitmapDescriptor icon = BitmapDescriptorFactory.fromBitmap(
BitmapFactory.decodeResource(getResources(), R.drawable.marker_other_highlight));
return icon;
}
}
}
}
PoiActivity布局:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.dell.gaodeditu_dome.PoiActivity">
<LinearLayout
android:id="@+id/linear"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/edit_text"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content" />
<Button
android:onClick="souSuo"
android:text="搜索"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<com.amap.api.maps.MapView
android:layout_below="@+id/linear"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<RelativeLayout
android:id="@+id/poi_detail"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_alignParentBottom="true"
android:background="@drawable/border_bg"
android:visibility="gone">
<TextView
android:id="@+id/poi_name"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginLeft="12dp"
android:layout_marginStart="12dp"
android:ellipsize="end"
android:gravity="center_vertical"
android:singleLine="true"
android:textColor="#5566b8"
android:textSize="15sp" />
<TextView
android:id="@+id/poi_address"
android:layout_width="wrap_content"
android:layout_height="25dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@id/poi_name"
android:layout_marginLeft="12dp"
android:layout_marginStart="12dp"
android:gravity="center_vertical"
android:singleLine="true"
android:textColor="#333333"
android:textSize="15sp" />
<TextView
android:id="@+id/poi_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@id/poi_address"
android:layout_marginLeft="12dp"
android:layout_marginStart="12dp"
android:gravity="center_vertical"
android:textColor="#333333"
android:textSize="12sp" />
</RelativeLayout>
</RelativeLayout>
LocateActivity:
public class LocateActivity extends AppCompatActivity implements AMapLocationListener {
private AMapLocationClient mLocationClient;
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_locate);
textView = findViewById(R.id.text_view);
//1.初始化定位
mLocationClient = new AMapLocationClient(this);
//2.设置定位回调监听
mLocationClient.setLocationListener(this);
//2....2给定位客户端对象设置定位参数
AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
//设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//获取一次定位结果:
mLocationOption.setOnceLocation(true);
//获取最近3s内精度最高的一次定位结果:
mLocationOption.setOnceLocationLatest(true);
mLocationClient.setLocationOption(mLocationOption);
//3.启动定位
mLocationClient.startLocation();
}
@Override
public void onLocationChanged(AMapLocation amapLocation) {
//获取定位的结果
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("经纬度:"+amapLocation.getLatitude()+"--"+amapLocation.getLongitude());
stringBuilder.append("地址:"+amapLocation.getAddress()+"--");
stringBuilder.append("地址:"+amapLocation.getCountry()+"--");
stringBuilder.append("地址:"+amapLocation.getProvince()+"--");
stringBuilder.append("地址:"+amapLocation.getCity()+"--");
stringBuilder.append("地址:"+amapLocation.getDistrict()+"--");
stringBuilder.append("地址:"+amapLocation.getStreet()+"--");
stringBuilder.append("地址:"+amapLocation.getStreetNum()+"--");
textView.setText(stringBuilder.toString());
}
}
LocateActivity布局:
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.dell.gaodeditu_dome.LocateActivity">
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</android.support.constraint.ConstraintLayout>
依赖:
//3D地图so及jar
compile 'com.amap.api:3dmap:latest.integration'
//定位功能
compile 'com.amap.api:location:latest.integration'
//搜索功能
compile 'com.amap.api:search:latest.integration'
ndk {
//设置支持的SO库架构(开发者可以根据需要,选择一个或多个平台的so)
abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86","arm64-v8a","x86_64"
}
权限:
//地图包、搜索包需要的基础权限
<!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!--用于获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用于访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<!--用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!--用于写入缓存数据到扩展存储卡-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!--用于申请调用A-GPS模块-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
<!--用于申请获取蓝牙信息进行室内定位-->
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
<!--配置高德地图的key-->
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="b819f5564a8efb829be58b81a3e44905"/>
