Parse Server Java SDKの使い方（Kotlinでの位置情報オブジェクト利用）

[ニフクラ mobile backendは3月末で終了します](https://mbaas.nifcloud.com/info/2023/12/post-171.html)。

ニフクラ mobile backendからの移行先として、お勧めしているのが[Parse Server](https://parseplatform.org/)です。設計思想が近く、変更するコード量が少なく済むのではないかと思います。

Parse ServerではAndroid向けにSDKを提供していますが、言語はJavaのみとなっています。Kotlin向けには、Java SDKの内容を翻訳しながら実装する必要があります。そこで、各機能の使い方を解説します。今回は位置情報オブジェクトの使い方です。

## Android SDKのインストール

Android SDKのインストールは幾つかの設定が必要です。

### settings.gradleの修正

プロジェクトルートにある `settings.gradle` を修正します。

```groovy
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
				// 以下を追加
        maven {
            url "https://jitpack.io"
        }
    }
}
```

### app/build.gradleの修正

app以下にある `build.gradle` を修正します。

```groovy
dependencies {
	// 以下を追加
	implementation "com.github.parse-community.Parse-SDK-Android:parse:4.2.1"
}
```

バージョンはインストールするタイミングによって異なりますが、現在は以下です。

![](https://jitpack.io/v/parse-community/Parse-SDK-Android.svg)

### AndroidManifest.xmlの修正

開発中で、ローカルのParse Serverを使う場合には、以下の設定が必要です。

```xml
<application
	android:usesCleartextTraffic="true" <!-- 追加 -->
>
```

## 初期化

SDKの初期化は `MainActivity` にて行います。Androidはエミュレーターなので、 `localhost:1337` ではなく、 `192.168.0.2:1337` などがParse ServerのURLになるでしょう。

```kotlin
import com.parse.Parse

class MainActivity : AppCompatActivity() {

    private lateinit var appBarConfiguration: AppBarConfiguration
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Parse.initialize(
            Parse.Configuration.Builder(this)
                .applicationId("appId")
                .clientKey("clientKey")
                .server("http://your_parse_server/parse/")
                .build()
        )
				// 省略
		}
}
```

## 位置情報オブジェクトの作成

Parseの位置情報オブジェクトの作成は `ParseGeoPoint` になります。1つ目の引数が緯度、二つ目が経度になります。

```kotlin
val point = ParseGeoPoint(40.0, -30.0)
val placeObject = ParseObject("Location")
placeObject.put("location", point)
```

取得する際には `getParseGeoPoint` メソッドを使います。

```kotlin
placeObject.getParseGeoPoint("location")
```

## ポリゴンの指定

Parse Serverには複数の位置情報を組み合わせたポリゴンも指定できます。より複雑な位置情報を扱えます。

```kotlin
val points: MutableList<ParseGeoPoint> = ArrayList()
points.add(ParseGeoPoint(0.0, 0.0))
points.add(ParseGeoPoint(0.0, 1.0))
points.add(ParseGeoPoint(1.0, 1.0))
points.add(ParseGeoPoint(1.0, 0.0))
val polygon = ParsePolygon(points)
placeObject.put("bounds", polygon)
```

取得する際には `getParsePolygon` メソッドを使います。

```kotlin
placeObject.getParsePolygon("bounds")
```

## 位置情報検索

位置情報検索は複数のメソッドがありますが、基本は `ParseQuery` を使った方法で変わりません。

```kotlin
val userLocation = placeObject.getParseGeoPoint("location")
val query = ParseQuery.getQuery<ParseObject>("PlaceObject")
query.whereNear("location", userLocation)
query.limit = 10
query.findInBackground()
```

二つの位置情報を指定する、 `whereWithinGeoBox` メソッドなども用意されています。

```kotlin
val southwestOfSF = ParseGeoPoint(37.708813, -122.526398)
val northeastOfSF = ParseGeoPoint(37.822802, -122.373962)
val query2 = ParseQuery.getQuery<ParseObject>("PizzaPlaceObject")
query.whereWithinGeoBox("location", southwestOfSF, northeastOfSF)
query.findInBackground()
```

他、位置情報検索系は以下のようなメソッドがあります。

- whereNear
- wherePolygonContains
- whereWithinGeoBox
- whereWithinKilometers
- whereWithinMiles
- whereWithinRadians

## まとめ

Parse Serverの位置情報オブジェクトは、NCMBと変わらず利用できます。また、Parseにはポリゴンという複数の位置情報を利用したオブジェクトも利用できます。地図を利用したアプリなどで活躍することでしょう。

データの管理方法などはParse ServerとNCMBで似ています。他のmBaaSと比べると、全体の修正量はそこまで多くないと思われます。載せ替え先として検討に挙げてください。

[Android Developers Guide \| Parse](https://docs.parseplatform.org/android/guide/#geopoints)