Android高德地图开发(五)获取地图数据

一、概述

这章我们学习如何获取地图的数据,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 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 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 data = districtResult.getDistrict();
        ArrayList 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 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 天气预报数据,查询结果分别返回在各自的回调方法中。

你可能感兴趣的:(Android高德地图开发(五)获取地图数据)