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<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 天气预报数据,查询结果分别返回在各自的回调方法中。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容