POI

一、简介

POI(Point of Interest),中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。

1、POI检索

百度地图SDK提供三种类型的POI检索:周边检索、区域检索和城市内检索。

l 周边检索:以某一点为中心,指定距离为半径,根据用户输入的关键词进行POI检索;

l 区域检索:在指定矩形区域内、根据关键词进行POI检索;

l 城市内检索:在某一城市内,根据用户输入的关键字进行POI检索;

自v3.6.1开始,城市poi检索返回结果新增门址类列表数据。例如:在“北京”搜索“上地十街1号”,除返回包含“上地十街1号”的poi列表以外,还包括地址为“上地十街1号”的明确门址。

具体来说,即PoiSearch类的SearchInCity(PoiCitySearchOption) 发起检索时返回的结果增加门址类数据。PoiResult中新增了GetAllAddr()获取门址类列表,当isHasAddrInfo() 返回true时,除了原poi列表外,还包含门址结果。

2、POI详情信息的检索

POI详情检索是指根据POI的ID信息,检索该兴趣点的详情。

3、在线建议查询

在线建议查询是指根据关键词查询在线建议词。为了帮助开发者实现检索出来的关键词快速定位到地图上,SDK自3.5.0版本起,开放了检索结果的经纬度信息及对应POI点的UID信息。

注意:

a. 在线建议检索的本质是根据部分关键是检索出来可能的完整关键词名称,如果需要这些关键词对应的POI的具体信息,请使用POI检索来完成;

b. 在线检索结果的第一条可能存在没有经纬度信息的情况,该条结果为文字联想出来的关键词结果,并不对应任何确切POI点。例如输入“肯”,第一条结果为“肯德基”,这条结果是一个泛指的名称,不会带有经纬度等信息。

二、运行截图

简介:介绍关键词查询、suggestion查询和查看餐饮类Place详情页功能

详述:

(1)点击某些关键词查询后的结果(如“餐厅”)可跳转到Place详情页;

(2)提供suggestion查询进行联想查询,例如输入“天安门”则会弹出联想查询的列表;

本示例运行截图如下:

三、设计步骤

1、添加demo12_poisearch.xml文件

在layout文件夹下添加该文件,然后将代码改为下面的内容:

<?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
xmlns:android="http://schemas.android.com/apk/res/android"
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
xmlns:android="http://schemas.android.com/apk/res/android"
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: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:padding="10dip"
android:text="下一组数据" />
</LinearLayout>

<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.baidu.mapapi.map.TextureMapFragment" />

</LinearLayout>

2、添加OverlayManager.cs文件

新建一个SrcOverlayUtil文件夹,在该文件夹下添加该文件。

说明:SrcOverlayUtil文件夹下的文件用于自定义一些基于基础覆盖而组合而成的高级覆盖物,包括用于显示poi数据,规划路线,公交详情路线的覆盖物等。

using Com.Baidu.Mapapi.Map;
using Com.Baidu.Mapapi.Model;
using System.Collections.Generic;
namespace BdMapV371Demos.SrcOverlayUtil
{
/// <summary>
/// 提供一个能够显示和管理多个Overlay的基类。
/// 将覆盖物点击事件传递给OverlayManager后,OverlayManager才能响应点击事件。
/// 在MarkerClick事件中处理Marker点击事件。
/// </summary>
public abstract class OverlayManager : Java.Lang.Object, BaiduMap.IOnMarkerClickListener, BaiduMap.IOnPolylineClickListener
{
BaiduMap mBaiduMap = null;
private List<OverlayOptions> mOverlayOptionList = null;

protected List<Overlay> mOverlayList = null;

public OverlayManager(BaiduMap baiduMap)
{
mBaiduMap = baiduMap;
mBaiduMap.SetOnMarkerClickListener(this);
if (mOverlayOptionList == null)
{
mOverlayOptionList = new List<OverlayOptions>();
}
if (mOverlayList == null)
{
mOverlayList = new List<Overlay>();
}
}

/// <summary>
/// 重写此方法设置要管理的Overlay列表
/// </summary>
/// <returns></returns>
public abstract List<OverlayOptions> GetOverlayOptions();

/// <summary>
/// 将所有Overlay 添加到地图上
/// </summary>
public void AddToMap()
{
if (mBaiduMap == null)
{
return;
}
RemoveFromMap();
List<OverlayOptions> overlayOptions = GetOverlayOptions();
if (overlayOptions != null)
{
mOverlayOptionList.AddRange(GetOverlayOptions());
}

foreach (OverlayOptions option in mOverlayOptionList)
{
mOverlayList.Add(mBaiduMap.AddOverlay(option));
}
}

/// <summary>
/// 将所有Overlay从地图上消除
/// </summary>
public void RemoveFromMap()
{
if (mBaiduMap == null)
{
return;
}
foreach (Overlay marker in mOverlayList)
{
marker.Remove();
}
mOverlayOptionList.Clear();
mOverlayList.Clear();
}

/// <summary>
/// 缩放地图,使所有Overlay都在合适的视野内
/// 注: 该方法只对Marker类型的overlay有效
/// </summary>
public void ZoomToSpan()
{
if (mBaiduMap == null)
{
return;
}
if (mOverlayList.Count > 0)
{
LatLngBounds.Builder builder = new LatLngBounds.Builder();
foreach (Overlay overlay in mOverlayList)
{
// polyline 中的点可能太多,只按marker缩放
if (overlay is Marker)
{
builder.Include(((Marker)overlay).Position);
}
}
mBaiduMap.SetMapStatus(MapStatusUpdateFactory
.NewLatLngBounds(builder.Build()));
}
}

public virtual bool OnMarkerClick(Marker marker)
{
return false;
}

public virtual bool OnPolylineClick(Polyline polyline)
{
return false;
}
}
}

