当前位置: 移动技术网 > 移动技术>移动开发>Android > Android百度地图poi范围搜索

Android百度地图poi范围搜索

2019年07月24日  | 移动技术网移动技术  | 我要评论

我想大家可能都有过这样的经历:兜里揣着一张银行卡,在街上到处找自动取款机(atm)。在这个场景中,atm就是的兴趣点,我们想做的事情就是找到离自己较近的一些atm然后取款,此时我们并不关心附近有哪些超市、酒吧,因为这些地方没办法取钱!

说了这么多,一方面是加深大家对poi这个词的认识,另一方面也是为了让大家明白我们接下来要做的事情。理论性的东西就不再多讲了,直接来看例子。

先给大家展示下效果图:

详细界面:

该示例主要介绍关键词查询、suggestion查询和查看餐饮类place详情页功能,尤其搜索某个地方的餐厅、理发店等等比较有实际意义,百度demo代码如下:

activity:

package com.home;
import android.app.activity;
import android.os.bundle;
import android.text.editable;
import android.text.textwatcher;
import android.view.view;
import android.widget.arrayadapter;
import android.widget.autocompletetextview;
import android.widget.edittext;
import android.widget.toast;
import com.baidu.mapapi.bmapmanager;
import com.baidu.mapapi.map.mapview;
import com.baidu.mapapi.search.mkaddrinfo;
import com.baidu.mapapi.search.mkbuslineresult;
import com.baidu.mapapi.search.mkdrivingrouteresult;
import com.baidu.mapapi.search.mkpoiinfo;
import com.baidu.mapapi.search.mkpoiresult;
import com.baidu.mapapi.search.mksearch;
import com.baidu.mapapi.search.mksearchlistener;
import com.baidu.mapapi.search.mkshareurlresult;
import com.baidu.mapapi.search.mksuggestioninfo;
import com.baidu.mapapi.search.mksuggestionresult;
import com.baidu.mapapi.search.mktransitrouteresult;
import com.baidu.mapapi.search.mkwalkingrouteresult;
/**
* 演示poi搜索功能
*/
public class poisearchactivity extends activity {
private mapview mmapview = null;
private mksearch msearch = null; // 搜索模块,也可去掉地图模块独立使用
/**
* 搜索关键字输入窗口
*/
private autocompletetextview keyworldsview = null;
private arrayadapter<string> sugadapter = null;
private int load_index;
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
demoapplication app = (demoapplication) this.getapplication();
if (app.mbmapmanager == null) {
app.mbmapmanager = new bmapmanager(this);
app.mbmapmanager.init(demoapplication.strkey,
new demoapplication.mygenerallistener());
}
setcontentview(r.layout.activity_poisearch);
mmapview = (mapview) findviewbyid(r.id.bmapview);
mmapview.getcontroller().enableclick(true);
mmapview.getcontroller().setzoom(12);
// 初始化搜索模块,注册搜索事件监听
msearch = new mksearch();
msearch.init(app.mbmapmanager, new mksearchlistener() {
// 在此处理详情页结果
@override
public void ongetpoidetailsearchresult(int type, int error) {
if (error != 0) {
toast.maketext(poisearchactivity.this, "抱歉,未找到结果",
toast.length_short).show();
} else {
toast.maketext(poisearchactivity.this, "成功,查看详情页面",
toast.length_short).show();
}
}
/**
* 在此处理poi搜索结果
*/
public void ongetpoiresult(mkpoiresult res, int type, int error) {
// 错误号可参考mkevent中的定义
if (error != 0 || res == null) {
toast.maketext(poisearchactivity.this, "抱歉,未找到结果",
toast.length_long).show();
return;
}
// 将地图移动到第一个poi中心点
if (res.getcurrentnumpois() > 0) {
// 将poi结果显示到地图上
mypoioverlay poioverlay = new mypoioverlay(
poisearchactivity.this, mmapview, msearch);
poioverlay.setdata(res.getallpoi());
mmapview.getoverlays().clear();
mmapview.getoverlays().add(poioverlay);
mmapview.refresh();
// 当epoitype为2(公交线路)或4(地铁线路)时, poi坐标为空
for (mkpoiinfo info : res.getallpoi()) {
if (info.pt != null) {
mmapview.getcontroller().animateto(info.pt);
break;
}
}
} else if (res.getcitylistnum() > 0) {
// 当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表
string strinfo = "在";
for (int i = 0; i < res.getcitylistnum(); i++) {
strinfo += res.getcitylistinfo(i).city;
strinfo += ",";
}
strinfo += "找到结果";
toast.maketext(poisearchactivity.this, strinfo,
toast.length_long).show();
}
}
public void ongetdrivingrouteresult(mkdrivingrouteresult res,
int error) {
}
public void ongettransitrouteresult(mktransitrouteresult res,
int error) {
}
public void ongetwalkingrouteresult(mkwalkingrouteresult res,
int error) {
}
public void ongetaddrresult(mkaddrinfo res, int error) {
}
public void ongetbusdetailresult(mkbuslineresult result, int ierror) {
}
/**
* 更新建议列表
*/
@override
public void ongetsuggestionresult(mksuggestionresult res, int arg1) {
if (res == null || res.getallsuggestions() == null) {
return;
}
sugadapter.clear();
for (mksuggestioninfo info : res.getallsuggestions()) {
if (info.key != null)
sugadapter.add(info.key);
}
sugadapter.notifydatasetchanged();
}
@override
public void ongetshareurlresult(mkshareurlresult result, int type,
int error) {
}
});
keyworldsview = (autocompletetextview) findviewbyid(r.id.searchkey);
sugadapter = new arrayadapter<string>(this,
android.r.layout.simple_dropdown_item_1line);
keyworldsview.setadapter(sugadapter);
/**
* 当输入关键字变化时,动态更新建议列表
*/
keyworldsview.addtextchangedlistener(new textwatcher() {
@override
public void aftertextchanged(editable arg0) {
}
@override
public void beforetextchanged(charsequence arg0, int arg1,
int arg2, int arg3) {
}
@override
public void ontextchanged(charsequence cs, int arg1, int arg2,
int arg3) {
if (cs.length() <= 0) {
return;
}
string city = ((edittext) findviewbyid(r.id.city)).gettext()
.tostring();
/**
* 使用建议搜索服务获取建议列表,结果在onsuggestionresult()中更新
*/
msearch.suggestionsearch(cs.tostring(), city);
}
});
}
@override
protected void onpause() {
mmapview.onpause();
super.onpause();
}
@override
protected void onresume() {
mmapview.onresume();
super.onresume();
}
@override
protected void ondestroy() {
mmapview.destroy();
super.ondestroy();
}
@override
protected void onsaveinstancestate(bundle outstate) {
super.onsaveinstancestate(outstate);
mmapview.onsaveinstancestate(outstate);
}
@override
protected void onrestoreinstancestate(bundle savedinstancestate) {
super.onrestoreinstancestate(savedinstancestate);
mmapview.onrestoreinstancestate(savedinstancestate);
}
/**
* 影响搜索按钮点击事件
*
* @param v
*/
public void searchbuttonprocess(view v) {
edittext editcity = (edittext) findviewbyid(r.id.city);
edittext editsearchkey = (edittext) findviewbyid(r.id.searchkey);
msearch.poisearchincity(editcity.gettext().tostring(), editsearchkey
.gettext().tostring());
}
public void gotonextpage(view v) {
// 搜索下一组poi
int flag = msearch.gotopoipage(++load_index);
if (flag != 0) {
toast.maketext(poisearchactivity.this, "先搜索开始,然后再搜索下一组数据",
toast.length_short).show();
}
}
}

