[Google Maps Datasets API(V1)] Javaで地理空間データを利用する

Google Maps Datasets API(V1)をJavaで使ってみました。
今回の記事はAPIを利用するにあたり準備する必要があるものを記事にしました。

***Maps Datasets APIとは***
独自の地理空間データをデータセットにアップロードし、
データ対象物にカスタムスタイル設定を適用して地図に表示できます。

点、ポリライン、ポリゴンのジオメトリに基づいてデータを可視化したり、
データ対象物をクリックイベントに反応させたりできます。

|No|||目次|
|---|---|---|---|
|1|||[Maps Datasets APIを使用するための準備](#1-maps-datasets-apiを使用するための準備)|
||1||[プロジェクトの作成](#11-プロジェクトの作成)|
||2||[Maps Datasets APIの設定](#12-maps-datasets-apiの設定)|
||3||[APIを使用するためのキー取得](#13-apiを使用するためのキー取得)|
|||1|[サービス アカウント](#131-サービス-アカウント)|
|||2|[OAuth2.0 クライアントID](#132-oauth20-クライアントid)|
|2|||[権限付与](#2-権限付与)|
|3|||[Maps Datasets APIを使ってみる](#3-maps-datasets-apiを使ってみる)|
||1||[googleライブラリの読み込み](#31-googleライブラリの読み込み)|
||2||[MapsPlatformDatasetsClientインスタンスを取得](#32-mapsplatformdatasetsclientインスタンスを取得)|
|||1|[サービスアカウントを利用する場合](#321-サービスアカウントを利用する場合)|
|||2|[OAuth 2.0 クライアントIDを利用する場合](#322-oauth-20-クライアントidを利用する場合)|
||3||[プログラムの実行](#33-プログラムの実行)|
|4|||[いろいろとAPIを叩いてみる](#4-いろいろとapiを叩いてみる)|
||1||[v1.media](#41-v1media)|
||2||[v1.projects.datasets](#42-v1projectsdatasets)|

# 1. Maps Datasets APIを使用するための準備
設定は下記から行います。
[⧉Google クラウド プラットフォーム](https://console.cloud.google.com/)

[1. GCPプロジェクトの作成](#11-プロジェクトの作成)
[2. Maps Datasets APIの設定](#12-maps-datasets-apiの設定)
[3. プログラムで使用するキーの取得](#13-apiを使用するためのキー取得)

### 1.1. プロジェクトの作成
まずはGCPでプロジェクトを作成します。
詳細はこちらの記事を参照ください
[⧉[Google Sheets API] Google Sheets API v4をJavaで操作する(1.1. プロジェクトの作成)](https://qiita.com/doran/items/3d43f776188b2281044c/#11-プロジェクトの作成)

### 1.2. Maps Datasets APIの設定
Maps Datasets APIを使えるようにします。

|No|手順||
|---|---|:-:|
|1|メニューの 「APIとサービス」 -> 「ライブラリ」 を選択します。|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/2fda7515-ffdf-11d7-4142-fed896cc8413.png">|
|2|Maps datasetsと入力して「Maps Datasets API」を検索します。|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/cbb7a158-a427-c1fb-7a42-f0db550fdc60.png">|
|3|「有効にする」ボタンを押して「Maps Datasets API」を使用可能にします。|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/cb846cdf-5f6a-f921-c279-5a3c4ee53fe4.png">|

### 1.3. APIを使用するためのキー取得
プログラムからAPIを実行するための準備を行います。
サービスアカウント、OAuth2.0、APIキーを利用する3つの方法があります。

#### 1.3.1. サービス アカウント
同じ内容を下記の記事に掲載してますので、下記の記事を参照ください。
[⧉[Google Sheets API] Google Sheets API v4をJavaで操作する(1.3. Googleサービスアカウントの作成)](https://qiita.com/doran/items/3d43f776188b2281044c/#13-googleサービスアカウントの作成)

#### 1.3.2. OAuth2.0 クライアントID
同じ内容を下記の記事に掲載してますので、下記の記事を参照ください。
[⧉[Google Drive API v3] JavaでDrive APIを使う(1.3.2. OAuth2.0 クライアントID)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a/#132-oauth20-クライアントid)

# 2. 権限付与
APIを使用してアクセスするにはプロジェクト単位での権限の付与が必須です。

APIをいろいろと叩く予定なので、ロールに「Maps API管理者」を指定していますが、
状況に応じて適切に設定してください。

|No|手順||
|---|---|:-:|
|1|メニュー「IAMと管理」 -> 「IAM」を選択します。|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/b3c4aa56-621f-02df-fe8f-1f8b3a331b4b.png">|
|2|「アクセス権を付与」を選択します。|<img width=280 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/2ca49fce-d4ef-6014-2444-feb5a8ea0454.png">|
|3|下記を入力・設定して「保存」ボタンを押します。<br><br>新しいプリンシパル：サービスアカウントメールアドレスか、OAuth2.0認証を行うメールアドレス<br>ロールを選択：Maps API管理者|<img width=280 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114621/12017eb3-e035-22e5-0d54-c109d22f3c7c.png">|

# 3. Maps Datasets APIを使ってみる
### 3.1. googleライブラリの読み込み
Maps Datasets APIを使用するためにライブラリのパスを設定します。
私の環境はpom.xmlで下記を指定しています。
Javaのバージョンは21を使用しています。

```xml
<dependencies>
    <dependency>
        <groupId>com.google.api-client</groupId>
        <artifactId>google-api-client</artifactId>
    </dependency>
    <dependency>
        <groupId>com.google.maps</groupId>
        <artifactId>google-maps-mapsplatformdatasets</artifactId>
        <version>0.31.0</version>
    </dependency>
    <!-- OAuth2.0でAPIを使う場合は下記を追加してください。 -->
    <dependency>
        <groupId>com.google.oauth-client</groupId>
        <artifactId>google-oauth-client-jetty</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>libraries-bom</artifactId>
            <version>26.38.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
```

### 3.2. MapsPlatformDatasetsClientインスタンスを取得

#### 3.2.1. サービスアカウントを利用する場合
コード中の「JSONファイルのパス」は、
[⧉[Google Sheets API] Google Sheets API v4をJavaで操作する(1.3. Googleサービスアカウントの作成)](https://qiita.com/doran/items/3d43f776188b2281044c#13-googleサービスアカウントの作成)
で取得したJSONファイルのパスを指定してください。

```java
private static MapsPlatformDatasetsClient getMapsPlatformDatasetsClient() throws Exception{
    try(InputStream input = new FileInputStream("JSONファイルのパス")){
        GoogleCredentials credentials = GoogleCredentials
                .fromStream(input)
                .createScoped(Arrays.asList("https://www.googleapis.com/auth/cloud-platform"));
        
        MapsPlatformDatasetsSettings settings = MapsPlatformDatasetsSettings.newBuilder()
                .setCredentialsProvider(FixedCredentialsProvider.create(credentials)) 
                .build();
        
        return MapsPlatformDatasetsClient.create(settings);
    }
}
```
#### 3.2.2. OAuth 2.0 クライアントIDを利用する場合
コード中の「JSONファイルのパス」は、
[⧉[Google Drive API v3] JavaでDrive APIを使う(1.3.2.1 認証情報の作成)](https://qiita.com/doran/items/15b2c59adb410ddeeb8a/#1321-認証情報の作成)
で取得したJSONファイルのパスを指定してください。

コード中の「認証情報を保存するフォルダパス」は、
認証情報が保存されるフォルダのパスを指定してください。
このコードを実行するとOAuth同意画面が表示されます。
ユーザーが同意をすると認証情報を保存するフォルダにファイルが生成されます。
このファイルが存在した場合は、再度実行してもOAuth同意画面は表示されません。

```java
private static MapsPlatformDatasetsClient getMapsPlatformDatasetsClient2() throws Exception{
    HttpTransport transport = GoogleNetHttpTransport.newTrustedTransport();
    GsonFactory jsonFactory = GsonFactory.getDefaultInstance();
    
    try(Reader reader = new InputStreamReader(new FileInputStream("JSONファイルのパス"))){
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(jsonFactory,reader);
        
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                transport, jsonFactory, clientSecrets, 
                Arrays.asList("https://www.googleapis.com/auth/cloud-platform"))
            .setDataStoreFactory(new FileDataStoreFactory(new java.io.File("認証情報を保存するフォルダパス")))
            .build();
        
        LocalServerReceiver receiver = new LocalServerReceiver.Builder().build();
        Credential credential = new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
        UserCredentials credentials = UserCredentials.newBuilder()
                .setClientId(clientSecrets.getDetails().getClientId())
                .setClientSecret(clientSecrets.getDetails().getClientSecret())
                .setRefreshToken(credential.getRefreshToken())
                .build();

        MapsPlatformDatasetsSettings settings = MapsPlatformDatasetsSettings.newBuilder()
                .setCredentialsProvider(FixedCredentialsProvider.create(credentials))
                .build();
       
        return MapsPlatformDatasetsClient.create(settings);
    }
}
```

### 3.3. プログラムの実行
プログラムを動かします。

サンプルはデータセット一覧を取得しています。

```java
public static void main(String[] args) throws Exception{
    try(MapsPlatformDatasetsClient client = getMapsPlatformDatasetsClient()){
        ListDatasetsRequest.Builder builder = ListDatasetsRequest.newBuilder();
        builder.setParent(String.format("projects/%s", "プロジェクトID"));
        
        MapsPlatformDatasetsClient.ListDatasetsPagedResponse response = client.listDatasets(builder.build());
        for(Dataset dataset : response.iterateAll()) {
            System.out.println(dataset);
        }
    }
}
```
# 4. いろいろとAPIを叩いてみる
いろいろとAPIを叩いてみます。

#### 4.1. v1.media
メディアアップロード、ダウンロードの操作

|メソッド|概要|記事|
|---|---|---|
|download|データセットをダウンロード|Java非対応(2024年5月 時点)|
|upload|データセットをアップロード|Java非対応(2024年5月 時点)|

#### 4.2. v1.projects.datasets
データセットに関する操作

|メソッド|概要|記事|
|---|---|---|
|create|データセットを作成|[⧉[Google Maps Datasets API(V1)] Javaで地理空間データのデータセットを作成・更新・削除する](https://qiita.com/doran/items/cf0a1e2e271ec8ce41b1)|
|delete|データセットを削除|[⧉[Google Maps Datasets API(V1)] Javaで地理空間データのデータセットを作成・更新・削除する](https://qiita.com/doran/items/cf0a1e2e271ec8ce41b1)|
|get|データセットを取得|[⧉[Google Maps Datasets API(V1)] Javaで地理空間データのデータセットを取得する](https://qiita.com/doran/items/dad9bcbb1d46b87c92fb)|
|list|データセット一覧を取得|[⧉[Google Maps Datasets API(V1)] Javaで地理空間データのデータセットを取得する](https://qiita.com/doran/items/dad9bcbb1d46b87c92fb)|
|patch|データセットを更新|[⧉[Google Maps Datasets API(V1)] Javaで地理空間データのデータセットを作成・更新・削除する](https://qiita.com/doran/items/cf0a1e2e271ec8ce41b1)|
<br>
<br>
おしまい。。