码迷,mamicode.com
首页 > 其他好文 > 详细

高德地图——搜索

时间:2016-06-22 09:24:20      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:

地图SDK提供了一系列的接口来方便用户获取高德LBS数据,目前主要支持的检索有:
? 兴趣点搜索:
1. 关键字搜索。
2. 周边搜索。
3. 指定区域搜索。
4. 团购/优惠搜索。
5. POI深度信息。
? 输入提示搜索。
? 路径规划
? 公交线路查询。
? 坐标/地址查询。

关键字搜索

  1. 搜索条件设置
    您需要通过 PoiSearch.Query(String query, String ctgr, String city) 设置搜索条件。
    参数“ query” 为搜索的关键字,“ ctgr” 为搜索类型(类型参照表从相关下载处获取),“ city”为搜索城市。
    关键字、类型至少输入一个,搜索城市必须输入。
    通过 Query.setPageSize(int) 设置查询每页的结果数目;
    通过 Query.setPageNum(int) 设置查询第几页。
  2. 发送请求和接收数据
    使用 PoiSearch.searchPOIAsyn() 搜索 POI。
    使用 PoiSearch.setOnPoiSearchListener()方法设置监听器,
    在 PoiSearch.OnPoiSearchListener 接口回调方法
    onPoiSearched(PoiResult poiResult,int rCode)中处理返回结果。当指定搜索城市时,若没有
    返回 POI 结果,则会返回包含关键字的建议城市名称。当关键字搜索无结果时,则会返回搜索建议关键字。

int currentPage = 0;
// 第一个参数表示搜索字符串,第二个参数表示POI搜索类型,二选其一
// 第三个参数表示POI搜索区域的编码,必设
        query = new PoiSearch.Query("kfc", "餐饮", "北京");
// 设置每页最多返回多少条poiitem
        query.setPageSize(10);
// 设置查第一页
        query.setPageNum(currentPage);
        PoiSearch poiSearch = new PoiSearch(this, query);
//设置搜索完成后的回调
poiSearch.setOnPoiSearchListener(this);
//进行异步查询
poiSearch.searchPOIAsyn();

    @Override
    public void onPoiItemSearched(PoiItem arg0, int arg1) {

    }

    public void onPoiSearched(PoiResult result, int rCode) {
            if (result != null && result.getQuery() != null) {
                if (result.getQuery().equals(query)) {
                    poiResult = result;
                    List<PoiItem> poiItems = poiResult.getPois();
                    if (poiItems != null && poiItems.size() > 0) {
    // 清理之前的图标,将查询结果显示在地图上
                        aMap.clear();
                        PoiOverlay poiOverlay = new PoiOverlay(aMap, poiItems);
                        poiOverlay.removeFromMap();
                        poiOverlay.addToMap();
                        poiOverlay.zoomToSpan();
                    }else{
                        // 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息
                        List<SuggestionCity> suggestionCities = poiResult
                                .getSearchSuggestionCitys();
                    }
                }
            }

完整代码如下:

package com.hang.helloamap;

import java.util.List;

import android.app.Activity;
import android.os.Bundle;

import com.amap.api.maps.AMap;
import com.amap.api.maps.MapView;
import com.amap.api.maps.overlay.PoiOverlay;
import com.amap.api.services.core.PoiItem;
import com.amap.api.services.core.SuggestionCity;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;
import com.amap.api.services.poisearch.PoiSearch.Query;

public class BasePoiSearchActivity extends Activity implements
        PoiSearch.OnPoiSearchListener {
    MapView mapView;
    AMap aMap;
    Query query = null;
    PoiResult poiResult = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
            mapView=new MapView(this);
            setContentView(mapView);
        mapView.onCreate(savedInstanceState);

        aMap = mapView.getMap();

        int currentPage = 0;
        // 第一个参数表示搜索字符串,第二个参数表示POI搜索类型,二选其一
        // 第三个参数表示POI搜索区域的编码,必设
        query = new PoiSearch.Query("kfc", "餐饮", "北京");
        query.setPageSize(10);// 设置每页最多返回多少条poiitem
        query.setPageNum(currentPage);// 设置查第一页
        PoiSearch poiSearch = new PoiSearch(this, query);
        poiSearch.setOnPoiSearchListener(this);
        poiSearch.searchPOIAsyn();

    }

    @Override
    public void onPoiItemSearched(PoiItem arg0, int arg1) {

    }

    public void onPoiSearched(PoiResult result, int rCode) {
            if (result != null && result.getQuery() != null) {
                if (result.getQuery().equals(query)) {
                    poiResult = result;
                    List<PoiItem> poiItems = poiResult.getPois();
                    if (poiItems != null && poiItems.size() > 0) {
                        aMap.clear();// 清理之前的图标
                        PoiOverlay poiOverlay = new PoiOverlay(aMap, poiItems);
                        poiOverlay.removeFromMap();
                        poiOverlay.addToMap();
                        poiOverlay.zoomToSpan();
                    }else{
                        // 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息
                        List<SuggestionCity> suggestionCities = poiResult
                                .getSearchSuggestionCitys();
                    }
                }
            }
    }

    @Override
    protected void onResume() {

        super.onResume();
        mapView.onResume();
    }

    @Override
    protected void onPause() {

        super.onPause();
        mapView.onPause();
    }

    @Override
    protected void onDestroy() {

        super.onDestroy();
        mapView.onDestroy();
    }
}

