【AndroidでSkobblerを使う】Skobbler内のいろいろなデータを検索する

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

Skobbler内に含まれるデータ(国, 州, 都市, 通り名, POI)に対して中心緯度経度と半径等の検索条件を設定し検索する。
  1. SKNearbySearchSettingsで条件を設定する。
  2. SKSearchManagerのコンストラクタにSKSearchListenerを渡しインスタンス化する。
  3. SKSearchManager#nearbySearchにSKNearbySearchSettingsを渡し検索を開始する。
  4. SKSearchListener#onReceivedSearchResultsで検索結果を受け取る
今回はタップした位置を中心に任意の検索条件を使い検索するサンプルを作りました。
public class MainActivity extends AppCompatActivity {

    private SKMapSurfaceView skMapSurfaceView;

    private SKMapViewHolder mapHolder;

    String mapResourcesDirPath;

    private SKCoordinate startSkCoordinate = new SKCoordinate(139.766084, 35.681382);

    private SKSearchListener skSearchListener = new SKSearchListener() {
        @Override
        public void onReceivedSearchResults(List<SKSearchResult> list) {
            //検索結果のリストを取得する。
            Log.d("SKSearchListener", "onReceivedSearchResults:" + list.size());
            for (SKSearchResult skSearchResult : list) {
                //検索結果のID
                Log.d("SKSearchResult", "ID:" + skSearchResult.getId());
                //検索結果の名前
                Log.d("SKSearchResult", "Name:" + skSearchResult.getName());
                //検索結果の緯度経度
                Log.d("SKSearchResult", "Location" + skSearchResult.getLocation().toString());
                //検索結果のメインカテゴリー
                Log.d("SKSearchResult", "MainCategory:" + skSearchResult.getMainCategory());
                //検索結果のカテゴリー
                Log.d("SKSearchResult", "Category:" + skSearchResult.getCategory());
                //検索結果のタイプ、通りの名前や地名
                //http://developer.skobbler.com/docs/android/2.5.1/com/skobbler/ngx/search/SKSearchResult.SKSearchResultType.html
                Log.d("SKSearchResult", "Type:" + skSearchResult.getType());
                //検索結果が含まれるオフラインパッケージのコードを取得する。
                Log.d("SKSearchResult", "OfflinePackageCode:" + skSearchResult.getOfflinePackageCode());
                List<SKSearchResultParent> parentsList = skSearchResult.getParentsList();
                Log.d("SKSearchResultParent", "SKSearchResultParent:" + parentsList.size());
                for (SKSearchResultParent skSearchResultParent : parentsList) {
                    //検索結果が含まれる親要素のINDEXを表示する。
                    Log.d("SKSearchResultParent", "Index:" + skSearchResultParent.getParentIndex());
                    //検索結果が含まれる親要素の名前を表示する。
                    Log.d("SKSearchResultParent", "Name:" + skSearchResultParent.getParentName());
                    //検索結果が含まれる親要素のタイプを表示する。
                    //http://developer.skobbler.com/docs/android/2.5.1/com/skobbler/ngx/search/SKSearchResult.SKSearchResultType.html
                    Log.d("SKSearchResultParent", "Type:" + skSearchResultParent.getParentType());
                }
            }
        }
    };
    