3、添加PoiOverlay.cs文件

在SrcOverlayUtil文件夹下添加该文件。

using Android.OS;
using Android.Widget;
using Com.Baidu.Mapapi;
using Com.Baidu.Mapapi.Map;
using Com.Baidu.Mapapi.Search.Poi;
using System.Collections.Generic;

namespace BdMapV371Demos.SrcOverlayUtil
{
    /// <summary>
    /// 显示一条公交详情结果的Overlay,继承自该类的子类可显示其他类型的Overlay
    /// </summary>
    public class PoiOverlay : OverlayManager
    {
        private static readonly int MaxPoiSize = 10;
        private PoiResult mPoiResult = null;

        public PoiOverlay(BaiduMap baiduMap) : base(baiduMap)
        {

        }

        /// <summary>
        /// 设置POI数据
        /// </summary>
        /// <param name="poiResult">POI结果数据</param>
        public void SetData(PoiResult poiResult)
        {
            this.mPoiResult = poiResult;
        }

        public override List<OverlayOptions> GetOverlayOptions()
        {

            if (mPoiResult == null || mPoiResult.AllPoi == null)
            {
                return null;
            }
            List<OverlayOptions> markerList = new List<OverlayOptions>();
            int markerSize = 0;
            for (int i = 0; i < mPoiResult.AllPoi.Count && markerSize < MaxPoiSize; i++)
            {
                if (mPoiResult.AllPoi[i].Location == null)
                {
                    continue;
                }
                markerSize++;
                Bundle bundle = new Bundle();
                bundle.PutInt("index", i);
                markerList.Add(new MarkerOptions()
                    .InvokeIcon(BitmapDescriptorFactory.FromAssetWithDpi("Icon_mark"
                            + markerSize + ".png")).InvokeExtraInfo(bundle)
                    .InvokePosition(mPoiResult.AllPoi[i].Location));
            }
            return markerList;
        }

        /// <summary>
        /// 获取该 PoiOverlay 的 poi数据
        /// </summary>
        public PoiResult GetPoiResult()
        {
            return mPoiResult;
        }

        /// <summary>
        /// 重写此方法可改变默认点击行为
        /// </summary>
        /// <param name="i">被点击的poi在PoiResult.AllPoi中的索引</param>
        /// <returns></returns>
        public virtual bool OnPoiClick(int i)
        {
            if (mPoiResult.AllPoi != null && mPoiResult.AllPoi[i] != null)
            {
                Toast.MakeText(BMapManager.Context,
                        mPoiResult.AllPoi[i].Name, ToastLength.Long).Show();
            }
            return false;
        }

        public override bool OnMarkerClick(Marker marker)
        {
            if (!mOverlayList.Contains(marker))
            {
                return false;
            }
            if (marker.ExtraInfo != null)
            {
                return OnPoiClick(marker.ExtraInfo.GetInt("index"));
            }
            return false;
        }

        public override bool OnPolylineClick(Polyline polyline)
        {
            return false;
        }
    }
}

4、添加Demo12PoiSearch.cs文件

在SrcSdkDemos文件夹下添加该文件,然后将代码改为下面的内容:

using Android.App;
using Android.Content.PM;
using Android.OS;
using Android.Support.V4.App;
using Android.Widget;
using BdMapV371Demos.SrcOverlayUtil;
using Com.Baidu.Mapapi.Map;
using Com.Baidu.Mapapi.Search.Core;
using Com.Baidu.Mapapi.Search.Poi;
using Com.Baidu.Mapapi.Search.Sug;

