263.高德地图的使用---关键字检索POI(3)

获取POI数据

高德提供了千万级别的 POI(Point of Interest,兴趣点)。在地图表达中,一个 POI 可代表一栋大厦、一家商铺、一处景点等等。通过POI搜索,完成找餐馆、找景点、找厕所等等的功能

关键字检索POI

根据关键字检索适用于在某个城市搜索某个名称相关的POI,例如:查找北京市的“肯德基”。
注意:
1、关键字未设置城市信息(默认为全国搜索)时,如果涉及多个城市数据返回,仅会返回建议城市,请根据APP需求,选取城市进行搜索。
2、不设置POI的类别,默认返回“餐饮服务”、“商务住宅”、“生活服务”这三种类别的POI,下方提供了POI分类码表,请按照列表内容设置希望检索的POI类型。(建议使用POI类型的代码进行检索)
实现关键字检索的步骤如下:

1、继承 OnPoiSearchListener 监听。
2、构造 PoiSearch.Query 对象,通过 PoiSearch.Query(String query, String ctgr, String city) 设置搜索条件。

query = new PoiSearch.Query(keyWord, "", cityCode);
//keyWord表示搜索字符串,
//第二个参数表示POI搜索类型,二者选填其一,选用POI搜索类型时建议填写类型代码,码表可以参考下方(而非文字)
//cityCode表示POI搜索区域,可以是城市编码也可以是城市名称,也可以传空字符串,空字符串代表全国在全国范围内进行搜索
query.setPageSize(10);// 设置每页最多返回多少条poiitem
query.setPageNum(currentPage);//设置查询页码

3、构造 PoiSearch 对象,并设置监听。

poiSearch = new PoiSearch(this, query);
poiSearch.setOnPoiSearchListener(this);

4、调用 PoiSearch 的 searchPOIAsyn() 方法发送请求。

poiSearch.searchPOIAsyn();

5、通过回调接口 onPoiSearched 解析返回的结果,将查询到的 POI 以绘制点的方式显示在地图上。
6、说明:
1)可以在回调中解析result,获取POI信息。
2)result.getPois()可以获取到PoiItem列表,Poi详细信息可参考PoiItem类。
3)若当前城市查询不到所需POI信息,可以通过result.getSearchSuggestionCitys()获取当前Poi搜索的建议城市。
4)如果搜索关键字明显为误输入,则可通过result.getSearchSuggestionKeywords()方法得到搜索关键词建议。
5)返回结果成功或者失败的响应码。1000为成功,其他为失败(详细信息参见网站开发指南-实用工具-错误码对照表)

public void onPoiSearched(PoiResult result, int rCode) {
     //解析result获取POI信息
}

周边检索POI

适用于搜索某个位置附近的POI,可设置POI的类别,具体查询所在位置的餐饮类、住宅类POI,例如:查找天安门附近的厕所等等场景。
与关键字检索的唯一区别需要通过 PoiSearch 的 setBound 方法设置圆形查询范围。

poiSearch.setBound(new SearchBound(new LatLonPoint(locationMarker.getPosition().latitude,
            locationMarker.getPosition().longitude), 1000));//设置周边搜索的中心点以及半径

多边形内检索的POI

不同于周边搜索,周边搜索是一个圆形范围,而多边形搜索的范围是一个多边形,适用于在搜索某个不规则区域的POI查询,例如:查找中关村范围内的停车场。

List<LatLonPoint> points = new ArrayList<LatLonPoint>();
points.add(new LatLonPoint(39.941711, 116.382248));
points.add(new LatLonPoint(39.884882, 116.359566));
points.add(new LatLonPoint(39.878120, 116.437630));
points.add(new LatLonPoint(39.941711, 116.382248));

poiSearch.setBound(new SearchBound(points));//设置多边形区域

范例,onCreate创建

package com.ldw.hello;

import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.TextView;

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.AMapOptions;
import com.amap.api.maps.CameraUpdateFactory;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.maps.overlay.DrivingRouteOverlay;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.core.PoiItem;
import com.amap.api.services.help.Inputtips;
import com.amap.api.services.help.InputtipsQuery;
import com.amap.api.services.help.Tip;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;
import com.amap.api.services.route.BusRouteResult;
import com.amap.api.services.route.DrivePath;
import com.amap.api.services.route.DriveRouteResult;
import com.amap.api.services.route.RideRouteResult;
import com.amap.api.services.route.RouteSearch;
import com.amap.api.services.route.WalkRouteResult;

import java.util.ArrayList;
import java.util.List;

public class PassengerActivity extends AppCompatActivity {


    private MapView _mapView = null;
    private AMap _amap = null;
    private AMapLocationClient _amapLocationClient = null;
    private AMapLocationClientOption _amapLocationOption = null;
    private Button _bt_startOrder = null;
    private TextView _tv_srcAddr = null;
    private AutoCompleteTextView _attv_dstAddr = null;

    private Marker _selfMarker = null;
    private boolean isAddSelfMarker = false;
    private String _city = null;//当前定位所在的城市

    private LatLonPoint _startPoint = null;
    private LatLonPoint _endPoint = null;



    protected  void initUI() {
        _mapView = (MapView)findViewById(R.id.PassengerMap);
        _bt_startOrder = (Button)findViewById(R.id.bt_startOrder);
        _tv_srcAddr = (TextView)findViewById(R.id.tv_passenger_srcAddr);
        _attv_dstAddr = (AutoCompleteTextView)findViewById(R.id.attv_passenger_dstAddr);

    }

