一、概述
这章我们学习如何获取地图的数据,POI数据,地址查询,公交站点查询,行政区域数据,天气情况等
二、本章内容
--- POI数据
--- 地址查询
--- 公交站点查询
--- 行政区域数据查询(行政范围)
--- 天气数据
1.POI数据获取
POI 即 point of interest,要获取POI数据我们需要使用到这几个类
PoiSearch搜索,PoiSearch.Query查询条件,PoiResult查询结果
//这里 keyWord 搜索的关键词,“050000”是搜索类型不清楚的可以在高德地图
//上查找有很多,cityCode代表城市ID
query = new PoiSearch.Query(keyWord, "050000", cityCode);
// 设置每页最多返回多少条poiitem
query.setPageSize(20);
// 设置查第一页
query.setPageNum(currentPage);
poiSearch = new PoiSearch(getActivity(), query);
//实现查询poi数据回调监听方法
poiSearch.setOnPoiSearchListener(this);
poiSearch.searchPOIAsyn();
首先我们需要设置查询条件,PoiSearch.Query 构造方法第一个参数为 搜索关键字,第二个参数为POI类别编码,第三个参数为城市编码
不设置POI的类别,默认返回“餐饮服务”、“商务住宅”、“生活服务”这三种类别的POI,其中POI编码下载地址 http://a.amap.com/lbs/static/zip/AMap_poicode.zip
还可以设置检索范围
//设置周边搜索的中心点以及半径
poiSearch.setBound(new SearchBound(new LatLonPoint(locationMarker.getPosition().latitude,
locationMarker.getPosition().longitude), 1000));
除此外,还有多边形检索POI,ID检索POI,道路沿途检索POI,这里我使用的不多,就不再这里详细讲解,感兴趣可以到官网上去研究一下,大致使用方法都差不多。
同时,我们需要实现查询结果的回调方法
@Override
public void onPoiSearched(PoiResult poiResult, int i) {
//搜索回调方法。回来的数据全在 poiResult中
this.poiResult = poiResult;
maxPages = poiResult.getPageCount();
Log.e("CF", "onPoiSearched: " + maxPages);
ArrayList<PoiItem> data = poiResult.getPois();
// PoiItem pi = data.get(0);
// //编码
// Log.e("CF", "onPoiSearched: " + pi.getAdCode());
// //区域名字
// Log.e("CF", "onPoiSearched: " + pi.getAdName());
// //商业街区名称
// Log.e("CF", "onPoiSearched: " + pi.getBusinessArea());
// //城市代码
// Log.e("CF", "onPoiSearched: " + pi.getCityCode());
// //所在城市名称
// Log.e("CF", "onPoiSearched: " + pi.getCityName());
// //嗯。。。母鸡啊
// Log.e("CF", "onPoiSearched: " + pi.getDirection());
// //邮箱地址
// Log.e("CF", "onPoiSearched: " + pi.getEmail());
// //停车场类型
// Log.e("CF", "onPoiSearched: " + pi.getParkingType());
// //唯一id
// Log.e("CF", "onPoiSearched: " + pi.getPoiId());
// //额。。。
// Log.e("CF", "onPoiSearched: " + pi.getPostcode());
// //省份代码
// Log.e("CF", "onPoiSearched: " + pi.getProvinceCode());
// //省份名称
// Log.e("CF", "onPoiSearched: " + pi.getProvinceName());
// //额。。。
// Log.e("CF", "onPoiSearched: " + pi.getShopID());
// //详细地址
// Log.e("CF", "onPoiSearched: " + pi.getSnippet());
// //联系电话
// Log.e("CF", "onPoiSearched: " + pi.getTel());
// //店名
// Log.e("CF", "onPoiSearched: " + pi.getTitle());
// //POI类型编码
// Log.e("CF", "onPoiSearched: " + pi.getTypeCode());
// //POI描述,标签
// Log.e("CF", "onPoiSearched: " + pi.getTypeDes());
// //网站
// Log.e("CF", "onPoiSearched: " + pi.getWebsite());
// //距离
// Log.e("CF", "onPoiSearched: " + pi.getDistance());
// //经纬度
// Log.e("CF", "onPoiSearched: " + pi.getLatLonPoint().getLatitude() +
// " --- " + pi.getLatLonPoint().getLongitude());
}
@Override
public void onPoiItemSearched(PoiItem poiItem, int i) {
}
2.地址描述数据查询
地理位置查询用到 GeocodeSearch,GeocodeQuery,GeocodeResult等类,从名字上我们可以看出跟POI的几个类比较相似,实际上用法也差不多。
GeocodeSearch gs = new GeocodeSearch(getActivity());
gs.setOnGeocodeSearchListener(this);
GeocodeQuery gq = new GeocodeQuery(addressStr, cityStr);
gs.getFromLocationNameAsyn(gq);
//实现查询结果的回调方法
@Override
public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {
}
@Override
public void onGeocodeSearched(GeocodeResult geocodeResult, int i) {
Log.e("CF", "onGeocodeSearched: " + i);
data = null;
data = geocodeResult.getGeocodeAddressList();
}
GeocodeQuery构造方法中第一个参数为查询的地址(如:xxx街xx号),第二个参数为查询城市(城市名称,城市ID,城市全拼都可以)
此外还需要注意一点,在高德地图中存在坐标转换问题,如果所有的数据来自与高德地图内,那么高德地图都使用火星坐标,即不用转换。但是如果你的经纬度数据来自于定位设备(如:GPS采集的)那么需要进行坐标转换,要将GPS坐标转化为高德地图中的火星坐标才能用。
不过在地址查询时,高德地图给我们提供了经纬度查询的类型
// 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200,GeocodeSearch.AMAP);
geocoderSearch.getFromLocationAsyn(query);
//使用这个方法查询,那么结果会在下面的方法中
@Override
public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int i) {
}
3.公交数据的查询
用法还是比较相似的
//第一个参数公交站台名称,第二个参数城市名称
busStationQuery = new BusStationQuery(busStationStr, cityStr);
busStationSearch = new BusStationSearch(getActivity(), busStationQuery);
busStationSearch.setOnBusStationSearchListener(new BusStationSearch.OnBusStationSearchListener() {
@Override
public void onBusStationSearched(BusStationResult busStationResult, int i) {
//这里就是公交数据
List<BusStationItem> data = busStationResult.getBusStations();
}
});
busStationSearch.searchBusStationAsyn();
4.行政区域范围获取
点击查询后直接调用
DistrictSearch search = new DistrictSearch(getApplicationContext());
DistrictSearchQuery query = new DistrictSearchQuery();
//传入关键字
query.setKeywords("成都");
//是否返回边界值
query.setShowBoundary(true);
search.setQuery(query);
//绑定监听器
search.setOnDistrictSearchListener(this);
//开始搜索
search.searchDistrictAnsy();
--------------------------------------------------------------------------------------------------
查询数据结果回调方法
@Override
public void onDistrictSearched(DistrictResult districtResult) {
Log.e(TAG, "onDistrictSearched: " + districtResult.getPageCount());
aMap.clear();
//获取行政区域的边界经纬度坐标点
ArrayList<DistrictItem> data = districtResult.getDistrict();
ArrayList<LatLng> points = new ArrayList<>();
if (data != null && data.size() > 0) {
String[] boundary = data.get(0).districtBoundary();
LatLonPoint center = data.get(0).getCenter();
int index = 0;
int count = 0;
for (int i = 0; i < boundary.length; i++) {
if (boundary[i].length() >= count) {
count = boundary[i].length();
index = i;
}
}
String str = boundary[index];
String[] latLngList = str.split(";");
for (int j = 0; j < latLngList.length; j++) {
String[] latLngStr = latLngList[j].split(",");
if (latLngStr.length == 2) {
try {
double lng = Double.parseDouble(latLngStr[0]);
double lat = Double.parseDouble(latLngStr[1]);
points.add(new LatLng(lat, lng));
} catch (Exception e) {
Log.e(TAG, "onDistrictSearched: cast error");
}
}
}
//移动到marker位置
CameraUpdate mCameraUpdate = CameraUpdateFactory.newCameraPosition(
new CameraPosition(
new LatLng(center.getLatitude(), center.getLongitude()),
8,
0,
0
)
);
aMap.moveCamera(mCameraUpdate);
//显示行政区域范围
aMap.addPolyline(new PolylineOptions()
.addAll(points)
.width(15)
//是否开启纹理贴图
.setUseTexture(true)
//绘制成大地线
.geodesic(false)
//设置纹理样式
.setCustomTexture(BitmapDescriptorFactory.fromBitmap(
BitmapFactory.decodeResource(getResources(), R.drawable.custtexture2)))
//设置画线的颜色
.color(Color.argb(200, 0, 0, 0)));
}
}
5.获取天气数据
用到WeatherSearch,WeatherSearchQuery,LocalWeatherLiveResultLocalWeatherForecastResult等类
WeatherSearchQuery wsq = new WeatherSearchQuery(
cityName, WeatherSearchQuery.WEATHER_TYPE_LIVE);
//WeatherSearchQuery wsq = new WeatherSearchQuery(cityName, WeatherSearchQuery.WEATHER_TYPE_FORECAST);
ws = new WeatherSearch(getActivity());
ws.setOnWeatherSearchListener(this);
ws.setQuery(wsq);
ws.searchWeatherAsyn();
@Override
public void onWeatherLiveSearched(LocalWeatherLiveResult localWeatherLiveResult, int i) {
if (i == 1000) {
if (localWeatherLiveResult != null && localWeatherLiveResult.getLiveResult() != null) {
LocalWeatherLive lwl = localWeatherLiveResult.getLiveResult();
dialogWeatherCityName.setText(lwl.getCity());
dialogWeatherTime.setText(lwl.getReportTime() + " 发布");
dialogWeatherState.setText(lwl.getWeather());
dialogWeatherTemperature.setText(lwl.getTemperature() + " ℃");
dialogWeatherWind.setText(lwl.getWindDirection() + "风 " + lwl.getWindPower() + " 级");
dialogWeatherHumidity.setText(lwl.getHumidity() + " %");
}
}
}
@Override
public void onWeatherForecastSearched(LocalWeatherForecastResult localWeatherForecastResult, int i) {
Log.e(TAG, "onWeatherForecastSearched: ");
if (i == 1000) {
if (localWeatherForecastResult != null && localWeatherForecastResult.getForecastResult() != null) {
LocalWeatherForecast lwf = localWeatherForecastResult.getForecastResult();
Log.e(TAG, "onWeatherForecastSearched: 省份=" + lwf.getProvince());
Log.e(TAG, "onWeatherForecastSearched: 城市=" + lwf.getCity());
Log.e(TAG, "onWeatherForecastSearched: AdCode=" + lwf.getAdCode());
Log.e(TAG, "onWeatherForecastSearched: 发布时间=" + lwf.getReportTime());
Log.e(TAG, "onWeatherForecastSearched: ----------------------------------");
List<LocalDayWeatherForecast> lwfList = lwf.getWeatherForecast();
if (lwfList != null && lwfList.size() > 0) {
for (LocalDayWeatherForecast one : lwfList) {
Log.e(TAG, "时间:" + one.getDate() + " 星期" + one.getWeek()
+ " " + one.getDayWeather() + " " + one.getDayWindDirection()
+ " " + one.getDayWindPower() + "级 " + one.getDayTemp()
+ "/" + one.getNightTemp() + "℃");
}
} else {
Log.e(TAG, "onWeatherForecastSearched: 没有预报数据");
}
} else {
Log.e(TAG, "onWeatherForecastSearched: 没有数据");
}
} else {
Log.e(TAG, "onWeatherForecastSearched: 错误代码:" + i);
}
}
天气数据中查询有两种: WeatherSearchQuery.WEATHER_TYPE_LIVE 实时天气数据,WeatherSearchQuery.WEATHER_TYPE_FORECAST 天气预报数据,查询结果分别返回在各自的回调方法中。