技术分享

周边搜索

在关键字基础上通过PoiSearch.SearchBound(LatLonPoint center, int
radiusInMeters) 设置周边圆形搜索范围。参数 “ center” 为搜索的中心点
坐标,“ radiusInMeters” 为周边搜索的范围。

为了更好的演示效果,这里多添加一些部分

package com.hang.helloamap;

import java.util.List;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;

import com.amap.api.maps.AMap;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.CircleOptions;
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.PoiOverlay;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.core.PoiItem;
import com.amap.api.services.core.SuggestionCity;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;
import com.amap.api.services.poisearch.PoiSearch.Query;
import com.amap.api.services.poisearch.PoiSearch.SearchBound;
import com.pansoft.oilgas.gaodenavigation.R;

public class PoiBoundSearchActivity extends Activity implements
        PoiSearch.OnPoiSearchListener {
    MapView mapView;
    AMap aMap;

    Query query = null;
    PoiResult poiResult = null;
    Marker locationMarker;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mapView = new MapView(this);
        setContentView(mapView);

        mapView.onCreate(savedInstanceState);

        aMap = mapView.getMap();

        int currentPage = 0;
        // 第一个参数表示搜索字符串,第二个参数表示POI搜索类型,二选其一
        // 第三个参数表示POI搜索区域的编码,必设
        query = new PoiSearch.Query("", "餐厅", "北京");

        query.setPageSize(10);// 设置每页最多返回多少条poiitem
        query.setPageNum(currentPage);// 设置查第一页
        PoiSearch poiSearch = new PoiSearch(this, query);

        locationMarker = aMap.addMarker(new MarkerOptions()
        //定义marker 图标的锚点。锚点是marker 图标接触地图平面的点。
        //图标的左顶点为(0,0)点,右底点为(1,1)点。
        //默认为(0.5,1.0.anchor(0.5f, 1)
                .icon(BitmapDescriptorFactory
                        .fromResource(R.drawable.ic_launcher))
                .position(new LatLng(39.908127, 116.375257))
                .title("西单为中心点,查其周边"));
                //展示一下搜索中心位置,以及一些文本信息
        locationMarker.showInfoWindow();
//在要搜索的范围中添加一个白色背景&&黑色边线,凸显搜索范围
        {
            CircleOptions circleOptions = new CircleOptions();
            circleOptions.center(locationMarker.getPosition());
            circleOptions.radius(200);
            circleOptions.fillColor(Color.WHITE);
            circleOptions.strokeColor(Color.BLACK);
            circleOptions.strokeWidth(10);
            aMap.addCircle(circleOptions);
        }
//设置搜索的范围
        poiSearch.setBound(new SearchBound(
                new LatLonPoint(locationMarker.getPosition().latitude,
                        locationMarker.getPosition().longitude), 200));

        poiSearch.setOnPoiSearchListener(this);
        poiSearch.searchPOIAsyn();

    }

    @Override
    public void onPoiItemSearched(PoiItem arg0, int arg1) {

    }

    public void onPoiSearched(PoiResult result, int rCode) {
        // 搜索POI的结果
        if (result != null && result.getQuery() != null) {
            // 是否是同一条
            if (result.getQuery().equals(query)) {
                poiResult = result;
                // 取得搜索到的poiitems有多少页
                int resultPages = poiResult.getPageCount();
                // 取得第一页的poiitem数据,页数从数字0开始
                List<PoiItem> poiItems = poiResult.getPois();
                if (poiItems != null && poiItems.size() > 0) {
                    // aMap.clear();// 清理之前的图标
                    PoiOverlay poiOverlay = new PoiOverlay(aMap, poiItems);
                    poiOverlay.removeFromMap();
                    poiOverlay.addToMap();
                    poiOverlay.zoomToSpan();
                } else {
                    // 当搜索不到poiitem数据时,会返回含有搜索关键字的城市信息
                    List<SuggestionCity> suggestionCities = poiResult
                            .getSearchSuggestionCitys();
                }
            }
        }
    }

    @Override
    protected void onResume() {

        super.onResume();
        mapView.onResume();
    }

    @Override
    protected void onPause() {

        super.onPause();
        mapView.onPause();
    }

    @Override
    protected void onDestroy() {

        super.onDestroy();
        mapView.onDestroy();
    }
}