布局xml(activity_poisearch):

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<linearlayout
android:layout_width="fill_parent"
android:layout_height="50dip"
android:orientation="horizontal" >
<textview
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="在" >
</textview>
<edittext
android:id="@+id/city"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="北京" />
<textview
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="市内找" >
</textview>
<autocompletetextview
android:id="@+id/searchkey"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0.88"
android:text="餐厅" />
</linearlayout>
<linearlayout
android:layout_width="fill_parent"
android:layout_height="50dip"
android:orientation="horizontal" >
<button
android:id="@+id/search"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="12"
android:background="@drawable/button_style"
android:onclick="searchbuttonprocess"
android:padding="10dip"
android:text="开始" />
<button
android:id="@+id/map_next_data"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="12"
android:background="@drawable/button_style"
android:onclick="gotonextpage"
android:padding="10dip"
android:text="下一组数据" />
</linearlayout>
<com.baidu.mapapi.map.mapview
android:id="@+id/bmapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
</linearlayout>

mypoioverlay类

package com.home;
import android.app.activity;
import com.baidu.mapapi.map.mapview;
import com.baidu.mapapi.map.poioverlay;
import com.baidu.mapapi.search.mkpoiinfo;
import com.baidu.mapapi.search.mksearch;
public class mypoioverlay extends poioverlay {
mksearch msearch;
public mypoioverlay(activity activity, mapview mapview, mksearch search) {
super(activity, mapview);
msearch = search;
}
@override
protected boolean ontap(int i) {
super.ontap(i);
mkpoiinfo info = getpoi(i);
if (info.hascaterdetails) {
msearch.poidetailsearch(info.uid);
}
return true;
}
}

在配置文件中要比之前多配置一个activity,不然没法查看详细界面,这是百度sdk jar中提供的类:

<activity
android:name="com.baidu.mapapi.search.placecateractivity"
android:configchanges="orientation|keyboardhidden"
android:theme="@android:style/theme.notitlebar" >
</activity>

application类同之前。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网