namespace BdMapV371Demos.SrcSdkDemos
{
    /// <summary>
    /// 演示poi搜索功能
    /// </summary>
    [Activity(Label = "@string/demo_name_poi",
        ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.KeyboardHidden,
         ScreenOrientation = ScreenOrientation.Sensor)]
    public class Demo12PoiSearch : FragmentActivity
    {
        private PoiSearch mPoiSearch = null;
        private SuggestionSearch mSuggestionSearch = null;
        private BaiduMap mBaiduMap = null;
        // 搜索关键字输入窗口
         private AutoCompleteTextView keyWorldsView = null;
        private ArrayAdapter<string> sugAdapter = null;
        private int load_Index = 0;

        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.demo12_poisearch);

            // 初始化搜索模块,注册搜索事件监听
            mPoiSearch = PoiSearch.NewInstance();
            mPoiSearch.GetPoiResult += (s, e) =>
            {
                var result = e.P0;
                if (result == null
                        || result.Error == SearchResult.ERRORNO.ResultNotFound)
                {
                    return;
                }
                if (result.Error == SearchResult.ERRORNO.NoError)
                {
                    mBaiduMap.Clear();
                    PoiOverlay overlay = new MyPoiOverlay(this, mBaiduMap);
                    mBaiduMap.SetOnMarkerClickListener(overlay);
                    overlay.SetData(result);
                    overlay.AddToMap();
                    overlay.ZoomToSpan();
                    return;
                }
                if (result.Error == SearchResult.ERRORNO.AmbiguousKeyword)
                {

                    // 当输入关键字在本市没有找到,但在其他城市找到时,返回包含该关键字信息的城市列表
                    string strInfo = "在";
                    foreach (CityInfo cityInfo in result.SuggestCityList)
                    {
                        strInfo += cityInfo.City;
                        strInfo += ",";
                    }
                    strInfo += "找到结果";
                    Toast.MakeText(this, strInfo, ToastLength.Long)
                            .Show();
                }
            };
            mPoiSearch.GetPoiDetailResult += (s, e) =>
            {
                var result = e.P0;
                if (result.Error != SearchResult.ERRORNO.NoError)
                {
                    Toast.MakeText(this, "抱歉,未找到结果", ToastLength.Short).Show();
                }
                else
                {
                    Toast.MakeText(this, "成功,查看详情页面", ToastLength.Short).Show();
                }
            };

            mSuggestionSearch = SuggestionSearch.NewInstance();
            mSuggestionSearch.GetSuggestionResult += (s, e) =>
            {
                var res = e.P0;
                if (res == null || res.AllSuggestions == null) return;
                sugAdapter.Clear();
                foreach (SuggestionResult.SuggestionInfo info in res.AllSuggestions)
                {
                    if (info.Key != null) sugAdapter.Add(info.Key);
                }
                sugAdapter.NotifyDataSetChanged();
            };

            keyWorldsView = FindViewById<AutoCompleteTextView>(Resource.Id.searchkey);
            sugAdapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleDropDownItem1Line);
            keyWorldsView.Adapter = sugAdapter;
            TextureMapFragment map1 = FragmentManager.FindFragmentById<TextureMapFragment>(Resource.Id.map);
            mBaiduMap = map1.BaiduMap;

            // 当输入关键字变化时,动态更新建议列表
            keyWorldsView.AfterTextChanged += (sender, e) => { };
            keyWorldsView.BeforeTextChanged += (sender, e) => { };
            keyWorldsView.TextChanged += (sender, e) =>
            {
                string s = e.Text.ToString();
                if (s.Length <= 0) return;
                string city = (FindViewById<EditText>(Resource.Id.city)).Text;
                // 使用建议搜索服务获取建议列表,结果在onSuggestionResult()中更新
                mSuggestionSearch.RequestSuggestion(
                    new SuggestionSearchOption().Keyword(s).City(city));
            };

            Button btnSearch = FindViewById<Button>(Resource.Id.search);
            btnSearch.Click += delegate
            {
                SearchButtonProcess();
            };

            Button btnNext = FindViewById<Button>(Resource.Id.map_next_data);
            btnNext.Click += delegate
            {
                load_Index++;
                SearchButtonProcess();
            };
        }

        protected override void OnPause()
        {
            base.OnPause();
        }

        protected override void OnResume()
        {
            base.OnResume();
        }

        protected override void OnDestroy()
        {
            mPoiSearch.Destroy();
            mSuggestionSearch.Destroy();
            base.OnDestroy();
        }

        protected override void OnSaveInstanceState(Bundle outState)
        {
            base.OnSaveInstanceState(outState);
        }

        protected override void OnRestoreInstanceState(Bundle savedInstanceState)
        {
            base.OnRestoreInstanceState(savedInstanceState);
        }

        public void SearchButtonProcess()
        {
            EditText editCity = FindViewById<EditText>(Resource.Id.city);
            EditText editSearchKey = FindViewById<EditText>(Resource.Id.searchkey);
            mPoiSearch.SearchInCity(new PoiCitySearchOption()
                .City(editCity.Text)
                .Keyword(editSearchKey.Text)
                .PageNum(load_Index));
        }

        private class MyPoiOverlay : PoiOverlay
        {
            Demo12PoiSearch poiSearchDemo;

            public MyPoiOverlay(Demo12PoiSearch poiSearchDemo, BaiduMap baiduMap) :
                base(baiduMap)
            {
                this.poiSearchDemo = poiSearchDemo;
            }

            public override bool OnPoiClick(int index)
            {
                base.OnPoiClick(index);
                PoiInfo poi = GetPoiResult().AllPoi[index];
                if (poi.HasCaterDetails)
                {
                    poiSearchDemo.mPoiSearch.SearchPoiDetail(
                        new PoiDetailSearchOption().PoiUid(poi.Uid));
                }
                return true;
            }
        }
    }
}