技术分享

输入提示搜索

使用一个简单的例子来进行说明
使用一个简单的布局,获取一个AutoCompleteTextView的实例

<?xml version="1.0" encoding="utf-8"?>
<AutoCompleteTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/autocomplete"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" />
package com.hang.helloamap;

import java.util.ArrayList;

public class PoiInputInfoActivity extends Activity implements TextWatcher {
    AutoCompleteTextView autoCompleteTextView;
    ArrayAdapter<String> adapter;

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

        autoCompleteTextView=(AutoCompleteTextView)findViewById(R.id.autocomplete);
        autoCompleteTextView.addTextChangedListener(this);
        autoCompleteTextView.setThreshold(1);

    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

    }

    @Override
    public void afterTextChanged(Editable s) {
        if (!TextUtils.isEmpty(s.toString())) {
            Inputtips inputTips = new Inputtips(this, 
//搜索结果的处理
new InputtipsListener() {
                @Override
                public void onGetInputtips(final List<Tip> tipList, int rCode) {
                    if(tipList!=null&&tipList.size()>0){

                    List<String> listString = new ArrayList<>();
                    for (int i = 0; i < tipList.size(); i++) {
                        listString.add(tipList.get(i).getName());
                    }

                    adapter = new ArrayAdapter<String>(
                            PoiInputInfoActivity.this,
                            android.R.layout.simple_dropdown_item_1line);
                    autoCompleteTextView.setAdapter(adapter);
                    adapter.addAll(listString);


                    }
                }
            });
            try {
// 发送输入提示请求
// 第一个参数表示提示关键字,第二个参数默认代表全国,也可以为城市区号
                inputTips.requestInputtips(s.toString(), "");
            } catch (AMapException e) {
                e.printStackTrace();
            }
        }
    }

}

技术分享

未完待续…

高德地图——搜索

标签:

原文地址:http://blog.csdn.net/guchuanhang/article/details/51726034

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!