Obtenga una lista de información de las calles circundantes según la latitud y longitud, y existe un método de búsqueda
/**
* 检索
* */
public void setSearchApi(Double wei, Double jing) {
mList.clear();
myAdapter.notifyDataSetChanged();
PoiSearch.Query query = new PoiSearch.Query("", "", "");
query.setPageSize(20);
PoiSearch search = new PoiSearch(this, query);
search.setBound(new PoiSearch.SearchBound(new LatLonPoint(wei, jing), 10000));
search.setOnPoiSearchListener(this);
search.searchPOIAsyn();
//up
}
Entre ellos, PoiSearch.Query query = new PoiSearch.Query("", "", ""); es la condición de recuperación, el primer parámetro es la palabra clave de búsqueda y el segundo parámetro es el tipo de búsqueda (hay 20 tipos en total, consulte el formulario a continuación)
servicios de auto | venta de coches | reparación de autos | servicio de motos | Servicios de banquetería |
servicio de compras | Servicios domésticos | Servicios deportivos y de ocio | servicios de atención médica | servicio de alojamiento |
sitios turísticos famosos | alojamiento de negocios | Agencias gubernamentales y grupos sociales. | Servicios científicos, educativos y culturales. | Servicio de instalaciones de transporte. |
Servicio de seguros financieros | Compañía | instalaciones auxiliares de carretera | Información sobre el nombre del lugar y la dirección | utilidades Publicas |
El tercer parámetro es la ciudad de búsqueda, que es un parámetro obligatorio. Se debe ingresar al menos una palabra clave y un tipo. query.setPageSize(20); es para establecer el número máximo de elementos devueltos por página.
y luego la devolución de llamada
@Override
public void onPoiSearched(PoiResult result, int i) {
PoiSearch.Query query = result.getQuery();
ArrayList<PoiItem> pois = result.getPois();
for (PoiItem poi : pois) {
Log.e("fanhuidepois",
"\ngetAdCode" + poi.getAdCode() +
"\ngetAdName" + poi.getAdName() +
"\ngetBusinessArea" + poi.getBusinessArea() +
"\ngetCityCode" + poi.getCityCode() +
"\ngetCityName" + poi.getCityName()+
"\ngetDirection"+poi.getDirection()+
"\ngetEmail"+poi.getEmail()+
"\ngetParkingType"+poi.getParkingType()+
"\ngetPoiId"+poi.getPoiId()+
"\ngetPostcode"+poi.getPostcode()+
"\ngetProvinceCode"+poi.getProvinceCode()+
"\ngetProvinceName"+poi.getProvinceName()+
"\ngetShopID"+poi.getShopID()+
"\ngetSnippet"+poi.getSnippet()+
"\ngetTel"+poi.getTel()+
"\ngetTitle"+poi.getTitle()+
"\ngetTypeCode"+poi.getTypeCode()+
"\ngetTypeDes"+poi.getTypeDes()+
"\ngetWebsite"+poi.getWebsite()+
"\ngetDistance"+poi.getDistance()+
"\ngetEnter"+poi.getEnter()+
"\ngetExit"+poi.getExit()+
"\ngetIndoorData"+poi.getIndoorData()+
"\ngetLatLonPoint"+poi.getLatLonPoint()+
"\ngetPhotos"+poi.getPhotos()+
"\ngetPoiExtension"+poi.getPoiExtension()+
"\ngetSubPois"+poi.getSubPois()+
"\n");
String name = poi.getCityName();//北京市
String city = poi.getAdName();//海淀区
String area = poi.getBusinessArea();//清河
String snippet = poi.getSnippet();//街道地址
String detail=poi.getTitle();
LocationInfo info = new LocationInfo();
info.setAddress(detail);
info.setAddress2(name+city+area+snippet);
LatLonPoint point = poi.getLatLonPoint();
info.setLatitude(point.getLatitude());
info.setLonTitude(point.getLongitude());
mList.add(info);
}
myAdapter.notifyDataSetChanged();
}
He registrado toda la información y los datos devueltos. Consúltelos usted mismo y obtenga los datos que necesita.
Luego muestra los datos en una lista.
/**
* 显示周边街道列表
*/
public void setShowList() {
mList = new ArrayList<>();
myAdapter = new MyAdapter(this, mList);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerview.setLayoutManager(layoutManager);
recyclerview.setAdapter(myAdapter);
myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
@Override
public void onClick(int position) {
Toast.makeText(MainActivity.this, "\n地址" + mList.get(position).getAddress()
+ "\n纬度" + mList.get(position).getLatitude()
+ "\n经度" + mList.get(position).getLonTitude(), Toast.LENGTH_SHORT).show();
}
});
}
El efecto anterior se puede lograr aquí y todos los códigos se pegan a continuación. Si no lo comprende, puede echar un vistazo:
Clase de información de ubicación
/**
* Created by
*/
public class LocationInfo {
private String address;
private String address2;
private Double Latitude;
private Double LonTitude;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getAddress2() {
return address2;
}
public void setAddress2(String address2) {
this.address2 = address2;
}
public Double getLatitude() {
return Latitude;
}
public void setLatitude(Double latitude) {
Latitude = latitude;
}
public Double getLonTitude() {
return LonTitude;
}
public void setLonTitude(Double lonTitude) {
LonTitude = lonTitude;
}
}
Clase de actividad principal
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.Toast;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps.AMap;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.LocationSource;
import com.amap.api.maps.MapView;
import com.amap.api.maps.UiSettings;
import com.amap.api.maps.model.CameraPosition;
import com.amap.api.maps.model.LatLng;
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.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class MainActivity extends AppCompatActivity implements LocationSource, AMapLocationListener, PoiSearch.OnPoiSearchListener {
//AMap是地图对象
private AMap aMap;
private MapView mapView;
//声明AMapLocationClient类对象,定位发起端
private AMapLocationClient mLocationClient = null;
//声明mLocationOption对象,定位参数
public AMapLocationClientOption mLocationOption = null;
//声明mListener对象,定位监听器
private OnLocationChangedListener mListener = null;
//标识,用于判断是否只显示一次定位信息和用户重新定位
private boolean isFirstLoc = true;
private MyAdapter myAdapter;
private List<LocationInfo> mList;
private RecyclerView recyclerview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerview = findViewById(R.id.recyclerview);
//获取地图控件引用
mapView = (MapView) findViewById(R.id.map);
//在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),实现地图生命周期管理
mapView.onCreate(savedInstanceState);
if (aMap == null) {
aMap = mapView.getMap();
//设置显示定位按钮 并且可以点击
UiSettings settings = aMap.getUiSettings();
aMap.setLocationSource(this);//设置了定位的监听
// 是否显示定位按钮
settings.setMyLocationButtonEnabled(true);
aMap.setMyLocationEnabled(true);//显示定位层并且可以触发定位,默认是flase
}
//开始定位
location();
setMapListener();
setShowList();
}
/**
* 地图滑动监听
* */
public void setMapListener() {
aMap.setOnCameraChangeListener(new AMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition cameraPosition) {
}
@Override
public void onCameraChangeFinish(CameraPosition cameraPosition) {
Log.e("fanhuionFinish", "\n纬度" + cameraPosition.target.latitude
+ "\n经度" + cameraPosition.target.longitude
+ "\n" + cameraPosition.toString());
setSearchApi(cameraPosition.target.latitude, cameraPosition.target.longitude);
}
});
}
/**
* 显示周边街道列表
*/
public void setShowList() {
mList = new ArrayList<>();
myAdapter = new MyAdapter(this, mList);
LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerview.setLayoutManager(layoutManager);
recyclerview.setAdapter(myAdapter);
myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
@Override
public void onClick(int position) {
Toast.makeText(MainActivity.this, "\n地址" + mList.get(position).getAddress()
+ "\n纬度" + mList.get(position).getLatitude()
+ "\n经度" + mList.get(position).getLonTitude(), Toast.LENGTH_SHORT).show();
}
});
}
/**
* 检索
* */
public void setSearchApi(Double wei, Double jing) {
mList.clear();
myAdapter.notifyDataSetChanged();
PoiSearch.Query query = new PoiSearch.Query("", "地名地址信息", "");
query.setPageSize(20);
PoiSearch search = new PoiSearch(this, query);
search.setBound(new PoiSearch.SearchBound(new LatLonPoint(wei, jing), 10000));
search.setOnPoiSearchListener(this);
search.searchPOIAsyn();
//up
}
private void location() {
//初始化定位
mLocationClient = new AMapLocationClient(getApplicationContext());
//设置定位回调监听
mLocationClient.setLocationListener(this);
//初始化定位参数
mLocationOption = new AMapLocationClientOption();
//设置定位模式为Hight_Accuracy高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置是否返回地址信息(默认返回地址信息)
mLocationOption.setNeedAddress(true);
//设置是否只定位一次,默认为false
mLocationOption.setOnceLocation(false);
//设置是否强制刷新WIFI,默认为强制刷新
mLocationOption.setWifiActiveScan(true);
//设置是否允许模拟位置,默认为false,不允许模拟位置
mLocationOption.setMockEnable(false);
//设置定位间隔,单位毫秒,默认为2000ms
mLocationOption.setInterval(2000);
//给定位客户端对象设置定位参数
mLocationClient.setLocationOption(mLocationOption);
//启动定位
mLocationClient.startLocation();
}
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mapView.onDestroy();
mLocationClient.stopLocation();//停止定位
mLocationClient.onDestroy();//销毁定位客户端。
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView.onResume (),实现地图生命周期管理
mapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView.onPause (),实现地图生命周期管理
mapView.onPause();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),实现地图生命周期管理
mapView.onSaveInstanceState(outState);
}
@Override
public void onLocationChanged(AMapLocation aMapLocation) {
if (aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
//定位成功回调信息,设置相关消息
aMapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见官方定位类型表
aMapLocation.getLatitude();//获取纬度
aMapLocation.getLongitude();//获取经度
aMapLocation.getAccuracy();//获取精度信息
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(aMapLocation.getTime());
df.format(date);//定位时间
aMapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
aMapLocation.getCountry();//国家信息
aMapLocation.getProvince();//省信息
aMapLocation.getCity();//城市信息
aMapLocation.getDistrict();//城区信息
aMapLocation.getStreet();//街道信息
aMapLocation.getStreetNum();//街道门牌号信息
aMapLocation.getCityCode();//城市编码
aMapLocation.getAdCode();//地区编码
// 如果不设置标志位,此时再拖动地图时,它会不断将地图移动到当前的位置
if (isFirstLoc) {
setSearchApi(aMapLocation.getLatitude(), aMapLocation.getLongitude());
//设置缩放级别
aMap.moveCamera(CameraUpdateFactory.zoomTo(17));
//将地图移动到定位点
aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude())));
//点击定位按钮 能够将地图的中心移动到定位点
mListener.onLocationChanged(aMapLocation);
//添加图钉
// aMap.addMarker(getMarkerOptions(amapLocation));
//获取定位信息
StringBuffer buffer = new StringBuffer();
buffer.append(aMapLocation.getCountry() + ""
+ aMapLocation.getProvince() + ""
+ aMapLocation.getCity() + ""
+ aMapLocation.getProvince() + ""
+ aMapLocation.getDistrict() + ""
+ aMapLocation.getStreet() + ""
+ aMapLocation.getStreetNum());
Toast.makeText(getApplicationContext(), buffer.toString(), Toast.LENGTH_LONG).show();
isFirstLoc = false;
}
} else {
//显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
Log.e("AmapError", "location Error, ErrCode:"
+ aMapLocation.getErrorCode() + ", errInfo:"
+ aMapLocation.getErrorInfo());
Toast.makeText(getApplicationContext(), "定位失败", Toast.LENGTH_LONG).show();
}
}
}
@Override
public void onPoiSearched(PoiResult result, int i) {
PoiSearch.Query query = result.getQuery();
ArrayList<PoiItem> pois = result.getPois();
for (PoiItem poi : pois) {
Log.e("fanhuidepois",
"\ngetAdCode" + poi.getAdCode() +
"\ngetAdName" + poi.getAdName() +
"\ngetBusinessArea" + poi.getBusinessArea() +
"\ngetCityCode" + poi.getCityCode() +
"\ngetCityName" + poi.getCityName()+
"\ngetDirection"+poi.getDirection()+
"\ngetEmail"+poi.getEmail()+
"\ngetParkingType"+poi.getParkingType()+
"\ngetPoiId"+poi.getPoiId()+
"\ngetPostcode"+poi.getPostcode()+
"\ngetProvinceCode"+poi.getProvinceCode()+
"\ngetProvinceName"+poi.getProvinceName()+
"\ngetShopID"+poi.getShopID()+
"\ngetSnippet"+poi.getSnippet()+
"\ngetTel"+poi.getTel()+
"\ngetTitle"+poi.getTitle()+
"\ngetTypeCode"+poi.getTypeCode()+
"\ngetTypeDes"+poi.getTypeDes()+
"\ngetWebsite"+poi.getWebsite()+
"\ngetDistance"+poi.getDistance()+
"\ngetEnter"+poi.getEnter()+
"\ngetExit"+poi.getExit()+
"\ngetIndoorData"+poi.getIndoorData()+
"\ngetLatLonPoint"+poi.getLatLonPoint()+
"\ngetPhotos"+poi.getPhotos()+
"\ngetPoiExtension"+poi.getPoiExtension()+
"\ngetSubPois"+poi.getSubPois()+
"\n");
String name = poi.getCityName();//北京市
String city = poi.getAdName();//海淀区
String area = poi.getBusinessArea();//清河
String snippet = poi.getSnippet();//街道地址
String detail=poi.getTitle();
LocationInfo info = new LocationInfo();
info.setAddress(detail);
info.setAddress2(name+city+area+snippet);
LatLonPoint point = poi.getLatLonPoint();
info.setLatitude(point.getLatitude());
info.setLonTitude(point.getLongitude());
mList.add(info);
}
myAdapter.notifyDataSetChanged();
}
@Override
public void onPoiItemSearched(PoiItem poiItem, int i) {
}
@Override
public void activate(OnLocationChangedListener onLocationChangedListener) {
mListener = onLocationChangedListener;
}
@Override
public void deactivate() {
mListener = null;
}
}
Si lo necesita, puede descargar el código fuente https://download.csdn.net/download/lanrenxiaowen/10817328