Skobbler内に含まれるデータ(国, 州, 都市, 通り名, POI)に対して中心緯度経度と半径等の検索条件を設定し検索する。
- SKNearbySearchSettingsで条件を設定する。
- SKSearchManagerのコンストラクタにSKSearchListenerを渡しインスタンス化する。
- SKSearchManager#nearbySearchにSKNearbySearchSettingsを渡し検索を開始する。
- 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();
}
}