获取高德地图poi 抓取 poi 搜索

Android实现带列表的地图POI周边搜索功能
作者:他叫自己MR张
字体:[ ] 类型:转载 时间:
这篇文章主要为大家详细介绍了Android实现带列表的地图POI周边搜索功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
先看效果图:(以公司附近的国贸为中心点)
上面是地图,下面是地理位置列表,有的只有地理位置列表(QQ动态的位置),这是个很常见的功能。它有个专门的叫法:POI周边搜索。
这个效果实现起来其实很简单,不过需要你先阅读下地图的API,这里使用的是高德地图的Android SDK,SDK的配置这里不作讲解,文末会放一些链接供学习。
1、利用地图的定位功能,获取用户当前的位置
2、根据获得的位置信息调用POI搜索,获取位置列表
3、ListView展示位置列表
4、用户拖动地图,获取地图中心坐标的位置信息,并执行2~3的步骤
&LinearLayout
xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
&com.amap.api.maps2d.MapView
android:id="@+id/map_local"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2"/&
android:id="@+id/map_list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="3"
android:divider="@color/space"
android:dividerHeight="1dp"
android:scrollbars="none"/&
&/LinearLayout&
public class New_LocalActivity extends Activity implements LocationSource,
AMapLocationListener, AMap.OnCameraChangeListener, PoiSearch.OnPoiSearchListener {
@BindView(R.id.map_local)
MapView mapV
@BindView(R.id.map_list)
ListView mapL
public static final String KEY_LAT = "lat";
public static final String KEY_LNG = "lng";
public static final String KEY_DES = "des";
private AMapLocationClient mLocationC
private LocationSource.OnLocationChangedListener mL
private LatL
private AMap aM
private String deepType = "";// poi搜索类型
private PoiSearch.Q// Poi查询条件类
private PoiSearch poiS
private PoiResult poiR // poi返回的结果
private PoiOverlay poiO// poi图层
private List&PoiItem& poiI// poi数据
private PoiSearch_
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new__local);
ButterKnife.bind(this);
mapView.onCreate(savedInstanceState);
private void init() {
if (aMap == null) {
aMap = mapView.getMap();
aMap.setOnCameraChangeListener(this);
setUpMap();
deepType = "餐饮";//这里以餐饮为例
//-------- 定位 Start ------
private void setUpMap() {
if (mLocationClient == null) {
mLocationClient = new AMapLocationClient(getApplicationContext());
AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
//设置定位监听
mLocationClient.setLocationListener(this);
//设置为高精度定位模式
mLocationOption.setOnceLocation(true);
mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
//设置定位参数
mLocationClient.setLocationOption(mLocationOption);
mLocationClient.startLocation();
// 自定义系统定位小蓝点
MyLocationStyle myLocationStyle = new MyLocationStyle();
myLocationStyle.myLocationIcon(BitmapDescriptorFactory
.fromResource(R.drawable.location_marker));// 设置小蓝点的图标
myLocationStyle.strokeColor(Color.BLACK);// 设置圆形的边框颜色
myLocationStyle.radiusFillColor(Color.argb(100, 0, 0, 180));// 设置圆形的填充颜色
myLocationStyle.strokeWidth(1.0f);// 设置圆形的边框粗细
aMap.setMyLocationStyle(myLocationStyle);
aMap.setLocationSource(this);// 设置定位监听
aMap.getUiSettings().setMyLocationButtonEnabled(true);// 设置默认定位按钮是否显示
aMap.setMyLocationEnabled(true);// 设置为true表示显示定位层并可触发定位,false表示隐藏定位层并不可触发定位,默认是false
* 开始进行poi搜索
protected void doSearchQuery() {
aMap.setOnMapClickListener(null);// 进行poi搜索时清除掉地图点击事件
int currentPage = 0;
query = new PoiSearch.Query("", deepType, city);// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
query.setPageSize(20);// 设置每页最多返回多少条poiitem
query.setPageNum(currentPage);// 设置查第一页
LatLonPoint lp = new LatLonPoint(latlng.latitude, latlng.longitude);
poiSearch = new PoiSearch(this, query);
poiSearch.setOnPoiSearchListener(this);
poiSearch.setBound(new PoiSearch.SearchBound(lp, 5000, true));
// 设置搜索区域为以lp点为圆心,其周围2000米范围
poiSearch.searchPOIAsyn();// 异步搜索
public void onLocationChanged(AMapLocation aMapLocation) {
if (mListener != null && aMapLocation != null) {
if (aMapLocation.getErrorCode() == 0) {
// 显示我的位置
mListener.onLocationChanged(aMapLocation);
//设置第一次焦点中心
latlng = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude());
aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latlng, 14), 1000, null);
city = aMapLocation.getProvince();
doSearchQuery();
String errText = "定位失败," + aMapLocation.getErrorCode() + ": " + aMapLocation.getErrorInfo();
Log.e("AmapErr", errText);
public void activate(OnLocationChangedListener listener) {
mListener =
mLocationClient.startLocation();
public void deactivate() {
mListener =
if (mLocationClient != null) {
mLocationClient.stopLocation();
mLocationClient.onDestroy();
mLocationClient =
public void onCameraChange(CameraPosition cameraPosition) {
public void onCameraChangeFinish(CameraPosition cameraPosition) {
latlng = cameraPosition.
aMap.clear();
aMap.addMarker(new MarkerOptions().position(latlng));
doSearchQuery();
public void onPoiSearched(PoiResult result, int rCode) {
if (rCode == 0) {
if (result != null && result.getQuery() != null) {// 搜索poi的结果
if (result.getQuery().equals(query)) {// 是否是同一条
poiResult =
poiItems = poiResult.getPois();// 取得第一页的poiitem数据,页数从数字0开始
List&SuggestionCity& suggestionCities = poiResult
.getSearchSuggestionCitys();
if (poiItems != null && poiItems.size() & 0) {
adapter = new PoiSearch_adapter(this, poiItems);
mapList.setAdapter(adapter);
mapList.setOnItemClickListener(new mOnItemClickListener());
Logger.d("无结果");
Logger.e("无结果");
} else if (rCode == 27) {
Logger.e("error_network");
} else if (rCode == 32) {
Logger.e("error_key");
Logger.e("error_other:" + rCode);
public void onPoiItemSearched(PoiItem poiItem, int i) {
//-------- 定位 End ------
protected void onResume() {
super.onResume();
mLocationClient.startLocation();
protected void onPause() {
super.onPause();
mLocationClient.stopLocation();
protected void onDestroy() {
mLocationClient.onDestroy();
super.onDestroy();
private class mOnItemClickListener implements AdapterView.OnItemClickListener {
public void onItemClick(AdapterView&?& parent, View view, int position, long id) {
Intent intent = new Intent();
intent.putExtra(KEY_LAT, poiItems.get(position).getLatLonPoint().getLatitude());
intent.putExtra(KEY_LNG, poiItems.get(position).getLatLonPoint().getLongitude());
intent.putExtra(KEY_DES, poiItems.get(position).getTitle());
setResult(RESULT_OK, intent);
示例中的Activity是使用startActivityForResult方式启动的,最后点击位置之后会返回点选的位置信息。
总结:我第一次准备实现上述的效果时,也是不知所措,因为还没有对地图API有比较全面的认识,后来看了不少资料,自己便结合了一下地图的功能点,实现了设计图中的效果。
本文作者:他叫自己MR张
本文地址:
以上就是本文的全部内容,非常感谢作者的分享,希望对大家的学习有所帮助,大家共同进步。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具查看: 2533|回复: 5
请问GARMIN使用高德地图为什么无法查找POI
发布安卓地图
支持分辨率(可多选):
资源分类(可多选):
本帖最后由 wise_radium 于
15:48 编辑
我用这个方法安装了高德地图,现在发现无法使用POI查找地址,不知道什么原因。地图已经可以访问。提示说没有匹配信息,请帮我一下,谢谢
我的GARMIN中好象少了一个TWCN.sid(1926K),Garmin\.System\SID在这个里面,哪位朋友能给我上传一个,谢谢。
本帖最后由 nicepic 于
16:28 编辑
那个sid是不需要的& &高德有一个CHNNV.sum文件必须加入JCV文件夹 关键是这个
按这个方法来
谢谢,我用了这个SUM文件,也放在了JCV中,还是不行,是不是因为输入法的原因呢?
提示: 作者被禁止或删除 内容自动屏蔽
有网友提供了单个文件的garmin高德地图包了,用这个比较简单些,楼主可以试试。
Powered by高德地图-搜索服务-POI搜索
之前公司项目收货地址仿饿了么的收货地址,结果发现自己实现的关键字搜索和周边搜索,搜索到的poi列表跟饿了么的并不完全一样,后来考虑了下,应该是搜索的范围、类型之类的设置的不一样。后来搜索了下,也的确是这样,,现在记录下来,留给自己也留给大家。
高德地图 Android SDK 提供了千万级别的POI(Point Of Interesting,兴趣点)的搜索。
目前支持关键字搜索、周边搜索、指定区域搜索的同步、异步方法。搜索返回 POI 的基本信息,如POI ID,POI 名称、类型、经纬度、地址等。
关键字搜索
通过 PoiSearch.Query(String query, String ctgr, String city) 设置搜索条件。参数&query&为搜索的关键字,&ctgr&为搜索类型(类型参照表从相关下载处获取)、&city&为搜索城市,是必填参数,关键字和类型至少输入一个。
设置搜索条件,发送请求
query =&new&PoiSearch.Query(keyWord,&"", cityCode);
// keyWord表示搜索字符串,
//第二个参数表示POI搜索类型,二者选填其一,
//POI搜索类型共分为以下20种:汽车服务|汽车销售|
//汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务|
//住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务|
//金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施
//cityCode表示POI搜索区域的编码,是必须设置参数
&&&&&query.setPageSize(10);// 设置每页最多返回多少条poiitem
&query.setPageNum(currentPage);//设置查询页码
&PoiSearch poiSearch =&new&PoiSearch(this,query);//初始化poiSearch对象
&poiSearch.setOnPoiSearchListener(this);//设置回调数据的监听器
&poiSearch.searchPOIAsyn();//开始搜索
通过回调接口接受并解析返回的结果。
public&void&onPoiSearched(PoiResult result,&int&rCode) {
//可以在回调中解析result,获取POI信息
//result.getPois()可以获取到PoiItem列表,Poi详细信息可参考PoiItem类
//若当前城市查询不到所需Poi信息,可以通过result.getSearchSuggestionCitys()获取当前Poi搜索的建议城市
//如果搜索关键字明显为误输入,则可通过result.getSearchSuggestionKeywords()方法得到搜索关键词建议
//返回结果成功或者失败的响应码。0为成功,其他为失败(详细信息参见网站开发指南-错误码对照表)
使用 PoiSearch.searchPOIAsyn() 搜索 POI。使用 PoiSearch.setOnPoiSearchListener() 方法设置监听器,在 PoiSearch.OnPoiSearchListener 接口回调方法 onPoiSearched(PoiResult poiResult,int rCode)中处理返回结果。当指定搜索城市时,若没有返回 POI 结果,则会返回包含关键字的建议城市名称。当关键字搜索无结果时,则会返回搜索建议关键字。
设置搜索条件,发送请求
query =&new&PoiSearch.Query(keyWord,&"汽车维修|餐饮服务", cityCode);
// keyWord表示搜索字符串,第二个参数表示POI搜索类型,默认为:生活服务、餐饮服务、商务住宅
//共分为以下20种:汽车服务|汽车销售|
//汽车维修|摩托车服务|餐饮服务|购物服务|生活服务|体育休闲服务|医疗保健服务|
//住宿服务|风景名胜|商务住宅|政府机构及社会团体|科教文化服务|交通设施服务|
//金融保险服务|公司企业|道路附属设施|地名地址信息|公共设施
//cityCode表示POI搜索区域,(这里可以传空字符串,空字符串代表全国在全国范围内进行搜索)
query.setPageSize(10);// 设置每页最多返回多少条poiitem
query.setPageNum(currentPage);//设置查第一页
PoiSearch poiSearch =&new&PoiSearch(this,query);
poiSearch.setBound(new&SearchBound(new&LatLonPoint(locationMarker.getPosition().latitude,
&&&&&&&&locationMarker.getPosition().longitude),&1000));//设置周边搜索的中心点以及区域
poiSearch.setOnPoiSearchListener(this);//设置数据返回的监听器
poiSearch.searchPoiAsyn();//开始搜索
通过回调接口获取数据
public&void&onPoiSearched(PoiResult result,&int&rCode) {
//在回调函数中解析result获取POI信息
//result.getPois()可以获取到PoiItem列表,Poi详细信息可参考PoiItem类
//若当前城市查询不到所需Poi信息,可以通过result.getSearchSuggestionCitys()获取当前Poi搜索的建议城市
//如果搜索关键字明显为误输入,则可通过result.getSearchSuggestionKeywords()方法得到搜索关键词建议
//返回结果成功或者失败的响应码。0为成功,其他为失败(详细信息参见网站开发指南-错误码对照表)
在周边搜索的基础上,增加了矩形限定区域。根据搜索矩形区域左下角和右上角的顶点坐标,使用 PoiSearch.SearchBound(LatLonPoint lowerLeft, LatLonPoint upperRight) 设置搜索范围。
输入提示搜索
在输入关键字(至少两个字符)时,可以使用Inputtips类的 Inputtips.InputtipsListener 接口监听输入信息,并使用 requestInputtips(String keyword, String city) 发送提示请求。
注:提示中会出现相同的关键字,但是这些关键字所在区域不同,使用时可以通过 tipList.get(i).getDistrict() 获得区域,也可以在提示时在关键字后加上区域。
例如用户输入&高德&,输入框下方的列表会显示包含关键字字段的输入提示信息。显示效果如图所示:
// 发送输入提示请求&
// newText表示提示关键字,第二个参数默认代表全国,也可以为城市区号
inputTips.requestInputtips(newText,&"");
通过回调接口获取数据
public&void&onGetInputtips(List&Tip& inputTips,&int&rcode){
//在回调函数中解析inputTips,获取输入提示返回的信息
//Tip类中包含Poi的Adcode、District、Name信息
//返回结果成功或者失败的响应码。0为成功,其他为失败(详细信息参见网站开发指南-错误码对照表)
行政区划搜索
根据县(区)级行政区划名称查询其下级区划的详细信息,如:中心点坐标、编码等等。
DistrictSearch search =&new&DistrictSearch(mContext);
DistrictSearchQuery query =&new&DistrictSearchQuery();
query.setKeywords("keywords");//传入关键字
query.setKeywordsLevel(DistrictSearchQuery.KEYWORDS_CITY);
query.setShowBoundary(true);//是否返回边界值
search.setQuery(query);
search.setOnDistrictSearchListener(this);//绑定监听器
search.searchDistrictAnsy();//开始搜索
通过回调接口获取数据
public&void&onDistrictSearched(DistrictResult districtResult) {
//在回调函数中解析districtResult获取行政区划信息
//在districtResult.getAMapException().getErrorCode()=0时调用districtResult.getDistrict()方法
//获取查询行政区的结果,详细信息可以参考DistrictItem类。
阅读排行榜相关文章推荐
转载请注明出处:
POI~~~ Point of Interest,翻译过来就是“兴趣点”。我们在使用地图的时候,搜索周边的ktv,饭店,或者宾馆的时候,输入关键字,然后地图展示给...
给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数。
最基本的算法是,从小到大遍历:
for (i = 2 to A -1)
if (i * B > A)...
K-means聚类算法是一种非层次聚类算法,在最小误差的基础上将数据划分了特定的类,类间利用距离作为相似度指标,两个向量之间的距离越小,其相似度就越高。程序读取全国省市经纬度坐标,然后根据经纬度坐标进...
source insight是一款很好的c语言的程序编辑器,方便对project管理,方便程序的阅读和编辑。查找功能使用十分频繁,选项较多,与其它软件的查找功能也类似,下面对英文版的查找功能,做简单说...
--查询每个年级的总学时数,并按照升序排列。
SELECT SUM(ClassHour) AS 总学时,GradeId AS 年级 FROM Subject GROUP BY
首先我使用的是java自带的对webservice的支持包来编写的服务端和发布程序,代码如下。
webservice的接口代码:
package com.xxx.test.
import ja...
在ubuntu下面开放端口好像主要有两种方法,一种是ubuntu自带的防火墙,一种是iptables,这里我们主要使用iptables。本文的系统版本为ubuntu14.04和ubuntu16.04
instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
第一次连接时使用screen命令对session进行记录:
在游戏中经常会有物品属性的查看,这些实现往往都是当鼠标移动到该物体上时弹出一个属性框,简单的做法是做一个UI框,将它的Active设置成false,就是不让它显示,只有当鼠标移动到这个物体上时,才会让...
他的最新文章
讲师:董晓杰
讲师:姚远
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 高德地图定位poi搜索 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信