    //以某个经纬度为中心来展示地图
    protected void moveMap(double latitude, double longtiude)
    {
        LatLng lagLng = new LatLng(latitude, longtiude);

        //移动amap地图 以之前的缩放比例展示
        _amap.animateCamera(CameraUpdateFactory.newLatLngZoom(lagLng, _amap.getCameraPosition().zoom));
    }

    //向固定的经纬度添加一个标记
    protected void addMarkerToMap(double latitude, double longitude)
    {
        _selfMarker = _amap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude))
                .icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.location_marker))));
    }


    protected void createMap(Bundle savedInstanceState) {
        //展示地图容器
        _mapView.onCreate(savedInstanceState);


        //得到amap对象
        _amap = _mapView.getMap();

        //默认显示实时交通信息
        _amap.setTrafficEnabled(true);

    }

    //启动定位服务器
    protected  void doLocation()
    {
        //1 创建一个客户端定位句柄
        _amapLocationClient = new AMapLocationClient(getApplicationContext());

        //1.5 给定位客户端设置一些属性
        _amapLocationOption = new AMapLocationClientOption();
        //每个5s定位一次
        _amapLocationOption.setInterval(3000);
        //_amapLocationOption.setOnceLocation(true);

        //将option设置给client对象
        _amapLocationClient.setLocationOption(_amapLocationOption);

        //2 给客户端句柄设置一个listenner来处理服务器返回的定位数据
        _amapLocationClient.setLocationListener(new AMapLocationListener() {
            @Override
            public void onLocationChanged(AMapLocation aMapLocation) {
                //onLocationChanged 就是如果服务器给客户端返回数据,调用的回调函数
                //aMapLocation 就是服务器给客户端返回的定位数据

                if (aMapLocation != null) {
                    //服务器是有响应的

                    if(aMapLocation.getErrorCode() == 0) {
                        //定位成功,aMapLocation获取数据
                        Log.e("Amap", "location succ address = "+ aMapLocation.getAddress());
                        Log.e("Amap", "city = "+ aMapLocation.getCity());
                        Log.e("Amap", "longtitude = " + aMapLocation.getLongitude());
                        Log.e("Amap", "latitude = " + aMapLocation.getLatitude());

                        if (isAddSelfMarker == false) {
                            //在此位置添加一个标记
                            addMarkerToMap(aMapLocation.getLatitude(), aMapLocation.getLongitude());
                            isAddSelfMarker = true;

                            //以自我为中心展示地图
                            moveMap(aMapLocation.getLatitude(), aMapLocation.getLongitude());
                        }

                        if (_startPoint == null) {
                            //得到乘客的起始坐标点
                            _startPoint = new LatLonPoint(aMapLocation.getLatitude(),aMapLocation.getLongitude());
                        }


                        //设置乘客源地址信息
                        _tv_srcAddr.setText(aMapLocation.getAddress());

                        _city = aMapLocation.getCity();

                    }
                    else {
                        //定位失败,

                        Log.e("Amap", "location error, code = "+ aMapLocation.getErrorCode()+
                                ", info = "+ aMapLocation.getErrorInfo());
                    }
                }
            }
        });

        //3 开启定位服务
        _amapLocationClient.startLocation();
    }


    //开启POI兴趣点搜索
    protected  void doSerarchPOI() {
        _bt_startOrder.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //开始搜索POI兴趣点

                Log.e("Amap", "button onclick");

                //拿到用户搜索地址的关键字
                String dstAddr = _attv_dstAddr.getText().toString();

                //开始POI搜索
                // 1 创建一个搜索的条件对象 query
                PoiSearch.Query query = new PoiSearch.Query(dstAddr, "", _city);

                // 2 创建一个POISearch句柄和query关联
                PoiSearch poiSearch = new PoiSearch(getApplicationContext(), query);

                // 3 给search绑定一个回调函数
                poiSearch.setOnPoiSearchListener(new PoiSearch.OnPoiSearchListener() {
                    @Override
                    public void onPoiSearched(PoiResult poiResult, int i) {
                        //处理得到的POI兴趣点集合 poiResult

                        if (i != 1000)  {
                            Log.e("Amap", "poi Search error code = "+ i);
                            return ;
                        }


                        //搜索成功
                        List<PoiItem> poiList = poiResult.getPois();

                        for (int index = 0; index < poiList.size(); index++) {
                            //此时 表示处理每个已经搜索到的兴趣点

                            Log.e("Amap", "搜索到的兴趣点有");
                            PoiItem item = poiList.get(index);

                            Log.e("Amap", "poi title =" + item.getTitle()+
                            "latitude = " +item.getLatLonPoint().getLatitude()+
                            "longitude = "+ item.getLatLonPoint().getLongitude());

                            //给每个搜索到的标记点画一个标记
                            addMarkerToMap(item.getLatLonPoint().getLatitude(),
                                          item.getLatLonPoint().getLongitude());


                            //默认以第一个兴趣点为我们坐标点
                            _endPoint = new LatLonPoint(item.getLatLonPoint().getLatitude(),
                                                      item.getLatLonPoint().getLongitude());


                            drawRouteLine();

                            if (index == 0) {
                                break;
                            }

                        }


                    }

                    @Override
                    public void onPoiItemSearched(PoiItem poiItem, int i) {

                    }
                });

                // 4 启动搜索
                poiSearch.searchPOIAsyn();
            }
        });
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_passenger);

        initUI();
        createMap(savedInstanceState);
        doLocation();

        doSerarchPOI();

    }
}

参考:https://lbs.amap.com/api/android-sdk/guide/map-data/poi

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值