5、修改MainActivity.cs

在MainActivity.cs文件的demos字段定义中,去掉【示例12】下面的注释。

运行观察结果。

时间: 2024-10-06 06:22:14

POI的相关文章

使用Apache POI导出Excel小结--导出XLS格式文档

使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI导出Excel小结--导出XLSX格式文档 使用Apache POI导出Excel--大数量导出 导出XLS格式文档 做企业应用项目难免会有数据导出到Excel的需求,最近在使用其,并对导出Excel封装成工具类开放出来供大家参考.关于Apache POI Excel基本的概念与操作我在这里就不啰嗦

利用poi导出Excel

import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.sql.Date;import java.util.ArrayList;import java.util.List; import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.

POI操作Excel

Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组成,列用大写英文字母表示,从A开始到Z共26列,然后再从AA到AZ又26列,再从BA到BZ再26列以此类推.行则使用数字表示,例如:A3 表示第三行第一列,E5表示第五行第五列. POI工具包 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 9

POI操作Excel设置前景色背景色

POI中背景颜色设置方法如下: HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setFillBackgroundColor(HSSFColor.TEAL.index); //设置背景色 cellStyle.setFillForegroundColor(HSSFColor.TEAL.index);// 设置前景色 cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

POI 数据验证

从3.8开始,POI使用.xls和.xlsx格式处理数据校验略有不同之处.1)针对一个或多个预定义值检查用户输入到单元格的值以下代码将限制用户能输入到单元格A1的值是三个整数值(10.20.30)之一:    Workbook workbook = new XSSFWorkbook();  // 或者new HSSFWorkbook    Sheet sheet = workbook.createSheet("Data Validation");    // 数据验证帮助类    Da

POI导出EXCEL经典实现

在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF,我这里就用两篇文章分别给大家介绍下.(注意,我们这里说的数据导出可不是数据库中的数据导出!么误会啦^_^) 呵呵,首先我们来导出EXCEL格式的文件吧.现在主流的操作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI.这里我们用Apache POI!我们先去Apach

POI导出大量数据

http://blog.csdn.net/lipinganq/article/details/53434884 http://www.cnblogs.com/sunxun/p/5868233.html http://blog.csdn.net/beginya/article/details/52788390 http://blog.csdn.net/krystaltangcl/article/details/52474529 http://blog.csdn.net/fullstack/arti

SSM中excel的导出以及poi的使用

首先,这是我对自己的需求而使用的逻辑,若有可以完美的地方方便告诉下小白. MAVEN <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.16</version> </dependency> 1.前端页面,伪异步(页面不刷新) 为什么不用ajax呢? JQuery的ajax函数的返回类型只有

获取百度地图POI数据二(准备搜索关键词)

上篇讲到  想要获取尽可能多的POI数据 需要准备尽可能多的搜索关键字   那么这些关键字如何得来呢?   本人使用的方法是通过一些网站来获取这些关键词   http://poi.mapbar.com/这个网站有全国各地的POI数据  对各个城市的POI数据都有归类  我便是从这个网站上面获取了上海市的各个类别的关键词  比如上海市所有的门牌号码  公路名称  地铁名称等等  下面介绍如何获取这些信息 和获取百度POI数据所用的方法一样,都是通过分析这个网站的url然后替换其中的参数获取不同的数

获取百度地图POI数据一(详解百度返回的POI数据)

POI是一切可以抽象为空间点的现实世界的实体,比如餐馆,酒店,车站,停车场等.POI数据具有空间坐标和各种属性,是各种地图查询软件的基础数据之一.百度地图作为国内顶尖的地图企业,其上具有丰富的POI数据,要获取其上的POI数据可以根据百度地图提供的API,但是这种方式有限制,能获取的数据极少.本文将详细介绍通过模拟HTTP请求的方式获取其上的POI数据. 当我们在百度地图的搜索框中通过输入关键字进行搜索时,这其实就是发送一个HTTP请求到百度的服务器,然后服务器返回数据. 打开网页的调试面板可以