    SKMapSurfaceListener skMapSurfaceListener = new SKMapSurfaceListener() {

        @Override
        public void onActionPan() {
        }

        @Override
        public void onActionZoom() {
        }

        @Override
        public void onSurfaceCreated(SKMapViewHolder skMapViewHolder) {
            mapHolder = skMapViewHolder;
            skMapSurfaceView = skMapViewHolder.getMapSurfaceView();
            skMapSurfaceView.centerMapOnPosition(startSkCoordinate);
        }

        @Override
        public void onMapRegionChanged(SKCoordinateRegion skCoordinateRegion) {
        }

        @Override
        public void onMapRegionChangeStarted(SKCoordinateRegion skCoordinateRegion) {
        }

        @Override
        public void onMapRegionChangeEnded(SKCoordinateRegion skCoordinateRegion) {
        }

        @Override
        public void onDoubleTap(SKScreenPoint skScreenPoint) {
        }

        @Override
        public void onSingleTap(SKScreenPoint skScreenPoint) {
            //検索マネージャーをインスタンス化する、引数は完了時のコールバックを設定する。
            SKSearchManager skSearchManager = new SKSearchManager(skSearchListener);
            //検索条件を設定する。
            SKNearbySearchSettings skNearbySearchSettings = new SKNearbySearchSettings();
            //検索の中心位置の緯度経度を設定する。
            skNearbySearchSettings.setLocation(skMapSurfaceView.pointToCoordinate(skScreenPoint));
            //検索の中心位置からの半径を設定する。単位はメートル
            skNearbySearchSettings.setRadius((short) 1000);
            //検索キーワードを設定する。
            skNearbySearchSettings.setSearchTerm("");
            //検索モードを設定する。
            //SKSearchManager.SKSearchMode.OFFLINE → オフライン検索
            //SKSearchManager.SKSearchMode.ONLINE → オンライン検索
            skNearbySearchSettings.setSearchMode(SKSearchManager.SKSearchMode.OFFLINE);
            //検索結果をソートを決める
            //SKNearbySearchSettings.SKSearchResultSortType.MATCH_SORT → 名前の一致具合にソートする。
            //SKNearbySearchSettings.SKSearchResultSortType.PROXIMITY_SORT → 距離が近い順でソートする。
            skNearbySearchSettings.setSearchResultSortType(SKNearbySearchSettings.SKSearchResultSortType.PROXIMITY_SORT);
            //検索結果の件数を設定する。
            skNearbySearchSettings.setSearchResultsNumber(100);
            //検索対象のカテゴリを配列で設定する。
            //メインカテゴリー
            //http://developer.skobbler.com/docs/android/2.5.1/com/skobbler/ngx/SKCategories.SKPOIMainCategory.html
            //カテゴリー
            //http://developer.skobbler.com/docs/android/2.5.1/com/skobbler/ngx/SKCategories.SKPOICategory.html
            skNearbySearchSettings.setSearchCategories(new int[]{SKCategories.SKPOIMainCategory.SKPOI_MAIN_CATEGORY_FOOD.getValue()});
            //検索結果の言語を設定する
            skNearbySearchSettings.setSearchLanguage(SKMaps.SKLanguage.LANGUAGE_LOCAL);
            //検索が正常に開始されたかを返却する。
            //http://developer.skobbler.com/docs/android/2.5.1/index.html
            SKSearchStatus status = skSearchManager.nearbySearch(skNearbySearchSettings);
            Log.d("SKSearchStatus", status.toString());
        }

        @Override
        public void onRotateMap() {
        }

        @Override
        public void onLongPress(SKScreenPoint skScreenPoint) {
        }

        @Override
        public void onInternetConnectionNeeded() {
        }

        @Override
        public void onMapActionDown(SKScreenPoint skScreenPoint) {
        }

        @Override
        public void onMapActionUp(SKScreenPoint skScreenPoint) {
        }

        @Override
        public void onPOIClusterSelected(SKPOICluster skpoiCluster) {
        }

        @Override
        public void onMapPOISelected(SKMapPOI skMapPOI) {
        }

        @Override
        public void onAnnotationSelected(SKAnnotation skAnnotation) {
        }

        @Override
        public void onCustomPOISelected(SKMapCustomPOI skMapCustomPOI) {
        }

        @Override
        public void onCompassSelected() {
        }

        @Override
        public void onCurrentPositionSelected() {
        }

        @Override
        public void onObjectSelected(int i) {
        }

        @Override
        public void onInternationalisationCalled(int i) {
        }

        @Override
        public void onBoundingBoxImageRendered(int i) {
        }

        @Override
        public void onGLInitializationError(String s) {
        }

        @Override
        public void onScreenshotReady(Bitmap bitmap) {
        }
    };
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mapResourcesDirPath = getFilesDir().getPath() + "/" + "SKMaps/";
        if (!new File(mapResourcesDirPath).exists()) {
            new SKPrepareMapTextureThread(this, mapResourcesDirPath, "SKMaps.zip", new SKPrepareMapTextureListener() {
                @Override
                public void onMapTexturesPrepared(boolean b) {
                    if (b) {
                          initMapSetting();
                    }
                    }
            }).start();
        } else {
            initMapSetting();
        }
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        if (mapHolder != null) {
            mapHolder.onPause();
        }
    }
    
    @Override
    protected void onResume() {
        super.onResume();
        if (mapHolder != null) {
            mapHolder.onResume();
        }
    }

    private void initMapSetting() {
        SKMapsInitSettings initMapSettings = new SKMapsInitSettings();
        initMapSettings.setMapResourcesPaths(mapResourcesDirPath,
        new SKMapViewStyle(mapResourcesDirPath + "daystyle/", "daystyle.json"));
        final SKAdvisorSettings advisorSettings = initMapSettings.getAdvisorSettings();
        advisorSettings.setAdvisorConfigPath(mapResourcesDirPath + "Advisor");
        advisorSettings.setResourcePath(mapResourcesDirPath + "Advisor/Languages");
        advisorSettings.setLanguage(SKAdvisorSettings.SKAdvisorLanguage.LANGUAGE_EN);
        advisorSettings.setAdvisorVoice("en");
        initMapSettings.setAdvisorSettings(advisorSettings);
        SKMaps.getInstance().initializeSKMaps(this, initMapSettings);
        SKMapFragment mapFragment = new SKMapFragment();
        mapFragment.setMapSurfaceListener(skMapSurfaceListener);
        FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
        fragmentTransaction.add(R.id.container, mapFragment).commit();
    }
}

Androidゲームプログラミング A to Z

新品価格
¥4,968から
(2017/2/27 22:58時点)


AndroidエンジニアのためのモダンJava

新品価格
¥3,456から
(2017/2/27 23:01時点)


AndroidNDKネイティブプログラミング第2版

中古価格
¥1,893から
(2017/2/28 00:04時点)


Androidアプリ開発逆引きレシピ (PROGRAMMER’S RECiPE)

新品価格
¥3,024から
(2017/2/28 00:06時点)


Android Studio ではじめる Android プログラミング入門 第3版 Android Studio 2対応

新品価格
¥3,240から
(2017/2/28 00:11時点)


アプリを作ろう! Android入門 Android Studio版 Android5対応

新品価格
¥2,160から
(2017/2/28 00:31時点)


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)