您现在的位置:

搜索服务

【Navinfo Navigation SDK for Android】向用户提供总计包含千万级别的POI(Point of Interest,兴趣点)搜索服务,搜索服务同时在线和离线搜索功能。目前,提供的POI搜索方式包括:关键字搜索、周边搜索、类型搜索、沿路搜索等。

1. 关键字搜索方法为PoiSearch.searchWithKeyword;

2. 周边搜索方法为PoiSearch.forceNearBy(true),设置强制使用周边搜索,然后在调用PoiSearch.searchWithKeyword完成搜索;

3. 沿路搜索方法为PoiSearch.searchAlongRoute。使用搜索方法前需要初始化设置搜索引擎,初始化内容包括:关键字搜索使用的内存缓冲区的大小,返回的POI数量,周边搜索的覆盖范围等;

4. 沿路搜索需要有导航模块支持。

                (完整代码详见相关资源下载中示例工程的NewSearchActivity.java)
                /**
                * 初始化需要使用的引擎 这里主要使用了POI搜索引擎和绘图引擎
                */
                private void init () {
                    ……
                    // 初始化POI搜索引擎
                    mPoiSearch = new PoiSearch();
                    // 设置搜索模式:
                    // onlineOnly在线搜索 offlineOnly离线搜索
                    mPoiSearch.setDataPreference(DataPreference.onlineOnly);
                    // 设置搜索城市id
                    mPoiSearch.setCity(cityName); 
                    // 设置搜索中心点
                    mPoiSearch.setCenter(mCenter);              // 注册搜索监听回调方法
                    mPoiSearch.setListener(new PoiSearch.Listener() {           
                        @Override             
                        public void onPoiSearch(int event) {                 
                            Log.d("search", event + "");                 
                            switch (event) {                     
                                case PoiSearch.Event.queryFinished:                         
                                Logger.i("luke finished event revieved");                         
                                break;                    
                            case PoiSearch.Event.pageLoaded:                         
                                try {                            
                                    // 情况之前的气泡                            
                                    clearAnnotation();                            
                                    mPoiItems.clear();                             
                                    // 例如搜索到3页,poisearch中包含1 - 3页的所有信息,所以需要计算出第三页的位置进行获取                             
                                    boolean flag1 = mPoiSearch.getTotalPoiItemSum() <= (mPageIndex + 1) * mPoiSearch.getPageSize();                            
                                    int maxIndex = flag1 ? mPoiSearch.getTotalPoiItemSum() : (mPageIndex + 1) * mPoiSearch.getPageSize();                             
                                    // 获取当前load页的数量                             
                                    int index = mPoiSearch.getCurrentPoiNum();                            
                                    if (index > 0) {                                 
                                        int poiNumbers = mPoiSearch.getItemNum(BaseItem.ItemType.poi);                                
                                        if (poiNumbers > 0) {                                    
                                            if (poiNumbers == 1) {                                         
                                                PoiItem poiItem = (PoiItem) mPoiSearch.getItemByIndex(BaseItem.ItemType.poi, 0);                                        
                                                // 如果是行政区则跳转到行政区                                        
                                                if (poiItem.type == PoiItem.ItemType.region) {                                            
                                                    RegionPoiItem regionPoiItem = (RegionPoiItem) poiItem;                                             
                                                    mDemoMapView.setCarPosition(regionPoiItem.center);                                             
                                                    mPoiSearch.setCity(regionPoiItem.completeName);                                            
                                                    mPoiSearch.setCenter(regionPoiItem.center);                                            
                                                    return;                                      
                                                }                            
                                            }
                                        }
                                    }
                                }
                                ……
                        }
                    }
                    // 地图上打点
                    private void drawAnnotation() {
                        mAnnotations.clear();
                        Vector2DF vec = new Vector2DF(0.9f, 0.5f);
                        Point point = new Point();
                        int zlevel = 100;
                        Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.gas);
                        for (int i = 0; i < mPoiItems.size(); i++) {
                            point.x = mPoiItems.get(i).position.x;
                            point.y = mPoiItems.get(i).position.y;
                            CustomAnnotation annot = new CustomAnnotation(zlevel, point, i, vec, icon);
                            annot.setTitle(mPoiItems.get(i).name);
                            mAnnotations.add(annot);
                        }
                        for (int i = 0; i < mAnnotations.size(); i++) {
                            mDemoMapView.getMapRenderer().addAnnotation(mAnnotations.get(i));
                        }
                        if (mPoiItems.size() > 0) {
                            // 移动地图中心
                            mDemoMapView.setWorldCenter(mPoiItems.get(0).position);
                        }
                    }
                    // 删除地图上打的点
                    private void clearAnnotation() {
                        for (int i = 0; i < mAnnotations.size(); i++) {
                            mDemoMapView.getMapRenderer().removeAnnotation(mAnnotations.get(i));
                        }
                    }
                }
            

运行后搜索操作界面:

搜索操作界面

点击搜索按钮返回结果:

点击搜索按钮返回结果
返回顶部