This is the full developer documentation for Re:Earth Docs # Page not found ページが見つかりません。 / The page you’re looking for doesn’t exist. [English documentation](/en/) · [日本語ドキュメント](/ja/) # Re:Earth ドキュメント > Re:Earth の各プロダクトを学び、活用するための情報をまとめています。 # Re:Earth ドキュメント Re:Earth の各プロダクトを学び、活用するための情報をまとめています。 お手伝いできることはありますか? * [CMS を始める](/ja/cms/) * [API リファレンス](/ja/developer/plugin/api-reference/) * [プラグイン開発](/ja/developer/plugin/get-started/run-in-plugin-playground/) ## チュートリアル 手を動かしながら Re:Earth の使い方を学ぶためのチュートリアルを公開しています [一覧へ](/ja/tutorials/) ## 開発向けドキュメント プラグイン開発や API 連携など、Re:Earth を使った開発のためのドキュメント [一覧へ](/ja/developer/) ## プロダクトから探す * [ Re:Earth CMS ](/ja/cms/) * Re:Earth Visualizer 準備中 * Re:Earth Flow 準備中 * [ Re:Earth Dashboard ](/ja/dashboard/) ## AI 向けドキュメント AI に渡すと、Re:Earth のドキュメントを効率よく読み込めます。 * [llms.txt サイト全体の目次 ](/llms.txt) * [llms-full.txt ドキュメント全文 ](/llms-full.txt) ## コミュニティ ご質問、ご提案、プロダクトに関するフィードバック、活用事例の共有はぜひコミュニティに投稿してください * [ Discord ドキュメントで解決しないことを質問できます (新しいタブで開きます)](https://discord.gg/XJhYkQQDAu) * [ GitHub ソースコードを読んだり、Issue や PR を投稿できます (新しいタブで開きます)](https://github.com/reearth) * [ X (Twitter) プロダクトの最新情報などを発信しています (新しいタブで開きます)](https://x.com/ReEarth_Eukarya) # はじめに > Re:Earth CMS でコンテンツを作成・管理する方向けのドキュメントです。API を使った開発は CMS Developer Docs をご覧ください。 はじめて Re:Earth CMS を学ぶ方へ 基本概念を読んでから始めることをおすすめします [「Re:Earth CMSとはなにか」を読む ](/ja/cms/concepts/what-is-reearth-cms/) ## 目的別 [Section titled “目的別”](#目的別) 手を動かして学ぶ [チュートリアルを始める ](/ja/tutorials/) 仕組みを理解する [基本概念を開く ](/ja/cms/concepts/what-is-reearth-cms/) 特定の操作を学ぶ [操作ガイドを開く ](/ja/cms/how-to/project-create-configure-delete/) 詳細な仕様を調べる [リファレンスを開く ](/ja/cms/reference/modeling/field-types/) # Re:Earth CMS の構成 > Re:Earth CMS を構成するプロジェクト・モデル・スキーマなどがそれぞれ何で、互いにどうつながっているかを説明します。 Re:Earth CMS では、ユーザーはプロジェクトの中にモデルを作り、そこにデータを入れて管理します。Re:Earth CMS の構成要素がそれぞれどんなものかを知っておくと、どのデータをどのモデルに分けるか、どの定義を複数のモデルで使い回すか、ファイルをどこに置くか、という設計を考えやすくなります。 * **プロジェクト**:モデル・アイテム・グループ・アセットをまとめて管理する単位です。1 つのプロジェクトは、複数のモデルを持てます。 * **モデル**:1 種類のデータをまとめて扱う単位です。1 つのモデルは、スキーマとコンテンツを 1 つずつ持ちます。 * **スキーマ**:アイテムがどんなフィールドとメタデータを持つかを定義する仕組みです。1 つのスキーマに、複数のフィールドを定義できます。 * **フィールド**:アイテムに入れる値の入力規則です。 * **メタデータ**:アイテムを管理するための入力規則です。スキーマの中で、フィールドとは別に定義します。 * **コンテンツ**:アイテムの集まりです。1 つのコンテンツは、複数のアイテムを持てます。 * **アイテム**:モデルに入れるデータの一つひとつです。アイテムには、スキーマで定義したフィールドに沿って値を入れます。 * **グループ**:複数のフィールドの定義をひとまとめにして、複数のモデルで使い回すための仕組みです。複数のモデルから、スキーマの **グループ** フィールドを通して参照できます。 * **アセット**:プロジェクトにアップロードしたファイルです。複数のモデルのアイテムから **アセット** フィールドを通して参照できます。 ![Re CMS の構成。プロジェクトの中にモデル・グループ・アセットがあり、モデルはスキーマとコンテンツを持つ。スキーマの定義に沿ってコンテンツのアイテムに値を入れ、スキーマのフィールドはグループを、コンテンツのアイテムはアセットを参照する](/_astro/fig1-cms-elements.ja.CTDiBR9Z_FKcNQ.svg) # モデルの構造を先に決める > データを入れる前にモデルとスキーマを決めて値の不揃いを防ぐ考え方と、そろったデータが入れた人以外にも使いやすくなることを説明します。 複数の人がデータを入力すると、値の書き方が人によって分かれてしまうことがあります。たとえば建物の情報では、用途の欄に「住宅」と記入する人がいる一方で、別の人は「住居」と記入するかもしれません。建築年の欄に「1985年?」のような値が混ざることもあります。 「住宅」と「住居」が同じ用途を指すことは、入れた本人には分かっていても、データの上では別の値です。集計するプログラムは別の値として数えるので、用途ごとの集計が合いません。「1985年?」をどの年として扱うかも入れた本人にしか分からず、データを使う側は、その値を信用してよいかを判断できません。このように不揃いなデータは、値の意味を知っている入れた本人以外の人や、プログラムには使いにくくなります。入力を各人の判断に任せた運用では、不揃いはデータが増えるほど広がります。 ![複数の人が入力した建物のデータ。建築年と用途の値の書き方が人によって分かれている](/_astro/fig1-uneven-input.ja.dUmRx3uE_ae4wa.svg) このような不揃いを防ぎ、データを入れた人以外の人やプログラムにも使いやすくするために、データを入れる前にどの項目にどんな値を入れるかを定義するのがデータ管理の基本です。Re:Earth CMS でのデータ管理も、データを入れる先を決め、そこに入る値を定義するところから始まります。 ## モデルは、データを入れる箱 [Section titled “モデルは、データを入れる箱”](#モデルはデータを入れる箱) データを入れる箱を、モデルと呼びます。Re:Earth CMS では、モデルに入れるデータの一つひとつを、アイテムと呼びます。建物のデータを扱うなら、建物のモデルを 1 つ作り、建物 1 棟につき 1 つのアイテムを入れます。100 棟を扱うなら、100 個のアイテムが 1 つのモデルに集まります。 ![建物のモデルに、建物 1 棟につき 1 つのアイテムが入っている](/_astro/fig2-model-and-items.ja.Di1NuK4X_1ScbX4.svg) ## スキーマは、データを入れる前に決める定義 [Section titled “スキーマは、データを入れる前に決める定義”](#スキーマはデータを入れる前に決める定義) Re:Earth CMS では、モデルを作るとき、そのモデルに入るデータの構造をスキーマとして決めます。データを入れる前に作っておく定義が、このスキーマです。 スキーマで決めるのは、そのモデルのデータがどんな項目からできているかです。たとえば、この記事で例にする建物のモデルでは、建物 1 棟のデータを「名前」「建築年」「用途」の 3 つの項目で表すことにします。この一つひとつの項目を、フィールドと呼びます。 1 つのフィールドを定義するには、フィールドに名前を付け、そのフィールドに入れてよい値を決めます。この記事の例の 3 つのフィールドは、次のとおりに定義できます。 * **「名前」フィールドはテキストフィールドにする。** 建物の名前は自由な文字列なので、どんな文字でも入力できるようにします。 * **「建築年」フィールドは整数型のフィールドにする。** 建てられた年だけを入れるフィールドなので、「1985年?」のような文字の混じった値は入れられなくなります。 * **「用途」フィールドは選択肢フィールドにする。**「住宅」と「住居」のような表記揺れが起きないよう、あらかじめ用意した選択肢から選ぶ形にします。 ![モデルのスキーマで「名前」「建築年」「用途」の 3 つのフィールドを定義し、アイテムの値がそのフィールドに入っている](/_astro/fig3-schema-and-items.ja.CfCnWQVD_1LvuKh.svg) ## 先に決めたスキーマが、不揃いを防ぐ [Section titled “先に決めたスキーマが、不揃いを防ぐ”](#先に決めたスキーマが不揃いを防ぐ) スキーマを先に決めておけば、誰が入力しても、アイテムに入れられる値はスキーマの定義に合うものだけになります。値がそろうかどうかが入力する人の判断ではなくスキーマで決まるので、データを管理する側は、データの品質を属人的にではなく仕組みで保てます。 値がそろっていると、データを入れた人に値の意味を聞かなくても、ほかの人やプログラムがデータをそのまま使えます。たとえば、別の担当者が建物を用途ごとに集計するとき、「用途」フィールドの値はあらかじめ用意した選択肢のどれかなので、同じ用途の建物は同じ値として数えられます。建物の一覧を Web サイトに表示するアプリも、API を通じてスキーマで定義したフィールドのとおりにデータを受け取るので、受け取った値をそのまま表示に使えます。データは、入れた人の手元のものではなく、ほかの人やプログラムにも使いやすいものになります。 Re:Earth CMS は、こうしたデータ管理の考え方をもとに設計されています。 # Re:Earth CMS とはなにか > データの管理を表示から切り離すヘッドレス CMS のしくみと、Re:Earth CMS でできること・強みを説明します。 Re:Earth CMS は、テキストや画像だけでなく、地理空間データも扱えるように設計されたヘッドレス CMS です。 ## CMS とは [Section titled “CMS とは”](#cms-とは) CMS(Content Management System、コンテンツ管理システム)とは、テキストや画像などのデータ(コンテンツ)を、コードを書かずに作成・管理・配信できる仕組みです。ユーザーは管理画面からデータを登録し、書き換え、削除します。 ![従来のCMSの仕組み](/_astro/fig1-cms-basic.ja.K1Pl_QYg_2cg9Rn.svg) ## ヘッドレス CMS とは [Section titled “ヘッドレス CMS とは”](#ヘッドレス-cms-とは) Re:Earth CMS が行うのは、ユーザーが登録したデータの管理と配信までです。データを表示する画面(Web サイトやアプリ)はユーザーが用意します。データは、API を通じてその画面に配信されます。 表示する画面が Re:Earth CMS の側に固定されていないため、同じデータを複数の配信先に配信できます。配信先だけでなく、データを登録する経路も複数にできます。管理画面のほかに、別の入力画面から API を通じてデータを受け取れます。Re:Earth CMS の中のデータは 1 つのままなので、ユーザーがデータを直せば、その修正は配信先のすべてに反映されます。 このように、データの管理と配信までを行い、表示する画面はユーザーが用意する形の CMS を、ヘッドレス CMS と呼びます。 たとえば、従来の CMS で Web サイトを作る場合、データを管理する仕組みとデータを表示するページは 1 つのシステムとして一体で、登録したデータはその Web サイトの中でだけ使えます。同じ内容をアプリでも配信するには、アプリの側にもう 1 つの管理を作ることになり、同じ内容のデータの管理が配信先の数だけ増えていきます。 ![従来のCMSではCMS内のコンテンツを別のアプリなどで再利用ができない](/_astro/fig2-integrated-cms.ja.ZBPCrDSb_Z2cGpUm.svg) 一方、ヘッドレス CMS では、データの管理が表示から切り離されています。管理は 1 つに一元化され、Web サイトやアプリ、さらにはデジタルサイネージのような機器にも、同じデータで配信できます。また、ヘッドレス CMS は表示を組み立てる処理を持たないぶん、動きが軽く、応答も速くなります。何に使うか、どんな技術で作るか、何と組み合わせるかを、データを作り直すことなくユーザーが決めることができることが特徴です。 ![コンテンツ管理からAPIを経由して、Webブラウザ・モバイルアプリ・IoTデバイス・デジタルサイネージへ同じデータが配信される仕組み](/_astro/fig3-cms-api.ja.DDWaanAQ_1OrKfH.svg) ## Re:Earth CMS でできること [Section titled “Re:Earth CMS でできること”](#reearth-cms-でできること) Re:Earth CMS では、次のことができます。 * **アプリや Web サイトのデータベースとして使う。** ユーザーは、どんな項目にどんな型の値を入れるかという、データの構造と型を先に決めます。アプリや Web サイトは、API を通じてデータを読み書きします。書き込まれたデータは、決めた構造と型に従って蓄積されます。簡易的なデータベースのように運用できます。 * **同じデータを、複数の形で配信する。** 地図に出す、一覧のページにする、表計算ソフトで開ける形式に書き出す、といった形で配信できます。どの形で配信しても元のデータは 1 つで、すべての配信先に同じ内容が届きます。 * **複数の経路からデータを集めて、複数人で運用する。** 現場で記録する人が使う入力画面をユーザーが別に作り、入力された内容を Re:Earth CMS がデータとして受け取ります。データが 1 か所にあり複数人が触れるため、誰がデータを作成・編集・公開できるかを役割ごとに決められ、レビューと承認を経て公開できます。データの変更履歴も残り、後から経緯をたどれます。 ## Re:Earth CMS の強み [Section titled “Re:Earth CMS の強み”](#reearth-cms-の強み) Re:Earth CMS の導入を検討している段階では、次の 2 つが強みになります。 * **同じデータを複数の配信先で使える。** ヘッドレス CMS に共通の強みです。データの管理を変えずに、配信先を後から増やせます。 * **地理空間データをそのまま扱える。** 位置や形状を入れるためのフィールドとして、ジオメトリオブジェクトとジオメトリエディタが用意されています。GeoJSON や 3Dタイルのファイルも、アセットとして保存して配信できます。 Re:Earth CMS を実際に運用する段階では、データを長く管理し続けることと、複数人で分担することがユーザーの課題になります。Re:Earth CMS には、この 2 つを支える機能があります。 * **データを過去の版に戻せる。** バージョン履歴が残り、過去の版を選んで復元できます。 * **モデルどうしを参照させられる。** 同じ情報は 1 つのモデルだけに持たせ、ほかのモデルからは参照でつなぎます。データの管理はモデルごとに分かれたままです。 * **本体のスキーマとは別に、管理用の情報を付けられる。** たとえば、誰が確認したか、いつ見直すかといった運用のための情報を、データに添えて持てます。 * **役割ごとにできる操作を分けられる。** 所有者・管理者・編集者・閲覧者の 4 つがあり、ユーザーは人ごとに割り当てます。 # アセットをプレビューする > Re:Earth CMS でアセットのアセットタイプを設定し、画像・地理空間データ・CSV などのファイルの中身を画面で表示する手順を説明します。 プレビューは、アセットの詳細画面でアップロードしたファイルの中身を表示するものです。プレビューの形式は **アセットタイプ** で決まります。 プレビューは、所有者・管理者・編集者・閲覧者のいずれでも閲覧できます。**アセットタイプ** を変えられるのは、所有者・管理者と、自分がアップロードしたアセットについての編集者です。 ## アセットタイプを設定してプレビューする [Section titled “アセットタイプを設定してプレビューする”](#アセットタイプを設定してプレビューする) アップロードしたファイルに合う **アセットタイプ** を選び、プレビューします。 1. **アセット** 画面の一覧で、プレビューするアセットの行にある編集のアイコンをクリックします。 2. **アセットタイプ** で、ファイルの形式に合うものを選びます。 3. **保存** をクリックします。 **アセットタイプ** の選択肢と、それぞれで表示できる拡張子は [アセット](/ja/cms/reference/content/assets/) にあります。 **保存** をクリックするまで、選んだ **アセットタイプ** は残りません。保存すると、**アセット** 画面の一覧の **プレビュータイプ** の列にも反映されます。 ## プレビューを大きく表示する [Section titled “プレビューを大きく表示する”](#プレビューを大きく表示する) 1. プレビューの右上にある拡大のアイコンをクリックします。 2. 元に戻すには、キーボードの Esc キーを押します。 拡大のアイコンが出るのは、**アセットタイプ** とファイルの拡張子が合っているアセットです。 ## SVG のソースを確認する [Section titled “SVG のソースを確認する”](#svg-のソースを確認する) SVG のアセットで、絵とファイルの中身を切り替えて表示します。 1. **アセットタイプ** に **SVG** を選びます。 2. **ソースコード** をクリックすると、ファイルの中身が表示されます。 3. **描画** をクリックすると、絵の表示に戻ります。 **ソースコード** と **描画** のボタンは、**アセットタイプ** が **SVG** のときだけ出ます。 # zip・7z アセットを解凍する > Re:Earth CMS でアセットを解凍し、zip・7z の中身のファイルの一覧と URL を確認する手順を説明します。 拡張子が zip・7z のファイルをアセットとしてアップロードして解凍すると、zip・7z の中身のファイルが CMS 上から確認できるようになります。 解凍した中身のファイルはアセットにはならず、アセットとして扱われるのは zip・7z のファイルです。zip・7z のアセットをアップロード・ダウンロード・削除する手順は [アセットを管理する](/ja/cms/how-to/assets/) にあります。 zip・7z の中身のファイルに対してできるのは、プレビューを表示することと、ファイルごとの URL を取得することです。 zip・7z の中身のファイルをプレビューに表示するには、そのアセットの **アセットタイプ** を選びます。手順は [アセットをプレビューする](/ja/cms/how-to/asset-geo-preview/) にあります。 解凍は、アップロードのときに実行する形と、アップロードした後から実行する形の2つがあります。 解凍できるのは、所有者・管理者・編集者です。閲覧者は、解凍済みのアセットの中身のファイルを閲覧できます。 ## アップロードのときに解凍する [Section titled “アップロードのときに解凍する”](#アップロードのときに解凍する) zip・7z のファイルをアップロードし、続けて解凍します。 1. **アセット** 画面で **アセットをアップロード** をクリックします。 2. **ローカル** タブで zip・7z のファイルを選ぶか、**URL** タブで zip・7z のファイルの URL を入力します。 3. **自動解凍** のチェックが付いていることを確かめます。 4. **アップロード** をクリックします。 **自動解凍** のチェックボックスは、選んだファイルまたは入力した URL の拡張子が zip・7z のときに出ます。チェックはデフォルトで付いています。 ## アップロードした後から解凍する [Section titled “アップロードした後から解凍する”](#アップロードした後から解凍する) **自動解凍** を外してアップロードしたアセットを、後から解凍します。 1. **アセット** 画面の一覧で、解凍するアセットの **ステータス** の列の値が **スキップ済み** であることを確かめます。 2. そのアセットの行にある編集のアイコンをクリックします。詳細画面が開きます。 3. **解凍** をクリックします。 **解凍** のボタンは、**ステータス** が **スキップ済み** のときだけ出ます。**ステータス** の一覧と意味は [アセット](/ja/cms/reference/content/assets/) にあります。 解凍が途中で終わると、**ステータス** が **失敗** になります。中身のファイルを確認するには、同じファイルをもう一度アップロードします。 ## zip・7z の中身のファイルの URL を取得する [Section titled “zip・7z の中身のファイルの URL を取得する”](#zip7z-の中身のファイルの-url-を取得する) 解凍が終わった zip・7z のアセットで、中身のファイル1件ごとの URL を取得します。この URL は、zip・7z のアセット自身の URL とは別のものです。 1. **アセット** 画面の一覧で、対象の zip・7z のアセットの行にある編集のアイコンをクリックします。詳細画面が開きます。 2. 中身のファイルの一覧で、URL を取得するファイルの名前をクリックします。 3. 選んだファイルの行に出る **URLをコピー** をクリックします。そのファイルの URL が手元にコピーされます。 中身のファイルの一覧には、ファイルがフォルダの階層のまま並びます。 中身のファイルの一覧は、拡張子が zip・7z のアセットにだけ出ます。 # アセットを管理する > Re:Earth CMS のアセット画面でファイルをアップロードし、ダウンロードや URL の取得を行い、要らなくなったアセットを削除する手順を説明します。アセットを探す・並び替える操作も扱います。 アセットは、プロジェクトにアップロードしたファイルです。左メニューの **アセット** の画面で扱います。 アセットはプロジェクト単位で管理され、そのプロジェクトのどのモデルからでも使えます。アセットのフィールドを持つアイテムから選ぶと、そのアセットがアイテムに紐づきます。 所有者・管理者は、すべてのアセットをアップロード・ダウンロード・削除できます。編集者は、アセットをアップロードでき、自分がアップロードしたアセットを削除できます。閲覧者は、アセットを閲覧・ダウンロードできます。 ## 手元のファイルをアップロードする [Section titled “手元のファイルをアップロードする”](#手元のファイルをアップロードする) パソコンの中のファイルをアセットにします。 1. **アセット** 画面で **アセットをアップロード** をクリックします。 2. **アセットのアップロード** の画面が開きます。**ローカル** タブが選ばれた状態で開くので、そのまま次に進みます。 3. **アセットのアップロード** の画面にファイルをドラッグ&ドロップするか、画面をクリックしてファイルを選びます。複数のファイルを一度に選べます。 4. 選んだファイルが並びます。取り消すファイルは、そのファイルのゴミ箱のアイコンをクリックして外します。 5. **アップロード** をクリックします。 アップロードが終わると画面が閉じ、一覧にアセットが並びます。zip・7z のファイルは、デフォルトで中身が解凍されます。解凍の扱いは [zip・7z アセットを解凍する](/ja/cms/how-to/asset-unzip/) にあります。 ## URL からアップロードする [Section titled “URL からアップロードする”](#url-からアップロードする) インターネット上のファイルを、その場所を指定してアセットにします。 1. **アセット** 画面で **アセットをアップロード** をクリックします。 2. **アセットのアップロード** の画面で **URL** タブを開きます。 3. **URL** にファイルの URL を入力します。指定できる URL は1件だけです。 4. **アップロード** をクリックします。 ## アセットをダウンロードする [Section titled “アセットをダウンロードする”](#アセットをダウンロードする) アセットのファイルを手元に保存します。 1. **アセット** 画面の一覧で、ダウンロードするアセットの行のチェックボックスにチェックを入れます。複数のアセットを選べます。 2. **ダウンロード** をクリックします。 ### 詳細画面からダウンロードする [Section titled “詳細画面からダウンロードする”](#詳細画面からダウンロードする) 1. **アセット** 画面の一覧で、ダウンロードするアセットの行にある編集のアイコンをクリックします。詳細画面が開きます。 2. ダウンロードのアイコンをクリックします。 ## アセットの URL を取得する [Section titled “アセットの URL を取得する”](#アセットの-url-を取得する) zip・7z のアセットでは、この URL は zip・7z のファイルのもので、中身のファイルの URL は [zip・7z アセットを解凍する](/ja/cms/how-to/asset-unzip/) にあります。 1. **アセット** 画面の一覧で、URL を取得するアセットの行にある編集のアイコンをクリックします。詳細画面が開きます。 2. ファイル名の右にある **URLをコピー** のアイコンをクリックします。そのアセットの URL が手元にコピーされます。 ## アセットを削除する [Section titled “アセットを削除する”](#アセットを削除する) 削除は取り消せません **削除** をクリックすると、確認の画面は出ずに削除されます。削除したアセットは元に戻せません。 要らなくなったアセットを削除します。 1. **アセット** 画面の一覧で、削除するアセットの **リンク先** の列を見て、アイテムから参照されていないことを確かめます。 2. 削除するアセットの行のチェックボックスにチェックを入れます。複数のアセットを選べます。 3. **削除** をクリックします。 ## アセットを探す [Section titled “アセットを探す”](#アセットを探す) ファイル名でアセットを絞り込みます。 1. 検索欄にファイル名の一部を入力し、虫めがねのアイコンをクリックします。 ## アセットを並び替える [Section titled “アセットを並び替える”](#アセットを並び替える) 選んだ列の値に従って、アセットの並ぶ順を決めます。並び替えに使えるのは **ファイル**・**サイズ**・**作成日時** の列です。 1. 並び替える列の見出しをクリックします。昇順になります。 # アイテム・アセット・リクエストにコメントする > Re:Earth CMS でアイテム・アセット・リクエストにコメントを書き、書いたコメントを編集・削除する手順を説明します。 コメントは、アイテム・アセット・リクエストのそれぞれに書けます。 コメントを書けるのは、所有者・管理者・編集者です。閲覧者は、コメントを閲覧できます。 ## アイテムにコメントする [Section titled “アイテムにコメントする”](#アイテムにコメントする) 1. **コンテンツ** 画面で、対象のモデルを選びます。 2. コメントを書くアイテムの入力画面を開きます。 3. 吹き出しのアイコンをクリックして **コメント** のパネルを開きます。 4. 入力欄に本文を入力します。 5. **コメント** をクリックします。 コンテンツの一覧からも書けます。一覧で吹き出しの列のボタンをクリックすると、その行のアイテムのコメントがパネルに出ます。 ## アセットにコメントする [Section titled “アセットにコメントする”](#アセットにコメントする) 1. **アセット** 画面で、コメントを書くアセットを開きます。 2. 吹き出しのアイコンをクリックして **コメント** のパネルを開きます。 3. 入力欄に本文を入力します。 4. **コメント** をクリックします。 アセットの一覧からも書けます。一覧で吹き出しの列のボタンをクリックすると、その行のアセットのコメントがパネルに出ます。 ## リクエストにコメントする [Section titled “リクエストにコメントする”](#リクエストにコメントする) 1. **リクエスト** 画面で、コメントを書くリクエストの行にある編集のアイコンをクリックします。 2. 入力欄に本文を入力します。 3. **コメントを追加** をクリックします。 リクエストの一覧からも書けます。一覧で吹き出しの列のボタンをクリックすると、その行のリクエストのコメントがパネルに出ます。 ## コメントを編集する [Section titled “コメントを編集する”](#コメントを編集する) 投稿済みのコメントの本文を書き換えます。 編集できるのは、所有者・管理者と、自分が書いたコメントについての編集者です。 1. 編集するコメントの編集のアイコンをクリックします。入力欄が開きます。 2. 本文を書き換えます。 3. チェックのアイコンをクリックします。 ## コメントを削除する [Section titled “コメントを削除する”](#コメントを削除する) 削除は取り消せません 削除したコメントは元に戻せません。確認は表示されません。 削除できるのは、所有者・管理者と、自分が書いたコメントについての編集者です。 1. 削除するコメントの削除のアイコンをクリックします。 # コンテンツをエクスポートする > Re:Earth CMS でモデルのコンテンツを JSON・CSV・GeoJSON のファイルにエクスポートする手順を説明します。 エクスポートは、モデルのコンテンツをファイルにして手元に取りだす操作です。 JSON・CSV・GeoJSON のそれぞれで何がエクスポートされるかは [インポート・エクスポート](/ja/cms/reference/operations/import-export/) にあります。 エクスポートされるのは、ステータスが **公開済み** のアイテムだけです。アイテムを公開する手順は [アイテムを公開/非公開にする](/ja/cms/how-to/item-publish-unpublish/) にあります。 ファイル名は、モデル名ではなくモデルの ID を使った `〈モデルのID〉-data.〈拡張子〉` になります。ダウンロードが終わると、ファイル名を添えた **ダウンロードに成功しました** が表示されます。 エクスポートは、所有者・管理者・編集者・閲覧者のいずれでも実行できます。 ## JSONエクスポート [Section titled “JSONエクスポート”](#jsonエクスポート) アイテムの値をそのまま書き出す形式です。 1. **コンテンツ** の **モデル** から、エクスポートするモデルを選びます。 2. モデル名の見出しにあるその他の操作(縦の…)をクリックし、**エクスポート** にカーソルを合わせます。 3. **JSON** を選びます。ダウンロードが始まります。 ## CSVエクスポート [Section titled “CSVエクスポート”](#csvエクスポート) 表計算ソフトで開ける形式です。 1. **コンテンツ** の **モデル** から、エクスポートするモデルを選びます。 2. モデル名の見出しにあるその他の操作(縦の…)をクリックし、**エクスポート** にカーソルを合わせます。 3. **CSV** を選びます。 4. 落ちるフィールドの案内が表示されます。内容を読み、**CSV形式でエクスポート** をクリックします。ダウンロードが始まります。エクスポートしないときは **キャンセル** をクリックします。 CSV に入らないフィールドを必須にしているモデルでは、書き出した CSV をそのままインポートできません。そのフィールドにデフォルト値を設定してある場合は、デフォルト値が入ってインポートできます。 ## GeoJSONエクスポート [Section titled “GeoJSONエクスポート”](#geojsonエクスポート) 地図で扱える形式です。ジオメトリのフィールドが2つ以上あるモデルでは、1つだけがファイルに入り、残りは入りません。 1. **コンテンツ** の **モデル** から、エクスポートするモデルを選びます。 2. モデル名の見出しにあるその他の操作(縦の…)をクリックし、**エクスポート** にカーソルを合わせます。 3. **GeoJSON** を選びます。 4. ジオメトリのフィールドが1つのモデルでは、ダウンロードが始まります。2つ以上あるモデルでは警告が出るので、1つだけがエクスポートされることを確かめて **このままエクスポート** をクリックします。エクスポートしないときは **キャンセル** をクリックします。 ジオメトリのフィールドが1つも無いモデルでは、**GeoJSON** を選んでもダウンロードは始まりません。 ### エクスポートするジオメトリのフィールドを決める [Section titled “エクスポートするジオメトリのフィールドを決める”](#エクスポートするジオメトリのフィールドを決める) エクスポートされるのは、**スキーマ** 画面の **フィールド** タブの並びで先にあるジオメトリのフィールドです。別のジオメトリのフィールドをエクスポートするには、この並びを変えます。 1. **スキーマ** 画面で、対象のモデルの **フィールド** タブを開きます。 2. エクスポートしたいジオメトリのフィールドのカードを、三本線のアイコンをつかんで他のジオメトリのフィールドより前に移動します。 アイテムが1件も無いモデルでは、どの形式でも **エクスポート** が操作できません。 # コンテンツをインポートする > Re:Earth CMS で CSV・JSON・GeoJSON のファイルからモデルのコンテンツをインポートする手順を説明します。 インポートは、手元で用意したファイルの内容を、モデルのコンテンツとして取り込む操作です。ファイルの1件のデータが1件のアイテムになり、値は CSV・JSON・GeoJSON のいずれかの形式で書きます。 実験的な機能 インポートは実験的な機能で、動作が不安定な場合があります。 ファイルの列名・キー名は、フィールドの表示名ではなく、フィールドキーと一致させます。 参照・グループのフィールドは、ファイルに書いてもインポートされません。ジオメトリのフィールドと複数値のフィールドは、CSV では扱えないため、JSON か GeoJSON を使います。 インポートが失敗するのは、次の場合です。1件でも当てはまると、そのファイルのアイテムは1件もインポートされません。 * 必須にしたフィールドの列・キーが、ファイルに無い。そのフィールドにデフォルト値を設定してある場合は、デフォルト値が入ります * 必須にしたフィールドの値が空になっている。CSV の空のセルは空の値として扱われ、デフォルト値は入りません * 形式に合わない値がある ファイルの書き方と、1回にインポートできる上限は [インポート・エクスポート](/ja/cms/reference/operations/import-export/) にあります。 ## ファイルからコンテンツをインポートする [Section titled “ファイルからコンテンツをインポートする”](#ファイルからコンテンツをインポートする) 手元のファイルから、モデルのコンテンツをインポートします。 **コンテンツをインポート** の画面には、CSV・JSON・GeoJSON それぞれのテンプレートのリンクがあります。テンプレートは書き方の見本で、モデルのスキーマに合わせて作られるものではありません。 1. **コンテンツ** の **モデル** から、インポート先のモデルを選びます。 2. モデル名の見出しにあるその他の操作(縦の…)をクリックし、**インポート** を選びます。 3. **コンテンツをインポート** の画面で、ファイルを選ぶかドラッグ&ドロップします。選べるファイルは1件だけです。 4. ファイルの確認が始まります。確認が終わると **コンテンツをインポート** の画面が閉じ、画面右下にアップロードの状況が出ます。 5. アップロードの状況で、ファイルの行に緑のチェックが付くと取り込みは終わりです。失敗したファイルには赤いアイコンと理由が出ます。 6. **コンテンツ** 画面で、アイテムがすべてインポートされたことを確かめます。 インポートしたアイテムのステータスは **ドラフト** です。外から見える状態にする手順は [アイテムを公開/非公開にする](/ja/cms/how-to/item-publish-unpublish/) にあります。 インポートの処理は、画面を移動しても続きます。画面右下に出ているアップロードの状況では、次の操作ができます。 * **最小化**: 表示を小さくします。 * **クローズ**: 表示を閉じて、処理中の取り込みをすべて中止します。 * ファイルごとの中止:そのファイルの取り込みだけを止めます。 * 再試行のアイコン:中止したファイルと失敗したファイルをやり直します。 メニューの **インポート** が操作できるのは、フィールドが1つ以上あるモデルを選んでいて、自分がアイテムを作成できる役割(所有者・管理者・編集者)のときです。この2つのどちらかを満たしていないときは操作できず、理由がメニューの項目に表示されます。 ## エラーを直してインポートし直す [Section titled “エラーを直してインポートし直す”](#エラーを直してインポートし直す) ファイルの列名・キー名や値の型がスキーマと合っていないときは、**コンテンツをインポート** の画面がエラーの一覧に切り替わります。 1. **箇所** と **詳細** の表で、どこが合っていないかを確かめます。同じ内容は **エラーログをダウンロード** でファイルに保存できます。 2. 手元のファイルを直します。 3. **戻る** をクリックしてファイルを選ぶ状態に戻り、直したファイルを選び直します。 # フィールドを追加・編集・削除する > Re:Earth CMS のモデルにフィールドを追加し、表示名・フィールドキー・説明や検証の設定を変更し、フィールドを削除する手順を説明します。 フィールドは、**スキーマ** 画面で管理します。 フィールドの追加・編集・削除ができるのは、所有者・管理者・編集者です。閲覧者は、スキーマを閲覧できます。 ## フィールドを追加する [Section titled “フィールドを追加する”](#フィールドを追加する) モデルにフィールドを1つ追加します。 1. **スキーマ** の **モデル** から、フィールドを追加するモデルを選びます。 2. **フィールド** タブを開きます。 3. **フィールドを追加** で、追加するフィールドをクリックします。選べるフィールドは [アイテムのフィールド](/ja/cms/reference/modeling/field-types/) を参照してください。**参照** を追加する手順は [参照フィールドでモデルどうしをつなぐ](/ja/cms/how-to/reference-field/) にあります。 4. **設定** タブで **表示名** を入力します。半角英数字で入力すると、**表示名** をもとにした文字列が **フィールドキー** に自動で入ります。**フィールドキー** に自動で入る文字列では、空白がハイフンに、大文字が小文字に変わります。 5. **フィールドキー** を確認します。値が入っていないときや、エラーが出ているときは、自分で入力します。 6. **説明** に、このフィールドに入れる内容を入力します。入力は任意です。 7. 選んだフィールドに応じて、**設定** タブに出る欄を入力します。 * **選択肢**: **選択肢を設定** に値を入力します。 * **グループ**: **グループを選択** で使うグループを選びます。先にグループを作成しておきます。手順は [グループを作成・編集・削除する](/ja/cms/how-to/groups/) にあります。 * **ジオメトリオブジェクト**: **対応タイプ** で扱うジオメトリの種類を選びます。複数選べます。 * **ジオメトリエディタ**: **対応タイプ** で扱うジオメトリの種類を1つ選びます。 8. 1つのフィールドに複数の値を入れるなら、**複数値の設定を許可** をオンにします。 9. このフィールドの値をアイテムの見出しに使うなら、**タイトルとして使用** をオンにします。この項目は **テキスト**・**テキストエリア**・**マークダウン** のときだけ出ます。1つのモデルでタイトルに設定できるフィールドは1つです。 10. **検証** タブで、値の条件を決めます。 * 値を必ず入れるなら **このフィールドを必須項目にする** を、アイテムごとに違う値を入れるなら **ユニーク制約** をオンにします。**グループ**・**ブーリアン**・**チェックボックス** ではこの2つを設定できません。 * **テキスト**・**テキストエリア**・**マークダウン** なら **最大長** で文字数の上限を、**整数型**・**浮動小数点数** なら **最小値**・**最大値** で値の範囲を入力します。他のフィールドではこの欄は出ません。フィールドごとの検証の項目は [フィールド属性](/ja/cms/reference/modeling/field-attributes/) にあります。 11. **デフォルト値** タブで、アイテムを作ったときに初めから入っている値を入力します。入力は任意です。 12. **OK** をクリックします。 追加したフィールドは **フィールド** タブの一覧に並びます。一覧では、必須のフィールドに `*`、ユニーク制約のあるフィールドに **(ユニーク)**、タイトルに設定したフィールドに **タイトル** が付きます。 ## フィールドの設定を変更する [Section titled “フィールドの設定を変更する”](#フィールドの設定を変更する) 追加した後から、表示名・フィールドキー・説明と、検証やデフォルト値の設定を変更できます。 1. **フィールド** タブの一覧で、変更するフィールドの編集(…)をクリックします。 2. **設定**・**検証**・**デフォルト値** の各タブで設定を変更します。**表示名** を変えても **フィールドキー** は変わりません。 3. **OK** をクリックします。 ## フィールドを削除する [Section titled “フィールドを削除する”](#フィールドを削除する) 削除は取り消せません 入力済みの値は表示されなくなり、同じ表示名とフィールドキーで作り直しても戻りません。双方向の参照フィールドを削除すると、相手のモデルにある対応フィールドも削除されます。 要らなくなったフィールドを削除します。 1. **フィールド** タブの一覧で、削除するフィールドの削除のアイコンをクリックします。 2. 確認の画面に出る表示名が、削除するフィールドのものであることを確かめます。 3. **フィールドを削除** をクリックします。 # アイテム一覧の表示・フィルター条件を設定する > Re:Earth CMS のアイテム一覧に検索とフィルターの条件を設定し、列の並び替えと表示する列を切り替える手順を説明します。 **コンテンツ** 画面のアイテム一覧では、キーワードの検索とフィルターで一覧に表示するアイテムを絞り込み、列の並び替えと表示する列の切り替えで表示の仕方を変えられます。 フィルター・列の並び替え・表示する列は、ビューに保存できます。保存する手順は [ビューを作成・編集・削除する](/ja/cms/how-to/views/) にあります。保存しないまま別のビューに切り替えると、設定した状態は失われます。 検索のキーワードはビューに保存されません。モデルやビューを切り替えると消えます。 4つの操作は、所有者・管理者・編集者・閲覧者のいずれでも実行できます。 ## キーワードで検索する [Section titled “キーワードで検索する”](#キーワードで検索する) 入力した文字を含むアイテムだけを一覧に出します。探す対象は、そのモデルのすべてのフィールドの値と、アイテムの ID・作成者・更新者です。 1. 検索欄に文字を入力します。 2. 虫めがねのアイコンをクリックします。 3. 検索を解除するときは、検索欄のクリアのアイコンをクリックします。 ## フィルターで条件を設定する [Section titled “フィルターで条件を設定する”](#フィルターで条件を設定する) フィールドの値でアイテムを絞り込みます。1つの条件は、フィールド・条件・値の3つで指定します。 1. **フィルター** をクリックします。 2. 絞り込みの対象にするフィールドを選びます。 3. 開いたパネルで条件を選びます。選べる条件はフィールドで決まり、値の入力が要らない条件もあります。条件の一覧は [アイテムフィルター・並び替え](/ja/cms/reference/content/item-filter-sort/) にあります。 4. 値を入れます。 * **選択肢**・**タグ**・**ブーリアン**・**チェックボックス**: 一覧から選びます。 * **日付**: カレンダーから選びます。 * それ以外のフィールド:文字か数値を入力します。 5. **確認** をクリックします。 設定した条件は、フィールド名の付いたボタンとして並びます。ボタンをクリックすると条件を変えられ、× をクリックするとその条件を外せます。条件を複数設定すると、すべての条件に合うアイテムだけが一覧に出ます。 **フィルター** の代わりに、**制御** のアイコンをクリックして **絞り込む** を選ぶ経路もあります。どちらも同じパネルが開きます。 ## 列で並び替える [Section titled “列で並び替える”](#列で並び替える) 選んだ列の値に従って、アイテムの並ぶ順を決めます。昇順と降順のどちらかを指定し、並び替えに使えるのは1つの列だけです。 1. 並び替える列の見出しをクリックします。昇順になります。 2. もう一度クリックすると降順になります。3回目のクリックで並び替えが解除されます。 別の列の見出しをクリックすると、そちらの列での並び替えに切り替わります。 **制御** のアイコンをクリックして **並び替える** を選ぶ経路もあります。この経路では、列を選び、**昇順** または **降順** を選び、**確認** をクリックします。 ## 表示する列を切り替える [Section titled “表示する列を切り替える”](#表示する列を切り替える) 一覧に出す列を選びます。 1. 歯車のアイコンをクリックします。 2. 出てきた一覧で、列ごとのチェックを入れて表示し、外して非表示にします。 # グループを作成・編集・削除する > Re:Earth CMS でグループを作成し、グループ名・グループキー・グループ概要を変更し、グループを削除する手順を説明します。 グループは、複数のフィールドをひとまとめにして、モデルのフィールドから使えるようにするものです。グループは **スキーマ** 画面の **グループ** で作成します。 グループの作成・編集・削除ができるのは、所有者・管理者・編集者です。閲覧者は、グループを閲覧できます。 ## グループを作成する [Section titled “グループを作成する”](#グループを作成する) プロジェクトにグループを1つ追加します。 1. **スキーマ** の **グループ** で **追加** をクリックします。 2. **グループ名** を入力します。半角英数字で入力すると、**グループ名** をもとにした文字列が **グループキー** に自動で入ります。**グループキー** に自動で入る文字列では、空白がハイフンに、大文字が小文字に変わります。 3. **グループ概要** に、このグループで扱う内容を入力します。入力は任意です。 4. **グループキー** を確認します。値が入っていないときや、エラーが出ているときは、自分で入力します。使える文字と長さは [グループ](/ja/cms/reference/modeling/groups/) を参照してください。 5. **OK** をクリックします。 **OK** をクリックすると、作成したグループの画面に移ります。 作成したグループにフィールドを追加する手順は、モデルと同じです。[フィールドを追加・編集・削除する](/ja/cms/how-to/fields/) を参照してください。モデルとの違いは2つです。 * **参照** と **グループ** のフィールドは使えません。 * **フィールド** と **メタデータ** のタブが出ません。フィールドの一覧がそのまま表示されます。 ## グループ名・グループキー・グループ概要を変更する [Section titled “グループ名・グループキー・グループ概要を変更する”](#グループ名グループキーグループ概要を変更する) 1. **スキーマ** の **グループ** から、変更するグループを選びます。 2. グループ名の見出しにあるその他の操作(縦の…)をクリックします。 3. **編集** を選びます。 4. **グループ名**・**グループ概要**・**グループキー** を変更します。**グループ名** を変えても **グループキー** は変わりません。 5. **OK** をクリックします。 ## グループを削除する [Section titled “グループを削除する”](#グループを削除する) 削除は取り消せません 削除したグループは元に戻せません。グループに追加したフィールドも使えなくなり、同じグループ名とグループキーで作り直しても戻りません。 モデルのグループフィールドで使われているグループは削除できません。削除するには、先にそのモデルのグループフィールドを削除します。 1. **スキーマ** の **グループ** から、削除するグループを選びます。 2. グループ名の見出しにあるその他の操作(縦の…)をクリックします。 3. **削除** を選びます。 4. 確認の画面に出るグループ名が、削除するグループのものであることを確かめます。 5. **グループを削除** をクリックします。 # アイテムを公開/非公開にする > Re:Earth CMS でアイテムを公開する手順と、公開したアイテムを非公開にする手順を説明します。参照しているアイテムを一緒に公開する場合も扱います。 アイテムの公開と非公開は、アイテムの入力画面で切り替えます。 入力画面に出るボタンは、プロジェクトの **リクエスト必須** で自分の役割がオンかオフかで変わります。 * オフのとき:**公開** が出ます。 * オンのとき:**新規リクエスト** が出ます。リクエストを作成し、レビュアーの承認を受けてから公開します。 **非公開** は、どちらのときもメニューに出ます。**リクエスト必須** の設定の手順は [役割ごとにリクエストの要否を設定する](/ja/cms/how-to/request-required-by-role/) にあります。 公開と非公開ができるのは、所有者・管理者・編集者です。閲覧者は、アイテムを閲覧できます。 ## アイテムを公開する [Section titled “アイテムを公開する”](#アイテムを公開する) 編集を終えたアイテムを公開します。 1. **コンテンツ** 画面で、対象のモデルを選びます。 2. 公開するアイテムの入力画面を開きます。 3. **公開** をクリックします。 4. このアイテムが参照しているアイテムに、ステータスに **ドラフト** か **レビュー** が付いているものがあるときは、**公開** の画面が出ます。一緒に公開するアイテムにチェックを入れ、**OK** をクリックします。チェックを入れなかったアイテムは公開されません。 公開すると、アイテムのステータスに **公開済み** が付きます。ステータスが **公開済み** だけのアイテムでは、**公開** は押せません。 レビュー中のアイテムは公開できません。 レビューを終える方法は2つです。 * リクエストを承認する:アイテムが公開されるので、改めて **公開** を押す必要はありません。 * リクエストをクローズする:**公開** を押せる状態に戻ります。ステータスに **公開済み** が残っているアイテムは、すでに公開されているため押せません。 ## アイテムを非公開にする [Section titled “アイテムを非公開にする”](#アイテムを非公開にする) 公開したアイテムを **ドラフト** に戻します。 1. **コンテンツ** 画面で、対象のモデルを選びます。 2. 非公開にするアイテムの入力画面を開きます。 3. その他の操作(…)をクリックし、**非公開** を選びます。 レビュー待ちのリクエストに入っているアイテムは、**ドラフト** ではなく **レビュー** になります。 ステータスが **ドラフト** のアイテムと **レビュー** のアイテムでは、**非公開** を選べません。ステータスが **公開済み & レビュー** のアイテムでは選べます。 ## 複数のアイテムをまとめて公開・非公開にする [Section titled “複数のアイテムをまとめて公開・非公開にする”](#複数のアイテムをまとめて公開非公開にする) 一覧で選んだアイテムを、まとめて公開または非公開にします。 1. **コンテンツ** 画面で、対象のモデルを選びます。 2. **コンテンツ** 画面の一覧で、対象のアイテムの行のチェックボックスにチェックを入れます。 3. **公開** または **非公開** をクリックします。 4. **公開** をクリックしたときは、**アイテムの公開** の確認が出ます。**はい** をクリックします。**非公開** では確認は出ません。 # 過去バージョンを確認して復元する > Re:Earth CMS でアイテムの過去バージョンの内容を確認し、その内容を今のアイテムに復元する手順を説明します。 保存するたびに、そのアイテムのフィールドの値・ステータス・日時がバージョンとして記録されます。過去バージョンは、アイテムの入力画面の **バージョン履歴** タブで確認します。 ## 過去バージョンの内容を確認する [Section titled “過去バージョンの内容を確認する”](#過去バージョンの内容を確認する) 保存されているバージョンを選んで、そのときの内容を今の内容と見比べます。 1. **コンテンツ** 画面で、対象のモデルを選びます。 2. 確認するアイテムの入力画面を開きます。 3. **バージョン履歴** タブを開きます。バージョンは新しいものから並び、いちばん新しいものに **現在** が付きます。 4. 確認するバージョンの日時をクリックします。 選んだバージョンの内容が、今の内容と並んで表示されます。バージョン側の内容は読むだけで、書き換えられません。 **バージョン履歴** タブが出るのは、バージョンが1件以上あるアイテムです。 ## 過去バージョンの内容を復元する [Section titled “過去バージョンの内容を復元する”](#過去バージョンの内容を復元する) 過去バージョンの内容を今のアイテムに戻して保存します。 1. **コンテンツ** 画面で、対象のモデルを選びます。 2. 復元するアイテムの入力画面を開きます。 3. **バージョン履歴** タブを開きます。 4. 復元するバージョンの日時をクリックします。 5. **復元** をクリックします。 6. 画面の上に確認が出ます。**復元** をクリックします。 7. フィールドの値が過去バージョンのものに置き換わります。**保存** をクリックします。 **保存** をクリックするまで、復元した内容は確定しません。保存すると新しいバージョンが記録され、それまでのバージョンはすべて残ります。 復元で置き換わるのはフィールドの値だけで、**メタデータ** の値は変わりません。 # アイテムを作成・編集・削除する > Re:Earth CMS でモデルにアイテムを作成し、値を編集し、要らなくなったアイテムを削除する手順を説明します。 アイテムの作成・編集・削除は、**コンテンツ** 画面で行います。**コンテンツ** の **モデル** でモデルを選ぶと、そのモデルのアイテムが表の形で並びます。この表をアイテムの一覧と呼びます。 アイテムに値を入れる入力欄は、そのモデルのスキーマで定義したフィールドです。入力欄の編集は、[フィールドを追加・編集・削除する](/ja/cms/how-to/fields/) の手順で行います。 ## アイテムを作成する [Section titled “アイテムを作成する”](#アイテムを作成する) モデルにアイテムを1件追加します。 アイテムを作成できるのは、所有者・管理者・編集者です。閲覧者は、アイテムを閲覧できます。 1. **コンテンツ** の **モデル** から、対象のモデルを選びます。 2. **新規アイテム** をクリックします。入力画面が開きます。 3. 入力欄に値を入れます。必須のフィールドを空のままにすると **保存** をクリックできません。 4. モデルにメタデータのフィールドがある場合は、入力画面の右にある **メタデータ** に値を入れます。 5. **保存** をクリックします。 保存すると、入力した値がそのまま残り、ステータスに **ドラフト** が付きます。 作成したアイテムを公開する手順は [アイテムを公開/非公開にする](/ja/cms/how-to/item-publish-unpublish/) にあります。 ## アイテムを編集する [Section titled “アイテムを編集する”](#アイテムを編集する) 保存済みのアイテムの値を書き換えます。 編集できるのは、所有者・管理者と、自分が作成したアイテムについての編集者です。 1. **コンテンツ** 画面の一覧で、編集するアイテムの行にある編集のアイコンをクリックします。入力画面が開きます。 2. 入力画面の値を書き換えます。 3. **保存** をクリックします。 保存するたびに、そのアイテムのフィールドの値・ステータス・日時がバージョンとして記録されます。過去バージョンを見る手順は [過去バージョンを確認して復元する](/ja/cms/how-to/item-versions/) にあります。 メタデータのフィールドは、一覧の表の中で直接書き換えられます。書き換えた内容は、**保存** をクリックしなくても保存されます。編集者が直接書き換えられるのは、自分が作成したアイテムのメタデータだけです。 ## アイテムを削除する [Section titled “アイテムを削除する”](#アイテムを削除する) 削除は取り消せません **削除** をクリックすると、確認の画面は出ずに削除されます。削除したアイテムは元に戻せず、他のアイテムからそのアイテムへの参照も外れます。 削除できるのは、所有者・管理者と、自分が作成したアイテムについての編集者です。 1. **コンテンツ** 画面の一覧で、削除するアイテムの行のチェックボックスにチェックを入れます。複数のアイテムを選べます。 2. **削除** をクリックします。 他のユーザーが作成したアイテムが選択に含まれていると、**削除** をクリックできません。 # ライセンスを設定する > Re:Earth CMS のプロジェクトにライセンスを設定する手順を説明します。テンプレートから選ぶ方法と、自分で書く方法を扱います。 ライセンスは、他者がプロジェクトとデータを使用・共有できる条件を定めます。プロジェクトの **ライセンス** 画面で設定します。ライセンスの本文は Markdown で書けます。 **ライセンス** 画面でライセンスを変更できるのは、所有者と管理者です。編集者は、プロジェクト作成時の設定とその後の閲覧はできますが、設定後の変更はできません。閲覧者は、設定されているライセンスを閲覧できます。 ## テンプレートからライセンスを選ぶ [Section titled “テンプレートからライセンスを選ぶ”](#テンプレートからライセンスを選ぶ) 使いたいライセンスがテンプレートにあるときは、テンプレートを選びます。選べるテンプレートは [README・ライセンス](/ja/cms/reference/publish-permissions/readme-license/) を参照してください。 テンプレートには、年や権利者の名前を自分で入れる必要があるものがあります。自分で入れる箇所は、角かっこ(`[ ]`)や山かっこ(`< >`)で囲まれています。 テンプレートを選ぶと本文が置き換わります 本文を編集するときは、テンプレートを選んでから編集します。 1. プロジェクトの **ライセンス** 画面で **編集** をクリックします。 2. **ライセンステンプレートを選択** をクリックします。 3. **ライセンステンプレートを選択** の一覧からライセンスを選びます。**Edit** タブに、そのライセンスの全文が入ります。 4. **Preview** タブを開き、入ったライセンスの本文を読みます。 5. 本文に角かっこ(`[ ]`)や山かっこ(`< >`)で囲まれた箇所があるときは、**Edit** タブに戻って自分の情報を入れます。 6. **変更を保存** をクリックします。 テンプレートの一覧には、ライセンスの名前だけが並びます。それぞれが再利用・改変・再配布をどこまで許すかは、ライセンスの本文に書かれています。手順4で本文を読んでから保存してください。 ライセンスの選定に組織の方針や法務の判断が関わるときは、保存する前に担当者に確かめてください。 ## ライセンスの本文を自分で書く [Section titled “ライセンスの本文を自分で書く”](#ライセンスの本文を自分で書く) 独自の条件を定めたライセンスを使うときは、本文を自分で書きます。 1. プロジェクトの **ライセンス** 画面で **編集** をクリックします。 2. **Edit** タブにライセンスの本文を入力します。 3. **Preview** タブを開き、表示を確かめます。 4. **変更を保存** をクリックします。 # メタデータのフィールドを追加・編集・削除する > Re:Earth CMS のモデルにメタデータのフィールドを追加し、設定を変更し、削除する手順を説明します。 メタデータのフィールドは、アイテムの内容とは別に、そのアイテムの状態や区分を記録するための項目です。**スキーマ** 画面の **メタデータ** タブで管理します。 メタデータのフィールドの追加・編集・削除ができるのは、所有者・管理者・編集者です。閲覧者は、スキーマを閲覧できます。 **メタデータ** タブが出るのはモデルを選んだときだけです。グループには **メタデータ** タブがありません。 ## メタデータのフィールドを追加する [Section titled “メタデータのフィールドを追加する”](#メタデータのフィールドを追加する) モデルにメタデータのフィールドを1つ追加します。 1. **スキーマ** の **モデル** から、フィールドを追加するモデルを選びます。 2. **メタデータ** タブを開きます。 3. **フィールドを追加** で、追加するフィールドをクリックします。選べるフィールドは **フィールド** タブと違います。一覧は [メタデータ](/ja/cms/reference/modeling/metadata/) を参照してください。 4. **設定** タブで **表示名** を入力します。半角英数字で入力すると、**表示名** をもとにした文字列が **フィールドキー** に自動で入ります。**フィールドキー** に自動で入る文字列では、空白がハイフンに、大文字が小文字に変わります。 5. **フィールドキー** を確認します。値が入っていないときや、エラーが出ているときは、自分で入力します。 6. **説明** に、このフィールドに入れる内容を入力します。入力は任意です。 7. 選んだフィールドに応じて、**設定** タブに出る欄を入力します。 * **タグ**: **タグを設定** の **追加** をクリックしてタグを1件足し、足されたタグをクリックして名前を入力します。タグの右にあるパレットのアイコンをクリックすると、色を選べます。 8. 1つのフィールドに複数の値を入れるなら、**複数値の設定を許可** をオンにします。 9. **検証** タブで、値の条件を決めます。 * 値を必ず入れるなら **このフィールドを必須項目にする** を、アイテムごとに違う値を入れるなら **ユニーク制約** をオンにします。**ブーリアン** と **チェックボックス** ではこの2つを設定できません。 * **テキスト** なら **最大長** で文字数の上限を入力します。他のフィールドではこの欄は出ません。 10. **デフォルト値** タブで、アイテムを作ったときに初めから入っている値を入力します。入力は任意です。 11. **OK** をクリックします。 追加したフィールドは **メタデータ** タブの一覧に並びます。一覧の先頭には、初めから **アイテムの情報** と **公開ステータス** が並んでいます。この2つは削除も編集もできません。 ## メタデータのフィールドの設定を変更する [Section titled “メタデータのフィールドの設定を変更する”](#メタデータのフィールドの設定を変更する) 追加した後から、表示名・フィールドキー・説明と、検証やデフォルト値の設定を変更できます。 1. **メタデータ** タブの一覧で、変更するフィールドの編集(…)をクリックします。 2. **設定**・**検証**・**デフォルト値** の各タブで設定を変更します。**表示名** を変えても **フィールドキー** は変わりません。 3. **OK** をクリックします。 ## メタデータのフィールドを削除する [Section titled “メタデータのフィールドを削除する”](#メタデータのフィールドを削除する) 削除は取り消せません 削除したフィールドは元に戻せません。入力済みの値は表示されなくなり、同じ表示名とフィールドキーで作り直しても戻りません。 1. **メタデータ** タブの一覧で、削除するフィールドの削除のアイコンをクリックします。 2. 確認の画面に出る表示名が、削除するフィールドのものであることを確かめます。 3. **フィールドを削除** をクリックします。 # モデルを作成・編集・削除する > Re:Earth CMS でモデルを作成し、モデル名・モデルキー・モデル概要を変更し、モデルを削除する手順を説明します。 モデルは、プロジェクトの **モデル** 画面で管理します。 モデルの作成・編集・削除ができるのは、所有者・管理者・編集者です。閲覧者は、モデルの一覧を閲覧できます。 ## モデルを作成する [Section titled “モデルを作成する”](#モデルを作成する) プロジェクトにモデルを1つ追加します。 1. プロジェクトの **モデル** 画面で **新規モデル** をクリックします。 2. **モデル名** を入力します。半角英数字で入力すると、**モデル名** をもとにした文字列が **モデルキー** に自動で入ります。**モデルキー** に自動で入る文字列では、空白がハイフンに、大文字が小文字に変わります。 3. **モデル概要** に、このモデルで扱う内容を入力します。入力は任意です。 4. **モデルキー** を確認します。値が入っていないときや、エラーが出ているときは、自分で入力します。使える文字と長さは [モデル](/ja/cms/reference/modeling/models/) を参照してください。 5. **OK** をクリックします。作成したモデルのスキーマ画面が開きます。 **モデル** 画面に戻ると、カードからそのモデルのスキーマとコンテンツに移動できます。 ## モデル名・モデルキー・モデル概要を変更する [Section titled “モデル名・モデルキー・モデル概要を変更する”](#モデル名モデルキーモデル概要を変更する) 1. プロジェクトの **モデル** 画面で、変更するモデルのカードにあるその他の操作(…)をクリックします。 2. **編集** を選びます。 3. **モデル名**・**モデル概要**・**モデルキー** を変更します。**モデル名** を変えても **モデルキー** は変わりません。 4. **OK** をクリックします。 ## モデルを削除する [Section titled “モデルを削除する”](#モデルを削除する) 削除は取り消せません モデルを削除すると、そのモデルのアイテムとコメント、ビュー、スキーマも削除されます。他のモデルからこのモデルを参照しているフィールドも削除されます。 要らなくなったモデルを削除します。 1. プロジェクトの **モデル** 画面で、削除するモデルのカードにあるその他の操作(…)をクリックします。 2. **削除** を選びます。 3. 確認の画面に出るモデル名が、削除するモデルのものであることを確かめます。 4. **モデルを削除** をクリックします。 削除すると、**モデル** 画面からそのモデルのカードがなくなります。 # プロジェクトを作成・変更・削除する > Re:Earth CMS でプロジェクトを作成し、名前・エイリアス・説明を変更し、プロジェクトを削除する手順を説明します。 プロジェクトは、ワークスペースのホームで作成します。作成した後は、プロジェクトの **設定** 画面で名前・エイリアス・説明を変更します。要らなくなったプロジェクトも、同じ画面から削除します。 所有者・管理者・編集者は、プロジェクトを作成・削除できます。プロジェクトの名前・エイリアス・説明を変更できるのは、所有者と管理者です。閲覧者は、プロジェクトの一覧と設定を閲覧できます。 ## プロジェクトを作成する [Section titled “プロジェクトを作成する”](#プロジェクトを作成する) ワークスペースにプロジェクトを1つ追加します。 1. ワークスペースのホームで **新規プロジェクト** をクリックします。 2. **プロジェクト名** を入力します。半角英数字で入力すると、**プロジェクト名** をもとにした文字列が **プロジェクトエイリアス** に自動で入ります。**プロジェクトエイリアス** に自動で入る文字列では、空白がハイフンに、大文字が小文字に変わります。 3. **プロジェクトエイリアス** を確認します。値が入っていないときや、エラーが出ているときは、自分で入力します。エイリアスの規則は [プロジェクト](/ja/cms/reference/publish-permissions/project/) にあります。 4. **プロジェクトの公開範囲** で **公開** か **非公開** を選びます。**非公開** を選べるのは有料プランのワークスペースです。Open & Public プランでは **非公開** を選べません。 5. **プロジェクト概要** に、このプロジェクトで扱う内容を入力します。入力は任意です。 6. **プロジェクトのライセンス** で、テンプレートからライセンスを選びます。選択は任意です。後から設定する手順は [ライセンスを設定する](/ja/cms/how-to/license/) にあります。 7. **OK** をクリックします。 ## 名前・エイリアス・説明を変更する [Section titled “名前・エイリアス・説明を変更する”](#名前エイリアス説明を変更する) 1. ワークスペースのホームにあるプロジェクト一覧から、設定を変更したいプロジェクトを選択します。 2. プロジェクトの **設定** 画面を開きます。 3. **一般** の **名前**・**エイリアス**・**説明** を変更します。 4. **変更を保存** をクリックします。 ## プロジェクトを削除する [Section titled “プロジェクトを削除する”](#プロジェクトを削除する) 削除は取り消せません 削除したプロジェクトは元に戻せません。 1. プロジェクトの **設定** 画面で **重要操作** を開きます。 2. **プロジェクトを削除** をクリックします。 3. 確認の画面に出る名前が、削除するプロジェクトの名前と同じことを確かめます。 4. 確認の画面で **プロジェクトを削除** をクリックします。 # プロジェクトの公開範囲を公開/非公開に切り替える > Re:Earth CMS でプロジェクトの公開範囲を公開と非公開の間で切り替える手順と、切り替えによって公開したコンテンツの見え方がどう変わるかを説明します。 プロジェクトの公開範囲は、公開したアイテムを誰が取得できるかを決める設定です。プロジェクトの **設定** 画面の **重要操作** で切り替えます。 公開範囲は作成のときにも選びます。作成の手順は [プロジェクトを作成・変更・削除する](/ja/cms/how-to/project-create-configure-delete/) にあります。 **公開** と **非公開** のそれぞれで公開したアイテムをどこから取得できるかは、[プロジェクト](/ja/cms/reference/publish-permissions/project/) と [パブリックAPI設定](/ja/cms/reference/publish-permissions/public-api-settings/) にあります。 プロジェクトの公開範囲は、アイテムを公開したかどうかとは別の設定です。プロジェクトの公開範囲を **公開** にしても、公開していないアイテムは取得できません。アイテムを公開する手順は [アイテムを公開/非公開にする](/ja/cms/how-to/item-publish-unpublish/) にあります。 プロジェクトを **非公開** に切り替えられるのは有料プランのワークスペースです。Open & Public プランでは、選択欄に **非公開** が並びますが、選んでも切り替えは完了しません。 **設定** 画面の **重要操作** で公開範囲を切り替えられるのは、所有者と管理者です。編集者は、プロジェクト作成時の設定とその後の閲覧はできますが、設定後の切り替えはできません。閲覧者は、公開範囲を閲覧できます。 ## 公開範囲を切り替える [Section titled “公開範囲を切り替える”](#公開範囲を切り替える) プロジェクトの公開範囲を **公開** または **非公開** にします。 公開にすると、公開したアイテムが誰でも取得できる状態になります 公開範囲を **公開** にすると、そのプロジェクトで公開しているすべてのアイテムが、認証なしで取得できる状態になります。公開したくないアイテムが含まれていないかを、切り替える前に確かめます。 1. プロジェクトの **設定** 画面を開きます。 2. **重要操作** の **プロジェクトの公開範囲を変更** の選択欄で、**公開** または **非公開** を選びます。 3. 確認の画面の内容を読み、**OK** をクリックします。 切り替えが終わると、選択欄の表示が切り替わります。 公開範囲は、切り替えた後もいつでも変えられます。 # README を書く > Re:Earth CMS のプロジェクトに README を書いて保存する手順を説明します。本文は Markdown で書けます。保存前に Preview タブで表示を確かめられます。 README は、プロジェクトの **README** 画面で書きます。本文は Markdown で書けます。 README を書けるのは、所有者と管理者です。編集者と閲覧者は、README を閲覧できます。 ## README を書いて保存する [Section titled “README を書いて保存する”](#readme-を書いて保存する) プロジェクトの内容を説明する文章を書いて保存します。 1. プロジェクトの **README** 画面で **編集** をクリックします。 2. **Edit** タブに本文を入力します。 3. **Preview** タブを開き、表示を確かめます。 4. **変更を保存** をクリックします。 # 参照フィールドでモデルどうしをつなぐ > Re:Earth CMS で参照フィールドを追加し、別のモデルのアイテムを参照できるようにする手順を説明します。一方向と双方向の参照を扱います。 参照フィールドを使うと、そのモデルのアイテムから、参照する相手のモデルのアイテムを指定できます。参照フィールドは **スキーマ** 画面で追加します。 参照フィールドの追加・編集・削除ができるのは、所有者・管理者・編集者です。閲覧者は、スキーマを閲覧できます。 **参照** をクリックすると **参照フィールドを作成** の画面が開きます。この画面は段階に分かれます。 * **参照設定**: 参照する相手のモデルと参照方向を決めます。 * **フィールド**: このモデルに追加するフィールドを設定します。 * **対応フィールド**: 相手のモデルに追加するフィールドを設定します。双方向の参照を選んだときだけ加わります。 **複数値の設定を許可** は、参照フィールドではどちらの参照方向でも設定できません。 ## 一方向の参照を追加する [Section titled “一方向の参照を追加する”](#一方向の参照を追加する) このモデルのアイテムから相手のモデルのアイテムを指定できるようにします。相手のモデルには何も追加されません。 1. **スキーマ** の **モデル** から、フィールドを追加するモデルを選びます。 2. **フィールドを追加** で **参照** をクリックします。**参照フィールドを作成** の画面が開きます。 3. **参照するモデルを選択** で、参照する相手のモデルを選びます。 4. **参照方向** で **一方向の参照** を選びます。 5. **次へ** をクリックします。 6. **設定** タブで **表示名** を入力します。半角英数字で入力すると、**表示名** をもとにした文字列が **フィールドキー** に自動で入ります。**フィールドキー** に自動で入る文字列では、空白がハイフンに、大文字が小文字に変わります。 7. **フィールドキー** を確認します。値が入っていないときや、エラーが出ているときは、自分で入力します。 8. **説明** に、このフィールドに入れる内容を入力します。入力は任意です。 9. **検証** タブで、値の条件を決めます。 * 値を必ず入れるなら **このフィールドを必須項目にする** を、相手のモデルの同じアイテムを、このモデルの2つ以上のアイテムから指定できないようにするなら **ユニーク制約** をオンにします。 10. **確認** をクリックします。 ## 双方向の参照を追加する [Section titled “双方向の参照を追加する”](#双方向の参照を追加する) このモデルと相手のモデルの両方にフィールドを追加し、互いのアイテムから相手を指定できるようにします。 1. **スキーマ** の **モデル** から、フィールドを追加するモデルを選びます。 2. **フィールドを追加** で **参照** をクリックします。**参照フィールドを作成** の画面が開きます。 3. **参照するモデルを選択** で、参照する相手のモデルを選びます。 4. **参照方向** で **双方向の参照** を選びます。 5. **次へ** をクリックします。 6. **設定** タブで、このモデルに追加するフィールドの **表示名** を入力します。 7. **フィールドキー** を確認します。値が入っていないときや、エラーが出ているときは、自分で入力します。 8. **説明** に、このフィールドに入れる内容を入力します。入力は任意です。 9. **検証** タブで、値の条件を決めます。 * 値を必ず入れるなら **このフィールドを必須項目にする** をオンにします。双方向の参照では **ユニーク制約** は設定できません。 10. **次へ** をクリックします。 11. **対応フィールド** で、相手のモデルに追加するフィールドの **表示名**・**フィールドキー**・**説明** を入力します。 12. **検証** タブで、相手のモデルに追加するフィールドの値の条件を決めます。 * 値を必ず入れるなら **このフィールドを必須項目にする** をオンにします。 13. **確認** をクリックします。 **対応フィールド** の段階では、**戻る** をクリックすると **フィールド** の段階に戻れます。**フィールド** から **参照設定** へ戻る操作はありません。 ## 参照フィールドの設定を変更する [Section titled “参照フィールドの設定を変更する”](#参照フィールドの設定を変更する) 追加した後は、**表示名**・**フィールドキー**・**説明** と検証の設定を変更できます。参照する相手のモデルと参照方向は変更できません。参照する相手のモデルや参照方向を変えるには、フィールドを削除してから作り直します。 1. **フィールド** タブの一覧で、変更する参照フィールドの編集(…)をクリックします。フィールドを更新する画面が開きます。 2. **参照設定** の内容を確かめ、**次へ** をクリックします。**参照するモデルを選択** と **参照方向** は操作できません。 3. **設定** タブと **検証** タブで設定を変更します。 4. 双方向の参照のときは **次へ** をクリックし、**対応フィールド** の設定も確かめます。 5. **確認** をクリックします。 ## 参照フィールドを削除する [Section titled “参照フィールドを削除する”](#参照フィールドを削除する) 削除は取り消せません 削除した参照フィールドは元に戻せません。双方向の参照フィールドを削除すると、相手のモデルにある対応フィールドも削除されます。 要らなくなった参照フィールドを削除します。 1. **フィールド** タブの一覧で、削除する参照フィールドの削除のアイコンをクリックします。 2. 確認の画面に出る表示名が、削除する参照フィールドのものであることを確かめます。 3. **フィールドを削除** をクリックします。 # リクエストを承認・クローズ・再開する > Re:Earth CMS でリクエストを承認してアイテムを公開する手順と、リクエストをクローズする手順、クローズしたリクエストを再開する手順を説明します。 リクエストのレビューは、プロジェクトの **リクエスト** 画面で行います。 ## リクエストを承認する [Section titled “リクエストを承認する”](#リクエストを承認する) レビューを終えたリクエストを承認します。 承認できるのは、所有者・管理者のうち、そのリクエストのレビュアーに入っている人です。承認できるリクエストは、状態が **レビュー待ち** のものです。 承認は取り消せません 承認したリクエストを **レビュー待ち** の状態に戻すことはできません。承認したアイテムは公開されます。 1. **リクエスト** 画面を開きます。 2. 承認するリクエストの行にある編集のアイコンをクリックします。 3. リクエストの説明を読みます。 4. 折りたたまれているアイテムの行を開いて、中身を確かめます。アイテムの名前をクリックすると、そのアイテムの入力画面へ移動します。 5. **承認** をクリックします。 承認すると、リクエストの状態が **承認済み** になります。リクエストに入れた変更は、アイテムに適用されて公開されます。 公開されるのは、リクエストを作成した時点の内容です。リクエストを作成したあとに加えた編集は公開されず、アイテムのステータスが「公開済み & ドラフト」になります。 ## リクエストをクローズする [Section titled “リクエストをクローズする”](#リクエストをクローズする) 承認せずにリクエストを終了します。 クローズできるのは、所有者・管理者と、自分が作成したリクエストについての編集者です。クローズできるリクエストは、状態が **レビュー待ち** のものです。 1. **リクエスト** 画面で、クローズするリクエストの行にある編集のアイコンをクリックします。 2. **クローズ** をクリックします。 クローズしたリクエストは、状態が **クローズ済み** になります。 リクエストに入れた変更は公開されません。アイテムのステータスは **ドラフト** か「公開済み & ドラフト」に戻ります。 ### 複数のリクエストをまとめてクローズする [Section titled “複数のリクエストをまとめてクローズする”](#複数のリクエストをまとめてクローズする) 1. **リクエスト** 画面で、クローズするリクエストの行のチェックボックスにチェックを入れます。 2. **クローズ** をクリックします。 ## クローズしたリクエストを再開する [Section titled “クローズしたリクエストを再開する”](#クローズしたリクエストを再開する) クローズしたリクエストをレビューの対象に戻します。 再開できるのは、所有者と管理者です。再開できるリクエストは、状態が **クローズ済み** のものです。 1. **リクエスト** 画面で、**状態** の列のフィルターで **クローズ済み** だけを選びます。 2. 再開するリクエストの行にある編集のアイコンをクリックします。 3. **再開** をクリックします。 再開すると、リクエストの状態が **レビュー待ち** に戻ります。 # リクエストを作成する > Re:Earth CMS でアイテムのリクエストを作成し、レビュアーを割り当てる手順を説明します。作成した後にレビュアーを変える手順も扱います。 リクエストは、アイテムを公開する前にレビューを受ける仕組みです。**コンテンツ** 画面でアイテムを開いて作成し、作成するときにレビュアーを選びます。 ## リクエストを作成する [Section titled “リクエストを作成する”](#リクエストを作成する) アイテムのリクエストを作成します。作ったアイテムをこれから公開する場合と、公開済みのアイテムを編集した場合の、どちらも作成できます。 リクエストを作成できるのは、所有者・管理者・編集者です。閲覧者は、リクエストを閲覧できます。 1. **コンテンツ** 画面で、リクエストを作成するアイテムの入力画面を開きます。 2. 公開したい内容を入力し、**保存** をクリックします。この時点では、入力した内容は公開されていません。 3. その他の操作(…)をクリックし、**新規リクエスト** を選びます。 4. **タイトル** を入力します。 5. **説明** に、レビュアーに伝えることを100字まで入力します。入力は任意です。 6. **レビュアー** で、レビューする人を1人以上選びます。複数の人を指定できます。 7. **OK** をクリックします。 8. 開いたアイテムが公開前のアイテムを参照している場合は、その一覧が出ます。リクエストに含めるものを選びます。 すでにレビュー中のアイテムには、リクエストを追加で作成できません。 作成したリクエストは、**リクエスト** 画面に「レビュー待ち」として並びます。 ## レビュアーを変える [Section titled “レビュアーを変える”](#レビュアーを変える) 作成したリクエストのレビュアーは、後から変えられます。 レビュアーを変えられるのは、所有者・管理者と、自分が作成したリクエストについての編集者です。 変えられるのは、ステータスが「レビュー待ち」か「ドラフト」のリクエストです。 1. **リクエスト** 画面で、対象のリクエストの行にある編集のアイコンをクリックします。 2. **レビュアー** のカードで **割り当てる** をクリックします。相手を選ぶ欄が開きます。 3. レビューする人を選びます。レビュアーは1人以上を選んだ状態にします。 4. 変更を確定するには、相手を選ぶ欄の外をクリックします。 # 役割ごとにリクエストの要否を設定する > Re:Earth CMS のプロジェクトで、どの役割のユーザーにリクエストを必須にするかを設定する手順を説明します。リクエストを必須にした役割のユーザーは、アイテムをリクエスト経由で公開します。 リクエストの要否は、プロジェクトの **設定** 画面の **リクエスト** で、役割ごとに設定します。 リクエストの要否を設定できるのは、所有者と管理者です。編集者と閲覧者は、設定の内容を閲覧できます。 ## リクエストを必須にする役割を設定する [Section titled “リクエストを必須にする役割を設定する”](#リクエストを必須にする役割を設定する) 設定は役割ごとに切り替えます。保存するまで反映されません。 1. プロジェクトの **設定** 画面を開きます。 2. **リクエスト** の表で、必須にする役割の行の **リクエスト必須** をオンにします。 3. **変更を保存** をクリックします。 リクエストを必須でなくするときは、その役割の行の **リクエスト必須** をオフにして保存します。 # スキーマをインポート/エクスポートする > Re:Earth CMS で JSON ファイルからモデルのスキーマを取り込む手順と、スキーマを JSON ファイルにエクスポートする手順を説明します。 スキーマのインポートとエクスポートは、**スキーマ** 画面で、モデル名の見出しにあるその他の操作(縦の…)から実行します。インポートは JSON ファイルからフィールドをまとめて作り、エクスポートは今のスキーマを JSON ファイルとして保存します。 インポートができるのは、所有者・管理者・編集者です。エクスポートは、所有者・管理者・編集者・閲覧者のいずれでも実行できます。 ## スキーマをインポートする [Section titled “スキーマをインポートする”](#スキーマをインポートする) 実験的な機能 インポートは実験的な機能で、動作が不安定な場合があります。 JSON ファイルからフィールドをまとめて作ります。使えるファイル形式は JSON だけです。JSON の書き方は [インポート・エクスポート](/ja/cms/reference/operations/import-export/) にあります。 はじめてインポートするときは、テンプレートを使うと書き方に合ったファイルを用意できます。テンプレートは、手順4で開く **スキーマのインポート** の画面にあるリンクからダウンロードできます。 1. **スキーマ** の **モデル** から、フィールドが1つも無いモデルを選びます。 2. **フィールド** タブを開きます。 3. モデル名の見出しにあるその他の操作(縦の…)をクリックし、**インポート** を選びます。 4. **スキーマのインポート** の画面で、JSON ファイルを選ぶかドラッグ&ドロップします。 5. **スキーマのプレビュー** で、ファイルから作られるフィールドの一覧を確かめます。 * フィールドの型は、ファイルの内容から自動で判定されます。違う型にするときは、行の **フィールドタイプ** から選び直します。 * 取り込まないフィールドは、行の右にあるチェックを外します。取り込むフィールドは1つ以上残します。 * 並び順は、行の左にあるアイコンをつかんで変えられます。 6. **インポート** をクリックします。チェックを1つも残していないと **インポート** は押せません。インポートが終わると **インポートに成功しました!** と表示され、画面が閉じます。 JSON として読めても形式が合わないときは、エラーの一覧の画面になります。**エラーログをダウンロード** でエラーをファイルに保存でき、**戻る** でファイルの選択に戻ります。拡張子が json でないファイル・中身が空のファイル・JSON として壊れているファイルを選んだときは、ファイルを選ぶ画面に注意が出ます。 インポートできるのは、フィールドが1つも無いモデルの **フィールド** タブだけです。次の場合はメニューの **インポート** が操作できません。理由はメニューの項目にカーソルを合わせると表示されます。 * グループを選んでいる * **メタデータ** タブを開いている * 選んだモデルにフィールドが1つ以上ある * 自分の役割にフィールドを追加する権限がない ## スキーマをエクスポートする [Section titled “スキーマをエクスポートする”](#スキーマをエクスポートする) 選んだモデルのスキーマが、その場でダウンロードされます。 1. **スキーマ** の **モデル** から、エクスポートするモデルを選びます。 2. モデル名の見出しにあるその他の操作(縦の…)をクリックし、**エクスポート** を選びます。 JSON ファイルのダウンロードが始まります。ファイル名は、モデル名ではなくモデルの ID を使った `〈モデルのID〉-schema.json` になります。フィールドが1つも無いモデルでは **エクスポート** が操作できません。 # 地理空間アセットのプレビュー用にタイルと地形を設定する > Re:Earth CMS のワークスペースの設定で、地理空間アセットのプレビューに使うタイルと地形を追加・変更・削除する手順を説明します。 タイルは、地理空間データのアセットをプレビューする地図の背景です。地形は、その地図の地面の起伏です。タイルと地形は、ワークスペースの **設定** 画面の **地理空間アセットのプレビュー設定** で追加します。 タイルと地形はそれぞれ複数登録でき、タイルの一覧・地形の一覧それぞれの先頭のものがデフォルトとして使われます。 この画面を変更できるのは、所有者と管理者です。編集者と閲覧者は、この画面を開いて登録済みのタイルと地形を見られます。 ## タイルを追加する [Section titled “タイルを追加する”](#タイルを追加する) プレビューの地図の背景として使うタイルを登録します。 1. ワークスペースの **設定** 画面を開きます。 2. **タイル** の下の **新しいタイルを追加** をクリックします。 3. **新規タイル** の画面で **タイルの種類** を選びます。 4. **URL** を選んだ場合は、**名前**・**URL**・**イメージURL** を入力します。 5. **OK** をクリックします。 6. **保存** をクリックします。 **タイルの種類** の選択肢は [地理空間アセットのプレビュー設定(タイル・地形)](/ja/cms/reference/publish-permissions/tiles-terrain/) にあります。 ## 地形を追加する [Section titled “地形を追加する”](#地形を追加する) 地図に地面の起伏を付けます。 1. ワークスペースの **設定** 画面で、**地形** の下の **有効** のスイッチをオンにします。 2. **新しい地形を追加** をクリックします。 3. **新規地形** の画面で **地形の種類** を選びます。 4. **Cesium Ion** を選んだ場合は、**名前**・**Terrain Cesium IonアセットID**・**Terrain Cesium Ion アクセストークン**・**地形URL**・**イメージURL** を入力します。 5. **OK** をクリックします。 6. **保存** をクリックします。 **地形の種類** の選択肢は [地理空間アセットのプレビュー設定(タイル・地形)](/ja/cms/reference/publish-permissions/tiles-terrain/) にあります。 **有効** のスイッチをオフにしたあと **保存** をクリックすると、地形は地図に使われなくなります。登録した地形は消えません。 ## 登録したタイル・地形を変更する [Section titled “登録したタイル・地形を変更する”](#登録したタイル地形を変更する) 登録済みのタイルまたは地形の内容を書き換えます。 1. ワークスペースの **設定** 画面で、変更するカードの編集のアイコンをクリックします。 2. **タイルを更新** または **地形を更新** の画面で内容を書き換えます。 3. **OK** をクリックします。 4. **保存** をクリックします。 ## デフォルトとして使うものを変える [Section titled “デフォルトとして使うものを変える”](#デフォルトとして使うものを変える) プレビューで最初に使われるタイルまたは地形を変えます。 1. ワークスペースの **設定** 画面で、デフォルトにするカードを、三本線のアイコンをつかんで一覧の先頭に動かします。 2. **保存** をクリックします。 ## 登録したタイル・地形を削除する [Section titled “登録したタイル・地形を削除する”](#登録したタイル地形を削除する) 要らなくなったタイルまたは地形を一覧から外します。 1. ワークスペースの **設定** 画面で、削除するカードの削除のアイコンをクリックします。 2. **保存** をクリックします。 削除のアイコンをクリックした時点でカードは一覧から消えますが、**保存** をクリックするまで確定しません。**保存** をクリックせずに画面を離れると、削除は取り消されます。 # ビューを作成・編集・削除する > Re:Earth CMS でアイテム一覧のフィルター・並び替え・列の表示をビューとして保存し、ビューの名前を変えたり削除したりする手順を説明します。 ビューは、**コンテンツ** 画面のアイテム一覧に掛けたフィルター・並び替え・列の表示状態をまとめて保存したものです。保存しておくと、次に画面を開いたときや別のビューから切り替えたときに、同じ状態の一覧をすぐ出せます。 ビューはタブとして並びます。タブを選ぶと、そのビューに保存された状態で一覧が表示されます。 ビューを作成・編集・削除し、並び順を変えられるのは、所有者と管理者です。編集者と閲覧者は、既にあるビューをタブから選んで使えます。 ## ビューを作成する [Section titled “ビューを作成する”](#ビューを作成する) 今の一覧の状態を、新しいビューとして保存します。 1. **コンテンツ** の **モデル** から、対象のモデルを選びます。 2. アイテムの一覧にフィルター・並び替え・列の表示を設定します。手順は [アイテム一覧の表示・フィルター条件を設定する](/ja/cms/how-to/filter-sort/) にあります。 3. **新しいビューとして保存します** をクリックします。 4. **ビュー名** を入力します。 5. **OK** をクリックします。 保存したビューがタブに追加され、そのタブが選ばれた状態になります。 ## ビューに今の状態を上書きする [Section titled “ビューに今の状態を上書きする”](#ビューに今の状態を上書きする) 既にあるビューに、今の一覧の状態を保存し直します。フィルターの条件を変えたときに使います。 1. 上書きするビューのタブを選びます。 2. アイテムの一覧のフィルター・並び替え・列の表示を変えます。 3. 上書きするビューのタブのその他の操作(縦の…)をクリックし、**ビューを更新** を選びます。 ビューの名前はそのままで、保存されている状態だけが今の一覧の状態に置き換わります。タブを切り替えて戻ってきても、上書きした状態で表示されます。 ## ビューの名前を変える [Section titled “ビューの名前を変える”](#ビューの名前を変える) 1. 名前を変えるビューのタブを選びます。 2. 名前を変えるビューのタブのその他の操作(縦の…)をクリックし、**名前の変更** を選びます。 3. **ビューを更新** の画面で **ビュー名** を書き換えます。 4. **OK** をクリックします。 ## ビューの並び順を変える [Section titled “ビューの並び順を変える”](#ビューの並び順を変える) タブの並び順を変えます。 1. 動かすタブをつかんで、置きたい位置までドラッグします。 ## ビューを削除する [Section titled “ビューを削除する”](#ビューを削除する) 削除は取り消せません 削除したビューは元に戻せません。そのビューに保存していたフィルター・並び替え・列の表示の設定が消えます。ビューに表示されていたアイテムは削除されません。 要らなくなったビューを削除します。削除できるのは、そのモデルにビューが2件以上あるときです。 1. 削除するビューのタブのその他の操作(縦の…)をクリックし、**ビューを削除します** を選びます。 2. 確認の画面で **削除** をクリックします。 削除したビューのタブが消え、別のビューが選ばれた状態になります。 # アセット > アセット画面にアップロードしたファイルです。プレビュータイプと対応する形式、一覧の並び替えを説明します。 アセットは、**アセット**画面にアップロードしたファイルです。アップロードしたアセットは、[アイテムのフィールド](/ja/cms/reference/modeling/field-types/)の「アセット」を通じてアイテムに紐づけられます。 ## アップロード [Section titled “アップロード”](#アップロード) アセットは、次の2つの方法でアップロードできます。 * **ローカル**:手元のファイルをアップロードする。 * **URL**:ファイルの URL を指定してアップロードする。 アップロードできるファイルの形式に制限はありません。 ## アセット情報 [Section titled “アセット情報”](#アセット情報) アセットの詳細画面の「アセット情報」には、次の項目が表示されます。 * ID * 作成日時 * 作成者 * サイズ ファイル名は、詳細画面のタイトルに表示されます。このアセットを参照しているアイテムは、「リンク先」に表示されます。 ## プレビュータイプ [Section titled “プレビュータイプ”](#プレビュータイプ) アセットを、どの形式としてプレビューするかを表す種類です。詳細画面では「アセットタイプ」、一覧では「プレビュータイプ」と表示されます。アセット1件につき、次の8種類から1つを設定します。種類ごとに対応する形式が決まっています。 | プレビュータイプ | プレビューできる拡張子 | | ----------------- | -------------------------- | | PNG/JPEG/TIFF/GIF | jpg・jpeg・png・gif・tiff・webp | | SVG | svg | | GEOJSON/KML/CZML | kml・czml・topojson・geojson | | 3Dタイル | json | | MVT | mvt | | GLTF/GLB | gltf・glb | | CSV | csv | | 不明タイプ | プレビューに対応しないファイル | 種類と拡張子が合っていないアセットは、プレビューされません。 zip・7z のアセットは、GEOJSON/KML/CZML・3Dタイル・MVT・GLTF/GLB のいずれかを選ぶとプレビューの対象になります。 アップロードのとき、プレビュータイプはファイルの種類と拡張子から自動で決まります。拡張子が json・zip・7z のファイルは自動で決まらず、「不明タイプ」になります。プレビュータイプは、詳細画面で後から変更できます。プレビュータイプの変更によって、ファイルの拡張子自体は変換されません。 ## 並び順 [Section titled “並び順”](#並び順) アセット一覧は、ファイル・サイズ・作成日時のいずれかで、昇順または降順に並び替えられます。 ## アーカイブの解凍 [Section titled “アーカイブの解凍”](#アーカイブの解凍) zip・7z の圧縮ファイルとしてアップロードしたアセットは、CMS 上で解凍できます。アップロードの際に自動で解凍するかどうかを選べ、デフォルトでは解凍が選ばれています。解凍しない設定でアップロードしたアセットは「スキップ済み」として登録されますが、後から手動で解凍できます。解凍の状態は、一覧の**ステータス**列に次のいずれかで表示されます。 | ステータス | 意味 | | ------ | --------- | | スキップ済み | 圧縮したままの状態 | | 保留中 | 解凍の待機中 | | 解凍中 | 解凍を実行中 | | 解凍完了 | 解凍が完了した状態 | | 失敗 | 解凍に失敗した状態 | # アイテムフィルター・並び替え > コンテンツ画面でアイテム一覧を絞り込む・並び替えるときに選べる条件の一覧です。フィールドごとに選べるフィルターの条件と、並び替えを説明します。 フィルターと並び替えは、**コンテンツ**画面のアイテム一覧に対して指定します。指定した内容は[ビュー](/ja/cms/reference/content/item-views/)として保存できます。 ## フィルターの条件 [Section titled “フィルターの条件”](#フィルターの条件) フィルターは、対象のフィールドと条件(演算子)を選んで指定します。条件には、値の入力が必要なものと、必要のないものがあります。フィルターは複数指定でき、すべてのフィルターを満たすアイテムが表示されます。選べる条件は、絞り込む対象の[アイテムのフィールド](/ja/cms/reference/modeling/field-types/)によって決まります。 | フィールド | 選べる条件 | | ---------------------------- | ---------------------------------- | | テキスト・テキストエリア・マークダウン・アセット・URL | 同値・異なる・含む・含まない・始まる・始まらない・終わる・終わらない | | 整数型・浮動小数点数 | 同値・異なる・超える・以上・未満・以下 | | 日付 | 同値・異なる・後・以降・前・以前・今週・今月・今年 | | ブーリアン・チェックボックス | 同値・異なる | | 選択肢・タグ | 同値・異なる | * 上記のフィールドで、入力が任意のとき、「空である」「空でない」も選べます。 * 「空である」「空でない」「今週」「今月」「今年」は、値の入力が必要ありません。 * ジオメトリオブジェクト・ジオメトリエディタは、任意のフィールドで「空である」「空でない」だけを選べます。 * 参照・グループ、および複数値を設定したフィールドは、絞り込みの対象になりません。 * 絞り込みの対象になるのは、アイテムのフィールドと、[メタデータ](/ja/cms/reference/modeling/metadata/)のフィールドです。ステータス・作成日時・作成者・更新日時・更新者の列は、絞り込みの対象になりません。 ## 並び替え [Section titled “並び替え”](#並び替え) 一覧を、選んだ列を基準に**昇順**または**降順**で並び替えます。フィールドのほか、作成日時・作成者・更新日時・更新者でも並び替えられます。ステータスでは並び替えられません。 # ビュー > アイテム一覧の並び替え・フィルター・表示する列をまとめて保存したものです。ビューの構成要素と、モデルごとに複数作れる仕組みを説明します。 ビューは、**コンテンツ**画面で、[アイテム](/ja/cms/reference/content/items/)一覧の見せ方を保存したものです。並び替え・フィルター・表示する列の設定に名前を付けて保存し、[モデル](/ja/cms/reference/modeling/models/)ごとに複数のビューを作って切り替えられます。作ったビューはモデルの設定として保存され、プロジェクトのメンバーが共通して使います。一覧の並び替え・フィルター・表示する列の変更を固定するには、ビューを保存する必要があります。 ## ビューの構成 [Section titled “ビューの構成”](#ビューの構成) ビューは次の項目で構成されます。並び替えとフィルターで指定できる条件の詳細は、[アイテムフィルター・並び替え](/ja/cms/reference/content/item-filter-sort/)を参照してください。 | 項目 | 内容 | | ----- | ---------------------- | | 名前 | ビューを識別する名前 | | 並び替え | 一覧を並べる基準と、昇順・降順 | | フィルター | 一覧に表示するアイテムを絞り込む条件 | | 表示する列 | 一覧に表示する列と、その表示・非表示・並び順 | ## ビューの変更と削除 [Section titled “ビューの変更と削除”](#ビューの変更と削除) ビューは、名前の変更と、一覧での並び順の変更ができます。削除できるのは、同じモデルにビューが2件以上あるときだけです。ビューを削除しても、一覧に表示されていたアイテムは削除されません。 # アイテム > モデルに登録する1件ごとのデータです。ドラフト・公開・レビューなど、アイテムがとる5つのステータスを説明します。 アイテムは、[モデル](/ja/cms/reference/modeling/models/)に登録する1件ごとのデータです。**コンテンツ**画面でモデルごとに登録し、モデルが持つスキーマで定めたフィールドに沿って値を入力します。ドラフトや公開などのステータスを持ちます。 ## ステータス・公開ステータス [Section titled “ステータス・公開ステータス”](#ステータス公開ステータス) アイテムのステータスは、公開されているかどうかと、最新の変更がどの段階にあるかで決まります。まだ公開していないアイテムは「ドラフト」または「レビュー」、公開済みのアイテムは「公開済み」と表示され、公開後に変更を加えると「公開済み & ドラフト」または「公開済み & レビュー」になります。 | ステータス | 意味 | | ----------- | --------------------------- | | ドラフト | まだ公開しておらず、下書きの状態 | | レビュー | まだ公開しておらず、レビューを申請している状態 | | 公開済み | 公開されている状態 | | 公開済み & ドラフト | 公開したあと、まだ公開していない下書きの変更がある状態 | | 公開済み & レビュー | 公開したあと、加えた変更をレビューに申請している状態 | ## 非公開にしたときのステータス [Section titled “非公開にしたときのステータス”](#非公開にしたときのステータス) 公開済みのアイテムを非公開にすると、ステータスから「公開済み」が外れます。レビュー待ちのリクエストに入っているアイテムは「レビュー」になり、入っていないアイテムは「ドラフト」になります。 ## 自動で記録される項目 [Section titled “自動で記録される項目”](#自動で記録される項目) アイテムには、フィールドの値とステータスのほかに、次の項目が自動で記録され、一覧に表示されます。 * 作成日時 * 作成者 * 更新日時 * 更新者 ## バージョン履歴 [Section titled “バージョン履歴”](#バージョン履歴) アイテムは、編集して保存するたびにバージョンとして記録されます。各バージョンには、そのときのステータス・日時と、作成者または更新者が記録されます。過去のバージョンの内容を確認できます。復元すると、そのバージョンの値が編集中のフォームに入り、保存した時点で新しいバージョンとして記録されます。復元しても、元のバージョンはそのまま残ります。 復元で置き換わるのは、フィールドの値だけです。[メタデータ](/ja/cms/reference/modeling/metadata/)の値は、復元しても元のままです。今の内容と同じバージョンは復元しても保存できません。 バージョン履歴が表示されるのは、バージョンが1件以上あるアイテムです。 # フィールド属性 > フィールドに設定できる属性の一覧です。入力を必須にする設定やユニーク制約など、表示や入力値のルールと、属性ごとに設定できるフィールドを説明します。 フィールドに設定できる属性の一覧です。**スキーマ**画面でフィールドを作成・編集するときに設定します。属性は、フィールドの表示や、入力できる値のルールを決めます。作成・編集のダイアログは**設定**・**検証**・**デフォルト値**の3つのタブに分かれていて、属性ごとに、設定するタブと設定できるフィールドが決まっています。 | 属性 | 何を決めるか | 設定するタブ | 設定できるフィールド | | --------------- | ------------------ | ---------- | ------------------------------------------------------------------------------------------- | | 表示名 | 画面でフィールドを示す名前 | **設定** | すべてのフィールド | | フィールドキー | フィールドを識別するキー | **設定** | すべてのフィールド | | 説明 | フィールドの用途の補足 | **設定** | すべてのフィールド | | 複数値の設定を許可 | 複数の値を格納できるかどうか | **設定** | テキスト・テキストエリア・マークダウン・整数型・浮動小数点数・ブーリアン・チェックボックス・選択肢・タグ・日付・URL・アセット・グループ・ジオメトリオブジェクト・ジオメトリエディタ | | このフィールドを必須項目にする | 空のまま保存できるかどうか | **検証** | テキスト・テキストエリア・マークダウン・整数型・浮動小数点数・選択肢・タグ・日付・URL・アセット・参照・ジオメトリオブジェクト・ジオメトリエディタ | | ユニーク制約 | 同じ値を重複して持てるかどうか | **検証** | テキスト・テキストエリア・マークダウン・整数型・浮動小数点数・選択肢・タグ・日付・URL・アセット・参照・ジオメトリオブジェクト・ジオメトリエディタ | | タイトルとして使用 | アイテムのタイトルに使うかどうか | **設定** | テキスト・テキストエリア・マークダウン | | 最大長 | 入力できる文字数の上限 | **検証** | テキスト・テキストエリア・マークダウン | | 最小値 | 入力できる数値の下限 | **検証** | 整数型・浮動小数点数 | | 最大値 | 入力できる数値の上限 | **検証** | 整数型・浮動小数点数 | | デフォルト値を設定 | アイテム作成時にあらかじめ入る初期値 | **デフォルト値** | テキスト・テキストエリア・マークダウン・整数型・浮動小数点数・ブーリアン・チェックボックス・選択肢・タグ・日付・URL・アセット・ジオメトリオブジェクト・ジオメトリエディタ | タグ・チェックボックスは、メタデータで使えるフィールドです。詳しくは [メタデータ](/ja/cms/reference/modeling/metadata/) を参照してください。 ## 表示名 [Section titled “表示名”](#表示名) フィールドの表示名です。画面や一覧でフィールドを示すときに使われます。必須です。 ## フィールドキー [Section titled “フィールドキー”](#フィールドキー) フィールドを識別するキーです。1〜32文字で、同じスキーマ内で一意である必要があります。使える文字は半角英数字、アンダースコア、ダッシュです。 ## 説明 [Section titled “説明”](#説明) フィールドの説明です。フィールドの用途を補足するために設定します。最大1000文字です。 ## 複数値の設定を許可 [Section titled “複数値の設定を許可”](#複数値の設定を許可) 1つの値ではなく、複数の値をリスト形式で格納できるようにする属性です。 ## このフィールドを必須項目にする [Section titled “このフィールドを必須項目にする”](#このフィールドを必須項目にする) この属性を設定すると、値が空のままではアイテムを保存できません。 ## ユニーク制約 [Section titled “ユニーク制約”](#ユニーク制約) 同じ値を持つアイテムを複数は作れないようにする属性です。1つの値は、そのフィールドで1件のアイテムにしか使えません。参照のフィールドでは、一方向の参照のときに設定できます。双方向の参照のときは設定できません。 ## タイトルとして使用 [Section titled “タイトルとして使用”](#タイトルとして使用) そのフィールドをアイテムのタイトルとして使う属性です。タイトルとして使用できるフィールドは、1つのスキーマにつき1つだけです。アイテムのフィールドと、[グループ](/ja/cms/reference/modeling/groups/)のフィールドで、それぞれ1つ設定できます。[メタデータ](/ja/cms/reference/modeling/metadata/)のフィールドには設定できません。 ## 最大長 [Section titled “最大長”](#最大長) 入力できる文字数の上限です。1以上の値を設定します。 ## 最小値 [Section titled “最小値”](#最小値) 入力できる数値の下限です。最小値は最大値以下にします。 ## 最大値 [Section titled “最大値”](#最大値) 入力できる数値の上限です。最大値は最小値以上にします。 ## デフォルト値を設定 [Section titled “デフォルト値を設定”](#デフォルト値を設定) アイテムを作成したときに、あらかじめ入る初期値です。 # アイテムのフィールド > アイテムに設定できるフィールドの一覧です。テキスト・数値・日付・位置情報など、各フィールドが何を入れるものかを説明します。 [アイテム](/ja/cms/reference/content/items/)に設定できるフィールドの一覧です。フィールドは、アイテムに入れる値の入力規則です。**スキーマ**画面でモデルにフィールドを追加するとき、次の中から1つを選びます。グループとメタデータで使えるフィールドは、[グループ](/ja/cms/reference/modeling/groups/)と[メタデータ](/ja/cms/reference/modeling/metadata/)を参照してください。 | フィールド | 何を入れる欄か | | ----------- | ------------------ | | テキスト | 1行のテキスト | | テキストエリア | 複数行のテキスト | | マークダウン | マークダウン記法に対応したテキスト | | 整数型 | 整数 | | 浮動小数点数 | 小数を含む数値 | | ブーリアン | 真(true)/偽(false)の値 | | 選択肢 | あらかじめ用意した選択肢からの選択 | | 日付 | 日付 | | URL | http・https の URL | | アセット | アップロードしたファイル | | 参照 | 選んだモデルのアイテムへの参照 | | グループ | 定義済みのグループ | | ジオメトリオブジェクト | GeoJSON 形式のジオメトリ | | ジオメトリエディタ | 地図上で描いたジオメトリ | ## テキスト [Section titled “テキスト”](#テキスト) 1行のテキストを入れる欄です。見出しやタイトルなど、短い文字列を格納します。 ## テキストエリア [Section titled “テキストエリア”](#テキストエリア) 複数行のテキストを入れる欄です。段落のある長めの文章を格納します。 ## マークダウン [Section titled “マークダウン”](#マークダウン) マークダウン記法に対応したテキストを入れる欄です。見出しや強調などの書式を含む文章を格納します。 ## 整数型 [Section titled “整数型”](#整数型) 整数を入れる欄です。小数を含まない数値を格納します。 ## 浮動小数点数 [Section titled “浮動小数点数”](#浮動小数点数) 小数を含む数値を入れる欄です。小数点以下のある数値と、整数のどちらも入れられます。 ## ブーリアン [Section titled “ブーリアン”](#ブーリアン) 真(true)または偽(false)のどちらかを入れる欄です。スイッチのオン/オフで入力します。 ## 選択肢 [Section titled “選択肢”](#選択肢) あらかじめ用意した選択肢から1つ選ぶ欄です。[フィールド属性](/ja/cms/reference/modeling/field-attributes/)の「複数値の設定を許可」を設定すると、複数選べます。選択肢はフィールドの作成時に登録し、1つ以上が必要です。同じ値の選択肢は登録できません。 ## 日付 [Section titled “日付”](#日付) 日付を入れる欄です。日付を格納します。 ## URL [Section titled “URL”](#url) URL を入れる欄です。`http://` または `https://` で始まる URL を受け付けます。ホストは、`.com` などのトップレベルドメインを持つドメイン名か、公開 IP アドレスである必要があります。`localhost` やプライベート IP アドレス(`192.168.x.x`・`127.x.x.x` など)は受け付けません。 ## アセット [Section titled “アセット”](#アセット) アップロードしたファイルを紐づける欄です。画像や書類などのファイルを格納します。 ## 参照 [Section titled “参照”](#参照) 選んだモデルのアイテムを参照する欄です。モデルとモデルの間の関連づけに使います。フィールドの作成時に、参照するモデルを1つ選び、参照方向を次の2つから1つ選びます。参照するモデルには、別のモデルと、このフィールドを持つモデル自身のどちらも選べます。 * 一方向の参照:片方のアイテムからもう片方を参照します。 * 双方向の参照:2つのアイテムが互いに参照し合います。 参照するモデルと参照方向は、フィールドを作成するときだけ決められます。作成した後は変更できません。変えるには、フィールドを削除して作り直します。 ## グループ [Section titled “グループ”](#グループ) 定義済みの[グループ](/ja/cms/reference/modeling/groups/)を入れる欄です。複数のフィールドをまとめたグループを、フィールドとして再利用します。 ## ジオメトリオブジェクト [Section titled “ジオメトリオブジェクト”](#ジオメトリオブジェクト) GeoJSON 形式でジオメトリを入力する欄です。入力した内容はプレビューできます。このフィールドの対応タイプは、フィールドの作成時に次の7種類から選びます。複数選べます。 * Point * Linestring * Polygon * GeometryCollection * MultiPoint * MultiLinestring * MultiPolygon ## ジオメトリエディタ [Section titled “ジオメトリエディタ”](#ジオメトリエディタ) 地図上に描いてジオメトリを入力する欄です。このフィールドの対応タイプは、フィールドの作成時に次の4つから1つ選びます。 * Point * Linestring * Polygon * Any:Point・Linestring・Polygon(Polygon は円・矩形でも描けます) # グループ > 複数のフィールドをひとまとめにして、複数のモデルで再利用するための仕組みです。グループ名・グループキー・グループ概要の設定を説明します。 グループは、複数のフィールドをひとまとめにして、複数の[モデル](/ja/cms/reference/modeling/models/)で再利用するための仕組みです。**スキーマ**画面で作成し、グループごとにフィールドを定義します。[アイテムのフィールド](/ja/cms/reference/modeling/field-types/)の「グループ」を通じて、モデルのフィールドとして組み込みます。モデルはグループのフィールドを複製せず参照するため、グループのフィールドを変更すると、そのグループを使っているすべてのモデルに反映されます。 ## グループ名 [Section titled “グループ名”](#グループ名) グループの表示名です。作成時に必ず設定します。 ## グループキー [Section titled “グループキー”](#グループキー) グループを識別するキーです。3〜32文字で、プロジェクト内で一意である必要があります。使える文字は半角英数字、アンダースコア、ダッシュです。 ## グループ概要 [Section titled “グループ概要”](#グループ概要) グループの説明です。グループの用途を補足するために設定します。 ## 設定できるフィールド [Section titled “設定できるフィールド”](#設定できるフィールド) グループには、次のフィールドを設定できます。それぞれの説明は[アイテムのフィールド](/ja/cms/reference/modeling/field-types/)を参照してください。 * テキスト * テキストエリア * マークダウン * 整数型 * 浮動小数点数 * ブーリアン * 選択肢 * 日付 * URL * アセット * ジオメトリオブジェクト * ジオメトリエディタ 「参照」と「グループ」のフィールドは、グループには設定できません。 ## グループの複数値 [Section titled “グループの複数値”](#グループの複数値) グループのフィールドに[フィールド属性](/ja/cms/reference/modeling/field-attributes/)の「複数値の設定を許可」を設定すると、1つのアイテムに同じグループの組を複数持たせられます。これは、グループの中の個々のフィールドに同じ属性を設定するのとは別の設定です。 ## グループの削除 [Section titled “グループの削除”](#グループの削除) モデルのフィールドで使われているグループは削除できません。削除するには、先にそのグループを使っているモデルのフィールドを削除します。 # メタデータ > アイテムのフィールドとは別に、アイテムを管理するための入力規則です。メタデータタブに表示される項目、使えるフィールド、アイテムごとの値の持ち方を説明します。 メタデータは、[アイテム](/ja/cms/reference/content/items/)のフィールドとは別に、アイテムを管理するための入力規則です。[モデル](/ja/cms/reference/modeling/models/)ごとに**スキーマ**画面の**メタデータ**タブで定義します。定義した値は、アイテムごとに持ちます。 ## メタデータタブに表示される項目 [Section titled “メタデータタブに表示される項目”](#メタデータタブに表示される項目) **コンテンツ**画面でアイテムを開くと、**メタデータ**タブに次の3つが表示されます。 | 欄 | 項目 | 値 | | --------- | ----------------------------------- | -------------------------- | | アイテムの情報 | システムの項目(ID・作成日時・作成者・更新日時・更新者) | システムで自動で付与される | | 公開ステータス | システムの項目 | ユーザーがアイテムを公開・非公開にすると変わる | | カスタムメタデータ | **スキーマ**画面の**メタデータ**タブでモデルごとに定義する項目 | ユーザーがアイテムの**メタデータ**タブで入力する | 定義した項目が1つも無いモデルでは、「カスタムメタデータ」の欄は表示されません。 ## メタデータに使えるフィールド [Section titled “メタデータに使えるフィールド”](#メタデータに使えるフィールド) メタデータのフィールドを作成するとき、次の6つから1つを選びます。 | フィールド | 何を入れる欄か | | -------- | -------------------------------- | | タグ | あらかじめ用意したタグからの選択 | | ブーリアン | 真(true)/偽(false)の値。スイッチで入力する | | チェックボックス | 真(true)/偽(false)の値。チェックボックスで入力する | | 日付 | 日付 | | テキスト | 1行のテキスト | | URL | http/https の URL | ### タグ [Section titled “タグ”](#タグ) あらかじめ用意したタグのリストから1つ選ぶ欄です。[フィールド属性](/ja/cms/reference/modeling/field-attributes/)の「複数値の設定を許可」を設定すると、複数選べます。タグは1つにつき1色を持ち、色は次の11色から選びます。 * magenta * red * volcano * orange * gold * lime * green * cyan * blue * geekblue * purple ### ブーリアン [Section titled “ブーリアン”](#ブーリアン) 真(true)または偽(false)のどちらかを入れる欄です。スイッチのオン/オフで入力します。 ### チェックボックス [Section titled “チェックボックス”](#チェックボックス) 真(true)または偽(false)のどちらかを入れる欄です。チェックボックスのオン/オフで入力します。ブーリアンと同じ真偽値を入れる欄で、入力に使う部品が異なります。 ### 日付 [Section titled “日付”](#日付) 日付を入れる欄です。日付を格納します。 ### テキスト [Section titled “テキスト”](#テキスト) 1行のテキストを入れる欄です。見出しやタイトルなど、短い文字列を格納します。 ### URL [Section titled “URL”](#url) http または https の URL を入れる欄です。 ## フィールドに設定できる属性 [Section titled “フィールドに設定できる属性”](#フィールドに設定できる属性) メタデータのフィールドにも、通常のフィールドと同じ[フィールド属性](/ja/cms/reference/modeling/field-attributes/)を設定できます。どの属性を設定できるかは、[フィールド属性](/ja/cms/reference/modeling/field-attributes/) の対応表に従います。ただし、タイトルとして使用は設定できません。 ## 値の保存 [Section titled “値の保存”](#値の保存) 既存のアイテムでメタデータの値を変えると、自動的に保存されます。新しいアイテムを作るときは、メタデータの値もアイテムと同時に保存されます。アイテムのフィールドは手動で保存します。 # モデル > アイテムをまとめて管理するモデルについて、モデル名・モデルキー・モデル概要の設定を説明します。 モデルは、[アイテム](/ja/cms/reference/content/items/)をまとめて管理する箱のようなものです。**モデル**画面で作り、名前とキーを付けます。モデルに入るアイテムの値は、設定したフィールドとメタデータのフィールドによるスキーマで定義されます。 ## モデル名 [Section titled “モデル名”](#モデル名) モデルの表示名です。モデルの作成時に必須です。 ## モデルキー [Section titled “モデルキー”](#モデルキー) モデルを識別するキーです。3〜32文字で、プロジェクト内で一意である必要があります。使える文字は半角英数字、アンダースコア、ダッシュです。キー全体が `id`・`assets`・`schemas`・`models`・`items` のいずれかと一致する場合は使えません。これらの語を含む `item_list` のようなキーは使えます。 ## モデル概要 [Section titled “モデル概要”](#モデル概要) モデルの説明です。モデルの用途を補足するために設定します。 ## 並び順 [Section titled “並び順”](#並び順) モデル一覧は、最終更新日時・作成日時・名前のいずれかで並び替えられます。 # コメント > アイテム・アセット・リクエストに対して、メンバー同士がやり取りするための書き込みです。コメントを付けられる対象と、コメントが持つ項目を説明します。 コメントは、[アイテム](/ja/cms/reference/content/items/)・[アセット](/ja/cms/reference/content/assets/)・[リクエスト](/ja/cms/reference/operations/requests/)に対して、メンバー同士がやり取りするための書き込みです。それぞれ **コンテンツ**・**アセット**・**リクエスト** の各画面で、一覧・詳細のどちらからも表示・投稿できます。 ## コメントが持つ項目 [Section titled “コメントが持つ項目”](#コメントが持つ項目) | 項目 | 内容 | | ---- | ----------------------------------------------------------------------------------------- | | 投稿者 | コメントを書いたユーザー。Integration API から作成したコメントには、連携したインテグレーションの名前が表示されます。自分が書いたコメントには「(自分)」が付きます | | 本文 | コメントの内容。Markdown 記法で書けます | | 投稿日時 | コメントを投稿した日時 | ## 作成・編集・削除 [Section titled “作成・編集・削除”](#作成編集削除) メンバーは、コメントを作成・編集・削除できます。できる範囲は役割によって決まり、編集者は自分が作成したコメントを編集・削除できます。詳しくは [役割と権限](/ja/cms/reference/publish-permissions/roles/) を参照してください。 アイテムとアセットのコメントは、Integration API から取得・作成・編集・削除できます。リクエストのコメントは、API では扱えません。詳しくは [CMS Developer Docs](/ja/developer/cms/overview/) を参照してください。 # インポート・エクスポート > モデルのデータやスキーマ定義を、ファイルで取り込む(インポート)・書き出す(エクスポート)機能です。対応する形式、上限、形式ごとの制約を説明します。 インポート・エクスポートは、[モデル](/ja/cms/reference/modeling/models/)のアイテムのデータやスキーマ定義を、ファイルで取り込む・書き出す機能です。 ## インポート [Section titled “インポート”](#インポート) 実験的な機能 インポートは実験的な機能で、動作が不安定な場合があります。 インポートには、コンテンツのインポートとスキーマのインポートの2種類があります。 ### コンテンツのインポート [Section titled “コンテンツのインポート”](#コンテンツのインポート) **コンテンツ** 画面から、モデルにアイテムを一括でインポートします。画面からのインポートは、既存のアイテムを更新せず、新しいアイテムとして追加するだけです。 ファイルは JSON・CSV・GeoJSON のいずれかで、次の共通ルールがあります。 * ファイルの列名・キー名は、フィールドの表示名ではなく、フィールドキーと一致させます。 * モデルのスキーマに無い列・キーは、インポート時に無視されます。ファイルに無いフィールドは、デフォルト値があればその値が入ります。 * 必須にしたフィールドは、列・キーがファイルに無いときと、値が空のときはインポートできません。デフォルト値が入るのは、列・キーがファイルに無いときだけです。値を空にした場合は、デフォルト値は入りません。CSV の空のセルは、空の値として扱われます。 * 1回にインポートできるのは、最大 50,000 件・ファイルサイズ 100 MB までです。 * 形式に合わない値が1件でもあると、インポート全体が行われません。エラーは画面で一覧でき、ログとしてダウンロードできます。 * インポート中は進捗が表示され、途中で中止できます。失敗したインポートは再試行できます。 各フィールドの値は、次のデータ型で記述します。 | フィールド | データ型 | | --------------------- | -------------------------------------------------------------------------------------------------------- | | テキスト/テキストエリア/マークダウン | 文字列 | | 整数型/浮動小数点数 | 数値 | | ブーリアン | 真偽値。`true` または `false` | | チェックボックス | 真偽値。`true` または `false` | | 日付 | 文字列。RFC3339 形式。例 `2025-12-01T00:00:00+09:00` | | 選択肢 | 文字列。選択肢の値 | | タグ | 文字列。タグの ID。複数値では、同じ ID を重ねられません | | URL | 文字列。http または https の URL | | アセット | 文字列。アセットの ID | | ジオメトリオブジェクト/ジオメトリエディタ | オブジェクト。GeoJSON のジオメトリ。例 `{"type":"Point","coordinates":[139.69,35.69]}`。JSON・GeoJSON でのみ指定でき、CSV では扱えません | | 複数値のフィールド | 配列。JSON・GeoJSON で指定でき、CSV では扱えません | 参照・グループのフィールドは、インポートの対象外です。 形式ごとの構造は次のとおりです。 * **CSV**:1行目がヘッダー行で、各列がフィールドキーです。1列目に `id` 列を置けますが、画面からのインポートでは新規追加のため使われません。空行は読み飛ばされます。単純なフィールド向けで、ジオメトリ・複数値は扱えません。 * **JSON**:アイテムのオブジェクトを並べた配列です。各オブジェクトのキーがフィールドキーです。 * **GeoJSON**:FeatureCollection です。各 Feature の geometry は、モデルのジオメトリフィールドに入ります。ジオメトリフィールドが複数ある場合は、最初の1つが使われます。properties の各キーは、フィールドキーになります。 各形式のファイルテンプレートは、インポートの画面からダウンロードできます。 ### スキーマのインポート [Section titled “スキーマのインポート”](#スキーマのインポート) **スキーマ** 画面から、モデルのスキーマを JSON でインポートします。インポートできるのは、モデルの空のスキーマだけです。グループとメタデータはインポートの対象になりません。 インポートする JSON は JSON Schema 形式で、`properties` の下に各フィールドを並べます。`properties` の下のプロパティ名が、フィールドキーになります。各フィールドには、画面に表示される名前を表す `title` と、フィールドタイプを表す `x-fieldType` が必要です。フィールドタイプに応じて、次の項目も指定します。 * `x-required`:必須にするか * `x-multiple`:複数値にするか * `x-unique`:ユニーク制約をかけるか * `maxLength`:最大長 * `x-options`:選択肢 * `maximum`/`minimum`:最小値・最大値 * `x-defaultValue`:デフォルト値 ファイルテンプレートは、インポートの画面からダウンロードできます。 ## エクスポート [Section titled “エクスポート”](#エクスポート) エクスポートは、選んだ時点でファイルがダウンロードされます。エクスポートには、コンテンツのエクスポートとスキーマ定義のエクスポートの2種類があります。 ### コンテンツのエクスポート [Section titled “コンテンツのエクスポート”](#コンテンツのエクスポート) **コンテンツ** 画面から、モデルのアイテムを書き出します。エクスポートする形式を、JSON・CSV・GeoJSON から選びます。アイテムが1件もないモデルはエクスポートできません。 エクスポートされるのは公開済みのアイテムだけです。ステータスが「ドラフト」「レビュー」のアイテムは、一覧に並んでいてもファイルに入りません。「公開済み & ドラフト」「公開済み & レビュー」のアイテムは、公開済みの内容が書き出されます。 ファイル名は、モデル名ではなくモデルの ID を使った `〈モデルのID〉-data.json`・`-data.csv`・`-data.geojson` になります。 * **JSON**:`results` にアイテムの配列、`totalCount` に件数を持つオブジェクトです。各アイテムには、フィールドの値に加えて、ID が `id`、作成日時が `$createdAt`、更新日時が `$updatedAt`、作成者が `$createdBy`、更新者が `$updatedBy` のキーで付きます。 * **CSV**:1列目が ID、以降がフィールドキーの列です。エクスポートされるのは、テキスト・テキストエリア・マークダウン・選択肢・タグ・URL・整数型・浮動小数点数・ブーリアン・チェックボックス・日付といった、単一値の単純なフィールドです。複数値のフィールド・アセット・参照・グループ・ジオメトリは含まれません。 * **GeoJSON**:ジオメトリフィールドを持つモデルだけで選べます。FeatureCollection として書き出され、各 Feature の geometry にジオメトリフィールド、properties にそれ以外のフィールドが入ります。ジオメトリフィールドが複数ある場合は、最初の1つが使われます。 ### スキーマのエクスポート [Section titled “スキーマのエクスポート”](#スキーマのエクスポート) **スキーマ** 画面から、モデルのスキーマ定義を JSON で書き出します。形式は、スキーマのインポートと同じ JSON Schema 形式で、`x-fieldType` などを含みます。フィールドが1つもないモデルはエクスポートできません。ファイル名は `〈モデルのID〉-schema.json` になります。 ## API からのインポート・エクスポート [Section titled “API からのインポート・エクスポート”](#api-からのインポートエクスポート) モデルのデータのインポート・エクスポートは、API からも行えます。詳しくは [CMS Developer Docs](/ja/developer/cms/overview/) を参照してください。 # リクエスト > アイテムの変更を公開する前に、レビュー・承認を経て反映する仕組みです。リクエストがとる4つのステータス、持つ項目、公開との関係を説明します。 リクエストは、[アイテム](/ja/cms/reference/content/items/)の変更を公開する前に、レビュー・承認を経て反映する仕組みです。**コンテンツ**画面でアイテムからリクエストを作成し、左メニューの **リクエスト** 画面で一覧・確認します。 ## ステータス [Section titled “ステータス”](#ステータス) リクエストは、次の4つのステータスのいずれかを持ちます。 | ステータス | 意味 | | ------ | -------------------------- | | ドラフト | 下書きの状態 | | レビュー待ち | レビュアーの承認を待っている状態 | | 承認済み | レビュアーに承認され、対象のアイテムが公開された状態 | | クローズ済み | 承認せずに閉じた状態。再開できる | リクエストは、作成した時点で「レビュー待ち」になります。「ドラフト」は作成時に選べません。 ## リクエストが持つ項目 [Section titled “リクエストが持つ項目”](#リクエストが持つ項目) | 項目 | 内容 | | ------- | ------------------------------------------------------------------- | | タイトル | リクエストを識別する名前。必須 | | 説明 | リクエストの内容の説明 | | レビュアー | 承認を行う担当者。1人以上を指定する | | 対象のアイテム | このリクエストに含めるアイテムと、そのバージョン。リクエストを作った後にアイテムを編集しても、その変更は既存のリクエストには入りません | | 状態 | 上記のいずれか | | 作成者 | リクエストを作成した人 | | 作成日時 | 作成された日時 | ## 一覧に表示される項目 [Section titled “一覧に表示される項目”](#一覧に表示される項目) **リクエスト** 画面の一覧には、次の8列が表示されます。 * 見出しなしの列:詳細画面を開くアイコン * コメント数(見出しはメッセージのアイコン) * タイトル * 状態 * 作成者 * レビュアー * 作成日時 * 更新日時 一覧を開いた時点では、状態が「レビュー待ち」でフィルターされています。一覧は、状態、作成者、レビュアーでフィルターできます。作成者とレビュアーは、自分に絞るか、すべてを表示するかを選べます。 ## レビューと承認 [Section titled “レビューと承認”](#レビューと承認) リクエストに対して、レビュアーは次のことを行えます。 * 承認:リクエストを承認します。承認すると、対象のアイテムが公開されます。 * クローズ:リクエストを閉じて終了します。クローズしたリクエストは再開できます。 リクエストを承認できるのは、承認の権限を持つ役割のユーザーのうち、そのリクエストのレビュアーに指名されている人です。クローズと再開は、承認とは別の権限で決まります。役割ごとの可否は [役割と権限](/ja/cms/reference/publish-permissions/roles/) を参照してください。 ## 公開との関係 [Section titled “公開との関係”](#公開との関係) アイテムを公開するとき、リクエストを経由するかどうかは、[プロジェクト](/ja/cms/reference/publish-permissions/project/)の設定「リクエストの要否」で決まります。 * リクエストが必須の役割のユーザーは、アイテムを直接公開せず、リクエストを作成してレビューに回します。 * リクエストが不要な役割のユーザーは、公開の権限があればアイテムを直接公開できます。公開の権限がなければ、リクエストが不要でもアイテムを公開できません。 アイテムのステータスが「レビュー」または「公開済み & レビュー」のとき、そのアイテムは公開したり、新しいリクエストを作成したりできません。リクエストが承認された時点で、対象のアイテムが公開されます。 ## コメント [Section titled “コメント”](#コメント) リクエストには、コメントを付けてやり取りできます。詳しくは [コメント](/ja/cms/reference/operations/comments/) を参照してください。 # プロジェクト > モデル・アイテム・アセットをまとめて管理する単位です。名前・エイリアス・説明・公開範囲・リクエストの要否など、プロジェクト自体に設定できる項目を説明します。 プロジェクトは、モデル・グループ・アイテム・アセットをまとめて管理する単位です。1つのプロジェクトは、1つのワークスペースに属します。プロジェクト自体の情報は、左メニューの**設定**画面で設定します。 ## 名前 [Section titled “名前”](#名前) プロジェクトを識別する名前です。必須です。 ## エイリアス [Section titled “エイリアス”](#エイリアス) プロジェクトにアクセスするための識別子です。5〜32文字で指定します。使える文字は、小文字の英数字・ハイフン(-)・アンダースコア(\_)です。同じワークスペース内で、他のプロジェクトと重複しない値にします。 ## 説明 [Section titled “説明”](#説明) プロジェクトの説明を入れる欄です。 ## 公開範囲 [Section titled “公開範囲”](#公開範囲) 公開範囲は、プロジェクトを公開するか非公開にするかの設定で、「公開」または「非公開」のどちらかです。**設定**画面の重要操作で切り替えます。 * **公開**:プロジェクトがオープンデータとして公開されます。Re:Earth Dashboard の「エクスプローラー」に掲載され、ログインしていない人を含め、誰でもプロジェクトを検索・閲覧し、データをダウンロードできます。公開・ダウンロードの対象になるのは、ステータスが「公開」の[アイテム](/ja/cms/reference/content/items/)だけです。公開範囲と、アイテムのステータス(公開・ドラフトなど)は別の設定です。 * **非公開**:プロジェクトはオープンデータとして公開されません。特定のモデル・アセットだけを配信するには、[パブリックAPI設定](/ja/cms/reference/publish-permissions/public-api-settings/)で許可します。非公開に設定できるのは、有料プランのみです。Open & Public プランでは、非公開に設定できません。 エクスプローラーでの掲載・ダウンロードは、Re:Earth Dashboard の画面で行います。詳しくは Dashboard のドキュメント(準備中)を参照してください。 ## リクエストの要否 [Section titled “リクエストの要否”](#リクエストの要否) 役割ごとに、変更を反映する前にリクエストを必須にするかどうかを設定します。所有者・管理者・編集者について設定でき、閲覧者は設定の対象外です。ここで設定した内容は、プロジェクト内のすべてのモデルに適用されます。すでに作ってあるモデルも対象です。 レビューを経て公開する仕組みは、[リクエスト](/ja/cms/reference/operations/requests/)を参照してください。 ## README とライセンス [Section titled “README とライセンス”](#readme-とライセンス) プロジェクトには、説明文書の README と、利用条件を定めるライセンスを持たせられます。詳しくは [README・ライセンス](/ja/cms/reference/publish-permissions/readme-license/) を参照してください。 # パブリックAPI設定 > プロジェクトのアイテムとアセットを外部に配信するための画面です。読み取りタブのモデルごとの配信と APIキー、書き込みタブの許可済みオリジンとモデルごとの書き込みについて、画面が持つ設定項目を説明します。API の呼び出し方は開発者向けドキュメントに委ねます。 パブリックAPI設定は、プロジェクトのアイテムとアセットを外部に配信するための画面です。左メニューの **パブリックAPI** にあります。この画面は**読み取り**と**書き込み**の2つのタブで構成されます。 ## 読み取り [Section titled “読み取り”](#読み取り) モデルのデータを外部へ配信するための設定です。モデルごとの配信の切り替えと、APIキーの2つの欄があります。 ### モデルごとの配信 [Section titled “モデルごとの配信”](#モデルごとの配信) 表には、プロジェクトのモデルが並び、末尾に「アセット」の行が付きます。アセットの行は、プロジェクトのアセットをまとめて配信するかどうかの設定です。列は次のとおりです。 | 列 | 内容 | | ------- | ------------------------------------------------------------------------------------------------------- | | 有効 | そのモデル(またはアセット)を配信するかの切り替え。[プロジェクト](/ja/cms/reference/publish-permissions/project/)の公開範囲が「非公開」のときに表示されます | | モデル | モデルの名前 | | エンドポイント | 配信先の URL。URL の前に「GET」と表示されます | * プロジェクトの公開範囲が「公開」の場合は、すべてのモデルが配信の対象になります。切り替えの列は表示されません。 * プロジェクトの公開範囲が「非公開」の場合は、モデルごとに配信するかを選びます。 配信を有効にしたモデルは、エンドポイントを知っている人が誰でもデータを読み取れます。この状態のモデルは、APIキーの権限では制限できません。配信されるのは、ステータスが「公開済み」のアイテムだけです。 ### APIキー [Section titled “APIキー”](#apiキー) APIキーは、プロジェクトの公開範囲が「非公開」の場合に、配信する範囲を制御するためのものです。プロジェクトの公開範囲が「公開」の場合は使えません。 一覧には「名前」と「キー」が表示されます。各キーが持つ項目は次のとおりです。 | 項目 | 内容 | | ----- | ------------------------------ | | 名前 | キーを識別する名前 | | 説明 | キーの用途などの説明 | | APIキー | API リクエストに使う秘密のトークン文字列。再生成できます | | 権限 | このキーで配信を許可するモデル・アセット | ## 書き込み [Section titled “書き込み”](#書き込み) 外部から匿名でデータを送信できるようにする設定です。認証なしの送信を受け付けるため、送信元のサイトを限定します。送信を受け付けると、そのモデルに新しいアイテムがドラフトの状態で作られます。公開はされず、リクエストも作られません。この設定を変更できるのは、所有者と管理者です。 ### 許可済みオリジン [Section titled “許可済みオリジン”](#許可済みオリジン) 送信を受け付けるサイトの一覧です。オリジンとは、`https://example.com` のように、通信方式とドメイン名までで Web サイトを識別する単位です。その先のページのパスは含みません。 この一覧との照合を受けるのは、Origin ヘッダーが付いた API リクエストです。受け付けるのは、一覧に登録したオリジンからのものだけで、オリジンを1つも登録していないときはすべて拒否します。サーバー上のプログラムやコマンドラインのツールのように、Origin ヘッダーが付かない API リクエストは、照合を受けません。オリジンは複数登録でき、登録済みの件数が表示されます。「すべてクリア」で全件を削除できます。 入力するのは、通信方式(`http` または `https`)とドメイン名までです。必要ならポート番号も付けられます。ページのパスやクエリを含む URL(例:`https://example.com/form`)は登録できません。サブドメインが複数ある場合は、1件ずつ登録します。形式に合わない値を入れると「有効なオリジンを入力してください(例:`https://example.com`)」と表示されます。末尾のスラッシュは、登録時に取り除かれます。 ### モデルごとの書き込み [Section titled “モデルごとの書き込み”](#モデルごとの書き込み) 表には、プロジェクトのモデルが並びます。アセットは対象外です。列は次のとおりです。 | 列 | 内容 | | ------- | ----------------------------------------------- | | 有効 | そのモデルへの書き込みを受け付けるかの切り替え | | モデル | モデルの名前 | | エンドポイント | 送信先の URL。URL の前に「POST」と表示されます | | (見出しなし) | そのモデルへの API リクエストの例を cURL コマンドとしてコピーする「コピー」のボタン | 許可済みオリジンを1つも登録していない場合、この表は操作できません。 ## API の呼び出し方 [Section titled “API の呼び出し方”](#api-の呼び出し方) エンドポイントの構造・認証・リクエストの書き方など、実際の API の使い方は、[CMS Developer Docs](/ja/developer/cms/overview/) を参照してください。 # README・ライセンス > プロジェクトに持たせられる2つの文書です。プロジェクトの説明である README と、利用条件を定めるライセンスについて、記述に使う形式と、ライセンスで選べるテンプレートを説明します。 README とライセンスは、プロジェクトに持たせられる文書です。どちらも Markdown 形式で記述します。画面を開いたときは本文の表示だけで、編集に切り替えると、記述する **Edit** と表示を確認する **Preview** のタブが出ます。 ## README [Section titled “README”](#readme) README は、プロジェクトの内容を説明する文書です。左メニューの **README** 画面で記述します。 ## ライセンス [Section titled “ライセンス”](#ライセンス) ライセンスは、プロジェクトとそのデータを他者が利用・共有できる条件を伝える文書です。左メニューの **ライセンス** 画面で記述します。 用意されたテンプレートから選ぶと、本文がそのテンプレートに差し替わります。 ライセンスに書いた条件によって、プロジェクトの公開範囲や API のアクセスが変わることはありません。公開の範囲は、**設定**画面で切り替えます。 ### 選べるライセンステンプレート [Section titled “選べるライセンステンプレート”](#選べるライセンステンプレート) テンプレートは次の9種類で、この中から1つを選びます。 * Open Use of Data Agreement v1.0 * European Union Public License v1.2 * GNU Lesser General Public License v3.0 * GNU General Public License v3.0 * Apache License 2.0 * MIT License * Creative Commons Attribution-NonCommercial 4.0 International * Creative Commons Attribution-ShareAlike 4.0 International * Creative Commons Attribution 4.0 International # 役割と権限 > ワークスペースのメンバーに割り当てる役割と、各役割が Re:Earth CMS でできることを説明します。役割4種と、リソースごとにできる操作を扱います。 メンバーの招待、役割(権限)の割り当て、ワークスペースの管理は、全プロダクト共通の Re:Earth Dashboard で設定します。詳しくは Dashboard のドキュメント(準備中)を参照してください。 Dashboard で割り当てられた役割によって、そのメンバーが Re:Earth CMS でできることが決まります。役割は次の4種類です。 | 役割 | CMS でできることの概要 | | --- | --------------------------------------------------------------------------------------------------------- | | 所有者 | CMS 内のすべての操作ができます。APIキーの再生成は、所有者だけが行えます | | 管理者 | APIキーの再生成を除き、CMS 内のすべての操作ができます | | 編集者 | プロジェクトの作成・削除と、モデル・スキーマ・ビューの作成・編集・削除ができます。プロジェクト設定は変更できません。アイテム・アセット・リクエスト・コメントは作成でき、編集・削除できるのは自身が作成したものです | | 閲覧者 | 閲覧のみできます | ## 役割ごとにできること [Section titled “役割ごとにできること”](#役割ごとにできること) 各役割が CMS 内でできる操作は次のとおりです。✓ はできる、✕ はできないことを表します。 | リソース | 操作 | 所有者 | 管理者 | 編集者 | 閲覧者 | | ------ | -------------- | --- | --- | -------------- | --- | | プロジェクト | 閲覧 | ✓ | ✓ | ✓ | ✓ | | プロジェクト | 作成 | ✓ | ✓ | ✓ | ✕ | | プロジェクト | 設定の変更 | ✓ | ✓ | ✕ | ✕ | | プロジェクト | 削除 | ✓ | ✓ | ✓ | ✕ | | プロジェクト | APIキーの作成・編集・削除 | ✓ | ✓ | ✕ | ✕ | | プロジェクト | APIキーの再生成 | ✓ | ✕ | ✕ | ✕ | | モデル | 閲覧 | ✓ | ✓ | ✓ | ✓ | | モデル | 作成・編集・削除 | ✓ | ✓ | ✓ | ✕ | | スキーマ | 閲覧 | ✓ | ✓ | ✓ | ✓ | | スキーマ | 作成・編集・削除 | ✓ | ✓ | ✓ | ✕ | | アイテム | 閲覧 | ✓ | ✓ | ✓ | ✓ | | アイテム | 作成 | ✓ | ✓ | ✓ | ✕ | | アイテム | 編集・削除 | ✓ | ✓ | 自身が作成したアイテムのみ | ✕ | | アイテム | 公開 | ✓ | ✓ | ✓ | ✕ | | アセット | 閲覧 | ✓ | ✓ | ✓ | ✓ | | アセット | 作成 | ✓ | ✓ | ✓ | ✕ | | アセット | 編集・削除 | ✓ | ✓ | 自身が作成したアセットのみ | ✕ | | ビュー | 閲覧 | ✓ | ✓ | ✓ | ✓ | | ビュー | 作成・編集・削除 | ✓ | ✓ | ✓ | ✕ | | リクエスト | 閲覧 | ✓ | ✓ | ✓ | ✓ | | リクエスト | 作成 | ✓ | ✓ | ✓ | ✕ | | リクエスト | 編集・クローズ | ✓ | ✓ | 自身が作成したリクエストのみ | ✕ | | リクエスト | 承認 | ✓ | ✓ | ✕ | ✕ | | コメント | 閲覧 | ✓ | ✓ | ✓ | ✓ | | コメント | 作成 | ✓ | ✓ | ✓ | ✕ | | コメント | 編集・削除 | ✓ | ✓ | 自身が作成したコメントのみ | ✕ | 表の「公開」は基本の権限です。実際にアイテムを直接公開できるかは、プロジェクトの「リクエストの要否」に左右されます。リクエストが必須の役割では、公開の代わりにリクエストの作成になります。詳しくは [リクエスト](/ja/cms/reference/operations/requests/) を参照してください。 表の「承認」も基本の権限です。実際にリクエストを承認できるのは、そのリクエストのレビュアーに指名されている人です。 表の「設定の変更」には、名前・エイリアス・説明・ライセンス・README の変更と、公開範囲の切り替え、[パブリックAPI設定](/ja/cms/reference/publish-permissions/public-api-settings/)の書き込みの設定の変更が含まれます。 ## インテグレーション [Section titled “インテグレーション”](#インテグレーション) インテグレーションの作成は、どの役割のメンバーでも行えます。インテグレーションの編集・削除と、インテグレーショントークンの再生成は、自身が作成したインテグレーションに限られます。 | リソース | 操作 | 所有者 | 管理者 | 編集者 | 閲覧者 | | --------- | ----------------------- | ------------------ | ------------------ | ------------------ | ------------------ | | インテグレーション | 作成 | ✓ | ✓ | ✓ | ✓ | | インテグレーション | 編集・削除 | 自身が作成したインテグレーションのみ | 自身が作成したインテグレーションのみ | 自身が作成したインテグレーションのみ | 自身が作成したインテグレーションのみ | | インテグレーション | インテグレーショントークンの再生成 | 自身が作成したインテグレーションのみ | 自身が作成したインテグレーションのみ | 自身が作成したインテグレーションのみ | 自身が作成したインテグレーションのみ | | インテグレーション | ワークスペースへの連携・役割の変更・連携の解除 | ✓ | ✓ | ✕ | ✕ | | インテグレーション | ワークスペースへ連携済みの一覧の閲覧 | ✓ | ✓ | ✓ | ✓ | 作成と連携の手順は、[インテグレーションの作成](/ja/developer/cms/getting-started/integration-setup/) にあります。 # 地理空間アセットのプレビュー設定(タイル・地形) > CMS のアセットプレビューで、地図の背景に使うタイルと地形の設定です。登録できるタイル・地形の種類、既定の決まり方、独自に追加できる項目を説明します。 CMS で 3Dタイル・MVT・GeoJSON・CZML などの地理空間の[アセット](/ja/cms/reference/content/assets/)をプレビューするとき、地図に使うタイルと地形を、この設定で選びます。タイルは地図として表示される画像で、地形は地図の起伏を表す標高の面です。 この設定は、ワークスペースの左メニューにある **設定** 画面内にあります。プロジェクトを開いている間は、左メニューに表示されません。同じ左メニューにある **ワークスペース設定** とも、[プロジェクト](/ja/cms/reference/publish-permissions/project/)ごとにある **設定** とも、別の画面です。 ## タイル [Section titled “タイル”](#タイル) 地図の背景に使うタイルです。この設定は、使うタイルの一覧を持ちます。一覧には複数のタイルを登録でき、先頭のタイルが既定のタイルとして使われます。 一覧に登録する各タイルは、次の6種類のうち1つの種類を持ちます。 * Google Satellite * Google Road Map * OpenStreetMap * NASA Black Marble * 地理院地図 標準地図 * URL 種類が **URL** のタイルは、次の項目を自分で指定します。 * 名前 * URL:タイルの URL テンプレートです。`{z}`・`{x}`・`{y}` を含む形式で指定します。Web ページや画像の URL は、タイルとして表示されません * イメージURL:この選択肢に表示するアイコンの画像です ## 地形 [Section titled “地形”](#地形) 地図の起伏を表す標高の面です。地形は、使うかどうかを切り替えられます。使う場合、この設定は、使う地形の一覧を持ちます。一覧には複数の地形を登録でき、先頭の地形が既定の地形として使われます。 一覧に登録する各地形は、次の2種類のうち1つの種類を持ちます。 * Re:Earth Terrain * Cesium Ion 種類が **Cesium Ion** の地形は、次の項目を自分で指定します。 * 名前 * Terrain Cesium IonアセットID * Terrain Cesium Ion アクセストークン * 地形URL:この URL を入れた場合は、ここから地形を読み込みます。空にした場合は、Terrain Cesium IonアセットIDとアクセストークンから読み込みます * イメージURL:この選択肢に表示するアイコンの画像です # 更新情報 — CMS > Re:Earth CMS のドキュメント更新履歴(新しい順)。 * **2026年10月7日** — [Re:Earth CMS の構成](/ja/cms/concepts/cms-composition/):記事を公開しました。 * **2026年10月2日** — [モデルの構造を先に決める](/ja/cms/concepts/model-structure-first/):記事を公開しました。 * **2026年9月10日** — [操作ガイド](/ja/cms/how-to/project-create-configure-delete/):記事を公開しました。 * **2026年8月28日** — [Re:Earth CMSとはなにか](/ja/cms/concepts/what-is-reearth-cms/):記事を公開しました。 * **2026年8月24日** — [リファレンス](/ja/cms/reference/modeling/field-types/):記事を公開しました。 # はじめに > Re:Earth Dashboard でアカウント・ワークスペース・プロジェクトを管理する方向けのドキュメントです。 Re:Earth Dashboardは、Re:Earth の各プロダクトで共通に使う、アカウント・ワークスペース・プロジェクトを管理するプロダクトです。 ## 目的別 [Section titled “目的別”](#目的別) 特定の操作を学ぶ 準備中 詳細な仕様を調べる [リファレンスを開く ](/ja/dashboard/reference/account/) # アカウント > Re:Earth のユーザーのアカウントが持つ項目と入力の条件、二段階認証、初回の設定、メールアドレスの確認を説明します。 アカウントは Re:Earth の各プロダクトを使うユーザーの登録です。アカウントにはそのユーザーの[個人ワークスペース](/ja/dashboard/reference/workspace/)が1つ結び付いています。 アカウントの項目は Re:Earth Dashboard のヘッダーのユーザーメニューにある**ユーザー設定**で設定します。 ## ユーザーエイリアス [Section titled “ユーザーエイリアス”](#ユーザーエイリアス) ユーザーの識別子です。個人ワークスペースの URL に使われます。入力は必須です。 **ユーザー設定**の**プロフィール**で設定します。 次の条件を満たす値にします。 * 5〜32文字 * 使える文字は、半角の英字(大文字と小文字)・数字・ハイフン(-) * 先頭と末尾は英字か数字 * ハイフンの前後は英字か数字 * ほかのユーザーのエイリアスとも、ワークスペースのエイリアスとも異なる値 前後の空白は取り除かれます。 ユーザーエイリアスを変更すると、個人ワークスペースのエイリアスも同じ値に変わります。個人ワークスペースの URL も変わります。 ## ユーザー名 [Section titled “ユーザー名”](#ユーザー名) ほかのユーザーに表示される名前です。入力は必須です。100文字まで入力できます。 **ユーザー設定**の**プロフィール**で設定します。 `taro@example.com` のようなメールアドレスの形式ではない値にします。 個人ワークスペースの名前が空のとき、または変更前のユーザー名と同じときは、ユーザー名を変更すると、個人ワークスペースの名前も新しいユーザー名に変わります。 ## メールアドレス [Section titled “メールアドレス”](#メールアドレス) ログインに使うメールアドレスです。**ユーザー設定**の**アカウント**に表示されます。変更はできません。 ## パスワード [Section titled “パスワード”](#パスワード) ログインに使うパスワードです。**ユーザー設定**の**アカウント**にある**パスワードを変更**で変更します。 新しいパスワードは次の条件を満たす必要があります。 * 8文字以上 * 大文字、小文字、数字、特殊文字をそれぞれ1文字以上含む 特殊文字として数えられるのは、次の文字です。 ``! @ # $ % ^ & * ( ) , . ? " : { } | < > _ - \ [ ] / ` ~ + =`` 新しいパスワードの確認の入力は、新しいパスワードと同じ値にします。 パスワードを変更すると、ログアウトされ、ログインの画面に戻ります。 ## 二段階認証 [Section titled “二段階認証”](#二段階認証) ログインのときに第2要素として認証アプリ(例:Google Authenticator、Authy)が生成するワンタイムパスワードを求める設定です。 **ユーザー設定**の**アカウント**にある**二段階認証**で設定します。 ### ワンタイムパスワード [Section titled “ワンタイムパスワード”](#ワンタイムパスワード) ワンタイムパスワードの状態は、**未設定**と**設定済み**の2つです。 | 状態 | 操作 | 操作の結果 | | -------- | --------- | -------------------------------------------------------------------------- | | **未設定** | **有効にする** | 認証アプリで登録するためのリンクが表示されます。認証アプリでの登録を終えると、**設定済み**になります。登録を終えるまでは**未設定**のままです | | **設定済み** | **無効にする** | 確認なしで、ワンタイムパスワードが無効になり、**未設定**に戻ります | ### 復旧コード [Section titled “復旧コード”](#復旧コード) 認証アプリを使えなくなったときに、ワンタイムパスワードの代わりにログインに使うコードです。 ワンタイムパスワードが**設定済み**のときに、**復旧コードを生成**で生成できます。 * 生成すると、それまでの復旧コードは使えなくなります。 * 生成したコードが表示されるのは、生成したときの1度だけです。 ## プロフィール [Section titled “プロフィール”](#プロフィール) ほかのユーザーに見せる項目です。 **ユーザー設定**の**プロフィール**で設定します。設定できる項目と入力の条件は次のとおりです。 | 項目 | 条件 | | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------- | | **プロフィール画像** | 形式は JPEG・PNG・WebP で、10MB まで | | **Web** | `https://example.com` のように `http://` または `https://` で始まり、ホスト名を含む URL、または `example.com` のようにドット(.)を含むホスト名。パスを含む URL は、`http://` または `https://` から入力します | | **概要** | 500文字まで。改行は1文字として数えます | ## 言語 [Section titled “言語”](#言語) Re:Earth Dashboard の表示言語です。 **ユーザー設定**の**プロフィール**で、次の3つから1つを選びます。 * **Auto / 自動** * **English** * **日本語** 選んだ言語は保存すると表示に反映されます。 ## 初回の設定 [Section titled “初回の設定”](#初回の設定) アカウントの作成では、メールアドレスとパスワードを登録します。ユーザー名とユーザーエイリアスには、`user-` で始まる値が自動で設定されます。 最初のログインで、ユーザーエイリアスとユーザー名を設定する画面が表示されます。 ここで設定するユーザーエイリアスは、「ユーザーエイリアス」の条件に加えて、`user-` で始まらない値にします。 ## メールアドレスの確認 [Section titled “メールアドレスの確認”](#メールアドレスの確認) メールアドレスの確認が済んでいないアカウントでログインすると、**メールアドレスを確認してください**の画面が表示されます。 この画面から確認メールを送り直せます。送り直したあと60秒は送り直せません。 # CMS プロジェクトのデータの閲覧とダウンロード > データタブに表示されるモデルの一覧とプレビューの範囲、API とダウンロードのボタンが出る条件、4つのダウンロード形式の動作を説明します。 Re:Earth Dashboard の CMS プロジェクトごとの画面にある**データ**タブでは、Re:Earth CMS のプロジェクトのアイテムをプレビューし、ファイルとしてダウンロードできます。パブリックAPI のエンドポイントも確認できます。 **データ**タブに表示される内容は、プロジェクトの**公開範囲**と、Re:Earth CMS のアイテムのステータスの2つで決まります。 公開範囲ごとに、モデルの一覧とプレビュー・**API**・**ダウンロード**を使えるユーザーは次のとおりです。 | プロジェクトの公開範囲 | モデルの一覧とプレビュー | **API** | **ダウンロード** | | ----------- | --------------------------------- | -------- | ---------- | | 公開 | すべてのユーザー | すべてのユーザー | すべてのユーザー | | 非公開 | プロジェクトが属するワークスペースの所有者・管理者・編集者・閲覧者 | 使えません | 使えません | **公開範囲**の設定は [プロジェクト](/ja/dashboard/reference/project/)を参照してください。 プレビューとダウンロードの対象になるアイテムは、ステータスが「公開済み」「公開済み & ドラフト」「公開済み & レビュー」のものです。ステータスが「ドラフト」「レビュー」のアイテムは、対象になりません。 ## モデルの一覧 [Section titled “モデルの一覧”](#モデルの一覧) **データ**タブにはプロジェクトのモデルの名前が並びます。一覧に表示されるモデルは最大50件です。 プロジェクトのモデルが0件のときは、「まだデータがありません」と表示されます。このとき**API**と**ダウンロード**のボタンは表示されません。 ## API [Section titled “API”](#api) **API**では、選んでいるモデルについて次の2つの項目が表示されます。 * **モデル名**:選んでいるモデルの名前 * **エンドポイント (読み取り専用)**:選んでいるモデルのパブリックAPI の URL パブリックAPI の仕様と使い方は、[パブリックAPI とは](/ja/developer/cms/overview/public-api/)を参照してください。 ## ダウンロード [Section titled “ダウンロード”](#ダウンロード) **ダウンロード**では、次の4つの形式から1つを選びます。 * **CSV** * **JSON** * **GeoJSON** * **Schema** **CSV**・**JSON**・**GeoJSON**を選ぶと、選んでいるモデルのアイテムがファイルとしてダウンロードされます。**Schema**を選ぶと、選んでいるモデルのスキーマが JSON Schema の形式のファイルとしてダウンロードされます。 形式ごとに保存されるファイルの名前は次のとおりです。 | 形式 | 保存されるファイル名 | | ----------- | --------------------- | | **CSV** | `<モデルキー>.csv` | | **JSON** | `<モデルキー>.json` | | **GeoJSON** | `<モデルキー>.geojson` | | **Schema** | `<モデルキー>.schema.json` | `<モデルキー>` には、選んでいるモデルのモデルキーが入ります。モデルキーは、\*\*エンドポイント (読み取り専用)\*\*に表示される URL の末尾の部分と同じです。たとえば、モデルキーが `buildings` のとき、**CSV**のファイルの名前は `buildings.csv` です。 **CSV**のファイルに入るフィールドは、[インポート・エクスポート](/ja/cms/reference/operations/import-export/)を参照してください。 **GeoJSON**をダウンロードできるのは、ジオメトリのフィールドを持つモデルだけです。ほかのモデルで**GeoJSON**を選ぶと、「モデルのダウンロード中にエラーが発生しました。」と表示されます。ジオメトリのフィールドが2つ以上あるモデルでは、スキーマのフィールドの並びで先にある1つだけがファイルに入ります。 形式ごとのデータの仕様は [パブリックAPIリファレンス](/ja/developer/cms/public-api-reference/) にあります。 ## プレビュー [Section titled “プレビュー”](#プレビュー) プレビューの表には、選んでいるモデルのアイテムが最大20件表示されます。 # プロジェクトを探す > Re:Earth Dashboard の「探す」について、掲載されるプロジェクト、名前で検索、トピックでの絞り込み、並び替えを説明します。 **探す**は、公開範囲が「公開」の CMS プロジェクトと Visualizer プロジェクトを探す画面です。Re:Earth にログインしているかどうかにかかわらず、すべてのユーザーが使えます。 **探す**は、[ホーム](https://reearth.io/home)のヘッダーにあります。 **探す**には Re:Earth CMS と Re:Earth Visualizer のプロジェクトの一覧がそれぞれあります。 * [CMS プロジェクトの一覧](https://reearth.io/explore/cms) * [Visualizer プロジェクトの一覧](https://reearth.io/explore/visualizer) ## 掲載されるプロジェクト [Section titled “掲載されるプロジェクト”](#掲載されるプロジェクト) **探す**に掲載されるのは、公開範囲が「公開」のプロジェクトだけです。公開範囲が「非公開」のプロジェクトは、所属するワークスペースのメンバーであっても**探す**には表示されません。 公開範囲の変更は、[プロジェクト](/ja/dashboard/reference/project/)を参照してください。 ## 名前での検索 [Section titled “名前での検索”](#名前での検索) 検索では、表示中の一覧のプロジェクトのうち、検索欄に入力した語を名前に含むものが表示されます。入力が止まったときに一覧に反映されます。 検索の条件は次のとおりです。 * 大文字と小文字を区別しません。 * 語の前後の空白は無視されます。 * 記号はそのままの文字として照合されます。 * 検索欄を空にすると検索の語による絞り込みが外れます。 ## トピックでの絞り込み [Section titled “トピックでの絞り込み”](#トピックでの絞り込み) トピックは、プロジェクトに設定するキーワードです。トピックの設定は、[プロジェクト](/ja/dashboard/reference/project/)を参照してください。 トピックで絞り込むと、選んだトピックをすべて持つプロジェクトだけが一覧に表示されます。 トピックでの絞り込みは、**名前で検索**と同時に使えます。そのときは、検索の語とトピックの両方に合うプロジェクトが表示されます。 一覧を切り替えると、検索の語とトピックの絞り込みが外れます。 トピックでの絞り込みには、検索欄の下のタグを選ぶ方法と、**フィルター**のパネルの**トピック**で指定する方法があります。 ### 検索欄の下のタグ [Section titled “検索欄の下のタグ”](#検索欄の下のタグ) 検索欄の下のタグの初期状態は、表示中の一覧のプロジェクトに設定されている回数が多い上位10個のトピックです。タグを選ぶと、そのタグのトピック1つで絞り込みが適用されます。 絞り込みが適用されているあいだ、タグには適用中のトピックが並びます。**フィルター**のパネルで複数のトピックを適用したときは、そのすべてのタグが並びます。並ぶのは10個までです。タグに並ばないトピックも、一覧の絞り込みには使われます。 適用中のトピックを外すと、そのトピックだけが絞り込みから外れます。適用中のトピックがすべて外れると、タグは初期状態に戻ります。 ### フィルター [Section titled “フィルター”](#フィルター) **フィルター**のパネルの**トピック**では、トピックを複数指定できます。候補は次の条件で決まります。 * 候補は入力欄に語が入っているときだけ表示されます。 * 表示中の一覧のプロジェクトで使われているトピックのうち、名前の先頭が入力した語に一致するものが候補になります。 * 候補は100件までです。 * 選択済みと適用中のトピックは候補に表示されません。 パネルの**適用**と**クリア**の結果は次のとおりです。 * **適用**:パネルで選んでいるすべてのトピックで絞り込みが適用されます。選んでいるトピックが0個のときは、トピックの絞り込みが解除されます。 * **クリア**:パネルの選択と適用中の絞り込みがすべて外れます。一覧にはその時点で反映されます。 ## 並び替え [Section titled “並び替え”](#並び替え) 一覧は**最もスターが多い**(スターの数の多い順)か**最新の更新**(更新の新しい順)で並びます。並び替えを選ぶまでは、**最もスターが多い**の順で並びます。 # メンバーと役割 > ワークスペースのメンバーが持つ役割4種と、役割ごとに Re:Earth Dashboard の画面でできる操作、メンバーの追加・役割の編集・メンバーの削除の条件、残りのシート数を説明します。 メンバーとは、ワークスペースに所属するユーザーのことです。ワークスペースごとに、役割を1つ持ちます。 チームワークスペースとは、複数のメンバーで共有するワークスペースのことです。ワークスペースの種類は、[ワークスペース](/ja/dashboard/reference/workspace/)を参照してください。 メンバーの管理は、チームワークスペースの画面の**メンバー**タブで行います。 ## 役割 [Section titled “役割”](#役割) 役割とは、メンバーができる操作を決める設定のことです。所有者・管理者・編集者・閲覧者の4種類があります。この順に上位から並びます。 ## 役割ごとにできること [Section titled “役割ごとにできること”](#役割ごとにできること) 各役割が Re:Earth Dashboard の画面でできる操作は次のとおりです。✓ はできる、✕ はできないことを表します。 | 画面 | 操作 | 所有者 | 管理者 | 編集者 | 閲覧者 | | --------------------------------------------------- | ----------------- | --- | --- | --- | --- | | ワークスペースの**メンバー** | 閲覧 | ✓ | ✓ | ✓ | ✓ | | ワークスペースの**メンバー** | 追加・編集・削除 | ✓ | ✓ | ✕ | ✕ | | ワークスペースの**設定**の**一般** | 閲覧 | ✓ | ✓ | ✓ | ✓ | | ワークスペースの**設定**の**一般** | 編集 | ✓ | ✕ | ✕ | ✕ | | ワークスペースの**設定**の**サブスクリプション** | 閲覧 | ✓ | ✓ | ✓ | ✓ | | ワークスペースの**設定**の**サブスクリプション** | アップグレード・編集 | ✓ | ✕ | ✕ | ✕ | | ワークスペースの**設定**の**請求書** | 閲覧 | ✓ | ✓ | ✓ | ✓ | | ワークスペースの**設定**の**請求書** | 請求書を確認 | ✓ | ✕ | ✕ | ✕ | | ワークスペースの**設定**の**重要操作** | 閲覧 | ✓ | ✓ | ✓ | ✓ | | ワークスペースの**設定**の**重要操作** | 編集・転送・削除 | ✓ | ✕ | ✕ | ✕ | | ワークスペースの**概要** | ピンをカスタマイズ | ✓ | ✕ | ✕ | ✕ | | ワークスペースの**CMSプロジェクト**・**Visualizerプロジェクト** | プロジェクトの作成 | ✓ | ✓ | ✓ | ✕ | | プロジェクトの**設定** | 閲覧 | ✓ | ✓ | ✓ | ✓ | | CMS プロジェクトの**設定**の**一般**・**リードミー**・**ライセンス** | 編集 | ✓ | ✓ | ✕ | ✕ | | Visualizer プロジェクトの**設定**の**一般**・**リードミー**・**ライセンス** | 編集 | ✓ | ✓ | ✓ | ✕ | | プロジェクトの**設定**の**重要操作** | 公開範囲の変更・プロジェクトの削除 | ✓ | ✓ | ✕ | ✕ | Re:Earth Dashboard 以外のプロダクトでできる操作は、プロダクトごとの記事を参照してください。 * Re:Earth CMS:[役割と権限](/ja/cms/reference/publish-permissions/roles/) ## メンバーの追加 [Section titled “メンバーの追加”](#メンバーの追加) メンバーを追加するときは、追加したいユーザーと設定する役割を指定します。検索の規則は次のとおりです。 * **ユーザーを検索**の対象はユーザー名とエイリアスです。入力した語を一部に含むユーザーが、大文字と小文字を区別せずに表示されます。 * 候補は名前順に最大50件表示されます。 * そのワークスペースのメンバーであるユーザーは選べません。 * エイリアスが未設定のユーザーは選べません。 * 選べるユーザーは1人です。 役割は**役割を選択**で、次の3つから1つを選びます。 * **閲覧者** * **編集者** * **管理者** 初期値は**閲覧者**です。有料プランのワークスペースで、残りのシート数が0のとき、選べるのは**閲覧者**だけです。 ## 役割の編集 [Section titled “役割の編集”](#役割の編集) 変更後の役割に選べるのは、**管理者**・**編集者**・**閲覧者**です。 所有者の役割を変更するには、[ワークスペース](/ja/dashboard/reference/workspace/)の所有権の転送を行います。 有料プランのワークスペースで、残りのシート数が0のとき、閲覧者の役割は変更できません。 ## メンバーの削除 [Section titled “メンバーの削除”](#メンバーの削除) メンバーを削除すると、そのメンバーはワークスペースのメンバーではなくなります。 所有者は削除できません。 ## 残りのシート数 [Section titled “残りのシート数”](#残りのシート数) 契約のシート数から設定済みのシート数を引いた数です。所有者・管理者・編集者の役割で追加できるメンバーの人数を表します。契約のシート数が無制限のときは表示されません。 # プロジェクト > 各プロダクトのプロジェクトを Re:Earth Dashboard で作成・設定するときの項目と入力の条件、プロジェクトの画面のタブ、公開範囲を説明します。 Re:Earth Dashboard では、各プロダクトのプロジェクトを作成し、プロジェクト名・プロジェクトエイリアス・公開範囲などを設定できます。プロジェクトは、それぞれ1つのワークスペースに属します。 プロジェクトの画面のタブは、プロダクトで異なります。CMS プロジェクトの画面には**概要**・**データ**・**設定**、Visualizer プロジェクトの画面には**概要**・**シーン**・**ストーリー**・**設定**のタブがあります。プロジェクトの情報は、どちらも**設定**タブで設定します。 プロジェクトを設定できる役割は、[メンバーと役割](/ja/dashboard/reference/members-roles/)を参照してください。 ## プロジェクト名 [Section titled “プロジェクト名”](#プロジェクト名) プロジェクト名は、プロジェクトを識別する名前です。入力は必須です。100文字まで入力できます。 ## プロジェクトエイリアス [Section titled “プロジェクトエイリアス”](#プロジェクトエイリアス) プロジェクトエイリアスは、プロジェクトにアクセスするための識別子です。プロジェクトの URL に使われます。入力は必須です。入力した値の前後の空白は取り除かれます。 次の条件を満たす値にします。 * 5〜32文字 * 使える文字は、半角の英字(大文字と小文字)・数字・ハイフン(-) * 先頭と末尾は英字か数字 * ハイフンの前後は英字か数字 * 同じワークスペース内のほかのプロジェクトとは異なる値 * `data`・`scene`・`story`・`settings` とは異なる値 エイリアスを変更すると、プロジェクトの URL が変わります。 ## 概要 [Section titled “概要”](#概要) 概要は、プロジェクトの説明を入れる欄です。500文字まで入力できます。改行は1文字として数えます。 ## 公開範囲 [Section titled “公開範囲”](#公開範囲) 公開範囲は、プロジェクトを公開するか非公開にするかの設定で、**公開**または**非公開**のどちらかです。選択は必須で、初期値は**公開**です。作成後は**設定**の**重要操作**で切り替えます。 * **公開**:プロジェクトがオープンデータとして公開されます。Re:Earth Dashboard の**探す**に掲載され、ログインしていないユーザーを含め、すべてのユーザーがプロジェクトを検索・閲覧できます。 * **非公開**:プロジェクトはオープンデータとして公開されません。プロジェクトが属するワークスペースの所有者・管理者・編集者・閲覧者だけが開けます。非公開に設定できるのは、有料プランのみです。Open & Public プランでは、非公開に設定できません。 公開範囲によって公開される内容は、プロダクトで異なります。Re:Earth CMS は [CMS プロジェクトのデータの閲覧とダウンロード](/ja/dashboard/reference/cms-project-data/)を、Re:Earth Visualizer は [Visualizer プロジェクトの閲覧とダウンロード](/ja/dashboard/reference/visualizer-project/)を参照してください。 ## トピック [Section titled “トピック”](#トピック) トピックは、プロジェクトに設定するキーワードです。 次の条件を満たす値にします。 * 追加できるのは10個まで * 1つのトピックは2〜20文字 * 使える文字は、言語を問わず文字・数字・ハイフン・アンダースコア * 同じプロジェクト内のほかのトピックとは異なる値 Enter で追加すると、空白はハイフンに、大文字は小文字に変換されます。文字数と文字種の判定は、変換後の文字列に対して行われます。重複の判定では、大文字と小文字を区別しません。 ## ライセンス [Section titled “ライセンス”](#ライセンス) ライセンスは、プロジェクトとそのデータを他者が利用・共有できる条件を伝える文書です。Markdown 形式で記述します。用意されたテンプレートから選ぶと、本文がそのテンプレートに差し替わります。ライセンスに書いた条件によって、プロジェクトの公開範囲が変わることはありません。公開範囲は、**設定**の**重要操作**で切り替えます。 選べるテンプレートは、プロダクトで異なります。Re:Earth CMS は [README・ライセンス](/ja/cms/reference/publish-permissions/readme-license/)を参照してください。Re:Earth Visualizer はドキュメントを準備中です。 ## リードミー [Section titled “リードミー”](#リードミー) リードミーは、プロジェクトの内容を説明する文書です。Markdown 形式で記述します。 # サブスクリプションと請求書 > ワークスペースの設定にあるサブスクリプションと請求書の画面です。プランとプランの変更、シートと契約のシート数、残りのシート数が0のときと契約のシート数を超えたときにできない操作、支払いの遅れの警告、請求書を説明します。 サブスクリプションと請求書は、ワークスペースの**設定**にある画面です。 ## サブスクリプション [Section titled “サブスクリプション”](#サブスクリプション) サブスクリプションは、ワークスペースのプラン・支払いの期間・契約のシート数を確認・変更する画面です。変更できるのはチームワークスペースだけです。使える機能と上限は、そのワークスペースのプランで決まります。 契約と支払いは、決済サービスの Stripe で管理されます。Stripe のカスタマーポータルは、Stripe が提供する、契約と請求書を確認・変更する画面です。 解約の予定日と予定されているプランの変更は、**サブスクリプション**の画面に表示されません。 プランごとの機能と価格は、[料金ページ](https://reearth.io/pricing)を参照してください。 ### プラン [Section titled “プラン”](#プラン) プランは、Open & Public プラン・有料プラン・カスタム契約のいずれかです。 作ったワークスペースは Open & Public プランで始まります。個人ワークスペースのプランは Open & Public プランだけです。サブスクリプションを終了すると、Open & Public プランに戻ります。 ### プランの変更 [Section titled “プランの変更”](#プランの変更) プランの変更とサブスクリプションの編集ができるのは、所有者だけです。 Open & Public プランからは、有料プランに変更できます。 有料プランは、Stripe のカスタマーポータルで、サブスクリプションの更新やキャンセル、決済手段や請求先情報の編集ができます。 カスタム契約は、サブスクリプションの画面からプランを変更できません。 ### シート [Section titled “シート”](#シート) シートは、[所有者・管理者・編集者](/ja/dashboard/reference/members-roles/)の役割のメンバーを設定できる枠です。1シートあたり1人のメンバーを設定できます。シートに設定されているメンバーを、シートメンバーといいます。閲覧者の役割はシートに含まれません。 設定済みのシート数は、ワークスペースのシートメンバーの人数です。契約のシート数は、サブスクリプションで決まる、設定できるシートの上限です。Open & Public プランの契約のシート数は、無制限です。 ### 現在のプラン [Section titled “現在のプラン”](#現在のプラン) **サブスクリプション**の**現在のプラン**には、ワークスペースのプランの内容が表示されます。 金額は、1シートあたりの金額に、設定済みのシート数を掛けた値で、月または年の単位です。 有料プランでは、次の項目が加わります。 * **次の支払いの締め切り**:次の支払い日 * **シート**:設定済みのシート数と契約のシート数 * **CMSのアップロード転送**:アップロードの使用量と上限 * **CMSのダウンロード転送**:ダウンロードの使用量と上限 * **カスタムドメイン**:使用数と上限 ### 残りのシート数が0のとき [Section titled “残りのシート数が0のとき”](#残りのシート数が0のとき) 有料プランのワークスペースで、残りのシート数が0のとき、メンバーの追加で設定できる役割は**閲覧者**だけです。 閲覧者の役割は変更できません。 ### 契約のシート数を超えたとき [Section titled “契約のシート数を超えたとき”](#契約のシート数を超えたとき) 設定済みのシート数が契約のシート数を超えているあいだは、警告が表示されます。次の操作は、どの役割のメンバーもできません。 * プロジェクトの作成 * CMS プロジェクトと Visualizer プロジェクトの**設定**の**一般**・**リードミー**・**ライセンス**の編集 * プロジェクトの**設定**の**重要操作**にある操作 * ピンをカスタマイズ * Visualizer プロジェクトのダウンロード 次の操作は、契約のシート数を超えているときもできます。 * ワークスペースとプロジェクトの閲覧 * メンバーの管理 * サブスクリプションの変更 * ワークスペースの**設定**の**重要操作**にある操作 * ワークスペースの**設定**の**一般**の編集 * 請求書の確認 ### 支払いの遅れ [Section titled “支払いの遅れ”](#支払いの遅れ) Stripe で請求書の支払いが失敗したときか、サブスクリプションが支払い期限を過ぎた状態に更新されたときは、警告が表示されます。 ## 請求書 [Section titled “請求書”](#請求書) 請求書は、チームワークスペースの請求書を確認する画面です。チームワークスペースだけにあります。 # Visualizer プロジェクトの閲覧とダウンロード > Visualizer プロジェクトの画面のシーン・ストーリーのタブが表示される条件と閲覧できるユーザー、概要タブのダウンロードの内容と条件を説明します。 Re:Earth Dashboard の Visualizer プロジェクトごとの画面にある**シーン**タブと**ストーリー**タブでは、Re:Earth Visualizer で公開したシーンとストーリーを閲覧できます。**概要**タブの**ダウンロード**では、プロジェクトのデータをファイルとしてダウンロードできます。 ## シーン・ストーリー [Section titled “シーン・ストーリー”](#シーンストーリー) **シーン**タブと**ストーリー**タブを閲覧できるユーザーは、プロジェクトの公開範囲で決まります。 | プロジェクトの公開範囲 | **シーン**・**ストーリー** | | ----------- | --------------------------------- | | **公開** | すべてのユーザー | | **非公開** | プロジェクトが属するワークスペースの所有者・管理者・編集者・閲覧者 | **公開範囲**の設定は [プロジェクト](/ja/dashboard/reference/project/)を参照してください。 **シーン**タブと**ストーリー**タブは、それぞれシーンとストーリーを公開しているときに表示されます。どちらのタブも、公開するときの**検索可能にする**の設定にかかわらず表示されます。 ## ダウンロード [Section titled “ダウンロード”](#ダウンロード) **概要**タブの**ダウンロード**では、プロジェクトのデータが zip のファイルとしてダウンロードされます。zip には、プロジェクトの情報、シーンのレイヤとスタイル、ストーリー、プラグイン、アセットが入ります。 アセットとプロジェクトのデータの合計が、圧縮する前のサイズで 500MB を超えるプロジェクトと、削除済みのプロジェクトは、ダウンロードできません。この合計に、プラグインのファイルは含まれません。 公開範囲が**公開**のプロジェクトは、ログインしていないユーザーを含め、すべてのユーザーがダウンロードできます。公開範囲が**非公開**のプロジェクトは、プロジェクトが属するワークスペースの所有者・管理者・編集者・閲覧者だけがダウンロードできます。 # ワークスペース > メンバーとプロジェクトをまとめて管理する単位です。ワークスペースの種類、項目の入力条件、プロジェクトの一覧、ピン留め、所有権の転送、削除の条件を説明します。 ワークスペースはメンバーとプロジェクトをまとめて管理する単位です。プロジェクトは、それぞれ1つのワークスペースに属します。 ワークスペースの画面には、**概要**・**CMSプロジェクト**・**Visualizerプロジェクト**・**メンバー**・**設定**のタブがあります。ワークスペースの項目は、**設定**タブで設定します。 ## 種類 [Section titled “種類”](#種類) ワークスペースには個人ワークスペースとチームワークスペースの2種類があります。チームワークスペースは複数のメンバーで共有します。 | 項目 | 個人ワークスペース | チームワークスペース | | ----------- | ---------------------- | ------------------- | | 作成 | ユーザーのアカウント登録と同時に作成されます | ユーザーが作成できます | | 名前・画像・説明の設定 | アカウントの設定と同期しています | **設定**の**一般**で設定します | | サブスクリプション | なし | あり | ## チームエイリアス [Section titled “チームエイリアス”](#チームエイリアス) ワークスペースにアクセスするための識別子です。ワークスペースの URL に使われます。入力は必須です。入力した値の前後の空白は取り除かれます。 次の条件を満たす値にします。 * 5〜32文字 * 使える文字は、半角の英字(大文字と小文字)・数字・ハイフン(-) * 先頭と末尾は英字か数字 * ハイフンの前後は英字か数字 * ほかのワークスペースのエイリアスともユーザーのエイリアスとも異なる値 * Re:Earth Dashboard のページの URL に使われている語(`explore`・`login`・`settings` など)や、一般的なシステム用の語(`admin`・`api`・`docs` など)などとは異なる値 チームエイリアスは、**設定**の**重要操作**で変更します。エイリアスを変更すると、ワークスペースの URL が変わります。 ## チーム名 [Section titled “チーム名”](#チーム名) ワークスペースを識別する名前です。入力は必須です。100文字まで入力できます。 ## チームウェブサイト [Section titled “チームウェブサイト”](#チームウェブサイト) ワークスペースに関連する外部サイトの URL です。たとえば、チームの公式ウェブサイトや SNS のページです。URL は、次のどちらかの形式で入力します。 * `http://` または `https://` で始まり、ホスト名を含む URL(`https://example.com` など) * ドット(.)を含むホスト名(`example.com` など) パスを含む URL は、`http://` または `https://` から入力します。 ## 概要 [Section titled “概要”](#概要) ワークスペースの説明を入れる欄です。500文字まで入力できます。改行は1文字として数えます。 ## プロフィール画像 [Section titled “プロフィール画像”](#プロフィール画像) ワークスペースの画像です。形式は JPEG・PNG・WebP で、10MB まで設定できます。 ## プラン [Section titled “プラン”](#プラン) Re:Earth のサブスクリプションはワークスペース単位に契約します。新規に作成したチームワークスペースは [Open & Public プラン](/ja/dashboard/reference/subscription-invoices/)になっており、**設定**から任意に有料プランへ変更ができます。 プランごとの機能と価格は、[料金ページ](https://reearth.io/pricing)を参照してください。 ## プロジェクト [Section titled “プロジェクト”](#プロジェクト) **CMSプロジェクト**タブと**Visualizerプロジェクト**タブの一覧に表示されるプロジェクトは、ユーザーによって異なります。 * ワークスペースのメンバーには[公開範囲](/ja/dashboard/reference/project/)が**非公開**のプロジェクトを含めて表示されます。 * ワークスペースのメンバーではないユーザーとログインしていないユーザーには、公開範囲が**公開**のプロジェクトだけが表示されます。 並び替えは次の4つから1つを選びます。初期値は**最近から**です。 | 選択肢 | 並び順 | | ------------ | --------- | | **名前 (A-Z)** | 名前の昇順 | | **名前 (Z-A)** | 名前の降順 | | **最近から** | 最終更新の新しい順 | | **古いから** | 最終更新の古い順 | ## ピン留め [Section titled “ピン留め”](#ピン留め) ピン留めは、ワークスペースの**概要**タブの**ピン留め済み**に表示するプロジェクトを選ぶ設定です。 * 選べるのは、各プロダクトのプロジェクトをあわせて6件までです。 * 公開範囲が**非公開**のプロジェクトは、ピン留めしてあってもワークスペースのメンバーにだけ表示されます。 ## 所有権の転送 [Section titled “所有権の転送”](#所有権の転送) [所有者](/ja/dashboard/reference/members-roles/)の役割は、**設定**の**重要操作**の**所有権の転送**で変更できます。転送すると、転送先のメンバーの役割が所有者になり、それまでの所有者の役割は管理者になります。 転送先は管理者か編集者のメンバー1人です。個人ワークスペースでは転送できません。 ## ワークスペースの削除 [Section titled “ワークスペースの削除”](#ワークスペースの削除) ワークスペースは、**設定**の**重要操作**で削除できます。この操作は取り消せません。 次の条件をすべて満たすワークスペースを削除できます。 * Open & Public プランのワークスペース * ワークスペースに属するプロジェクトが0件 削除するには、ワークスペースのエイリアスと同じ値を入力する必要があります。大文字と小文字は区別されます。 個人ワークスペースは削除できません。 # 更新情報 — Dashboard > Re:Earth Dashboard のドキュメント更新履歴(新しい順)。 * **2026年10月27日** — [リファレンス](/ja/dashboard/reference/account/):記事を公開しました。 # 開発向けドキュメント > プラグイン開発や API 連携など、Re:Earth を使った開発のためのドキュメント プラグイン開発や API 連携など、Re:Earth を使った開発のためのドキュメント ### [Visualizer Plugin Docs](/ja/developer/plugin/overview/what-is-a-plugin/) [Re:Earth Visualizer へ機能を追加するプラグインの開発向けドキュメント](/ja/developer/plugin/overview/what-is-a-plugin/) ### [CMS Developer Docs](/ja/developer/cms/overview/) [外部アプリや外部システムと Re:Earth CMSを連携させるためのAPIと実装に関するドキュメント](/ja/developer/cms/overview/) # インテグレーションAPI の使い方 > インテグレーショントークンをリクエストに付与し、インテグレーションAPI で CMS のデータへ認証付きでアクセスする。 このページでは、インテグレーショントークンをリクエストに付与し、[インテグレーションAPI](/ja/developer/cms/overview/integration-api/) で CMS のデータへ認証付きでアクセスする方法を説明します。 ## インテグレーショントークンの発行 [Section titled “インテグレーショントークンの発行”](#インテグレーショントークンの発行) インテグレーションAPI は **インテグレーショントークンを使って認証**します。まずは Re:Earth CMS の管理画面で、対象プロジェクト(必要に応じてワークスペース)のインテグレーショントークンを発行してください。手順は [インテグレーションの作成](/ja/developer/cms/getting-started/integration-setup/) を参照してください。 ## アイテム一覧を取得する(GET) [Section titled “アイテム一覧を取得する(GET)”](#アイテム一覧を取得するget) 最初の動作確認として、インテグレーションAPI でアイテムの一覧を取得してみます。発行したインテグレーショントークンを `Authorization` ヘッダーに付与してリクエストします。`` などの山括弧の部分は、実際の値に置き換えてください。 * curl ```bash curl --location --request GET \ 'https://api.cms.reearth.io/api//projects//models//items' \ --header 'Authorization: Bearer ' ``` * PowerShell ```powershell $TOKEN = "" $WORKSPACE_ID = "" $PROJECT_ID = "" $MODEL_ID = "" $headers = @{ Authorization = "Bearer $TOKEN" Accept = "application/json" } $uri = "https://api.cms.reearth.io/api/$WORKSPACE_ID/projects/$PROJECT_ID/models/$MODEL_ID/items" $resp = Invoke-RestMethod -Method Get -Uri $uri -Headers $headers $resp ``` 補足 フロントエンドから直接インテグレーションAPI を呼び出すと、開発者ツールでトークンが見えてしまいます。トークンを隠すには、バックエンドサーバー側でトークンを管理し、そこから API にアクセスする構成をおすすめします。 ヒント 次は [インテグレーションAPI でアイテムをフィルタして取得する](/ja/developer/cms/guides/filter-items/) に進みましょう。 # インテグレーションの作成 > インテグレーションAPI / Webhook を利用するためのインテグレーションの作成・連携手順。 [インテグレーションAPI](/ja/developer/cms/overview/integration-api/) や [Webhook](/ja/developer/cms/overview/webhook/) を利用するには、インテグレーションを作成する必要があります。手順は次の 2 ステップです。 1. パーソナルアカウントでインテグレーションを作成します 2. 連携先ワークスペースで、作成したインテグレーションを連携します ## 1. インテグレーションを作成する [Section titled “1. インテグレーションを作成する”](#1-インテグレーションを作成する) 1. パーソナルアカウントに移動し、Re:Earth CMS の管理画面で**マイインテグレーション**タブを開きます 2. **新規インテグレーション作成**ボタンをクリックします ![My Integrations 画面。作成済みのインテグレーションがカード一覧で表示され、右下に Create new integration カードがある](/_astro/my-integrations-list.BnNchQ0E_Z2vS0r5.webp) 3. インテグレーション名を入力します(必須)。説明は任意です 4. **作成**ボタンをクリックします ![New Integration モーダル。Integration Name と Description の入力欄、Cancel・Create ボタンが表示されている](/_astro/new-integration-modal.2BsCinVp_Z14CGEW.webp) 作成が完了すると、**マイインテグレーション**画面に上で作成したインテグレーションが追加されます。インテグレーションをクリックすると、トークンを確認できます。このトークンを使って API リクエストを行い、アイテムの作成や更新が可能になります。 ![My Integration 詳細ページの General タブ。Integration Name・Description・Integration Token(Re-generate ボタン付き)・Code Example・Danger Zone が表示されている](/_astro/integration-detail-token.C-Ym-psJ_Z8OjvH.webp) ## 2. インテグレーションをワークスペースに連携する [Section titled “2. インテグレーションをワークスペースに連携する”](#2-インテグレーションをワークスペースに連携する) 作成したインテグレーションを対象のワークスペースに連携します。 1. インテグレーションを利用したいワークスペースに移動し、Re:Earth CMS の管理画面で**インテグレーション**タブを開き、**インテグレーションを連携**ボタンをクリックします ![ワークスペースの Integrations 画面。接続済みインテグレーションの一覧と、右上に Connect Integration ボタンが表示されている](/_astro/workspace-integrations-list.AjRnT41k_Z11xk1e.webp) 2. 作成したインテグレーションを選択して**連携**ボタンをクリックします ![Connect Integration モーダル。接続可能なインテグレーションの一覧から test が選択され、Connect ボタンが有効になっている](/_astro/connect-integration-modal.B1Mf0zwi_Z1EzQuG.webp) 3. 連携すると、**インテグレーション**画面に上で連携したインテグレーションが表示されます。**設定**ボタンから役割を変更します。役割については後述の「役割」を参照してください ![Integration Setting モーダル。対象インテグレーションの Role ドロップダウンと Save ボタンが表示されている](/_astro/integration-role-setting.CqDDx6CF_Z2pfGuy.webp) これにより、インテグレーショントークンを使って対象ワークスペースにアクセスできるようになります。 ## 役割 [Section titled “役割”](#役割) インテグレーションをプロジェクトに連携する際、4つの役割のいずれかを割り当てます。各役割は、そのインテグレーションがプロジェクト内で実行できる操作を定義します。 | 役割 | 説明 | | --------------- | --------------------------------------------------------------- | | owner(所有者) | プロジェクト内のすべてのリソースを作成・閲覧・更新・削除できます。最も強い権限を持つ役割です。 | | maintainer(管理者) | プロジェクト設定、モデル・スキーマ・グループ、アイテム、アセットを幅広く管理できます。owner と同等の操作権限を持ちます。 | | writer(編集者) | プロジェクトのコンテンツを作成・編集できます。アイテムの更新・削除は自身が作成したものに限られます。 | | reader(閲覧者) | 閲覧のみ可能です。関係者や外部レビュー担当者に適しています。 | 権限の内訳は次のとおりです(✅ = 許可、⚑ = 条件付きで許可、❌ = 不許可)。 | リソース | 操作 | owner | maintainer | writer | reader | | ------------- | -------- | ----- | ---------- | --------------- | ------ | | プロジェクト設定 | 作成 | ✅ | ✅ | ✅ | ❌ | | | 読み取り | ✅ | ✅ | ✅ | ✅ | | | 更新 | ✅ | ✅ | ✅ | ❌ | | | 削除 | ✅ | ✅ | ✅ | ❌ | | モデル・スキーマ・グループ | 作成 | ✅ | ✅ | ✅ | ❌ | | | 読み取り | ✅ | ✅ | ✅ | ✅ | | | 更新 | ✅ | ✅ | ✅ | ❌ | | | 削除 | ✅ | ✅ | ✅ | ❌ | | アイテム | 作成 | ✅ | ✅ | ✅ | ❌ | | | 読み取り | ✅ | ✅ | ✅ | ✅ | | | 更新 | ✅ | ✅ | ⚑ 自身が作成したアイテムのみ | ❌ | | | 削除 | ✅ | ✅ | ⚑ 自身が作成したアイテムのみ | ❌ | | | 公開 / 非公開 | ✅ | ✅ | ✅ | ❌ | | アセット | 作成 | ✅ | ✅ | ✅ | ❌ | | | 読み取り | ✅ | ✅ | ✅ | ✅ | | | 更新 | ✅ | ✅ | ✅ | ❌ | | | 削除 | ✅ | ✅ | ✅ | ❌ | ## インテグレーショントークンの再生成 [Section titled “インテグレーショントークンの再生成”](#インテグレーショントークンの再生成) トークンが漏洩した可能性がある場合やセキュリティ上の理由でリセットしたい場合は、トークンを再生成できます。 インテグレーション詳細ページから、**再生成**ボタンをクリックすると、トークンが再生成できます。 ![My Integration 詳細ページの General タブ。Integration Token 欄の Re-generate ボタン](/_astro/integration-detail-token.C-Ym-psJ_Z8OjvH.webp) 注意 再生成を行うと現在のトークンは即座に無効になります。トークンを使用している既存のシステムは、新しいトークンに更新する必要があります。 ## インテグレーションの編集 [Section titled “インテグレーションの編集”](#インテグレーションの編集) インテグレーション詳細ページから、名前や説明を編集できます。変更後は **保存**ボタンをクリックしてください。 ![My Integration 詳細ページの General タブ。Integration Name・Description の編集欄と Save ボタン](/_astro/integration-detail-token.C-Ym-psJ_Z8OjvH.webp) ## インテグレーションの削除 [Section titled “インテグレーションの削除”](#インテグレーションの削除) インテグレーション詳細ページ下部の**インテグレーションを削除**ボタンをクリックし、確認画面で **OK** をクリックすると、インテグレーションが削除されます。 ![My Integration 詳細ページ下部の Danger Zone。Remove Integration ボタン](/_astro/integration-detail-token.C-Ym-psJ_Z8OjvH.webp) 危険 インテグレーションを削除すると元に戻せません。連携済みのワークスペースからアクセスできなくなり、発行済みのトークンも無効になります。 # パブリックAPI の使い方(読み取り) > CMS のデータをパブリックAPI で取得できる状態にし、最初のリクエストを成功させる。 このページでは、CMS のデータを [パブリックAPI](/ja/developer/cms/overview/public-api/) で取得できる状態にし、最初のリクエストを成功させるまでを扱います。 ## 事前準備:アイテムを公開する [Section titled “事前準備:アイテムを公開する”](#事前準備アイテムを公開する) パブリックAPI でデータを取得するには、Re:Earth CMS の管理画面で以下の 2 つの設定が必要です。 1. アイテムを公開状態にします 2. パブリックAPI ページの **読み取り** タブでモデルを有効にします ### 1. アイテムを公開状態にする [Section titled “1. アイテムを公開状態にする”](#1-アイテムを公開状態にする) Re:Earth CMS の管理画面で、公開したいアイテムのステータスを **公開** に変更します。 ### 2. パブリックAPI を有効にする [Section titled “2. パブリックAPI を有効にする”](#2-パブリックapi-を有効にする) パブリックAPI でモデルのデータを取得できるようにするには、**パブリックAPI** ページの **読み取り** タブでそのモデルを有効にする必要があります。 1. プロジェクトの **パブリックAPI** を開きます 2. **読み取り** タブを選択します 3. 対象モデルの「**有効**」トグルをオンにします 4. **変更を保存** ボタンをクリックします ![Re:Earth CMS の Public API ページ。Reading タブが選択され、対象モデルの Enable トグルがオンになり、右上の Save Changes ボタンが有効な状態。下部に API Key の一覧・New Key ボタンも表示されている](/_astro/public-api-reading-tab.BBhLJ1c-_Z1okYp5.webp) 同じ **パブリックAPI** ページの下部に **API Key** セクションがあり、次の「APIキーを設定する」はここから行います。 ### 3. APIキーを設定する(非公開プロジェクトのみ・任意) [Section titled “3. APIキーを設定する(非公開プロジェクトのみ・任意)”](#3-apiキーを設定する非公開プロジェクトのみ任意) プロジェクトの公開範囲が非公開の場合は、APIキーを発行することでアクセスを制御できます。公開プロジェクトでは APIキーの設定は不要です。 APIキーとは? モデルの公開範囲を制限する際に活用できます。非公開プロジェクトでのみ使用可能です。 設定手順: 1. プロジェクトの **パブリックAPI** を開きます 2. **API Key** セクションの **+新しいキー** ボタンをクリックします 3. 名前や説明を入力し、対象モデルの **権限** を設定して **変更を保存** ボタンをクリックします ![Public API / New API Key ページ。Name・Description の入力欄と、モデルごとの Enable トグルを持つ Permissions テーブル、下部に Save Changes ボタン](/_astro/new-api-key-form.B4r7S8IE_Z1GpM1U.webp) 4. **API Key** セクションに、作成した APIキーが追加されます。コピーして外部アプリケーションとの連携に使用します ![API Key 一覧のコピーアイコンにカーソルを合わせ、Copy ツールチップが表示されている状態](/_astro/api-key-copy.DzYpl-FK_1hwPA1.webp) 発行した APIキーは、リクエストの `Authorization` ヘッダーに付与します。 ```bash curl 'https://api.cms.reearth.io/api/p///' \ -H 'Authorization: Bearer ' ``` ## アイテム一覧を取得する(GET) [Section titled “アイテム一覧を取得する(GET)”](#アイテム一覧を取得するget) 公開設定が完了したら、以下の URL でアイテム一覧を取得できます。公開データであれば APIキーなしで利用可能です。`` などの山括弧の部分は、実際の値に置き換えてください。 ```plaintext GET https://api.cms.reearth.io/api/p/// ``` * curl ```bash curl --location --request GET \ 'https://api.cms.reearth.io/api/p///' ``` * PowerShell ```powershell $WORKSPACE_ID = "" $PROJECT_ID = "" $MODEL_ID = "" $uri = "https://api.cms.reearth.io/api/p/$WORKSPACE_ID/$PROJECT_ID/$MODEL_ID" $resp = Invoke-RestMethod -Method Get -Uri $uri $resp ``` * JavaScript ```js const WORKSPACE_ID = ""; const PROJECT_ID = ""; const MODEL_ID = ""; const url = `https://api.cms.reearth.io/api/p/${WORKSPACE_ID}/${PROJECT_ID}/${MODEL_ID}`; const resp = await fetch(url, { method: "GET", headers: { Accept: "application/json", }, }); if (!resp.ok) { const text = await resp.text(); throw new Error(`HTTP ${resp.status}: ${text}`); } const data = await resp.json(); console.log(data); ``` ヒント 次は [パブリックAPI でアイテムを GeoJSON 形式で取得して地図に表示する](/ja/developer/cms/guides/geojson-map/) に進みましょう。 # パブリックAPI の使い方(書き込み) > パブリックAPI を使ってアイテムを作成する。 このページでは、[パブリックAPI](/ja/developer/cms/overview/public-api/) を使ってアイテムを作成(POST)する方法を説明します。 ## 事前準備:パブリックAPI を有効にする [Section titled “事前準備:パブリックAPI を有効にする”](#事前準備パブリックapi-を有効にする) パブリックAPI でモデルのデータを投稿できるようにするには、パブリックAPI ページの **書き込み** タブでそのモデルを有効にする必要があります。 1. プロジェクトの **パブリックAPI** を開きます 2. **書き込み** タブを選択します 3. 許可済みオリジンを少なくとも1つ追加します。ブラウザからのリクエストは、指定されたオリジンからのみ受け入れられます 4. 対象モデルの「**有効**」トグルをオンにします 5. **変更を保存** ボタンをクリックします ![Re:Earth CMS の Public API ページ。Posting タブが選択され、Allowed Origins に許可済みオリジンが1件登録され、対象モデルの POST API Enable トグルがオンになっている状態](/_astro/public-api-posting-tab.BxAam8K__Z2j2cdX.webp) 画面の **Copy** ボタンを押すと、curl リクエストをコピーできます。 ## アイテムを作成する(POST) [Section titled “アイテムを作成する(POST)”](#アイテムを作成するpost) `POST /{model}/items` エンドポイントに JSON でフィールドを指定すると、新しいアイテムを作成できます。認証は不要です。`` などの山括弧の部分は、実際の値に置き換えてください。`fields` のキーと値は、対象モデルのフィールド定義に応じて変わります。以下はサンプルです。 * curl ```bash curl -X POST 'https://api.cms.reearth.io/api/p////items' \ -H 'Content-Type: application/json' \ -d '{ "fields": { "": "", "": "" } }' ``` * PowerShell ```powershell $WORKSPACE_ID = "" $PROJECT_ID = "" $MODEL_ID = "" $uri = "https://api.cms.reearth.io/api/p/$WORKSPACE_ID/$PROJECT_ID/$MODEL_ID/items" $body = @{ fields = @{ "" = "" "" = "" } } | ConvertTo-Json $resp = Invoke-RestMethod -Method Post -Uri $uri -ContentType "application/json" -Body $body $resp ``` * JavaScript ```js const WORKSPACE_ID = ""; const PROJECT_ID = ""; const MODEL_ID = ""; const url = `https://api.cms.reearth.io/api/p/${WORKSPACE_ID}/${PROJECT_ID}/${MODEL_ID}/items`; const body = { fields: { "": "", "": "", }, }; const resp = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(body), }); if (!resp.ok) { const text = await resp.text(); throw new Error(`HTTP ${resp.status}: ${text}`); } const data = await resp.json(); console.log(data); ``` 下書き状態で作成されます 作成されたアイテムは **下書き** 状態になり、公開するまでパブリックAPI(読み取り)では取得できません。公開するには、CMS の管理画面から公開操作を行うか、インテグレーションAPI を使用します。インテグレーションAPI での公開方法は [インテグレーションAPI を使ってデータを公開する](/ja/developer/cms/guides/publish-items/) を参照してください。 APIキーについて 投稿リクエストに APIキーを含める必要はありません。ただし、含める場合は有効なキーである必要があります。パブリックAPI の投稿は現在パブリックAPI(読み取り)の認証フローを共有しているため、無効な APIキーを含めるとリクエストが拒否されます。APIキーの作成方法は [パブリックAPI の使い方(読み取り)の「APIキーを設定する」](/ja/developer/cms/getting-started/public-api-quickstart-read/#3-api%E3%82%AD%E3%83%BC%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E9%9D%9E%E5%85%AC%E9%96%8B%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E3%81%BF%E4%BB%BB%E6%84%8F)を参照してください。 レート制限 IP アドレスごとに **100 リクエスト/分** のレート制限が設けられています。制限を超えた場合、レスポンスの `Retry-After` ヘッダーで再試行までの待機秒数が示されます。 # Webhook の使い方 > CMS の変更イベントを外部サービスへ自動通知するために Webhook を設定する。 このページでは、CMS の変更イベントを外部サービスへ自動通知するために [Webhook](/ja/developer/cms/overview/webhook/) を設定する方法を説明します。 ## インテグレーションの作成 [Section titled “インテグレーションの作成”](#インテグレーションの作成) Webhook は**インテグレーション画面から設定**します。まずは Re:Earth CMS の管理画面で、対象プロジェクト(必要に応じてワークスペース)のインテグレーションを作成してください。手順は [インテグレーションの作成](/ja/developer/cms/getting-started/integration-setup/) を参照してください。 ## 設定手順 [Section titled “設定手順”](#設定手順) 1. マイインテグレーションからインテグレーションをクリックし、詳細ページを開きます 2. **Webhook タブ**を開きます 3. **+新規 Webhook** ボタンをクリックします ![インテグレーション詳細ページの Webhook タブ。まだ Webhook が無い状態で、New Webhook ボタンが強調表示されている](/_astro/webhook-tab-empty.D3-SYlGO_1GNaUs.webp) 4. 以下の情報を埋めて、**保存**ボタンをクリックします * **名前** * **URL** — 通知先の URL。`POST` リクエストを受信できる有効な URL である必要があります * **シークレット(Secret)** — ここで設定したシークレットは Webhook のリクエストを署名する際に使用されます。受信側でその署名を検証することで、正当な送信元かどうかを確認できます * Webhook を作動させる**イベント**(複数選択可) ![New Webhook フォーム。Name・Url・Secret の入力欄と、Item・Asset ごとの Trigger Event チェックボックス](/_astro/new-webhook-form.BIbq3a3r_yPh8t.webp) テスト用 URL について テスト目的であれば、[webhook.site](https://webhook.site) で一時的な URL を発行すると、リアルタイムで通知内容を確認できます。 ## イベントの種類 [Section titled “イベントの種類”](#イベントの種類) Webhook が作動するイベントを選択します。選択したイベントが発生するたびに、指定 URL に `POST` リクエストが送信されます。複数選択可能です。 ### アイテム [Section titled “アイテム”](#アイテム) | イベント | タイミング | | ---- | ---------------- | | 作成 | 新規アイテムが作成されたとき | | 更新 | アイテムが更新されたとき | | 削除 | アイテムが削除されたとき | | 公開 | アイテムが公開されたとき | | 非公開 | アイテムが非公開に設定されたとき | ### アセット [Section titled “アセット”](#アセット) | イベント | タイミング | | ------ | ----------------------- | | アップロード | 新規アセットがアップロードされたとき | | 圧縮 | ZIP ファイルなどのアセットが解凍されたとき | | 削除 | アセットが削除されたとき | ## 動作確認 [Section titled “動作確認”](#動作確認) Webhook を保存したら、設定した対象のイベントを実行してみましょう。対象のイベントを実行すると、指定した URL へ通知が届きます。 # インテグレーションAPI を使って外部フォームの送信データで CMS のアイテムを更新する > HTML フォームから送信されたデータで、インテグレーションAPI 経由で CMS の既存アイテムを更新する。 インテグレーションAPI を使うと、データの更新や削除など、パブリックAPI と比較して複雑な操作が可能です。登録情報の変更フォームなど、HTML フォームから送信されたデータで Re:Earth CMS の既存アイテムを更新する方法を説明します。 ## サンプルコード [Section titled “サンプルコード”](#サンプルコード) 以下は、更新フォームのサンプルコードです。アイテム ID、名前、コメントを送信して、指定したアイテムを更新します。`WORKSPACE_ID` などの値や、`fields` の `key`(フィールドキー)は、自分のモデルの設定に応じて変えてください。 ```html Edit your info



``` トークンをフロントエンドに直接書かないでください 上記サンプルはあくまで動作確認用です。トークンがフロントエンドに露出すると、第三者に悪用されるリスクがあります。本番環境では、バックエンドサーバーでトークンを管理し、そこからインテグレーションAPI を呼び出す構成を推奨します。 ## 実行結果 [Section titled “実行結果”](#実行結果) フォームに入力して送信すると、インテグレーションAPI 経由でアイテムが更新されます。 ![ID・name・message の入力欄と Submit ボタンを持つ更新フォーム](/_astro/external-form-update-form.Di-D58xV_ZXvRiW.webp) CMS の Content 画面を確認すると、更新した内容がアイテムに反映されています。 ![Re:Earth CMS の Content 画面。フォームから送信された内容がアイテムに反映されている](/_astro/external-form-item-created.hZ2H0TVv_1t1SYB.webp) エンドポイントの詳細な仕様については、[インテグレーションAPIリファレンス](/ja/developer/cms/integration-api-reference/) を参照してください。 # パブリックAPI を使って外部フォームの送信データを CMS に保存する > HTML フォームから送信されたデータをパブリックAPI 経由で CMS にアイテムとして保存する。 お問い合わせフォームやアンケートフォームなど、HTML フォームから送信されたデータを Re:Earth CMS に保存する方法を説明します。パブリックAPI を使うと、APIキーやインテグレーショントークンなしでフォームの内容を CMS に投稿できます。 ## サンプルコード [Section titled “サンプルコード”](#サンプルコード) 以下は、お問い合わせフォームのサンプルコードです。名前、コメントを CMS に送信して保存します。`WORKSPACE_ID` などの値や、`fields` のキーは、自分のモデルの設定に応じて変えてください。 ```html Contact


``` ## 実行結果 [Section titled “実行結果”](#実行結果) フォームに入力して送信すると、パブリックAPI 経由でアイテムが作成されます。 ![name・message の入力欄と Submit ボタンを持つお問い合わせフォーム](/_astro/external-form-create-form.CdD-rs9T_sj8dh.webp) CMS の Content 画面を確認すると、送信内容が下書きステータスのアイテムとして保存されています。 ![Re:Earth CMS の Content 画面。フォームから送信された内容が下書きステータスのアイテムとして表示されている](/_astro/external-form-item-created.hZ2H0TVv_1t1SYB.webp) アイテムを公開したい場合は、CMS の管理画面から公開操作を行うか、[インテグレーションAPI を使ってデータを公開する](/ja/developer/cms/guides/publish-items/) を参照してください。 エンドポイントの詳細な仕様については、[パブリックAPIリファレンス](/ja/developer/cms/public-api-reference/) を参照してください。 # インテグレーションAPI でアイテムをフィルタして取得する > キーワード検索や条件フィルタを使って、必要なアイテムだけを絞り込んで取得する。 インテグレーションAPI でアイテムを取得する際は、条件を指定してフィルタできます。フィルタの方法は2つあります。 補足 パブリックAPI にはフィルタ機能がありません。アイテムの絞り込みが必要な場合はインテグレーションAPI を使用してください。 ## 方法 1:キーワード検索 [Section titled “方法 1:キーワード検索”](#方法-1キーワード検索) `GET /items` エンドポイントに `keyword` パラメータを付与すると、アイテムをキーワードで絞り込めます。利用可能なパラメータについては [インテグレーションAPIリファレンス](/ja/developer/cms/integration-api-reference/) を参照してください。 * curl ```bash curl -X GET \ 'https://api.cms.reearth.io/api//projects//models//items?keyword=Tokyo' \ --header 'Authorization: Bearer ' ``` * JavaScript ```js const TOKEN = ""; const url = new URL("https://api.cms.reearth.io/api//projects//models//items"); url.searchParams.set("keyword", "Tokyo"); const resp = await fetch(url, { headers: { Authorization: `Bearer ${TOKEN}`, Accept: "application/json", }, }); if (!resp.ok) throw new Error(`HTTP ${resp.status}`); const data = await resp.json(); console.log(data); ``` トークンをフロントエンドに直接書かないでください 上記サンプルはあくまで動作確認用です。トークンがフロントエンドに露出すると、第三者に悪用されるリスクがあります。本番環境では、バックエンドサーバーでトークンを管理し、そこからインテグレーションAPI を呼び出す構成を推奨します。 ## 方法 2:条件フィルタ(詳細な絞り込み) [Section titled “方法 2:条件フィルタ(詳細な絞り込み)”](#方法-2条件フィルタ詳細な絞り込み) より複雑な条件で絞り込む場合は、`POST /items/filter` エンドポイントに JSON で条件を指定します。 ### フィルタ条件の構造 [Section titled “フィルタ条件の構造”](#フィルタ条件の構造) 条件タイプをキーに、`fieldId`(フィールドセレクター)・`operator`・`value` を指定します。 ```json { "filter": { "<条件タイプ>": { "fieldId": { "fieldId": "", "type": "field" }, "operator": "<演算子>", "value": "<値>" } } } ``` ### 文字列フィールドを条件に指定する例 [Section titled “文字列フィールドを条件に指定する例”](#文字列フィールドを条件に指定する例) `string` 条件タイプの `contains` 演算子を使うと、指定したフィールドの値に特定の文字列が含まれるアイテムだけを絞り込めます。以下は、フィールドの値に「Tokyo」を含むアイテムを取得する例です。 ```bash curl -X POST \ 'https://api.cms.reearth.io/api//projects//models//items/filter' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data '{ "filter": { "string": { "fieldId": { "fieldId": "", "type": "field" }, "operator": "contains", "value": "Tokyo" } } }' ``` ### AND / OR 条件の組み合わせ [Section titled “AND / OR 条件の組み合わせ”](#and--or-条件の組み合わせ) 複数条件を組み合わせる場合は `and` / `or` を使います。 ```bash curl -X POST \ 'https://api.cms.reearth.io/api//projects//models//items/filter' \ --header 'Authorization: Bearer ' \ --header 'Content-Type: application/json' \ --data '{ "filter": { "and": [ { "basic": { "fieldId": { "fieldId": "", "type": "field" }, "operator": "equals", "value": "high" } }, { "string": { "fieldId": { "fieldId": "", "type": "field" }, "operator": "contains", "value": "Tokyo" } } ] } }' ``` 利用可能な条件タイプや演算子の詳細については、[インテグレーションAPIリファレンス](/ja/developer/cms/integration-api-reference/) を参照してください。 # パブリックAPI でアイテムを GeoJSON 形式で取得して地図に表示する > ジオメトリフィールドを持つモデルのアイテムを GeoJSON で取得し、地図ライブラリで表示する。 パブリックAPI を使うと、ジオメトリフィールドを持つモデルのアイテムを GeoJSON 形式で取得できます。取得した GeoJSON はそのまま MapLibre GL JS・Leaflet などの地図ライブラリや、Re:Earth Visualizer に渡して表示できます。 前提 モデルに **GeoJSON Geometry 型**のフィールドが定義されていること。このフィールドがないモデルでは `.geojson` エンドポイントを呼び出しても `features` が空になります。公開設定がまだの場合は、先に [パブリックAPI の使い方(読み取り)](/ja/developer/cms/getting-started/public-api-quickstart-read/) を参照してください。 ## サンプルコード [Section titled “サンプルコード”](#サンプルコード) パブリックAPI からアイテムを GeoJSON 形式で取得して MapLibre GL JS で地図に表示する HTML のサンプルです。`WORKSPACE_ID`・`PROJECT_ID`・`MODEL_ID` は、実際の値に置き換えてください。 ```html Re:Earth CMS パブリックAPI + MapLibre GL JS
``` ## 実行結果 [Section titled “実行結果”](#実行結果) 地図上に CMS から取得したデータが表示されます。 ![パブリックAPI から取得した GeoJSON を MapLibre GL JS で表示した地図。日本各地に赤い円マーカーが表示されている](/_astro/geojson-map-result.BBwBgSKz_ZudUCO.webp) エンドポイントの詳細な仕様については、[パブリックAPIリファレンス](/ja/developer/cms/public-api-reference/) を参照してください。 # インテグレーションAPI を使ってデータを公開する > インテグレーションAPI で作成したアイテムを下書きから公開に変更し、パブリックAPI で取得できるようにする。 インテグレーションAPI からアイテムを登録した直後は、ステータスが **下書き** の状態になっています。パブリックAPI などで公開データとして取得できるようにするには、ステータスを **公開** に変更する必要があります。 ## 公開の流れ [Section titled “公開の流れ”](#公開の流れ) 1. 作成したアイテムの ID を取得します 2. 公開エンドポイントにリクエストを送り、ステータスを公開に変更します ## 指定した ID のアイテムを公開するサンプルコード [Section titled “指定した ID のアイテムを公開するサンプルコード”](#指定した-id-のアイテムを公開するサンプルコード) * curl ```bash curl -X POST \ 'https://api.cms.reearth.io/api//projects//models//items//publish' \ --header 'Authorization: Bearer ' ``` * JavaScript ```js const WORKSPACE_ID = ""; const PROJECT_ID = ""; const MODEL_ID = ""; const ITEM_ID = ""; const TOKEN = ""; const url = `https://api.cms.reearth.io/api/${WORKSPACE_ID}/projects/${PROJECT_ID}/models/${MODEL_ID}/items/${ITEM_ID}/publish`; const resp = await fetch(url, { method: "POST", headers: { Authorization: `Bearer ${TOKEN}`, Accept: "application/json", }, }); if (!resp.ok) { const text = await resp.text(); throw new Error(`HTTP ${resp.status}: ${text}`); } console.log("公開しました"); ``` トークンをフロントエンドに直接書かないでください 上記サンプルはあくまで動作確認用です。トークンがフロントエンドに露出すると、第三者に悪用されるリスクがあります。本番環境では、バックエンドサーバーでトークンを管理し、そこからインテグレーションAPI を呼び出す構成を推奨します。 ## アイテムの作成から公開まで一括で行うサンプルコード [Section titled “アイテムの作成から公開まで一括で行うサンプルコード”](#アイテムの作成から公開まで一括で行うサンプルコード) アイテムの作成と公開を続けて行う場合は、作成時に返ってくるアイテム ID をそのまま公開リクエストに使います。 ```js const WORKSPACE_ID = ""; const PROJECT_ID = ""; const MODEL_ID = ""; const TOKEN = ""; const baseUrl = `https://api.cms.reearth.io/api/${WORKSPACE_ID}/projects/${PROJECT_ID}`; // 1. アイテムを作成する const createResp = await fetch(`${baseUrl}/models/${MODEL_ID}/items`, { method: "POST", headers: { Authorization: `Bearer ${TOKEN}`, "Content-Type": "application/json", Accept: "application/json", }, body: JSON.stringify({ fields: [ { key: "name", type: "text", value: "サンプル" }, ], }), }); if (!createResp.ok) throw new Error(`作成失敗: HTTP ${createResp.status}`); const item = await createResp.json(); // 2. 作成したアイテムを公開する const publishResp = await fetch(`${baseUrl}/models/${MODEL_ID}/items/${item.id}/publish`, { method: "POST", headers: { Authorization: `Bearer ${TOKEN}`, Accept: "application/json", }, }); if (!publishResp.ok) throw new Error(`公開失敗: HTTP ${publishResp.status}`); console.log("作成・公開が完了しました"); ``` トークンをフロントエンドに直接書かないでください 上記サンプルはあくまで動作確認用です。トークンがフロントエンドに露出すると、第三者に悪用されるリスクがあります。本番環境では、バックエンドサーバーでトークンを管理し、そこからインテグレーションAPI を呼び出す構成を推奨します。 ## 実行結果 [Section titled “実行結果”](#実行結果) 公開前は、ステータスが **下書き** になっています。 ![公開前のアイテム。ステータスが下書きになっている](/_astro/item-before-publish.CIi_WURN_Z1Hv32a.webp) 公開エンドポイントを呼び出すと、ステータスが **公開** に変わり、パブリックAPI から取得できるようになります。 ![インテグレーションAPI で公開後のアイテム。ステータスが Published になっている](/_astro/item-after-publish.CJUAFBkc_ZmmUKS.webp) エンドポイントの詳細な仕様については、[インテグレーションAPIリファレンス](/ja/developer/cms/integration-api-reference/) を参照してください。 # インテグレーションAPI を使ってローカルファイルをアセットに登録する > ローカルにある画像やファイルを Re:Earth CMS のアセットとして登録する。 ローカルにある画像やファイルを Re:Earth CMS のアセットとして登録する方法を説明します。アセットに登録したファイルは、アイテムのフィールドから参照したり、パブリックAPI 経由で配信したりできます。 ## サンプルコード [Section titled “サンプルコード”](#サンプルコード) * curl ```bash curl -X POST \ 'https://api.cms.reearth.io/api//projects//assets' \ --header 'Authorization: Bearer ' \ --form 'file=@/path/to/file.jpg' ``` * JavaScript ブラウザのファイル選択フォームと組み合わせる例です。 ```html アセットアップロード ``` トークンをフロントエンドに直接書かないでください 上記サンプルはあくまで動作確認用です。トークンがフロントエンドに露出すると、第三者に悪用されるリスクがあります。本番環境では、バックエンドサーバーでトークンを管理し、そこからインテグレーションAPI を呼び出す構成を推奨します。 ## 実行結果 [Section titled “実行結果”](#実行結果) 簡易的なアップロードフォームでファイルを選択し、アップロードを実行します。 ![簡易的なアセットアップロードフォーム。ファイルが選択され、アップロードボタンがある](/_astro/upload-asset-form.Bdl3WBJj_Z1Jk4jJ.webp) インテグレーションAPI 経由でアセットが登録され、CMS の Asset 画面に表示されます。 ![インテグレーションAPI からアセットを登録した後の Asset 画面。アップロードしたファイルが一覧に表示されている](/_astro/asset-registered.CnMYqMjF_1D5UOY.webp) エンドポイントの詳細な仕様については、[インテグレーションAPIリファレンス](/ja/developer/cms/integration-api-reference/) を参照してください。 # 概要 > Re:Earth CMS が提供する API・Webhook の全体像と使い分け。 Re:Earth CMS は、プロジェクト単位でコンテンツ・構造・公開状態を管理し、外部アプリケーションや外部システムと連携するための**ヘッドレス CMS** です。外部からのアクセスには、公開範囲のデータを閲覧・作成するためのものと、CMS 内のリソースを管理・操作するためのものがあります。そのため Re:Earth CMS では、目的に応じて **パブリックAPI**・**インテグレーションAPI**・**Webhook** を提供しています。それぞれの特徴は次のとおりです。 | 連携方法 | 用途 | 認証 | | ---------------- | --------------------- | --------------------------------- | | **パブリックAPI** | 公開範囲のデータを外部から閲覧・投稿 | 公開プロジェクトは不要。非公開プロジェクトは APIキーで追加可能 | | **インテグレーションAPI** | 外部システムとの連携・CRUD 操作全般 | インテグレーショントークン必須 | | **Webhook** | CMS 内のイベントを指定 URL へ通知 | シークレットによる署名検証 | より詳しい技術情報は [DeepWiki](https://deepwiki.com/reearth/reearth-cms) をご覧ください。 DeepWiki について 上の DeepWiki は AI がソースコードから生成したドキュメントのため、内容に誤りが含まれる可能性があります。利用時は注意してください。 GraphQL API について Re:Earth CMS は上記 2 つの REST API のほかに GraphQL API を内部的に提供していますが、これは**内部 API** です。予告なく仕様が変更される場合があるため、**一般ユーザーは使用しないでください**。外部連携にはインテグレーションAPIまたはパブリックAPIを使用してください。 パブリックAPI Web サイトや地図アプリケーション、公開フォームから公開範囲のデータを閲覧・作成します。 [パブリックAPI とは ](/ja/developer/cms/overview/public-api/) インテグレーションAPI バックエンドサーバーからプロジェクト・モデル・スキーマ・アイテム・アセットを管理します。 [インテグレーションAPI とは ](/ja/developer/cms/overview/integration-api/) Webhook アイテムやアセットが変わった瞬間に、CMS から自分のサーバーへ通知させます。 [Webhook とは ](/ja/developer/cms/overview/webhook/) ## パブリックAPI [Section titled “パブリックAPI”](#パブリックapi) 公開範囲のデータを外部アプリケーションから閲覧・作成するための API です。Web サイトや地図アプリケーション、公開フォームなど、フロントエンドから直接利用する用途に向いています。JSON・CSV・GeoJSON 形式で取得でき、Re:Earth Visualizer などでの表示にも使えます。 ただし、既存データの更新・削除や、モデル・スキーマの変更はできません。 ## インテグレーションAPI [Section titled “インテグレーションAPI”](#インテグレーションapi) 外部システムやバックエンドサーバーから CMS 内のリソースを管理・操作するための API です。アイテムやアセットに加え、プロジェクト・モデル・スキーマなど CMS を構成するリソース全般を扱えます。 インテグレーショントークンは強い権限を持つ認証情報のため、**フロントエンドに露出させず**、バックエンドサーバーなど安全な環境で管理する必要があります。 ## Webhook [Section titled “Webhook”](#webhook) CMS 内のイベント(アイテムの作成・更新・公開、アセットのアップロード・削除など)を、指定した URL へリアルタイムに通知する仕組みです。API のように CMS へリクエストするのではなく CMS 側から知らせるため、データ同期や外部ワークフローの自動化に向いています。 利用には、通知を受け取るサーバーの用意と、必要に応じた署名検証の実装が必要です。 # インテグレーションAPI とは > 認証つきで CMS 内のリソースを作成・更新・削除するための管理 API。 インテグレーションAPI は、外部サービスを通じて Re:Earth CMS 内のデータを管理・操作するための API です。認証を行ったうえで、以下のような操作が行えます。 * プロジェクトデータの取得・管理 * モデルやアイテム、スキーマの作成・更新・削除 * アセットやコメント登録などの操作 公開データを認証なしで取得・作成したい場合は、[パブリックAPI](/ja/developer/cms/overview/public-api/) を使用します。 インテグレーションAPI の主な特徴は次のとおりです。 | 特徴 | 内容 | | ------------------- | -------------------------------------------------------------------------- | | あらゆるリソースを作成・更新・削除可能 | アイテム・アセット・モデルなど CMS 上のあらゆるリソースを作成・更新・削除可能。公開設定されていないモデル・アイテム・アセットにもアクセス可能。 | | 認証必要 | インテグレーショントークンによる認証が必要。 | | RESTful API | 標準的な HTTP メソッド(`GET` / `POST` など)を使う REST 準拠設計。 | 注意 インテグレーショントークンは管理者権限に相当するため、クライアントサイドに露出すると第三者に悪用されるリスクがあります。バックエンドサーバーでトークンを管理し、そこから API を呼び出す構成が必須です。 ## 次のステップ [Section titled “次のステップ”](#次のステップ) まずは [インテグレーションの作成](/ja/developer/cms/getting-started/integration-setup/) に進み、インテグレーショントークンを発行しましょう。全エンドポイントの詳細は [インテグレーションAPIリファレンス](/ja/developer/cms/integration-api-reference/) を参照してください。 # パブリックAPI とは > 公開設定されたデータの閲覧・作成に特化した認証不要の API。 パブリックAPI は、Re:Earth CMS で公開設定されたデータを読み取り、作成できる API です。Web サイトや外部サービスは、この API を通じて次のようなデータを取得できます。 * 公開設定されたモデル * アイテム(コンテンツ) * アセット(画像・ファイルなど) データの更新・削除、スキーマの変更など管理操作が必要な場合は、[インテグレーションAPI](/ja/developer/cms/overview/integration-api/) を使用します。 パブリックAPI の主な特徴は次のとおりです。 | 特徴 | 内容 | | ------------ | ------------------------------------------------------------------------------------------------------------------------- | | データの閲覧・作成が可能 | 公開設定されたモデル・アイテム・アセットのみにアクセス可能。データの作成も可能(ただし Asset・Reference・Tag・Group・GeometryEditor・GeometryObject 型のフィールドは投稿に対応していません)。 | | 認証不要 | 公開データであれば APIキーなしで利用可能。非公開データは取得できません。 | | RESTful API | 標準的な HTTP メソッド(`GET` / `POST` など)を使う REST 準拠設計。 | 注意 パブリックAPI は認証不要のため、フロントエンドから直接呼び出せます。ただし、環境によっては CORS(Cross-Origin Resource Sharing)の設定が必要です。本番環境では許可オリジンを適切に制限してください。 ## 次のステップ [Section titled “次のステップ”](#次のステップ) [パブリックAPI の使い方(読み取り)](/ja/developer/cms/getting-started/public-api-quickstart-read/) に進み、公開設定から最初の読み取りリクエストまでを試してみましょう。全エンドポイントの詳細は [パブリックAPIリファレンス](/ja/developer/cms/public-api-reference/) を参照してください。 # Webhook とは > CMS 内のイベントを外部サービスへリアルタイムに通知する仕組み。 Webhook は、システム内でイベントが発生したときに、外部サーバーへ自動でデータを送信する仕組みです。API のポーリング(定期的に API を呼び出してデータを確認する方式)とは異なり、イベントが発生したタイミングでのみ通知が届くため、リソースの消費が少なく、リアルタイムに近い連携が実現できます。 Re:Earth CMS の Webhook を使用すると、プロジェクト内でアイテムやアセットの編集・削除・公開などの変更が行われた際に、外部サービスへリアルタイムで通知を送信できます。これにより、外部システムとの連携や自動化、データ同期が容易になります。 * アイテムの作成・更新・削除の通知 * アイテムの公開・非公開状態の変更通知 * 指定した URL への HTTP `POST` によるリアルタイム通知 * リクエスト内容が改ざんされていないことを確認するための署名付与 外部から CMS のデータを**取得・操作したい**場合は、[インテグレーションAPI](/ja/developer/cms/overview/integration-api/) または [パブリックAPI](/ja/developer/cms/overview/public-api/) を使用します。 Webhook の主な特徴は次のとおりです。 | 特徴 | 内容 | | ------------------- | ----------------------------------------------------------------------- | | CMS からのイベント通知を行う仕組み | アイテムの作成・更新・削除・公開などのイベントが発生すると、CMS 側から指定した URL へ HTTP `POST` リクエストを送信する。 | | インテグレーションに紐づけて設定 | Webhook 単体では存在せず、1 つのインテグレーションに対して複数の Webhook を追加できる。 | | 署名検証が必要 | リクエストにはシークレットによる署名が付与されるため、受信側で検証を行い、なりすましを防ぐ必要がある。 | 注意 Webhook を利用するには、通知を受け取るための受信サーバーをあらかじめ用意し、署名検証のロジックを実装しておく必要があります。受信サーバー側の実装・運用にはアプリケーション開発の知識と経験が求められます。 ## 次のステップ [Section titled “次のステップ”](#次のステップ) まずは [インテグレーションの作成](/ja/developer/cms/getting-started/integration-setup/) に進み、Webhook 設定の前提となるインテグレーションを作成しましょう。 # FAQ > CMS の API・Webhook 連携に関するよくある質問。 ## セットアップ・基本 [Section titled “セットアップ・基本”](#セットアップ基本) **Q: 複数のプロジェクトで同じインテグレーションを使えますか?** はい、1 つのインテグレーションを複数のプロジェクトに接続できます。ただし、プロジェクトごとに接続の設定が必要です。 **Q: インテグレーショントークンと APIキーは何が違いますか?** インテグレーショントークンはインテグレーションAPI(読み書き・管理操作)で使用するトークンです。APIキーはパブリックAPI で非公開プロジェクトにアクセスする際に使用します。用途が異なるため、それぞれ適切な場面で使い分けてください。 **Q: API のベース URL は何ですか?** | API | ベース URL | | ------------ | ---------------------------------------------------------------- | | インテグレーションAPI | `https://api.cms.reearth.io/api/{workspace}/projects/{project}/` | | パブリックAPI | `https://api.cms.reearth.io/api/p/{workspace}/{project}/` | ## アイテム操作 [Section titled “アイテム操作”](#アイテム操作) **Q: アイテムを作成したのにパブリックAPI で取得できません。なぜですか?** インテグレーションAPI で作成したアイテムはデフォルトで **下書き** 状態になります。パブリックAPI で取得できるようにするには、以下のエンドポイントでアイテムを公開する必要があります。詳しくは [インテグレーションAPI を使ってデータを公開する](/ja/developer/cms/guides/publish-items/) を参照してください。 ```plaintext POST /{workspace}/projects/{project}/models/{model}/items/{itemId}/publish ``` **Q: フィールドキーはどこで確認できますか?** Re:Earth CMS の管理画面でモデルのスキーマ設定を開くと、各フィールドのキーを確認できます。また、以下のエンドポイントでスキーマを取得することでも確認できます。 ```plaintext GET /{workspace}/projects/{project}/models/{model}/schema.json ``` **Q: 一度に取得できるアイテムの最大件数は何件ですか?** 1 リクエストあたり最大 **100 件**です。`perPage` パラメータで件数を指定できます(デフォルト: 50 件)。100 件を超えるデータを取得する場合は、`page` パラメータを使ってページネーションで取得してください。 **Q: アイテムを特定の条件で絞り込んで取得できますか?** インテグレーションAPI では、`POST /items/filter` エンドポイントを使って条件フィルタが使えます。テキスト・数値・日時・ステータスなど様々な条件タイプに対応しており、`and` / `or` で複数条件を組み合わせることもできます。なお、パブリックAPI にはフィルタ機能はありません。絞り込みが必要な場合はインテグレーションAPI を使用してください。詳しくは [インテグレーションAPI でアイテムをフィルタして取得する](/ja/developer/cms/guides/filter-items/) を参照してください。 ## パブリックAPI [Section titled “パブリックAPI”](#パブリックapi) **Q: 認証なしでアクセスできるのはどのような場合ですか?** 公開設定されたプロジェクトであれば、認証なしでパブリックAPI にアクセスできます。非公開プロジェクトの場合は、`Authorization` ヘッダーに APIキーを付与することでアクセスできます。 **Q: GeoJSON で取得しても `features` が空になります。** モデルに **GeoJSON Geometry 型**のフィールドが定義されていないと、`features` が空になります。CMS の管理画面でモデルのスキーマ設定を確認し、ジオメトリフィールドが追加されているか確認してください。 ## Webhook [Section titled “Webhook”](#webhook) **Q: Webhook を設定したのに通知が届きません。どこを確認すればよいですか?** 以下の点を確認してください。 1. Webhook URL が正しく設定されているか 2. URL が `http://` または `https://` で始まっているか 3. 受信サーバーが POST リクエストを受け付けているか 4. 受信サーバーが 10 秒以内に 2XX レスポンスを返しているか 5. 対象のイベントが Webhook の設定で有効になっているか ローカル環境でテストする場合は、ngrok などのトンネリングツールを使って外部からアクセスできる URL を用意してください。 **Q: Webhook のペイロードはどこで確認できますか?** テスト目的であれば、webhook.site で一時的な URL を発行すると、受信したペイロードをブラウザ上でリアルタイムに確認できます。 注意 webhook.site の無料版はデータが 7 日で削除され、リクエスト内容が他のユーザーから閲覧可能な状態になります。本番環境での使用は推奨しません。 ## エラー対処 [Section titled “エラー対処”](#エラー対処) **Q: `401 Unauthorized` が返ってきます。** `Authorization` ヘッダーが正しく設定されているか確認してください。 ```plaintext Authorization: Bearer ``` `Bearer` とトークンの間にスペースが必要です。トークンが正しいにもかかわらずエラーが続く場合は、トークンを再発行してください。 **Q: `400 Bad Request` が返ってきます。** リクエストボディの構造が正しくない場合に返ります。以下を確認してください。 * `fields` の `key` が CMS 側のフィールドキーと一致しているか * `fields` の `type` がフィールド型と一致しているか * JSON の構文が正しいか(カンマ、クォート、ネスト) **Q: `404 Not Found` が返ってきます。** URL に含まれる workspace / project / model の ID またはエイリアスが正しいか確認してください。また、パブリックAPI の場合はモデルが公開設定になっているかも確認してください。 # ツール > CMS 連携を助ける SDK / CLI ツール(準備中)。 CMS 連携を簡単にする SDK・CLI ツールは現在準備中です。整備が完了次第、このページで案内します。 それまでは、[パブリックAPIリファレンス](/ja/developer/cms/public-api-reference/) および [インテグレーションAPIリファレンス](/ja/developer/cms/integration-api-reference/) の REST エンドポイントを直接呼び出してご利用ください。 # 概要 > プラグイン API の概要 Re:Earth Visualizer プラグイン API は、プラグイン拡張が Re:Earth Visualizer とシームレスに連携するために設計された API の集まりです。Visualizer のデータへのアクセスを提供し、レイヤ・ビューア・カメラ・タイムライン・UI・拡張などのさまざまなコンポーネントを管理するメソッドを提供します。 ## プラグインAPI [Section titled “プラグインAPI”](#プラグインapi) Re:Earth Visualizer プラグイン API は `reearth` オブジェクトにまとめられており、プラグインの WebAssembly 側でグローバルに利用できます。API はいくつかのモジュールに分かれており、それぞれ Visualizer と連携するためのプロパティとメソッドを提供します。 ### システム関連 [Section titled “システム関連”](#システム関連) **reearth.version: `string`:** Re:Earth Visualizer のバージョン。 **reearth.apiVersion: `string`:** Re:Earth Visualizer プラグイン API のバージョン。 **reearth.engine: `Engine`:** 現在使用中の Re:Earth Visualizer のエンジン。 ### シーン関連 [Section titled “シーン関連”](#シーン関連) [reearth.viewer ](/ja/developer/plugin/api-reference/viewer/) [reearth.camera ](/ja/developer/plugin/api-reference/camera/) [reearth.timeline ](/ja/developer/plugin/api-reference/timeline/) ### レイヤ関連 [Section titled “レイヤ関連”](#レイヤ関連) [reearth.layers ](/ja/developer/plugin/api-reference/layers/) [reearth.sketch ](/ja/developer/plugin/api-reference/sketch/) ### 拡張関連 [Section titled “拡張関連”](#拡張関連) [reearth.extension ](/ja/developer/plugin/api-reference/extension/) [reearth.ui ](/ja/developer/plugin/api-reference/ui/) [reearth.modal ](/ja/developer/plugin/api-reference/modal/) [reearth.popup ](/ja/developer/plugin/api-reference/popup/) ### データ関連 [Section titled “データ関連”](#データ関連) [reearth.data ](/ja/developer/plugin/api-reference/data/) ## 試してみましょう [Section titled “試してみましょう”](#試してみましょう) Re:Earth Visualizer プラグインプレイグラウンドで、これらのプラグイン API の使用例を多数紹介しています。 [プラグインプレイグラウンド ](https://visualizer.reearth.io/plugin-playground?plugin-id=my-plugin) # reearth.camera > `reearth.camera` の API リファレンスです。 **`reearth.camera`** 名前空間は、`reearth` 環境内でカメラを管理・操作するための包括的な機能セットを提供します。 ## プロパティ [Section titled “プロパティ”](#プロパティ) ### position [Section titled “position”](#position) このプロパティは、`reearth` 内のカメラの現在位置と向きを提供します。カメラの地理的な位置、高度、および角度方向に関する詳細な情報を返します。カメラの視点を把握・記録する際に役立ちます。 #### 構文 [Section titled “構文”](#構文) ```ts reearth.camera.position: CameraPosition | undefined; ``` #### 戻り値 [Section titled “戻り値”](#戻り値) **型** `CameraPosition` カメラ位置が定義されている場合、詳細な位置と向きのデータを持つオブジェクトを返します。 ノート CameraPosition 型の詳細については、[CameraPosition](#cameraposition) セクションをご参照ください。 **型** `undefined` カメラ位置が現在利用できないことを示します。 #### 使用例 [Section titled “使用例”](#使用例) ```javascript // 例 1: 現在のカメラ位置を取得する const currentPosition = reearth.camera.position; // 位置が利用可能かどうかを確認する if (currentPosition) { console.log("Latitude:", currentPosition.lat); console.log("Longitude:", currentPosition.lng); console.log("Height:", currentPosition.height); console.log("Heading:", currentPosition.heading); console.log("Pitch:", currentPosition.pitch); console.log("Roll:", currentPosition.roll); } else { console.log("Camera position is undefined."); } ``` ### fov [Section titled “fov”](#fov) このプロパティは、`reearth` におけるカメラの視野角(FOV)を表し、任意の時点で観測できる世界の範囲を定義します。カメラの視点が広いか狭いかを調整する際に重要なパラメータです。 FOV はカメラがパースペクティブモードの場合にのみ利用可能です。 #### 構文 [Section titled “構文”](#構文-1) ```ts reearth.camera.fov: number | undefined ``` #### 戻り値 [Section titled “戻り値”](#戻り値-1) **型** `number | undefined` カメラの視野角をラジアン単位で表す数値です。視野角は 3D 空間でのコンテンツの見え方に大きく影響し、値が大きいほど広い視野になり、値が小さいほどズームインされた絞り込まれたビューになります。 視野角が undefined の場合、カメラの FOV が設定されていないか、現在の状況では利用できないことを示します。 #### 使用例 [Section titled “使用例”](#使用例-1) ```javascript // 例 1: カメラの現在の視野角にアクセスしてログに出力する const cameraFov = reearth.camera.fov; if (cameraFov !== undefined) { console.log("Current Camera FOV (radians):", cameraFov); } else { console.log("Camera FOV is undefined."); } // 例 2: FOV に基づいて調整する // 視野角が広すぎる場合に確認して調整する const cameraFov = reearth.camera.fov; if (cameraFov !== undefined && cameraFov > 1) { console.log("Camera FOV is wide. Consider reducing for a more focused view."); } else if (cameraFov !== undefined) { console.log("Camera FOV is optimal for current view."); } ``` ### aspectRatio [Section titled “aspectRatio”](#aspectratio) このプロパティは、`reearth` 環境におけるカメラのビューポートの幅と高さの比率を表します。この比率は、ビューポートの寸法に基づいてオブジェクトが歪みなく描画されるよう、カメラのビュー内でのコンテンツの表示方法に影響します。 #### 構文 [Section titled “構文”](#構文-2) ```ts reearth.camera.aspectRatio: number | undefined ``` #### 戻り値 [Section titled “戻り値”](#戻り値-2) **型** `number | undefined` カメラのビューポートのアスペクト比(幅 ÷ 高さ)を表す数値です。たとえば、一般的なワイドスクリーンモニターのアスペクト比は 16:9(約 1.78)であり、正方形のアスペクト比は 1:1(1.0)です。アスペクト比が広いほど横方向の視野が広くなり、高いほど縦方向の視野が広くなります。 #### 使用例 [Section titled “使用例”](#使用例-2) ```javascript // 例 1: カメラの現在のアスペクト比にアクセスしてログに出力する const cameraAspectRatio = reearth.camera.aspectRatio; if (cameraAspectRatio !== undefined) { console.log("Current Camera Aspect Ratio:", cameraAspectRatio); } else { console.log("Camera aspect ratio is undefined."); } // 例 2: アスペクト比に基づいてカメラビューを調整する const cameraAspectRatio = reearth.camera.aspectRatio; if (cameraAspectRatio !== undefined && cameraAspectRatio > 1.8) { console.log( "Camera aspect ratio is very wide. Consider adjusting the view for better composition." ); } else if (cameraAspectRatio !== undefined) { console.log("Camera aspect ratio is within a normal range."); } ``` ### viewport [Section titled “viewport”](#viewport) このプロパティは、カメラのビューに現在表示されている地理的な境界を表します。カメラの可視エリアの西・南・東・北の範囲を定義する GeoRect オブジェクトを返します。地理座標でカメラの視野を把握する際に役立ちます。 #### 構文 [Section titled “構文”](#構文-3) ```ts reearth.camera.viewport: GeoRect | undefined ``` #### 戻り値 [Section titled “戻り値”](#戻り値-3) **型** `GeoRect | undefined` 現在のビューポートの地理的な境界を表すオブジェクトです。 ノート GeoRect に含まれるオプションの詳細については、[GeoRect](#georect) セクションをご参照ください。 viewport が undefined の場合、カメラの現在の地理的な境界が設定されていないか取得できないことを示します。これは、カメラが地理的な領域にフォーカスしていない場合に発生することがあります。 #### 使用例 [Section titled “使用例”](#使用例-3) ```javascript // 例 1: ビューポートの現在の地理的な境界にアクセスしてログに出力する const viewportBounds = reearth.camera.viewport; if (viewportBounds) { console.log("Viewport bounds:"); console.log("West:", viewportBounds.west); console.log("South:", viewportBounds.south); console.log("East:", viewportBounds.east); console.log("North:", viewportBounds.north); } else { console.log("Viewport is undefined."); } // 例 2: ビューポートを確認して調整を提案する const viewportBounds = reearth.camera.viewport; if (viewportBounds) { console.log("Current Viewport:", viewportBounds); // ビューポートが西または東に広がりすぎていないか確認する if (viewportBounds.west < -180 || viewportBounds.east > 180) { console.log( "Viewport extends beyond global bounds. Consider adjusting the camera." ); } else { console.log("Viewport is within normal geographic bounds."); } } else { console.log("Viewport is undefined."); } ``` ## メソッド [Section titled “メソッド”](#メソッド) ### flyTo [Section titled “flyTo”](#flyto) このメソッドは、アニメーションの時間・イージング・視野角(FOV)の任意制御とともに、カメラを指定した目的地へ滑らかに移動させます。シーン内の特定の場所やレイヤへカメラを誘導し、滑らかな遷移とカスタムアニメーションを実現する際に役立ちます。 #### 構文 [Section titled “構文”](#構文-4) ```ts reearth.camera.flyTo( destination: LayerId | CameraPosition, options?: CameraMoveOptions & { fov?: number } ) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ) ##### `destination` [Section titled “destination”](#destination) カメラの目標地点を指定します。特定のレイヤにフォーカスするための LayerId(文字列)、または地理的な位置と向きのパラメータを指定する CameraPosition オブジェクトを指定できます。 **型**: `LayerId | CameraPosition` **`LayerId`**: カメラが移動するべき特定のレイヤの ID を表す文字列です。 **`CameraPosition`**: カメラの緯度・経度・高度・向きを定義するオブジェクトです。 ノート CameraPosition に含まれるオプションの詳細については、[CameraPosition](#cameraposition) セクションをご参照ください。 ##### `options` [Section titled “options”](#options) **省略可能** 移動アニメーションと視野角を制御する省略可能なオブジェクトです。 **型**: `CameraMoveOptions & { fov?: number }` **`CameraMoveOptions:`** 移動アニメーションを制御するオブジェクトです。 ノート CameraMoveOptions に含まれるオプションの詳細については、[CameraMoveOptions](#cameramoveoptions) セクションをご参照ください。 **`fov?: number:`** 目的地での視野角(ラジアン単位)を指定します。遷移の一部としてカメラの FOV を調整します。 #### 戻り値: [Section titled “戻り値:”](#戻り値-4) なし(`void`)。このメソッドは値を返しません。 #### 使用例 [Section titled “使用例”](#使用例-4) ```javascript // 例 1: 指定した座標へ 3 秒のアニメーションで移動する reearth.camera.flyTo( { lat: 35.6895, lng: 139.6917, height: 500 }, // Tokyo coordinates { duration: 3 } // 3-second animation duration ); // 例 2: アニメーションなしで即座にレイヤへ移動する const layerId = "layer123"; reearth.camera.flyTo(layerId, { duration: 0 }); // 例 3: 4 秒のアニメーション・カスタム FOV・イージング関数を使って座標へ移動する reearth.camera.flyTo( { lat: 48.8566, // Latitude for Paris lng: 2.3522, // Longitude for Paris height: 1500, // Altitude in meters heading: 0.785, // Heading in radians (45 degrees clockwise) pitch: -0.523, // Pitch in radians (30 degrees downward) roll: 0, // No roll }, { duration: 4, // Set animation duration to 4 seconds fov: 0.8, // Set field of view to 0.8 radians easing: (t) => t * t, // Custom easing for a slower start } ); ``` ### flyToBoundingBox [Section titled “flyToBoundingBox”](#flytoboundingbox) このメソッドは、指定した地理的バウンディングボックスにフォーカスするようにカメラを滑らかに移動させます。アニメーション・向き・距離の省略可能なパラメータを指定できます。領域を表示するためにズームアウトしたり、ビューポート内の特定のエリアをハイライトするためにズームインしたりする際に役立ちます。 #### 構文 [Section titled “構文”](#構文-5) ```ts reearth.camera.flyToBoundingBox( boundingBox: GeoRect, options?: CameraMoveOptions & { heading?: number; pitch?: number; range?: number; } ) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-1) ##### `boundingBox` [Section titled “boundingBox”](#boundingbox) **型**: `GeoRect` 対象エリアの地理的な境界を定義するオブジェクトです。 ノート GeoRect に含まれるオプションの詳細については、[GeoRect](#georect) セクションをご参照ください。 ##### `options` [Section titled “options”](#options-1) **省略可能** アニメーション・向き・ズームレベルを制御するオブジェクトです。 **型**: ```ts CameraMoveOptions & { heading?: number; pitch?: number; range?: number; } ``` ノート CameraMoveOptions に含まれるオプションの詳細については、[CameraMoveOptions](#cameramoveoptions) セクションをご参照ください。 **`heading?: number;`** カメラが向く方向をラジアンで指定します。0 は北を指し、正の値は時計回りに回転します。 **`pitch?: number;`** カメラの垂直角度をラジアンで指定します。負の値は下方向に傾きます。 **`range?: number;`** バウンディングボックスの中心からカメラまでの距離をメートルで指定します。ズームレベルを制御します。 #### 戻り値: [Section titled “戻り値:”](#戻り値-5) なし(`void`)。このメソッドは値を返しません。 #### 使用例 [Section titled “使用例”](#使用例-5) ```javascript // 例 1: 2 秒のアニメーションでバウンディングボックスへ移動する reearth.camera.flyToBoundingBox( { west: -74.1, south: 40.7, east: -73.9, north: 40.8 }, // New York City area { duration: 2 } // 2-second animation duration ); // 例 2: アニメーションなしでバウンディングボックスへ移動する reearth.camera.flyToBoundingBox( { west: 139.6, south: 35.6, east: 139.8, north: 35.7 }, // Tokyo area { duration: 0 } ); // 例 3: すべてのパラメータを使用してバウンディングボックスへ移動する reearth.camera.flyToBoundingBox( { west: -122.55, // Western boundary of San Francisco area south: 37.7, // Southern boundary east: -122.35, // Eastern boundary north: 37.85, // Northern boundary }, { duration: 5, // Set animation duration to 5 seconds easing: (t) => t * t, // Custom easing for a slower start heading: 0.785, // Set heading to 0.785 radians (45 degrees clockwise) pitch: -0.523, // Tilt downward to -0.523 radians (30 degrees) range: 4000, // Set camera distance to 4000 meters from the center } ); ``` ### zoomIn [Section titled “zoomIn”](#zoomin) このメソッドは、カメラの高度を下げてシーンに近づけます。ズーム効果は、アニメーションの時間やイージングなどの省略可能な設定でカスタマイズできます。シーン内のオブジェクトやエリアをより詳細に表示する際に役立ちます。 #### 構文 [Section titled “構文”](#構文-6) ```ts reearth.camera.zoomIn: (amount: number, options?: CameraMoveOptions) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-2) ##### `amount` [Section titled “amount”](#amount) **型**: `number` ズームレベルを指定します。正の値はカメラの高度を下げてシーンに近づけ、値が大きいほどズームレベルが大きくなります。負の値は理論的にカメラを遠ざけます。 ##### `options` [Section titled “options”](#options-2) **省略可能** ズーム操作のアニメーションを制御するオブジェクトです。 **型**:`CameraMoveOptions` ノート CameraMoveOptions に含まれるオプションの詳細については、[CameraMoveOptions](#cameramoveoptions) セクションをご参照ください。 #### 戻り値: [Section titled “戻り値:”](#戻り値-6) なし(`void`)。このメソッドは値を返しません。 #### 使用例 [Section titled “使用例”](#使用例-6) ```javascript // 例 1: アニメーションを使って現在のビューを指定倍率でズームインする reearth.camera.zoomIn(2, { duration: 3, easing: (t) => t * (2 - t), // Quadratic easing in-out }); // 例 2: アニメーションとカスタムイージング関数でズームインする reearth.camera.zoomIn(500, { duration: 3, // Set animation duration to 3 seconds easing: (t) => t * t, // Custom easing function for slower start }); ``` ### zoomOut [Section titled “zoomOut”](#zoomout) このメソッドは、カメラの現在位置を基準に、指定した量だけズームレベルを下げてシーンのより広い視野を提供します。ズーム効果は、アニメーションの時間やイージングなどの省略可能な設定でカスタマイズできます。環境の広い視野を提供したり、広いパースペクティブへ遷移する際に役立ちます。 #### 構文 [Section titled “構文”](#構文-7) ```ts reearth.camera.zoomOut(amount: number, options?: CameraMoveOptions) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-3) ##### `amount` [Section titled “amount”](#amount-1) **型**: `number` ズームレベルを指定します。正の値はカメラの高度を上げてシーンから遠ざけます。値が大きいほど、より大きなズームアウト効果が得られます。 ##### `options` [Section titled “options”](#options-3) **省略可能** ズーム操作のアニメーションを制御するオブジェクトです。 **型**:`CameraMoveOptions` ノート CameraMoveOptions に含まれるオプションの詳細については、[CameraMoveOptions](#cameramoveoptions) セクションをご参照ください。 #### 戻り値: [Section titled “戻り値:”](#戻り値-7) なし(`void`)。このメソッドは値を返しません。 #### 使用例 [Section titled “使用例”](#使用例-7) ```javascript // 例 1: 即座にズームアウトする reearth.camera.zoomOut(10, { duration: 0 }); // 例 2: カスタムイージング関数でズームアウトする reearth.camera.zoomOut(5, { duration: 2, // Set animation duration to 2 seconds easing: (t) => t * t, // Custom easing for a slower start }); // 例 3: カスタムイージング関数とアニメーションでズームアウトする reearth.camera.zoomOut(15, { duration: 4, // Animation lasts 4 seconds easing: (t) => t * (2 - t), // Custom easing for smooth acceleration and deceleration }); ``` ### lookAt [Section titled “lookAt”](#lookat) このメソッドは、カメラを指定した目的地にフォーカスするよう調整し、カメラの向き・距離・視野角(FOV)を制御できます。シーン内の特定の場所やオブジェクトにユーザーの注意を向ける際に最適です。 #### 構文 [Section titled “構文”](#構文-8) ```ts reearth.camera.lookAt( destination: LookAtDestination, options?: CameraMoveOptions & { fov?: number } ) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-4) ##### `destination` [Section titled “destination”](#destination-1) **型**: `LookAtDestination` カメラの目標位置を指定するオブジェクトです。 ノート LookAtDestination オブジェクトに含まれるオプションの詳細については、[LookAtDestination](#lookatdestination) セクションをご参照ください。 ##### `options` [Section titled “options”](#options-4) **省略可能** 移動アニメーションと視野角を制御する省略可能なオブジェクトです。 **型**: `CameraMoveOptions & { fov?: number }` **`CameraMoveOptions:`** 移動アニメーションを制御するオブジェクトです。 ノート CameraMoveOptions に含まれるオプションの詳細については、[CameraMoveOptions](#cameramoveoptions) セクションをご参照ください。 **`fov?: number:`** 目的地での視野角(ラジアン単位)を指定します。遷移の一部としてカメラの FOV を調整します。 #### 戻り値: [Section titled “戻り値:”](#戻り値-8) なし(`void`)。このメソッドは値を返しません。 #### 使用例 [Section titled “使用例”](#使用例-8) ```javascript // 例 1: デフォルトアニメーションで特定の座標にフォーカスする reearth.camera.lookAt({ lat: 34.0522, // Latitude for Los Angeles lng: -118.2437, // Longitude for Los Angeles height: 1000, // Altitude in meters }); // 例 2: カスタムの heading・pitch・range で座標にフォーカスする reearth.camera.lookAt( { lat: 51.5074, // Latitude for London lng: -0.1278, // Longitude for London height: 1000, // Altitude in meters heading: 1.57, // Heading in radians (90 degrees clockwise) pitch: -0.785, // Pitch in radians (45 degrees downward) range: 2000, // 2 kilometers from the focus point }, { duration: 3, // Set animation duration to 3 seconds } ); // 例 3: 目的地とオプションのすべてのパラメータを使用する reearth.camera.lookAt( { lat: 35.6895, // Latitude for Tokyo lng: 139.6917, // Longitude for Tokyo height: 500, // Altitude in meters heading: 0.785, // Heading in radians pitch: -0.523, // Pitch in radians range: 1500, // 1.5 kilometers from the focus point radius: 100, // Focus area radius in meters }, { duration: 5, // Animation lasts 5 seconds easing: (t) => t * t, // Custom easing for a slower start fov: 1.2, // Set field of view to 1.2 radians } ); ``` ### getGlobeIntersection [Section titled “getGlobeIntersection”](#getglobeintersection) このメソッドは、カメラのビューと地球の表面または地形との交点を計算します。交点の地理座標(緯度・経度・高度)を返し、オプションでビューポートの可視エリアも計算します。地面や地形との操作(距離の測定や可視性の判定など)を必要とするアプリケーションに特に役立ちます。 #### 構文 [Section titled “構文”](#構文-9) ```ts reearth.camera.getGlobeIntersection: (options: Options) => | { center?: LatLngHeight; viewSize?: number; } | undefined; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-5) ##### `options` [Section titled “options”](#options-5) 交点計算を制御する省略可能なオブジェクトです。 **型**: ```ts type Options = { withTerrain?: boolean; calcViewSize?: boolean; }; ``` **`withTerrain?: boolean;`**: true の場合、交点計算時に地形の高さを考慮します。デフォルトは false(平坦な地形)です。false または省略の場合、計算は平坦な地球表面を前提とします。 **`calcViewSize?: boolean;`**: true の場合、カメラの視点から地上の可視エリアのサイズ(ビューサイズ)をメートル単位で計算します。デフォルトは false です。 #### 戻り値: [Section titled “戻り値:”](#戻り値-9) **`{center?: LatLngHeight; viewSize?: number;} | undefined`** 交点が見つかった場合はオブジェクトを返し、交点がない場合は undefined を返します。 **`center?: LatLngHeight`**: 交点の地理座標です。 ```ts type LatLngHeight = { lat: number; // Latitude of the intersection point in decimal degrees. lng: number; // Longitude of the intersection point in decimal degrees. height: number; // Height of the intersection point above the ground in meters. }; ``` **`viewSize?: number`**: カメラの視点から見た地上の可視エリアのサイズ(メートル単位)です。 #### 使用例 [Section titled “使用例”](#使用例-9) ```javascript // 例 1: 地形との交点とビューサイズを計算する const intersection = reearth.camera.getGlobeIntersection({ withTerrain: true, // Enable terrain intersection calcViewSize: true, // Calculate visible area size }); if (intersection) { console.log("Intersection Point:", intersection.center); console.log("View Size (meters):", intersection.viewSize); } else { console.log("No intersection found."); } // 例 2: 平坦な地球表面との交点を計算し、ビューサイズは計算しない const intersection = reearth.camera.getGlobeIntersection({ withTerrain: false, // Assume a flat globe surface calcViewSize: false, // Do not calculate the visible area size }); if (intersection && intersection.center) { console.log("Intersection Point:", intersection.center); console.log("Latitude:", intersection.center.lat); console.log("Longitude:", intersection.center.lng); console.log("Height:", intersection.center.height); } else { console.log("No intersection found."); } // 例 3: undefined の交点を安全に処理する const intersection = reearth.camera.getGlobeIntersection({ withTerrain: true, }); if (!intersection) { console.log("No intersection found. The camera may be above the globe."); } else if (intersection.center) { console.log("Latitude:", intersection.center.lat); console.log("Longitude:", intersection.center.lng); console.log("Height:", intersection.center.height); } ``` ### rotateAround [Section titled “rotateAround”](#rotatearound) このメソッドは、カメラを現在のフォーカスポイントを中心に指定した角度(ラジアン)で回転させます。フォーカスポイントを固定したままシーンを探索する際に役立ちます。 #### 構文 [Section titled “構文”](#構文-10) ```ts reearth.camera.rotateAround(radian: number) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-6) ##### `radian` [Section titled “radian”](#radian) **型**: `number` カメラを回転させる角度(ラジアン単位)です。正の値は時計回りに回転し、負の値は反時計回りに回転します。 #### 戻り値: [Section titled “戻り値:”](#戻り値-10) なし(`void`)。このメソッドは値を返しません。 #### 使用例 [Section titled “使用例”](#使用例-10) ```javascript // 例 1: カメラを時計回りに 1 ラジアン回転させる reearth.camera.rotateAround(1); // 例 2: カメラを反時計回りに -0.5 ラジアン回転させる reearth.camera.rotateAround(-0.5); ``` ### rotateRight [Section titled “rotateRight”](#rotateright) このメソッドは、カメラを現在位置を中心に指定した角度(ラジアン)で右方向に回転させます。外部の特定のポイントにフォーカスすることなく回転します。 #### 構文 [Section titled “構文”](#構文-11) ```ts reearth.camera.rotateRight(radian: number) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-7) ##### `radian` [Section titled “radian”](#radian-1) **型**: `number` カメラを回転させる角度(ラジアン単位)です。正の値は右方向に回転し、負の値は左方向に回転します。 #### 戻り値: [Section titled “戻り値:”](#戻り値-11) なし(`void`)。このメソッドは値を返しません。 #### 使用例 [Section titled “使用例”](#使用例-11) ```javascript // 例 1: カメラを右方向に 0.785 ラジアン(45 度)回転させる reearth.camera.rotateRight(0.785); // 例 2: カメラを右方向(時計回り)に 1 ラジアン回転させる reearth.camera.rotateRight(1); // 例 3: カメラを左方向(反時計回り)に -1.57 ラジアン(-90 度)回転させる reearth.camera.rotateRight(-1.57); ``` ### orbit [Section titled “orbit”](#orbit) このメソッドは、カメラを地球の中心を軸に指定した角度(ラジアン)で回転させ、グローバルな視点を提供します。異なる角度から地球を素早く探索する際に特に役立ちます。 #### 構文 [Section titled “構文”](#構文-12) ```ts reearth.camera.orbit(radian: number) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-8) ##### `radian` [Section titled “radian”](#radian-2) **型**: `number` カメラを軌道周回させる角度(ラジアン単位)です。正の値は時計回りに周回し、負の値は反時計回りに周回します。 #### 戻り値: [Section titled “戻り値:”](#戻り値-12) なし(`void`)。このメソッドは値を返しません。 #### 使用例 [Section titled “使用例”](#使用例-12) ```javascript // 例 1: カメラを地球の周りで時計回りに 2 ラジアン周回させる reearth.camera.orbit(2); // 例 2: カメラを地球の周りで反時計回りに -1 ラジアン周回させる reearth.camera.orbit(-1); ``` ### move [Section titled “move”](#move) このメソッドは、カメラを現在位置を基準に指定した方向へ移動させます。シーンを動的にナビゲートし、異なる軸に沿ったカメラの移動を精密に制御する際に役立ちます。 #### 構文 [Section titled “構文”](#構文-13) ```ts reearth.camera.move( direction: "forward" | "backward" | "up" | "down" | "left" | "right", amount: number ) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-9) ##### `direction` [Section titled “direction”](#direction) **型**: `"forward" | "backward" | "up" | "down" | "left" | "right"` **`forward`**: カメラを前方(向いている方向に近づく方向)へ移動させます。 **`backward`**: カメラを後方(向いている方向から遠ざかる方向)へ移動させます。 **`up`**: カメラを垂直軸に沿って上方向へ移動させます。 **`down`**: カメラを垂直軸に沿って下方向へ移動させます。 **`left`**: カメラを水平軸に沿って左方向へ移動させます。 **`right`**: カメラを水平軸に沿って右方向へ移動させます。 ##### `amount` [Section titled “amount”](#amount-2) **型**: `number` 選択した方向にカメラが移動する距離(メートル単位)を指定します。値が大きいほど移動量が大きくなります。 #### 戻り値: [Section titled “戻り値:”](#戻り値-13) なし(`void`)。このメソッドは値を返しません。 #### 使用例 [Section titled “使用例”](#使用例-13) ```javascript // 例 1: カメラを前方に 500 メートル移動させる reearth.camera.move("forward", 500); // 例 2: カメラを上方向に 200 メートル移動させる reearth.camera.move("up", 200); // 例 3: カメラを左方向に 100 メートル移動させる reearth.camera.move("left", 100); // 例 4: カメラを後方に 300 メートル移動させる reearth.camera.move("backward", 300); ``` ### setView [Section titled “setView”](#setview) このメソッドは、アニメーションなしでカメラを指定した位置と向きに即座に設定します。位置・向き・視野角(FOV)を精密に制御して、カメラを特定のビューにすばやく配置する際に最適です。 #### 構文 [Section titled “構文”](#構文-14) ```ts reearth.camera.setView( view: CameraPosition & { fov?: number } ) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-10) ##### `view` [Section titled “view”](#view) **型**: `CameraPosition & { fov?: number }` カメラの位置・向き・省略可能な視野角を定義するオブジェクトです。 ノート CameraPosition に含まれるオプションの詳細については、[CameraPosition](#cameraposition) セクションをご参照ください。 **`fov?: number:`** カメラの省略可能な視野角(ラジアン単位)で、カメラの視野角を制御します。 #### 戻り値: [Section titled “戻り値:”](#戻り値-14) なし(`void`)。このメソッドは値を返しません。 #### 使用例 [Section titled “使用例”](#使用例-14) ```javascript // 例 1: heading・pitch・roll を指定してカメラを特定の位置に設定する reearth.camera.setView({ lat: 35.6895, // Latitude for Tokyo lng: 139.6917, // Longitude for Tokyo height: 1000, // Altitude in meters heading: 1.57, // Heading in radians (90 degrees clockwise) pitch: -0.785, // Pitch in radians (45 degrees downward) roll: 0, // No roll }); // 例 2: カスタムの視野角でカメラを設定する reearth.camera.setView({ lat: 48.8566, // Latitude for Paris lng: 2.3522, // Longitude for Paris height: 1500, // Altitude in meters heading: 0.785, // Heading in radians (45 degrees clockwise) pitch: -0.523, // Pitch in radians (30 degrees downward) roll: 0, // No roll fov: 1.2, // Field of view in radians }); // 例 3: heading・pitch・roll なしでカメラを設定する reearth.camera.setView({ lat: 40.7128, // Latitude for New York City lng: -74.006, // Longitude for New York City height: 2000, // Altitude in meters }); ``` ## イベント [Section titled “イベント”](#イベント) ノート 共通のイベントメソッド(`on`、`off`)の詳細については、[イベント](/ja/developer/plugin/api-reference/events) ページをご参照ください。 ### move [Section titled “move”](#move-1) このイベントは、`reearth` 環境内でカメラの位置または向きが変化するたびに発生します。カメラの動きを監視して応答し、更新されたカメラの位置と向きを取得することができます。 #### 構文 [Section titled “構文”](#構文-15) ```ts reearth.camera.on("move", (camera: CameraPosition) => void): void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-11) ##### `camera` [Section titled “camera”](#camera) **型**: `CameraPosition` move イベントが発生するたびに呼び出される関数です。コールバックは引数として更新されたカメラ位置を受け取ります。 ノート CameraPosition に含まれるオプションの詳細については、[CameraPosition](#cameraposition) セクションをご参照ください。 #### 使用例 [Section titled “使用例”](#使用例-15) ```javascript // 例 1: カメラの移動を監視して更新された位置をログに出力する reearth.camera.on("move", (camera) => { console.log("Camera moved:"); console.log("Latitude:", camera.lat); console.log("Longitude:", camera.lng); console.log("Height:", camera.height); console.log("Heading:", camera.heading); console.log("Pitch:", camera.pitch); console.log("Roll:", camera.roll); }); // 例 2: カメラが移動するたびにカスタムアクションを実行する reearth.camera.on("move", (camera) => { if (camera.lat && camera.lng) { console.log(`Camera moved to ${camera.lat}, ${camera.lng}`); } }); ``` ## 型定義 [Section titled “型定義”](#型定義) ### CameraPosition [Section titled “CameraPosition”](#cameraposition) 詳細な位置と向きのデータを含むオブジェクトです。 ```javascript type CameraPosition = { lat?: number; lng?: number; height?: number; heading?: number; pitch?: number; roll?: number; }; ``` **`lat?: number;`**: カメラが位置する緯度(10 進数の度単位)です。 **`lng?: number;`**: カメラが位置する経度(10 進数の度単位)です。 **`height?: number`**: 地球の表面からのカメラの高度(メートル単位)で、カメラの高低を決定します。 **`heading?: number;`**: カメラが向く方向です。0 は北を指し、値が増加するにつれて時計回りに回転します(ラジアン単位)。 **`pitch?: number;`**: ピッチ角(カメラの垂直方向の傾き)です。正の値は上方向、負の値は下方向に傾きます(ラジアン単位)。 **`roll?: number;`**: ロール角(視線方向を軸としたカメラの回転)です(ラジアン単位)。 ### GeoRect [Section titled “GeoRect”](#georect) 現在のビューポートの地理的な境界を表すオブジェクトです。 ```javascript type GeoRect = { west: number; south: number; east: number; north: number; }; ``` **`west: number`**: ビューポートの西端の境界(経度の10 進数の度単位)です。 **`south: number`**: ビューポートの南端の境界(緯度の10 進数の度単位)です。 **`east: number`**: ビューポートの東端の境界(経度の10 進数の度単位)です。 **`north: number`**: ビューポートの北端の境界(緯度の10 進数の度単位)です。 ### CameraMoveOptions [Section titled “CameraMoveOptions”](#cameramoveoptions) 移動アニメーションを制御するオブジェクトです。 ```javascript type CameraMoveOptions = { duration?: number; // in seconds easing?: (time: number) => number; }; ``` **`duration?: number;`** カメラ移動の時間を秒単位で指定します。即座に移動するには `0` を使用します。省略した場合はデフォルトの時間が使用されます。 **`easing?: (time: number) => number;`** アニメーションの速度を制御するカスタムイージング関数です。time は 0 から 1 の間の正規化された値です。 ### LookAtDestination [Section titled “LookAtDestination”](#lookatdestination) カメラの目標位置を指定するオブジェクトです。 ```javascript type LookAtDestination = { lat?: number; lng?: number; height?: number; heading?: number; pitch?: number; range?: number; radius?: number; }; ``` **`lat?: number`** 目標位置の緯度(10 進数の度単位)です。 **`lng?: number;`** 目標位置の経度(10 進数の度単位)です。 **`height?: number;`** 海抜からの目標位置の高度(メートル単位)です。 **`heading?: number;`** カメラの向き(ラジアン単位)です(0 = 北、正の値は時計回りに回転)。 **`pitch?: number;`** カメラの垂直方向の傾き(ラジアン単位)です。負の値は下方向に傾きます。 **`range?: number;`** カメラから目標位置までの距離(メートル単位)です。 **`radius?: number;`** 目標周辺の半径を指定し、目標を見ながらカメラが目標からどれだけ離れるかを制御します。 # reearth.data > `reearth.data` の API リファレンスです。 **`reearth.data`** 名前空間は、`reearth` プラグインにおけるクライアントサイドストレージを管理するメソッドを提供します。データの非同期な取得・更新・削除、ストレージキーの管理、およびストア全体のクリアが可能です。この名前空間は、ユーザー設定、セッションデータ、または一時的な設定を永続化する際に便利です。 ## reearth.data.clientStorage [Section titled “reearth.data.clientStorage”](#reearthdataclientstorage) clientStorage は、軽量で非同期なキーバリューストレージシステムを管理するインターフェースを提供します。プラグインのクライアントサイドストレージに対して、読み取り・書き込み・削除などの操作を行うメソッドを備えています。 ### setAsync [Section titled “setAsync”](#setasync) キーと値のペアをストレージに保存します。 #### 構文 [Section titled “構文”](#構文) ```ts reearth.data.clientStorage.setAsync(key: string, value: unknown): Promise ``` #### パラメータ [Section titled “パラメータ”](#パラメータ) ##### key [Section titled “key”](#key) **型** `string` 値に関連付けるキーです。 ##### value [Section titled “value”](#value) **型** `unknown` 保存する値です。 #### 戻り値 [Section titled “戻り値”](#戻り値) **型** `Promise` キーと値のペアが保存されると解決される Promise です。 ### getAsync [Section titled “getAsync”](#getasync) 指定したキーに関連付けられた値を取得します。 #### 構文 [Section titled “構文”](#構文-1) ```ts reearth.data.clientStorage.getAsync(key: string): Promise ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-1) ##### key [Section titled “key”](#key-1) **型** `string` 取得する値のキーです。 #### 戻り値 [Section titled “戻り値”](#戻り値-1) **型** `Promise` キーに関連付けられた値で解決される Promise です。キーが存在しない場合は `undefined` で解決されます。 ### keysAsync [Section titled “keysAsync”](#keysasync) クライアントストレージに保存されているすべてのキーを取得します。 #### 構文 [Section titled “構文”](#構文-2) ```ts reearth.data.clientStorage.keysAsync(): Promise ``` #### 戻り値 [Section titled “戻り値”](#戻り値-2) **型** `Promise` 各キーを表す文字列の配列で解決される Promise です。 ### deleteAsync [Section titled “deleteAsync”](#deleteasync) 指定したキーと値のペアをストレージから削除します。 #### 構文 [Section titled “構文”](#構文-3) ```ts reearth.data.clientStorage.deleteAsync(key: string): Promise ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-2) ##### key [Section titled “key”](#key-2) **型** `string` 削除する値のキーです。 #### 戻り値 [Section titled “戻り値”](#戻り値-3) **型** `Promise` キーと値のペアが削除されると解決される Promise です。 ### dropStoreAsync [Section titled “dropStoreAsync”](#dropstoreasync) クライアントストレージのすべてのデータを消去します。 #### 構文 [Section titled “構文”](#構文-4) ```ts reearth.data.clientStorage.dropStoreAsync(): Promise ``` #### 戻り値 [Section titled “戻り値”](#戻り値-4) **型** `Promise` ストレージが消去されると解決される Promise です。 # イベント > プラグイン API における共通のイベント処理 Re:Earth Visualizer プラグイン API は、さまざまなコンポーネントにわたってイベントを処理するための一貫したパターンを提供します。イベントを使用することで、プラグインはユーザーのインタラクションやシステムの変化にリアルタイムで応答できます。 ## 共通イベントメソッド [Section titled “共通イベントメソッド”](#共通イベントメソッド) Re:Earth Visualizer のすべてのイベント対応コンポーネントは、イベントのサブスクライブおよびアンサブスクライブに同じパターンを共有しています。 ### on [Section titled “on”](#on) `on` メソッドを使用すると、指定したイベントが発生したときに呼び出されるイベントリスナーを登録できます。 #### 構文 [Section titled “構文”](#構文) ```typescript on( type: T, callback: (...args: EventType[T]) => void, options?: { once?: boolean } ): void ``` #### パラメータ [Section titled “パラメータ”](#パラメータ) * **type**: 待ち受けるイベントタイプ * **callback**: イベント発生時に実行する関数 * **options**(省略可能): 設定オプション * **once**: `true` に設定すると、リスナーは一度呼び出された後に自動的に削除されます #### 使用例 [Section titled “使用例”](#使用例) ```javascript // 基本的なイベントリスナー reearth.popup.on("close", () => { console.log("Popup was closed"); }); // 一度だけトリガーされるイベントリスナー reearth.layers.on( "select", (layerId, featureId) => { console.log("Layer selected (this will only trigger once):", layerId, featureId); }, { once: true } ); ``` ### off [Section titled “off”](#off) `off` メソッドを使用すると、以前に登録したイベントリスナーを削除できます。 #### 構文 [Section titled “構文”](#構文-1) ```typescript off( type: T, callback: (...args: EventType[T]) => void ): void ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-1) * **type**: 登録を解除するイベントタイプ * **callback**: `on` で登録した関数 #### 使用例 [Section titled “使用例”](#使用例-1) ```javascript // コールバック関数を定義する const handleClose = () => { console.log("Popup was closed"); }; // イベントリスナーを登録する reearth.popup.on("close", handleClose); // リスニングを停止する場合 reearth.popup.off("close", handleClose); ``` ## イベントタイプ [Section titled “イベントタイプ”](#イベントタイプ) Re:Earth Visualizer の各コンポーネントには独自のイベントタイプがあります。特定のイベントの詳細については、各コンポーネントのドキュメントを参照してください。 # reearth.extension > `reearth.extension` の API リファレンスです。 **`reearth.extension`** 名前空間は、アクティブなプラグイン拡張の機能とプロパティへのアクセスを提供します。ウィジェット、ブロック、または `reearth` 環境内の他の拡張インスタンスなど、異なるコンポーネント間の通信メソッドを含みます。 ## プロパティ [Section titled “プロパティ”](#プロパティ) ### block [Section titled “block”](#block) `block` プロパティは、プラグインのストーリーブロックまたはインフォボックスブロックへのアクセスを提供します。ブロックにはメタデータ、プラグインの詳細、プロパティが含まれ、インフォボックスブロックの場合は関連レイヤも含まれます。このプロパティは `reearth` 環境内のコンテンツブロックを操作する際に有用です。 注意 このプロパティは、`storyBlock` または `infoboxBlock` タイプの拡張内で実行された場合のみ利用可能です。 #### 構文 [Section titled “構文”](#構文) ```ts reearth.extension.block?: PluginStoryBlock | (PluginInfoboxBlock & { layer?: Layer }); ``` #### 戻り値 [Section titled “戻り値”](#戻り値) **型** `PluginStoryBlock | (PluginInfoboxBlock & { layer?: Layer });` メタデータ、プラグインの詳細、プロパティを含むプラグインブロックオブジェクトです。インフォボックスブロックの場合は、関連レイヤも含まれます。 **`PluginStoryBlock`**: プラグイン内でナラティブやシーケンスを作成するために特別に設計されたコンテンツブロックであるストーリーブロックを表します。 ノート `PluginStoryBlock` に含まれるオプションの詳細については、[PluginStoryBlock](#pluginstoryblock) セクションを参照してください。 **`PluginInfoboxBlock`**: 関連レイヤを含む場合があるインフォボックスブロックを表します。 ノート `PluginInfoboxBlock` に含まれるオプションの詳細については、[PluginInfoboxBlock](#plugininfoboxblock) セクションを参照してください。 **`layer?: Layer`**: インフォボックスブロックに関連付けられたレイヤを表します。メタデータ、データソースの詳細、表示設定を含みます。 ノート `Layer` に含まれるオプションの詳細については、[Layer](#layer) セクションを参照してください。 #### 使用例 [Section titled “使用例”](#使用例) ```javascript // 例 1: ストーリーブロックの詳細を取得する const block = reearth.extension.block; if (block && block.extensionType === "storyBlock") { console.log("Story Block ID:", block.id); console.log("Plugin ID:", block.pluginId); console.log("Block Name:", block.name); } // 例 2: インフォボックスブロックに関連付けられたレイヤにアクセスする const block = reearth.extension.block; if (block && block.extensionType === "infoboxBlock" && block.layer) { const layer = block.layer; console.log(`Layer ID: ${layer.id}`); console.log(`Layer Title: ${layer.title}`); console.log(`Layer Type: ${layer.type}`); } ``` ### widget [Section titled “widget”](#widget) `widget` プロパティは、プラグインのウィジェットに関する情報(ID、レイアウト、表示設定など)へのアクセスを提供します。ウィジェットは `reearth` 環境内で動的に配置およびスタイル設定できる UI コンポーネントです。 注意 このプロパティは、`widget` タイプの拡張内で実行された場合のみ利用可能です。 #### 構文 [Section titled “構文”](#構文-1) ```ts reearth.extension.widget?: Widget; ``` #### 戻り値 [Section titled “戻り値”](#戻り値-1) **型** `Widget` ノート `Widget` の詳細については、[Widget](#widget-1) セクションを参照してください。 #### 使用例 [Section titled “使用例”](#使用例-1) ```javascript // ウィジェットの詳細を確認してログ出力する const widget = reearth.extension.widget; if (widget) { console.log("Widget ID:", widget.id); console.log("Plugin ID:", widget.pluginId); console.log("Extension ID:", widget.extensionId); console.log("Property ID:", widget.propertyId); console.log("Extended Horizontally:", widget.extended?.horizontally); console.log("Extended Vertically:", widget.extended?.vertically); } ``` ### list [Section titled “list”](#list) このプロパティは、ウィジェット、ブロック、その他のサポートされているタイプを含む、すべてのプラグイン拡張インスタンスの配列へのアクセスを提供します。各インスタンスには、プラグインと拡張に関するメタデータが含まれます。 #### 構文 [Section titled “構文”](#構文-2) ```ts reearth.extension.list: PluginExtensionInstance[]; ``` #### 戻り値 [Section titled “戻り値”](#戻り値-2) **型** `PluginExtensionInstance[];` `list` 配列の各エントリは、プラグイン拡張のインスタンスを表します。 ノート `PluginExtensionInstance` に含まれるオプションの詳細については、[PluginExtensionInstance](#pluginextensioninstance) セクションを参照してください。 #### 使用例 [Section titled “使用例”](#使用例-2) ```javascript // 例 1: すべての拡張インスタンスとそのメタデータをログ出力する const extensionInstances = reearth.extension.list; extensionInstances.forEach((instance) => { console.log("Extension Instance ID:", instance.id); console.log("Plugin ID:", instance.pluginId); console.log("Name:", instance.name); console.log("Extension ID:", instance.extensionId); console.log("Type:", instance.extensionType); console.log("Run Times:", instance.runTimes ?? "Not Available"); }); // 例 2: ウィジェット拡張のみをフィルタリングしてログ出力する const widgets = reearth.extension.list.filter( (instance) => instance.extensionType === "widget" ); console.log("Widget Extensions:"); widgets.forEach((widget) => { console.log(`- ${widget.name} (ID: ${widget.id})`); }); ``` ## メソッド [Section titled “メソッド”](#メソッド) ### postMessage [Section titled “postMessage”](#postmessage) このメソッドにより、プラグイン拡張は一意の ID を指定して特定のウィジェット、ブロック、または他の拡張インスタンスにメッセージを送信できます。この機能はプラグイン内のコンポーネント間通信を実現するために有用です。 #### 構文 [Section titled “構文”](#構文-3) ```ts reearth.extension.postMessage(id: string, message: any) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ) ##### `id` [Section titled “id”](#id) **型**: `string` メッセージの送信先となるターゲットインスタンスの拡張 ID です。 ##### `message` [Section titled “message”](#message) **型**: `any` 送信するメッセージです。 #### 戻り値: [Section titled “戻り値:”](#戻り値-3) なし(void)。このメソッドは値を返さずに処理を実行します。 #### 使用例 [Section titled “使用例”](#使用例-3) ```javascript // "my-widget-name" という名前のウィジェットにメッセージを送信する const extensionInstances = reearth.extension.list; const targetWidgetId = extensionInstances.find( (extension) => extension.name === "my-widget-name" )?.id; if (targetWidgetId) { reearth.extension.postMessage(targetWidgetId, { action: "update", data: { key: "value" }, }); } ``` ## イベント [Section titled “イベント”](#イベント) ノート 共通のイベントメソッド(`on`、`off`)の詳細については、[イベント](/ja/developer/plugin/api-reference/events) ページを参照してください。 ### message [Section titled “message”](#message-1) `message` イベントは、拡張に対してメッセージが送信されるたびにトリガーされます。このイベントは\*\*現在の拡張の UI(またはモーダル、ポップアップ)\*\*からのメッセージを受信するために使用されます。 #### 構文 [Section titled “構文”](#構文-4) ```ts reearth.extension.on("message", (message: unknown) => void): void; ``` #### 使用例 [Section titled “使用例”](#使用例-4) ```javascript reearth.extension.on("message", (message) => { console.log("Received message:", message); }); ``` ### extensionMessage [Section titled “extensionMessage”](#extensionmessage) `extensionMessage` イベントは、**別の拡張インスタンス**からメッセージが送信されたときにトリガーされます。データペイロードと送信者の ID を含む追加のコンテキストを提供します。 #### 構文 [Section titled “構文”](#構文-5) ```ts reearth.extension.on("extensionMessage", (props: ExtensionMessage) => void): void; ``` #### 使用例 [Section titled “使用例”](#使用例-5) ```javascript reearth.extension.on("extensionMessage", (props) => { console.log("Message from:", props.sender); console.log("Message data:", props.data); }); ``` ## 型定義 [Section titled “型定義”](#型定義) ### PluginStoryBlock [Section titled “PluginStoryBlock”](#pluginstoryblock) ```javascript type PluginStoryBlock = Omit< StoryBlock, "propertyForPluginAPI" | "propertyItemsForPluginBlock" >; type StoryBlock = { id: string; name?: string | null; pluginId: string; extensionId: string; extensionType?: "storyBlock"; propertyId?: string; property?: any; propertyForPluginAPI?: any; propertyItemsForPluginBlock?: Item[]; }; ``` **`id: string;`**: ストーリーブロックの一意の識別子です。複数のブロックを扱う際に各ブロックを区別するために必要です。 **`name?: string | null;`**: ストーリーブロックの名前です。省略可能で、指定されない場合は `null` になることがあります。 **`pluginId: string;`**: このストーリーブロックが属するプラグインの一意の ID です。ブロックを親プラグインに関連付けるために使用します。 **`extensionId: string;`**: このブロックを作成したプラグイン拡張の一意の ID です。プラグイン内でブロックのソースを追跡するために有用です。 **`extensionType?: "storyBlock";`**: 拡張のタイプを `"storyBlock"` として指定します。このプロパティにより、`infoboxBlock` などの他のブロックタイプと区別できます。 **`propertyId?: string;`**: ブロックの設定や他の場所に保存されたメタデータにリンクする省略可能なプロパティ ID です。 **`property?: any;`**: ブロックに関連付けられたカスタムプロパティです。 ### PluginInfoboxBlock [Section titled “PluginInfoboxBlock”](#plugininfoboxblock) ```javascript type PluginInfoboxBlock = Omit< InfoboxBlock, "propertyForPluginAPI" | "propertyItemsForPluginBlock" >; type InfoboxBlock

= { id: string; name?: string; pluginId?: string; extensionId?: string; extensionType?: "infoboxBlock"; propertyId?: string; property?: P; propertyForPluginAPI?: any; propertyItemsForPluginBlock?: Item[]; }; ``` **`id: string;`**: インフォボックスブロックの一意の識別子です。各ブロックを容易に識別できるようにします。 **`name?: string;`**: インフォボックスブロックの省略可能な名前です。インフォボックスのラベルやタイトルを表すことがあります。 **`pluginId?: string;`**: このインフォボックスブロックが属するプラグインの一意の ID です。省略可能で、常に存在するとは限りません。 **`extensionId: string;`**: このインフォボックスブロックを作成したプラグイン拡張の一意の ID です。その出所を識別するために使用します。 **`extensionType?: "infoboxBlock";`**: 拡張のタイプを `"infoboxBlock"` として指定します。処理するブロックのタイプを判別するために重要なプロパティです。 **`propertyId?: string;`**: ブロックの設定やメタデータにリンクする省略可能なプロパティ ID です。`PluginStoryBlock` と同様に、動的なプロパティ管理を可能にします。 **`property?: P;`**: ブロックに関連付けられたカスタムプロパティを表します。型はジェネリックパラメータ `P` によって決定され、プラグインの特定のニーズに合わせて動的に適応できます。 ### Layer [Section titled “Layer”](#layer) ```javascript type Layer = { id: string; // A unique identifier for the layer. title?: string; visible?: boolean; // Flag indicating whether the layer is visible by default. Default is true infobox?: Infobox; // An infobox that can display additional interactive or informational content type: "simple"; data?: { type: | "geojson" | "3dtiles" | "osm-buildings" | "google-photorealistic" | "czml" | "csv" | "wms" | "mvt" | "kml" | "gpx" | "shapefile" | "gtfs" | "gml" | "georss" | "gltf" | "tiles" | "tms" | "heatMap"; url?: string; // URL of data source value?: any; layers?: string | string[]; jsonProperties?: string[]; isSketchLayer?: boolean; updateInterval?: number; // milliseconds parameters?: Record; idProperty?: string; time?: { property?: string; interval?: number; // milliseconds updateClockOnLoad?: boolean; }; csv?: { idColumn?: string | number; latColumn?: string | number; lngColumn?: string | number; heightColumn?: string | number; noHeader?: boolean; disableTypeConversion?: boolean; }; geojson?: { useAsResource?: boolean; }; }; properties?: any; defines?: Record; events?: Events; layerStyleId?: string; marker?: MarkerAppearance; polyline?: PolylineAppearance; polygon?: PolygonAppearance; model?: ModelAppearance; "3dtiles"?: Cesium3DTilesAppearance; }; ``` ### Widget [Section titled “Widget”](#widget-1) ```javascript type Widget = { readonly id: string; readonly pluginId?: string; readonly extensionId?: string; readonly property?: unknown; readonly propertyId?: string; readonly extended?: { horizontally: boolean; vertically: boolean; }; readonly layout?: WidgetLayout; }; ``` **`id: string;`**: ウィジェットの一意の識別子です。 **`pluginId?: string;`**:(省略可能)このウィジェットを所有するプラグインの ID です。ウィジェットがどのプラグインに属するかを識別するために有用です。 **`extensionId?: string;`**:(省略可能)ウィジェットを作成したプラグイン拡張の ID です。同じプラグインの異なる拡張によって作成されたウィジェットを区別するために使用できます。 **`property?: unknown;`**:(省略可能)ウィジェットに関連付けられたカスタムプロパティです。プロパティの正確な構造は、特定のプラグインの実装に依存します。 **`propertyId?: string;`**:(省略可能)ウィジェットの設定またはメタデータの一意の識別子です。外部設定や保存されたプロパティへのリンクに使用します。 **`extended?: { horizontally: boolean; vertically: boolean };`**:(省略可能)ウィジェットが特定の方向に拡張されているかどうかを示します。このプロパティはウィジェットのレイアウトと動作を判断するために有用です。 * `horizontally: boolean`: ウィジェットが水平方向に拡張されている場合は `true`、そうでない場合は `false`。 * `vertically: boolean`: ウィジェットが垂直方向に拡張されている場合は `true`、そうでない場合は `false`。 このプロパティは省略可能で、常に存在するとは限りません。省略された場合、ウィジェットはいずれの方向にも拡張されません。 **`layout?: WidgetLayout;`**:(省略可能)Re:Earth UI 内でのウィジェットの位置と配置を指定します。以下の [WidgetLayout](#widgetlayout) の定義を参照してください。 ### WidgetLayout [Section titled “WidgetLayout”](#widgetlayout) ```javascript type WidgetLayout = { location: WidgetLocation; align?: WidgetAlignment; }; ``` `WidgetLayout` 型は、Re:Earth インターフェース内でウィジェットがどのように配置されるかを定義します。 **`location: WidgetLocation;`**: インターフェース内でのウィジェットの正確な位置を指定します。詳細については [WidgetLocation](#widgetlocation) を参照してください。 **`align?: WidgetAlignment;`**:(省略可能)ウィジェットのエリア内での配置方法を決定します。指定しない場合はデフォルトの配置になります。詳細については [WidgetAlignment](#widgetalignment) を参照してください。 ### WidgetLocation [Section titled “WidgetLocation”](#widgetlocation) ```javascript type WidgetLocation = { zone: "inner" | "outer"; section: "left" | "center" | "right"; area: "top" | "middle" | "bottom"; }; ``` `WidgetLocation` 型は、`reearth` インターフェース内でのウィジェットの階層的な位置を定義します。UI ゾーンに対するウィジェットの配置位置を記述します。 **`zone: "inner" | "outer";`**: ウィジェットが配置される UI ゾーンを指定します: * `"inner"`: ウィジェットがメインコンテンツエリア内にあることを示します。 * `"outer"`: ウィジェットが周辺 UI(例: サイドバー、ヘッダー)にあることを示します。 **`section: "left" | "center" | "right";`**: ゾーン内のセクションを示します: * `"left"`: 左セクション。 * `"center"`: 中央セクション。 * `"right"`: 右セクション。 **`area: "top" | "middle" | "bottom";`**: セクション内の垂直エリアを定義します: * `"top"`: セクションの上部。 * `"middle"`: セクションの中央。 * `"bottom"`: セクションの下部。 ### WidgetAlignment [Section titled “WidgetAlignment”](#widgetalignment) ```javascript type WidgetAlignment = "start" | "centered" | "end"; ``` `WidgetAlignment` 型は、ウィジェットがそのエリア内でどのように整列されるかを指定します。 **`"start";`**: ウィジェットをエリアの先頭(例: 左上隅)に整列させます。 **`"centered";`**: ウィジェットをエリアの中央に配置します。 **`"end";`**: ウィジェットをエリアの末尾(例: 右下隅)に整列させます。 ### PluginExtensionInstance [Section titled “PluginExtensionInstance”](#pluginextensioninstance) ```javascript type PluginExtensionInstance = { readonly id: string; readonly pluginId: string; readonly name: string; readonly extensionId: string; readonly extensionType: "widget" | "block" | "infoboxBlock" | "storyBlock"; }; ``` **`id: string;`**: 拡張インスタンスの一意の識別子です。この ID は `reearth` 環境内でインスタンスを参照するために使用されます。 **`pluginId: string;`**: 拡張インスタンスが属するプラグインの一意の ID です。インスタンスを親プラグインにリンクします。 **`name: string;`**: 拡張インスタンスの名前です。通常、インスタンスを識別するための人が読める名前です。 **`extensionId: string;`**: インスタンスを作成したプラグイン拡張の一意の ID です。同じプラグイン内の拡張を区別するために使用します。 **`extensionType: "widget" | "block" | "infoboxBlock" | "storyBlock";`**: インスタンスが表す拡張のタイプです。指定可能な値は以下の通りです: * `"widget"`: ウィジェット拡張。 * `"infoboxBlock"`: インフォボックスブロック拡張。 * `"storyBlock"`: ストーリーブロック拡張。 # reearth.layers > `reearth.layers` の API リファレンスです。 **`reearth.layers`** 名前空間は、reearth シーン内のレイヤを管理・操作するためのメソッド群を提供します。プラグイン開発者はこれらのメソッドを使用して、レイヤのプログラム的な追加・検索・変更・削除を行うことができます。 ## プロパティ [Section titled “プロパティ”](#プロパティ) ### layers [Section titled “layers”](#layers) このプロパティは、**`reearth`** シーンに現在存在するすべてのレイヤのリストを提供します。プラグイン開発者はこれを使用して、必要に応じてレイヤへのアクセスや操作を行うことができます。このプロパティは **`LazyLayer`** オブジェクトの配列を返し、各オブジェクトはシーン内の個別のレイヤを表します。 #### 構文 [Section titled “構文”](#構文) ```ts reearth.layers.layers: LazyLayer[]; ``` #### 戻り値 [Section titled “戻り値”](#戻り値) **型** `LazyLayer[]` 各要素がシーン内の個別のレイヤを表す **`LazyLayer`** オブジェクトの配列です。 ノート **`LazyLayer`** オブジェクトはレイヤの軽量な表現形式です。プロパティへのアクセスは必要に応じて明示的に行う必要があります。 LazyLayer 型の詳細については、[LazyLayer 型](#lazylayer-%E5%9E%8B) セクションを参照してください。 ### overridden [Section titled “overridden”](#overridden) これは省略可能なプロパティで、`reearth` シーン内でプロパティがオーバーライドされたレイヤを提供します。このメソッドを使用することで、レイヤのオーバーライド状態を確認できます。ユーザー操作、アプリケーション状態の変化、または外部データの更新に応じてレイヤプロパティを調整する必要がある場合に特に有用です。 #### 構文 [Section titled “構文”](#構文-1) ```ts reearth.layers.overridden: OverriddenLayer[]; ``` #### 戻り値 [Section titled “戻り値”](#戻り値-1) **型** `Omit` `Layer` 型定義から `type` と `children` を除いた型です。 #### 使用例 [Section titled “使用例”](#使用例) ```javascript // Check if there are any overridden properties defined if (reearth.layers.overridden) { console.log("Overridden properties are defined."); // Iterate through the overridden properties and log each one for (const layer of reearth.layers.overridden) { console.log(`Layer ID: ${layer.id}, Overridden Properties:`, layer); } } else { console.log("No overridden properties are defined."); } ``` ### selected [Section titled “selected”](#selected) これは `reearth` プロジェクト内で現在選択されているレイヤを表します。レイヤが選択されている場合は `ComputedLayer` オブジェクトを保持し、選択されていない場合は `undefined` となる省略可能なプロパティです。このプロパティを使用することで、選択中のレイヤの詳細に直接アクセスでき、特定のレイヤデータの照会、プロパティの変更、または UI コンポーネントへの追加情報の表示など、ユーザーの選択に依存した操作を容易に行うことができます。 #### 構文 [Section titled “構文”](#構文-2) ```ts reearth.layers.selected?: computedLayer; ``` #### 戻り値 [Section titled “戻り値”](#戻り値-2) **型** `ComputedLayer` すべての処理が完了した後に得られるレイヤで、元の地理データと処理済みの地理データの両方、および適用・評価済みのスタイルと状態を含みます。 ノート **`ComputedLayer`** オブジェクトはレイヤの軽量な表現形式です。プロパティへのアクセスは必要に応じて明示的に行う必要があります。 ComputedLayer 型の詳細については、[ComputedLayer 型](#computedlayer-%E5%9E%8B) セクションを参照してください。 #### 使用例 [Section titled “使用例”](#使用例-1) ```javascript // Check if there is a selected layer and log its details if (reearth.layers.selected) { console.log("Selected Layer ID:", reearth.layers.selected.id); console.log("Selected Layer Title:", reearth.layers.selected.layer?.title); } else { console.log("No layer is currently selected."); } ``` ### selectedFeature [Section titled “selectedFeature”](#selectedfeature) これは `reearth` プロジェクト内で現在選択されているフィーチャーを表します。フィーチャーが選択されている場合は `feature` オブジェクトを保持し、選択されていない場合は `undefined` となる省略可能なプロパティです。このプロパティを使用することで、選択中のフィーチャーの詳細に直接アクセスでき、特定のフィーチャーデータの照会やプラグイン拡張への追加情報の表示など、ユーザーの選択に依存した操作を容易に行うことができます。 #### 構文 [Section titled “構文”](#構文-3) ```ts reearth.layers.selectedFeature?: computedFeature; ``` #### 戻り値 [Section titled “戻り値”](#戻り値-3) **型** `ComputedFeature` すべての最終評価済みプロパティとスタイルが適用された、単一の地理的フィーチャー(点、線、ポリゴン等)です。 ノート ComputedFeature 型の詳細については、[ComputedFeature 型](#computedfeature-%E5%9E%8B) セクションを参照してください。 #### 使用例 [Section titled “使用例”](#使用例-2) ```javascript // Check if there is a selected feature and log its details if (reearth.layers.selectedFeature) { console.log("Selected Feature ID:", reearth.layers.selectedFeature.id); } else { console.log("No Feature is currently selected."); } ``` ## メソッド [Section titled “メソッド”](#メソッド) ### add [Section titled “add”](#add) このメソッドは、**`reearth`** シーンに新しいレイヤを追加するために使用します。画像、データ表現、インタラクティブウィジェットなどの追加コンテンツレイヤでシーンを動的に拡張するために欠かせないメソッドです。主な引数として **`Layer`** オブジェクトを受け取り、追加するレイヤの特性とプロパティを定義します。 #### 構文 [Section titled “構文”](#構文-4) ```ts reearth.layers.add: (layer: Layer) => string | undefined; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ) ##### `layer` [Section titled “layer”](#layer) **型**: `Layer` レイヤの作成と管理に必要なすべてのデータとメタデータを含むオブジェクトです。シーンに追加するレイヤの特性とプロパティを定義します。 ノート Layer 型およびレイヤアピアランス型の詳細については、[Layer 型](#layer-%E5%9E%8B) および [レイヤアピアランス型](#%E3%83%AC%E3%82%A4%E3%83%A4%E3%82%A2%E3%83%94%E3%82%A2%E3%83%A9%E3%83%B3%E3%82%B9%E5%9E%8B) セクションを参照してください。 #### 戻り値 [Section titled “戻り値”](#戻り値-4) **型** `string | undefined` 操作が成功した場合、新しく追加されたレイヤの一意の識別子 `id` を返します。この識別子は以降の操作や照会に使用できます。操作が失敗した場合は `undefined` を返します。 #### 使用例 [Section titled “使用例”](#使用例-3) * マーカーの追加 ```javascript const newLayerId = reearth.layers.add({ type: "simple", data: { type: "geojson", value: { type: "FeatureCollection", features: [ { type: "Feature", properties: {}, geometry: { coordinates: [139.97422779688281, 35.74642872517698], type: "Point", }, }, ], }, }, // marker property is required to indicate that the layer needs a marker appearance marker: {}, }); if (newLayerId) { console.log("Layer added successfully with ID:", newLayerId); } else { console.log("Failed to add layer."); } ``` * ポリラインの追加 ```javascript const newLayerId = reearth.layers.add({ type: "simple", data: { type: "geojson", value: { type: "FeatureCollection", features: [ { type: "Feature", properties: {}, geometry: { coordinates: [ [139.93007825346956, 35.81332779614391], [139.8105822019014, 35.730789521095986], ], type: "LineString", }, }, ], }, }, // polyline property is required to indicate that the layer needs a polyline appearance polyline: {}, }); if (newLayerId) { console.log("Layer added successfully with ID:", newLayerId); } else { console.log("Failed to add layer."); } ``` * ポリゴンの追加 ```javascript const newLayerId = reearth.layers.add({ type: "simple", data: { type: "geojson", value: { type: "FeatureCollection", features: [ { type: "Feature", properties: {}, geometry: { coordinates: [ [ [139.56560369329821, 35.859787461762906], [139.56560369329821, 35.586320662892106], [139.73648312259508, 35.586320662892106], [139.73648312259508, 35.859787461762906], [139.56560369329821, 35.859787461762906], ], ], type: "Polygon", }, }, ], }, }, // polygon property is required to indicate that the layer needs a polygon appearance polygon: {}, }); if (newLayerId) { console.log("Layer added successfully with ID:", newLayerId); } else { console.log("Failed to add layer."); } ``` * 3D モデルの追加 ```javascript const model3D = { type: "simple", data: { type: "geojson", value: { type: "Feature", geometry: { type: "Point", coordinates: [139.6917, 35.6895], }, }, }, model: { url: "https://api.visualizer.test.reearth.dev/assets/01j90myth0wy2kq5agry8rh4fd.gltf", // 'Re:Earth' logo from asset heightReference: "relative", heading: 270, pitch: 0, roll: 0, scale: 100, silhouette: true, silhouetteColor: "red", }, }; reearth.layers.add(model3D); ``` * 3dtiles の追加 ```javascript // Define a 3D tile. This is a 3D tile of Chiyoda yard building in Tokyo. The co-ordinates are Latitude: 35.69393005 Longitude: 139.75371138. const tile3d = { type: "simple", data: { type: "3dtiles", url: "https://plateau.geospatial.jp/main/data/3d-tiles/bldg/13100_tokyo/13101_chiyoda-ku/notexture/tileset.json", }, "3dtiles": { show: true, color: { expression: { conditions: [ ["${_zmax} > 100", "color('red')"], ["true", "color('green')"], ], }, }, edgeWidth: 10, edgeColor: "#ffffff", selectedFeatureColor: "blue", }, }; reearth.layers.add(tile3d); ``` ### find [Section titled “find”](#find) このメソッドは、カスタム検索関数を適用して Reearth シーン内のレイヤを効率的に検索します。特定の属性、プロパティ、または条件など、動的に定義された基準を満たすレイヤを特定する際に有用です。各レイヤを評価するコールバック関数を受け取り、指定された条件を満たすレイヤに対して `true` を返します。これにより、シーンの特定部分を対象とした精密な操作や分析が可能となり、レイヤ管理の柔軟性と制御性が向上します。 #### 構文 [Section titled “構文”](#構文-5) ```ts reearth.layers.find: ( fn: (layer: LazyLayer, index: number) => boolean, ) => LazyLayer | undefined ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-1) ##### `fn` [Section titled “fn”](#fn) **型**: `(layer: LazyLayer, index: number) => boolean` シーン内の各レイヤを評価するためのコールバック関数です。この関数は以下の引数を受け取ります。 * **`layer: LazyLayer`**: レイヤのすべてのデータを含むオブジェクト。 * **`index: number`**: 現在のレイヤのインデックス。 #### 戻り値 [Section titled “戻り値”](#戻り値-5) **型** `LazyLayer | undefined` 指定されたテスト関数を満たす最初の **`LazyLayer`** オブジェクトを返します。条件を満たすレイヤが存在しない場合は **`undefined`** を返します。 #### 使用例 [Section titled “使用例”](#使用例-4) ```javascript //1. Define a search function to find the first visible layer const searchFunction = (layer, index) => { return layer.isVisible === true; }; // Use the find method to locate the first visible layer const foundLayer = reearth.layers.find(searchFunction); // Log the result or handle the case where no layer is found if (foundLayer) { console.log(`Found visible layer with ID: ${foundLayer.id}`); } else { console.log("No visible layer found."); } //2. Search for the first layer that is a 3D Tiles with the title "Re:Earth" and assign it to a variable. reearth.layers.find( (layer) => layer.data.type === "3dtiles" && layer.title === "Re:Earth" ); ``` ### findAll [Section titled “findAll”](#findall) このメソッドは、プロジェクト内のすべてのレイヤを対象に包括的な検索を実行し、指定された条件に一致するレイヤの配列を返します。プロジェクト内の各レイヤに適用するコールバック関数を受け取ります。 #### 構文 [Section titled “構文”](#構文-6) ```ts reearth.layers.findAll: (layer: LazyLayer, index: number) => boolean) => LazyLayer[] ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-2) ##### `layer` [Section titled “layer”](#layer-1) **型** `LazyLayer` レイヤの作成と管理に必要なすべてのデータとメタデータを含むオブジェクトです。 ##### `index` [Section titled “index”](#index) **型** `number` 階層内における現在のレイヤのインデックスです。 #### 戻り値 [Section titled “戻り値”](#戻り値-6) **型** `LazyLayer[]` コールバック関数で指定された条件を満たす `LazyLayer` オブジェクトの配列を返します。条件を満たすレイヤが存在しない場合は空の配列を返します。 #### 使用例 [Section titled “使用例”](#使用例-5) ```javascript //1. Define a search function to find all layers with a specific visibility setting const searchVisibleLayers = (layer) => layer.isVisible; // Use the findAll method to get all visible layers const visibleLayers = reearth.layers.findAll(searchVisibleLayers); // Output the IDs of the found layers console.log( "Visible layers found:", visibleLayers.map((layer) => layer.id) ); //2. Filter out layers where the type is "GeoJSON" and the title is exactly "sample". let filteredLayers = reearth.layers.findAll( (layer) => layer.data.type === "geojson" && layer.title === "sample" ); // Log the array of filtered layers to the console. This array contains all layers that meet the specified conditions. console.log("filteredLayers: ", filteredLayers); ``` ### findById [Section titled “findById”](#findbyid) このメソッドは、一意の識別子(ID)に基づいて特定のレイヤオブジェクトを取得するために設計されています。ID が既知のレイヤに直接アクセスする際に欠かせないメソッドで、プロパティの編集、表示のオン/オフ切り替え、またはレイヤ固有データの分析などを効率的かつ精密に行うことができます。レイヤ階層全体を検索・反復する必要なく、個別のレイヤへの直接アクセスを可能にします。検索対象のレイヤ ID を表す単一の文字列パラメータを受け取ります。 #### 構文 [Section titled “構文”](#構文-7) ```ts reearth.layers.findById: (layerId: string) => LazyLayer | undefined; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-3) ##### `layerId` [Section titled “layerId”](#layerid) **型** `string` シーン内で検索対象となるレイヤの一意の識別子です。 #### 戻り値 [Section titled “戻り値”](#戻り値-7) **型** `LazyLayer | undefined` 指定された ID を持つレイヤが見つかった場合、その `LazyLayer` オブジェクトを返します。一致するレイヤが存在しない場合は `undefined` を返します。 #### 使用例 [Section titled “使用例”](#使用例-6) ```javascript // Define the layer ID you are searching for const targetLayerId = "01j1rx8xhxsk2wdydew3m8hr6q"; // Attempt to find the layer by its ID const layer = reearth.layers.findById(targetLayerId); // Check if the layer was found and log the result or handle it accordingly if (layer) { console.log(`Layer found: ${layer.title}`); } else { console.log("No layer found with the specified ID:", targetLayerId); } ``` ### findByIds [Section titled “findByIds”](#findbyids) このメソッドは、レイヤ ID の配列に基づいて `reearth` シーンから複数のレイヤを同時に取得します。プロパティの一括更新、エフェクトの適用、グループ表示の管理など、複数の特定レイヤを同時に操作する必要があるアプリケーションに特に有用です。文字列引数のスプレッドを受け取り(各引数がレイヤ ID を表します)、各要素が `Layer` オブジェクトまたは `undefined` に対応する配列を返します。 #### 構文 [Section titled “構文”](#構文-8) ```ts reearth.layers.findByIds: (...layerIds: string[]) => (LazyLayer | undefined)[]; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-4) ##### `...layerIds` [Section titled “...layerIds”](#layerids) **型** `...string[]` 取得するレイヤの一意の識別子を表すレイヤ ID の配列です。1つまたは複数の ID を柔軟に入力できます。 使用時は配列を複数の引数としてスプレッドする必要があります。 #### 戻り値 [Section titled “戻り値”](#戻り値-8) **型** `(LazyLayer | undefined)[]` 各入力 ID に対応する `LazyLayer` オブジェクトまたは `undefined` を含む配列を返します。シーン内に ID に対応するレイヤが存在するかどうかに応じて値が決まります。返される配列の各位置は入力リストの ID の位置に直接対応しており、順序の一貫性が保たれます。指定した ID を持つレイヤが存在しない場合、その位置に `undefined` が返されます。 #### 使用例 [Section titled “使用例”](#使用例-7) ```javascript // Define an array of layer IDs to be searched const layerIds = ["01j1rx8xhxsk2wdydew3m8hr6q", "01j90ed9m6bxagb6bvfg4sk49q"]; // Retrieve the layers by their IDs const layers = reearth.layers.findByIds(...layerIds); // Process the results, handling both found and not found cases layers?.forEach((layer, index) => { if (layer) { console.log(`Layer found: ID = ${layer.id}, Title = ${layer.title}`); } else { console.log(`No layer found for ID: ${layerIds[index]}`); } }); ``` ### findFeatureById [Section titled “findFeatureById”](#findfeaturebyid) このメソッドは、フィーチャー ID に関連するフィーチャーを取得する手段を提供します。レイヤ ID とフィーチャー ID を受け取り、指定されたレイヤ ID とフィーチャー ID に一致する `Feature` オブジェクトを返します。 #### 構文 [Section titled “構文”](#構文-9) ```ts reearth.layers.findFeatureById: (layerId: string, featureId: string) => Feature | undefined; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-5) ##### `layerId` [Section titled “layerId”](#layerid-1) **型** `string` シーン内で検索対象となるレイヤの一意の識別子です。 ##### `featureId` [Section titled “featureId”](#featureid) **型** `string` レイヤ内のフィーチャーの一意の識別子です。 #### 戻り値 [Section titled “戻り値”](#戻り値-9) **型** `Feature | undefined` 指定されたレイヤ内で指定された ID を持つフィーチャーが見つかった場合、その `Feature` オブジェクトを返します。一致するフィーチャーが存在しない場合は `undefined` を返します。 ノート Feature 型の詳細については、[Feature 型](#feature-%E5%9E%8B) セクションを参照してください。 #### 使用例 [Section titled “使用例”](#使用例-8) ```javascript // Define the layer ID and feature ID you are searching for const targetLayerId = "01j90ed9m6bxagb6bvfg4sk49q"; const targetFeatureId = "6167fcb5-9564-4c8e-a4d3-d0b419f54ec6"; // Attempt to find the layer by its ID const feature = reearth.layers.findFeatureById(targetLayerId, targetFeatureId); // Check if the feature was found and log the result or handle it accordingly if (feature) { console.log(`feature found: ${feature.type}`); } else { console.log("No feature found with the specified ID:", targetFeatureId); } ``` ### findFeaturesByIds [Section titled “findFeaturesByIds”](#findfeaturesbyids) このメソッドは、1つ以上の指定されたフィーチャー ID でラベル付けされたすべてのフィーチャーを取得するために設計されています。単一のレイヤ ID と複数のフィーチャー ID を受け取り、指定されたレイヤ ID とフィーチャー ID に一致する `Feature` オブジェクトの配列を返します。 #### 構文 [Section titled “構文”](#構文-10) ```ts reearth.layers.findFeaturesByIds: (layerId: string, featureId: string[]) => Feature[] | undefined; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-6) ##### `layerId` [Section titled “layerId”](#layerid-2) **型** `string` シーン内で検索対象となるレイヤの一意の識別子です。 ##### `featureId` [Section titled “featureId”](#featureid-1) **型** `string[]` レイヤ内のフィーチャーの一意の識別子です。1つまたは複数の ID を柔軟に入力できます。 #### 戻り値 [Section titled “戻り値”](#戻り値-10) **型** `(Feature[] | undefined)` 指定されたレイヤ内で見つかったフィーチャー ID を持つ `Feature` オブジェクトの配列を返します。一致するフィーチャーが存在しない場合は `undefined` を返します。 #### 使用例 [Section titled “使用例”](#使用例-9) ```javascript // Define an array of layer IDs to be searched const layerId = "01j90ed9m6bxagb6bvfg4sk49q"; const featureIds = [ "6167fcb5-9564-4c8e-a4d3-d0b419f54ec6", "abae3164-f8b3-42bb-b194-0379ecc4c653", ]; // Retrieve the layers by their IDs const features = reearth.layers.findFeaturesByIds(layerId, featureIds); // Process the results, handling both found and not found cases features.forEach((feature, index) => { if (feature) { console.log(`Feature found: ID = ${feature.id}, Type = ${feature.type}`); } else { console.log(`No Feature found for ID: ${feature[index]}`); } }); ``` ### hide [Section titled “hide”](#hide) このメソッドは、提供されたレイヤ ID の配列に基づいて1つ以上のレイヤを非表示にするために設計されています。文字列引数のスプレッドを受け取り(各引数がレイヤの一意の識別子を表します)、呼び出されると指定された各レイヤの表示状態を `false` に設定し、プロジェクト内のビューから効果的に非表示にします。特定の条件やユーザー操作に基づいて、エンドユーザーに表示される要素を動的に制御するために特に有用です。 #### 構文 [Section titled “構文”](#構文-11) ```ts reearth.layers.hide : (...layerIds: string[]) => void ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-7) ##### `...layerIds` [Section titled “...layerIds”](#layerids-1) **型** `...string[]` 非表示にするレイヤの ID をそれぞれ表す文字列のスプレッドパラメータです。 #### 戻り値 [Section titled “戻り値”](#戻り値-11) **型** `なし(void)` このメソッドは値を返しません。 #### 使用例 [Section titled “使用例”](#使用例-10) ```javascript // Define the IDs of layers to be hidden const layerIdsToHide = [ "01j1rx8xhxsk2wdydew3m8hr6q", "01j90ed9m6bxagb6bvfg4sk49q", ]; // Hide the specified layers in the Reearth scene reearth.layers.hide(...layerIdsToHide); ``` ### show [Section titled “show”](#show) このメソッドは、`reearth` シーン内の指定されたレイヤの表示状態を `true` に設定するために使用します。ユーザーに表示するレイヤをプログラム的に制御でき、マップまたはシーン上のさまざまなデータセット、フィーチャー、またはグラフィック要素の表示を管理するための重要なツールです。ユーザー操作、アプリケーション状態、または特定の条件に基づいてレイヤを動的に表示・非表示にするシナリオに特に有用です。 #### 構文 [Section titled “構文”](#構文-12) ```ts reearth.layers.show: (...layerId: string[]) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-8) ##### `...layerIds` [Section titled “...layerIds”](#layerids-2) **型** `...string[]` 表示するレイヤの ID をそれぞれ表す文字列のスプレッドパラメータです。 #### 戻り値 [Section titled “戻り値”](#戻り値-12) **型** `なし(void)` このメソッドは値を返しません。 #### 使用例 [Section titled “使用例”](#使用例-11) ```javascript // Define the IDs of layers to be shown const layerIdsToShow = [ "01j1rx8xhxsk2wdydew3m8hr6q", "01j90ed9m6bxagb6bvfg4sk49q", ]; // Show the specified layers in the Reearth scene reearth.layers.show(...layerIdsToShow); ``` ### delete [Section titled “delete”](#delete) このメソッドは、`reearth` シーン内の指定されたレイヤを削除するために使用します。プラグインAPI によって追加された一時的なレイヤのみを削除します。レイヤの ID を主な引数として受け取ります。 #### 構文 [Section titled “構文”](#構文-13) ```ts reearth.layers.delete: (...layerId: string[]) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-9) ##### `...layerIds` [Section titled “...layerIds”](#layerids-3) **型** `...string[]` 削除するレイヤの ID をそれぞれ表す文字列のスプレッドパラメータです。 #### 戻り値 [Section titled “戻り値”](#戻り値-13) **型** `なし(void)` このメソッドは値を返しません。 #### 使用例 [Section titled “使用例”](#使用例-12) ```javascript // Define the IDs of layers to be deleted const layerIdsToDelete = [ "ed5cade3-4049-4626-a4c6-4e84baaef987", "0cdc12f8-4096-4a3c-84fa-0cc984130559", ]; // Show the specified layers in the Reearth scene reearth.layers.delete(...layerIdsToDelete); ``` ### override [Section titled “override”](#override) このメソッドは、ID によって指定されたレイヤのプロパティを動的にオーバーライドします。レイヤプロパティを変更することができます。表示状態、色、またはレイヤ構造で定義されたカスタム属性など、レイヤプロパティをオンザフライで変更できます。この動的な操作は、元のレイヤ設定を永続的に変更することなく、ユーザー操作、データ更新、またはその他のアプリケーションロジックに応じてレイヤ属性を変化させる必要があるレスポンシブなアプリケーションに不可欠です。レイヤの ID と部分的なレイヤオブジェクトの2つのパラメータを受け取ります。 #### 構文 [Section titled “構文”](#構文-14) ```ts reearth.layers.override: (layerId: string, properties: Partial) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-10) ##### `layerId` [Section titled “layerId”](#layerid-3) **型** `string` プロパティをオーバーライドするレイヤの一意の識別子です。 ##### `properties` [Section titled “properties”](#properties) **型** `Partial` Layer 型のいずれかのプロパティを省略可能な形で含むことができるオブジェクトです。 #### 戻り値 [Section titled “戻り値”](#戻り値-14) **型** `なし(void)` このメソッドは入力パラメータを必要とせず、値を返さずに処理を実行します。 #### 使用例 [Section titled “使用例”](#使用例-13) ```javascript // add a sample layer const sampleLayer = { type: "simple", data: { type: "geojson", value: { type: "Feature", geometry: { type: "Point", coordinates: [139.6917, 35.6895], }, }, }, marker: { style: "image", imageSize: 1, imageColor: "blue", }, }; const layerId = reearth.layers.add(sampleLayer); // Example to modify the style // We should hav a big red marker instead of a small blue one reearth.layers.override(layerId, { marker: { imageSize: 5, imageColor: "red", }, }); ``` ### select [Section titled “select”](#select) このメソッドは、`reearth` シーン内の特定のレイヤをプログラム的に選択するために使用します。 #### 構文 [Section titled “構文”](#構文-15) ```ts reearth.layers.select: (layerId?: string) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-11) ##### `layerId` [Section titled “layerId”](#layerid-4) **型** `string` 選択するレイヤの一意の識別子です。 #### 戻り値 [Section titled “戻り値”](#戻り値-15) **型** `なし(void)` このメソッドは入力パラメータを必要とせず、値を返さずに処理を実行します。 #### 使用例 [Section titled “使用例”](#使用例-14) ```javascript // Select a layer by ID reearth.layers.select("01j1rx8xhxsk2wdydew3m8hr6q"); ``` ### selectFeature [Section titled “selectFeature”](#selectfeature) このメソッドは、`reearth` シーン内の特定のフィーチャーをプログラム的に選択するために使用します。特定のフィーチャーをハイライトまたはフォーカスするために不可欠で、インフォボックスやその他のコンテキスト情報の表示など、追加の UI 要素やアクションをトリガーすることができます。 #### 構文 [Section titled “構文”](#構文-16) ```ts reearth.layers.selectFeature: (layerId?: string, featureId?: string) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-12) ##### `layerId` [Section titled “layerId”](#layerid-5) **型** `string` 選択するレイヤの一意の識別子です。 ##### `featureId` [Section titled “featureId”](#featureid-2) **型** `string` レイヤ内のフィーチャーの一意の識別子です。 #### 戻り値 [Section titled “戻り値”](#戻り値-16) **型** `なし(void)` このメソッドは入力パラメータを必要とせず、値を返さずに処理を実行します。 #### 使用例 [Section titled “使用例”](#使用例-15) ```javascript // Layer ID and feature ID to be selected const layerId = "01j90ed9m6bxagb6bvfg4sk49q"; const featureId = "6167fcb5-9564-4c8e-a4d3-d0b419f54ec6"; // Select the layer reearth.layers.selectFeature(layerId, featureId); ``` ### selectFeatures [Section titled “selectFeatures”](#selectfeatures) このメソッドは、`reearth` シーン内の特定の複数フィーチャーをプログラム的に選択するために使用します。特定のフィーチャーをハイライトまたはフォーカスするために不可欠で、インフォボックスやその他のコンテキスト情報の表示など、追加の UI 要素やアクションをトリガーすることができます。 #### 構文 [Section titled “構文”](#構文-17) ```ts reearth.layers.selectFeatures: (targets: { layerId?: string; featureId?: string[] }[]) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-13) ##### `targets` [Section titled “targets”](#targets) **型** `{ layerId?: string; featureId?: string[] }[]` * **`layerId: string`**: 選択するレイヤの一意の識別子。 * **`featureId: string[]`**: 各要素がフィーチャーの ID を表す文字列の配列。 #### 戻り値 [Section titled “戻り値”](#戻り値-17) **型** `なし(void)` このメソッドは入力パラメータを必要とせず、値を返さずに処理を実行します。 #### 使用例 [Section titled “使用例”](#使用例-16) ```javascript // add a sample layer const chiyodaLayerId = reearth.layers.add({ type: "simple", data: { type: "3dtiles", url: "https://assets.cms.plateau.reearth.io/assets/ca/ee4cb0-9ce4-4f6c-bca1-9c7623e84cb1/13100_tokyo23-ku_2022_3dtiles_1_1_op_bldg_13101_chiyoda-ku_lod2_no_texture/tileset.json", }, ["3dtiles"]: { selectedFeatureColor: "red", }, }); const chuoLayerId = reearth.layers.add({ type: "simple", data: { type: "3dtiles", url: "https://assets.cms.plateau.reearth.io/assets/4a/30f295-cd07-46b0-b0ab-4a4b1b3af06b/13100_tokyo23-ku_2022_3dtiles_1_1_op_bldg_13102_chuo-ku_lod2_no_texture/tileset.json", }, ["3dtiles"]: { selectedFeatureColor: "red", }, }); // NOTE: After 3dtiles been loaded, we can use this to select features // Select features by layer IDs and feature IDs reearth.layers.selectFeatures([ { layerId: chiyodaLayerId, featureId: [ "f9f2275bcf13a9674ba81473bc129ed6", "b9a4fd90ca6112eccd43bfffd4aeb2fe", ], }, { layerId: chuoLayerId, featureId: [ "acf77feceabce515700a47021bfe63dc", "4dcf088a80f1eaaf73b1f356f7446298", ], }, ]); ``` ## イベント [Section titled “イベント”](#イベント) ノート 共通イベントメソッド(`on`、`off`)の詳細については、[イベント](/ja/developer/plugin/api-reference/events) ページを参照してください。 ### select [Section titled “select”](#select-1) このイベントは、`reearth` シーン内でレイヤが選択されたときにトリガーされます。レイヤ選択イベントを監視し、カスタムアクションや動作で応答する手段を提供します。 #### 構文 [Section titled “構文”](#構文-18) ```ts reearth.layers.on('select', (selection: LayerSelection) => void) ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-14) ##### selection [Section titled “selection”](#selection) **型** `LayerSelection:[layerId: string | undefined, featureId: string | undefined]` * **`layerId: string | undefined`**: 選択されたレイヤの一意の識別子。 * **`featureId: string | undefined`**: 選択されたフィーチャーの一意の識別子。 #### 使用例 [Section titled “使用例”](#使用例-17) ```javascript const layerId = reearth.layers.add({ type: "simple", data: { type: "geojson", value: { type: "FeatureCollection", features: [ { type: "Feature", properties: {}, geometry: { coordinates: [139.97422779688281, 35.74642872517698], type: "Point", }, }, ], }, }, marker: {}, }); reearth.camera.lookAt({ lat: 35.74642872517698, lng: 139.97422779688281, height: 1000, }); reearth.layers.on("select", (layerId, featureId) => { console.log( `Layer selection: Layer ID: ${layerId}, Feature ID: ${featureId}` ); }); ``` ## 型定義 [Section titled “型定義”](#型定義) ### Layer 型 [Section titled “Layer 型”](#layer-型) レイヤの作成と管理に必要なすべてのデータとメタデータを含むオブジェクトです。 ```javascript type Layer = { id: string; // A unique identifier for the layer. title?: string; visible?: boolean; // Flag indicating whether the layer is visible by default. Default is true infobox?: Infobox; // An infobox that can display additional interactive or informational content type: "simple"; data?: { type: | "geojson" | "3dtiles" | "osm-buildings" | "reearth-buildings" | "google-photorealistic" | "czml" | "csv" | "wms" | "mvt" | "kml" | "gpx" | "shapefile" | "gtfs" | "gml" | "georss" | "gltf" | "tiles" | "tms" | "heatMap"; url?: string; // URL of data source value?: any; layers?: string | string[]; jsonProperties?: string[]; isSketchLayer?: boolean; updateInterval?: number; // milliseconds parameters?: Record; idProperty?: string; time?: { property?: string; interval?: number; // milliseconds updateClockOnLoad?: boolean; }; csv?: { idColumn?: string | number; latColumn?: string | number; lngColumn?: string | number; heightColumn?: string | number; noHeader?: boolean; disableTypeConversion?: boolean; }; geojson?: { useAsResource?: boolean; }; }; properties?: any; defines?: Record; events?: Events; layerStyleId?: string; marker?: MarkerAppearance; polyline?: PolylineAppearance; polygon?: PolygonAppearance; model?: ModelAppearance; "3dtiles"?: Cesium3DTilesAppearance; }; ``` ### LazyLayer 型 [Section titled “LazyLayer 型”](#lazylayer-型) レイヤの軽量な表現形式です。 ```javascript type LazyLayer = Readonly & { computed?: Readonly; isTempLayer?: boolean; pluginId?: string; extensionId?: string; property?: any; propertyId?: string; isVisible?: boolean; }; ``` ### ComputedLayer 型 [Section titled “ComputedLayer 型”](#computedlayer-型) すべての処理が完了した後に得られるレイヤで、元の地理データと処理済みの地理データの両方、および適用・評価済みのスタイルと状態を含みます。 ```javascript type ComputedLayer = { id: string; status: "fetching" | "ready"; layer: Layer; originalFeatures: Feature[]; features: ComputedFeature[]; properties?: any; }; ``` ### レイヤアピアランス型 [Section titled “レイヤアピアランス型”](#レイヤアピアランス型) 各レイヤタイプのプロパティです。 * Marker ```javascript type MarkerAppearance = { show?: boolean; height?: number; heightReference?: "none" | "clamp" | "relative"; style?: "none" | "point" | "image"; pointSize?: number; pointColor?: string; pointOutlineColor?: string; pointOutlineWidth?: number; image?: string; imageSize?: number; imageSizeInMeters?: boolean; imageHorizontalOrigin?: "left" | "center" | "right"; imageVerticalOrigin?: "top" | "center" | "baseline" | "bottom"; imageColor?: string; imageCrop?: "none" | "rounded" | "circle"; imageShadow?: boolean; imageShadowColor?: string; imageShadowBlur?: number; imageShadowPositionX?: number; imageShadowPositionY?: number; label?: boolean; labelText?: string; labelPosition?: | "left" | "right" | "top" | "bottom" | "lefttop" | "leftbottom" | "righttop" | "rightbottom"; labelTypography?: { fontFamily?: string; fontSize?: number; fontWeight?: number; color?: string; italic?: boolean; underline?: boolean; }; labelBackground?: boolean; labelBackgroundColor?: string; labelBackgroundPaddingHorizontal?: number; labelBackgroundPaddingVertical?: number; extrude?: boolean; near?: number; //The unit is meter far?: number; //The unit is meter hideIndicator?: boolean; selectedFeatureColor?: string; // This doesn't support expression }; ``` * Polyline ```javascript type PolylineAppearance = { show?: boolean; clampToGround?: boolean; strokeColor?: string; strokeWidth?: number; shadows?: "disabled" | "enabled" | "cast_only" | "receive_only"; near?: number; far?: number; classificationType?: "both" | "terrain" | "3dtiles"; hideIndicator?: boolean; selectedFeatureColor?: string; // This doesn't support expression }; ``` * Polygon ```javascript type PolygonAppearance = { show?: boolean; fill?: boolean; fillColor?: string; stroke?: boolean; strokeColor?: string; strokeWidth?: number; heightReference?: "none" | "clamp" | "relative"; shadows?: "disabled" | "enabled" | "cast_only" | "receive_only"; near?: number; far?: number; extrudedHeight?: number; classificationType?: "both" | "terrain" | "3dtiles"; hideIndicator?: boolean; selectedFeatureColor?: string; // This doesn't support expression }; ``` * Model ```javascript type ModelAppearance = { show?: boolean; url?: string; heightReference?: "none" | "clamp" | "relative"; heading?: number; pitch?: number; roll?: number; scale?: number; maximumScale?: number; minimumPixelSize?: number; animation?: boolean; shadows?: "disabled" | "enabled" | "cast_only" | "receive_only"; colorBlend?: "none" | "highlight" | "replace" | "mix"; color?: string; colorBlendAmount?: number; lightColor?: string; near?: number; far?: number; pbr?: boolean; imageBasedLightIntensity?: number; }; ``` * 3dtiles ```javascript type Cesium3DTilesAppearance = { show?: boolean; color?: string; styleUrl?: string; // url of style json file shadows?: "disabled" | "enabled" | "cast_only" | "receive_only"; colorBlendMode?: "highlight" | "replace" | "mix" | "default"; selectedFeatureColor?: string; // This doesn't support expression tileset?: string; pbr?: boolean; // physically-based rendering showWireframe?: boolean; showBoundingVolume?: boolean; }; ``` ### Feature 型 [Section titled “Feature 型”](#feature-型) フィーチャーの作成と管理に必要なすべてのデータとメタデータを含むオブジェクトです。 ```javascript type Feature = { type: "feature" | "computedFeature"; id: string; // feature ID geometry?: Geometry; interval?: [start: Date, end?: Date]; properties?: any; // Map engine specific information. metaData?: { description?: string; }; range?: DataRange; }; ``` ### ComputedFeature 型 [Section titled “ComputedFeature 型”](#computedfeature-型) すべての最終評価済みプロパティとスタイルが適用された、単一の地理的フィーチャー(点、線、ポリゴン等)です。 ```javascript type ComputedFeature = { type: "computedFeature"; id: string; // feature ID geometry?: Geometry; interval?: [start: Date, end?: Date]; properties?: any; // Map engine specific information. metaData?: { description?: string; }; range?: DataRange; // AppearanceTypes marker?: MarkerAppearance; polyline?: PolylineAppearance; polygon?: PolygonAppearance; model?: ModelAppearance; "3dtiles"?: Cesium3DTilesAppearance; }; ``` # reearth.modal > `reearth.modal` の API リファレンスです。 **`reearth.modal`** 名前空間は、`reearth` 内のモーダルダイアログコンポーネントの構造と機能を定義します。 ## メソッド [Section titled “メソッド”](#メソッド) ### show [Section titled “show”](#show) このメソッドは、**`reearth`** 内でカスタマイズ可能な HTML コンテンツを持つモーダルウィンドウを表示します。開発者はモーダルのサイズ・背景・モーダル外クリック時の動作を定義できます。 #### 構文 [Section titled “構文”](#構文) ```ts reearth.modal.show: ( html: string, options?: Options ) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ) ##### `html` [Section titled “html”](#html) **型**: `string` モーダル内に表示する HTML コンテンツの文字列です。 ##### `options` [Section titled “options”](#options) **省略可能** モーダルの外観と動作をカスタマイズするオブジェクトです。 **型**: ```ts type Options = { width?: number | string; height?: number | string; background?: string; clickBgToClose?: boolean; }; ``` * **`width?: number | string;`**: モーダルの幅を指定します。指定しない場合はデフォルトの幅が使用されます。 * **`height?: number | string;`**: モーダルの高さを指定します。省略するとデフォルトの高さが適用されます。 * **`background?: string;`**: モーダルの背景色または CSS 値を指定します(例: `"#fff"`、`"rgba(0, 0, 0, 0.5)"`)。 * **`clickBgToClose?: boolean;`**: モーダルの背景をクリックしたときにモーダルを閉じるかどうかを設定します。`true` にするとこの機能が有効になります。デフォルトは `false` です。 #### 戻り値: [Section titled “戻り値:”](#戻り値) なし(void)。このメソッドは値を返さずに処理を実行します。 #### 使用例 [Section titled “使用例”](#使用例) ```javascript // 使用例 1: カスタム HTML コンテンツを含むモーダルを表示する reearth.modal.show("

Welcome to Reearth!

", { width: 400, height: 300, background: "rgba(0, 0, 0, 0.5)", clickBgToClose: true, }); // 使用例 2: 大きめの固定サイズとソリッドな背景でモーダルを表示する reearth.modal.show( "

Important Information

Details about the project...

", { width: 600, height: 400, background: "#f8f8f8", clickBgToClose: false, } ); ``` ### postMessage [Section titled “postMessage”](#postmessage) このメソッドは、モーダルウィンドウと **`reearth`** の他の部分との間、またはモーダル内のコンポーネント間の通信を可能にします。モーダル内のユーザー操作を reearth に通知したり、他のコンポーネントにデータや処理を要求したりするなど、さまざまな用途に利用できます。 #### 構文 [Section titled “構文”](#構文-1) ```ts reearth.modal.postMessage: (message: any) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-1) ##### `message` [Section titled “message”](#message) **型**: `any` モーダルに送信するメッセージです。 #### 戻り値: [Section titled “戻り値:”](#戻り値-1) なし(void)。このメソッドは値を返さずに処理を実行します。 #### 使用例 [Section titled “使用例”](#使用例-1) ```javascript // 使用例 1: シンプルなテキストメッセージを送信する reearth.modal.postMessage("Hello, Re:Earth!"); // 使用例 2: Reearth アプリケーションにシンプルな文字列メッセージを送信する reearth.modal.postMessage("User clicked the button!"); // 使用例 3: オブジェクトメッセージを送信する reearth.modal.postMessage({ message: "greeting" }); // 使用例 4: ユーザーデータを含むオブジェクトを送信する reearth.modal.postMessage({ eventType: "userAction", details: { action: "submit", userId: 12345, }, }); ``` ### update [Section titled “update”](#update) このメソッドは、**`reearth`** 内で現在開いているモーダルの外観と動作を変更します。モーダルのサイズ・背景色・クリックで閉じる動作などのプロパティを動的に調整できます。 #### 構文 [Section titled “構文”](#構文-2) ```ts reearth.modal.update: (options: Options) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-2) ##### `options` [Section titled “options”](#options-1) モーダルの外観と動作を更新するプロパティを含むオブジェクトです。 **型**: ```ts type Options = { width?: number | string; height?: number | string; background?: string; clickBgToClose?: boolean; }; ``` * **`width?: number | string;`**: モーダルの新しい幅を設定します。 * **`height?: number | string;`**: モーダルの新しい高さを設定します。 * **`background?: string;`**: モーダルの新しい背景を設定します。 * **`clickBgToClose?: boolean;`**: モーダル外をクリックしたときに閉じるかどうかを設定します。`true` にするとユーザーが背景をクリックしたときにモーダルが閉じます。`false` にすると背景クリックでモーダルが閉じなくなります。 #### 戻り値: [Section titled “戻り値:”](#戻り値-2) なし(void)。このメソッドは値を返さずに処理を実行します。 #### 使用例 [Section titled “使用例”](#使用例-2) ```javascript // 使用例 1: 幅 300px・高さ 400px・ライトブルーの背景にリサイズする reearth.modal.update({ width: 300, height: 400, background: "#ADD8E6", clickBgToClose: true, }); // 使用例 2: カスタム背景色・大きめのサイズに更新し、クリックで閉じる機能を無効にする reearth.modal.update({ width: 600, height: 450, background: "rgba(0, 128, 128, 0.8)", clickBgToClose: false, // 背景クリックによるモーダルのクローズを防止 }); // 使用例 3: 背景クリックでモーダルを閉じられるようにする reearth.modal.update({ clickBgToClose: true, }); // 使用例 4: 他のプロパティを維持したままモーダルの幅のみ 300px に変更する reearth.modal.update({ width: 300, }); ``` ### close [Section titled “close”](#close) このメソッドは、開いているモーダルを閉じるために使用します。タスクの完了・論理的な条件・その他のユーザー操作に基づいてモーダルを非表示にできます。パラメータは不要です。 #### 構文 [Section titled “構文”](#構文-3) ```ts reearth.modal.close: () => void ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-3) なし #### 戻り値: [Section titled “戻り値:”](#戻り値-3) なし(void)。このメソッドは値を返さずに処理を実行します。 #### 使用例 [Section titled “使用例”](#使用例-3) ```ts // 現在開いているモーダルを閉じる reearth.modal.close(); ``` ## イベント [Section titled “イベント”](#イベント) ノート 共通イベントメソッド(`on`・`off`)の詳細については、[Events](/ja/developer/plugin/api-reference/events) ページを参照してください。 ### close [Section titled “close”](#close-1) close イベントは、**`reearth`** 内のモーダルが閉じられたときに発火します。このイベントを利用することで、モーダルが閉じられた際にリソースの解放・データの保存・UI の更新といった処理を実行できます。提供するオプションに応じて、リスナーを一度だけ実行するか繰り返し実行するかを設定できます。 #### 構文 [Section titled “構文”](#構文-4) ```ts reearth.modal.on("close", () => void): void; ``` #### 使用例 [Section titled “使用例”](#使用例-4) ```javascript reearth.modal.on("close", () => { console.log("The Modal was closed."); }); ``` # reearth.popup > `reearth.popup` の API リファレンスです。 **`reearth.popup`** 名前空間は、`reearth` 内のポップアップダイアログコンポーネントの構造と機能を定義します。 ## メソッド [Section titled “メソッド”](#メソッド) ### show [Section titled “show”](#show) show メソッドは、拡張ウィジェットまたはブロックを基準とした指定位置に、カスタム HTML コンテンツを含むポップアップを表示します。ポップアップの外観・位置・オフセットを設定できるため、さまざまな UI ニーズに柔軟に対応できます。 #### 構文 [Section titled “構文”](#構文) ```ts reearth.popup.show: ( html: string, options?: Options ) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ) ##### `html` [Section titled “html”](#html) **型**: `string` ポップアップ内に表示する HTML コンテンツの文字列です。 ##### `options` [Section titled “options”](#options) **省略可能** ポップアップの外観と配置をカスタマイズするプロパティを持つオブジェクトです。 **型**: ```ts type Options = { width?: number | string; height?: number | string; position?: PopupPosition; offset?: PopupOffset; }; ``` * **`width?: number | string;`**: ポップアップの幅を指定します。 * **`height?: number | string;`**: ポップアップの高さを指定します。 * **`position?: PopupPosition;`**: 基準点または要素に対するポップアップの表示位置を指定します。 ノート PopupPosition に含まれるオプションの詳細については、[PopupPosition](#popupposition) セクションを参照してください。 * **`offset?: PopupOffset`**: ポップアップの配置位置からの追加間隔またはオフセットを定義します。 ノート PopupOffset に含まれるオプションの詳細については、[PopupOffset](#popupoffset) セクションを参照してください。 #### 戻り値: [Section titled “戻り値:”](#戻り値) なし(void)。このメソッドは値を返さずに処理を実行します。 #### 使用例 [Section titled “使用例”](#使用例) ```javascript // 使用例 1. シンプルな通知ポップアップを表示する reearth.popup.show(`

You have successfully updated your profile.

`, { // ポップアップの幅を 300 ピクセルに設定 width: 300, // ポップアップの高さを 100 ピクセルに設定 height: 100, // 基準要素またはビューポートの下端右側にポップアップを配置 position: "bottom-end", // メイン軸とクロス軸に対して特定のオフセットでポップアップの位置を調整 offset: 10, // ターゲットから 10px のオフセットを設定 }); // 使用例 2. カスタム HTML・幅・両軸のオフセット調整を含むポップアップを表示する reearth.popup.show(`

Custom Popup Content

`, { width: "300px", height: "150px", position: "top-start", // ターゲットの左上にポップアップを配置 offset: { // 細かな配置調整のためのオフセットオブジェクト mainAxis: 15, // メイン軸に沿って 15px オフセット crossAxis: 10, // クロス軸に沿って 10px オフセット alignmentAxis: null, // アライメント調整なし }, }); // 使用例 3. デフォルトのサイズと位置でポップアップを表示する reearth.popup.show("

Simple Popup

"); ``` ### postMessage [Section titled “postMessage”](#postmessage) このメソッドは、ポップアップの iframe にメッセージを送信する機能を提供します。ポップアップが拡張スクリプトから情報を取得する必要があるシナリオでの通信に役立ちます。 #### 構文 [Section titled “構文”](#構文-1) ```ts reearth.popup.postMessage: (message: any) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-1) ##### `message` [Section titled “message”](#message) **型**: `any` 送信するメッセージです。 #### 戻り値: [Section titled “戻り値:”](#戻り値-1) なし(void)。このメソッドは値を返さずに処理を実行します。 #### 使用例 [Section titled “使用例”](#使用例-1) ```javascript // 使用例 1. ポップアップからシンプルな文字列メッセージを送信する reearth.popup.postMessage("Popup completed its task"); // 使用例 2. ユーザー操作の詳細を含むオブジェクトを送信する const userData = { action: "submit", details: { name: "John Doe", email: "john@example.com" }, }; reearth.popup.postMessage(userData); ``` ### update [Section titled “update”](#update) このメソッドを使用すると、ポップアップ iframe の外観と位置を変更できます。ポップアップを再作成することなく、幅・高さ・位置・オフセットなどのプロパティを動的に調整できます。 #### 構文 [Section titled “構文”](#構文-2) ```ts reearth.popup.update: (options: Options) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-2) ##### `options` [Section titled “options”](#options-1) ポップアップのサイズ・位置・オフセットを更新するプロパティを含むオブジェクトです。 **型**: ```ts type Options = { width?: number | string; height?: number | string; position?: PopupPosition; offset?: PopupOffset; }; ``` * **`width?: number | string;`**: ポップアップの新しい幅を設定します。 * **`height?: number | string;`**: ポップアップの新しい高さを設定します。 * **`position?: PopupPosition;`**: 基準点または要素に対するポップアップの新しい表示位置を指定します。 ノート PopupPosition に含まれるオプションの詳細については、[PopupPosition](#popupposition) セクションを参照してください。 * **`offset?: PopupOffset;`**: ポップアップの配置位置からの間隔またはオフセットを調整します。 ノート PopupOffset に含まれるオプションの詳細については、[PopupOffset](#popupoffset) セクションを参照してください。 #### 戻り値: [Section titled “戻り値:”](#戻り値-2) なし(void)。このメソッドは値を返さずに処理を実行します。 #### 使用例 [Section titled “使用例”](#使用例-2) ```javascript // 使用例 1. 両軸に対して特定のオフセット調整を加えてポップアップを更新する reearth.popup.update({ width: "250px", height: "100px", position: "bottom", // ターゲットの下に配置 offset: { // 詳細な調整のためのオフセットオブジェクト mainAxis: 10, // メイン軸でターゲットから 10px オフセット crossAxis: 5, // クロス軸に沿って 5px オフセット }, }); // 使用例 2. 新しいコンテンツや UI レイアウト変更に合わせてオフセットを調整する reearth.popup.update({ offset: { mainAxis: 25, crossAxis: 15 }, // メイン軸とクロス軸の両方のオフセットを調整 // 幅・高さ・位置は更新せず、オフセットのみ変更 }); // 使用例 3. 他のプロパティを維持したままポップアップの高さを調整する reearth.popup.update({ height: 200, // 高さを 200px に設定 }); ``` ### close [Section titled “close”](#close) このメソッドは、現在表示中のポップアップをプログラムから閉じるシンプルな手段を提供します。タスクの完了・論理的な条件・その他のユーザー操作に基づいてポップアップを非表示にできます。 #### 構文 [Section titled “構文”](#構文-3) ```ts reearth.popup.close: () => void ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-3) なし #### 戻り値: [Section titled “戻り値:”](#戻り値-3) なし(void)。このメソッドは値を返さずに処理を実行します。 #### 使用例 [Section titled “使用例”](#使用例-3) ```ts // 現在開いているポップアップを閉じる reearth.popup.close(); ``` ## イベント [Section titled “イベント”](#イベント) ノート 共通イベントメソッド(`on`・`off`)の詳細については、[Events](/ja/developer/plugin/api-reference/events) ページを参照してください。 ### close [Section titled “close”](#close-1) close イベントは、**`reearth`** 内のポップアップが閉じられたときに発火します。このイベントを利用することで、ポップアップが非表示になった際にリソースの解放・UI の更新・他コンポーネントへの通知といった特定の処理を実行できます。 #### 構文 [Section titled “構文”](#構文-4) ```ts reearth.popup.on("close", () => void): void; ``` #### 使用例 [Section titled “使用例”](#使用例-4) ```javascript reearth.popup.on("close", () => { console.log("The Popup was closed."); }); ``` ## 型定義 [Section titled “型定義”](#型定義) ### PopupPosition [Section titled “PopupPosition”](#popupposition) `PopupPosition` 型は、ターゲット要素に対してポップアップを表示する位置を制御します。拡張ウィジェットまたはブロックの上・下・左右に配置するための各種オプションと、アライメント調整(start・center・end)のオプションを提供します。 ```javascript type PopupPosition = | "top" | "top-start" | "top-end" | "right" | "right-start" | "right-end" | "bottom" | "bottom-start" | "bottom-end" | "left" | "left-start" | "left-end"; ``` **`top`**: ターゲットの真上にポップアップを配置します。 **`top-start`**: ターゲットの左上にポップアップを揃えます。 **`top-end`**: ターゲットの上かつ右側にポップアップを揃えます。 **`right`**: ターゲットの真右にポップアップを揃えます。 **`right-start`**: ターゲットの右側かつ上端にポップアップを揃えます。 **`right-end`**: ターゲットの右側かつ下端にポップアップを揃えます。 **`bottom`**: ターゲットの真下にポップアップを配置します。 **`bottom-start`**: ターゲットの下かつ左側にポップアップを揃えます。 **`bottom-end`**: ターゲットの下かつ右側にポップアップを揃えます。 **`left`**: ターゲットの真左にポップアップを配置します。 **`left-start`**: ターゲットの左側かつ上端にポップアップを揃えます。 **`left-end`**: ターゲットの左側かつ下端にポップアップを揃えます。 ### PopupOffset [Section titled “PopupOffset”](#popupoffset) `PopupOffset` 型を使用すると、拡張ウィジェットまたはブロックからのポップアップの距離を制御できます。メイン軸に沿ったオフセットを調整する数値と、メイン軸・クロス軸・アライメント軸など各軸を細かく制御するオブジェクトの 2 種類の指定方法があります。 ```javascript type PopupOffset = | number | { mainAxis?: number; crossAxis?: number; alignmentAxis?: number | null; }; ``` #### オプション [Section titled “オプション”](#オプション) ###### 数値 [Section titled “数値”](#数値) * 単一の数値を指定すると、ポップアップがメイン軸に沿ってターゲットに近づく方向または遠ざかる方向にシフトします。 * 使用例: 10 を指定すると、ポップアップがメイン軸に沿って 10 ピクセルシフトします。 ###### オブジェクト [Section titled “オブジェクト”](#オブジェクト) 以下のプロパティを持つ細かな制御が可能なオブジェクトです。 **`mainAxis?: number`**: ターゲットからのポップアップの距離をメイン軸に沿って調整します。正の値はポップアップをターゲットから遠ざけ、負の値は近づけます。 **`crossAxis?: number`**: メイン軸に垂直なクロス軸に沿ってポップアップの距離を調整します。正の値はポップアップを一方向に、負の値は逆方向に移動させます(方向は向きに依存します)。 **`alignmentAxis?: number | null`**: `crossAxis` と同じ軸ですが、アライメントが指定された配置にのみ適用され、`end` アライメントを反転させます。数値を設定すると `crossAxis` の値を上書きします。正の値はフローティング要素をアライメントされた辺の反対側の辺の方向に移動させ、負の値はその逆方向に移動させます。 # reearth.sketch > reearth.sketch の API リファレンスです。 Re:Earth Visualizer には強力なスケッチ機能が搭載されており、ユーザーはカスタムのマーカー、ポリライン、ポリゴンなどをマップ上に直接動的に描画できます。この機能は、プラグイン API の `reearth.sketch` を通じてアクセスできます。 ## プロパティ [Section titled “プロパティ”](#プロパティ) ### tool [Section titled “tool”](#tool) 現在のスケッチツールを取得します。 #### 構文 [Section titled “構文”](#構文) ```ts reearth.sketch.tool: SketchType; ``` #### 戻り値 [Section titled “戻り値”](#戻り値) **型** `SketchType = | "marker" | "polyline" | "circle" | "rectangle" | "polygon" | "extrudedCircle" | "extrudedRectangle" | "extrudedPolygon"` ### options [Section titled “options”](#options) 現在のスケッチオプションを取得します。 #### 構文 [Section titled “構文”](#構文-1) ```ts reearth.sketch.options: SketchOptions; ``` #### 戻り値 [Section titled “戻り値”](#戻り値-1) **型** ```ts type SketchOptions = { color?: string; appearance?: SketchAppearance; dataOnly?: boolean; disableShadow?: boolean; rightClickToAbort?: boolean; autoResetInteractionMode?: boolean; }; ``` * **color:** スケッチジオメトリの基本色を指定します。 * **appearance:** 描画完了後にスケッチジオメトリに適用されるスタイルを定義します。 * **dataOnly:** `true` に設定すると、描画後にマップへ新しいレイヤが追加されません。デフォルト: `false`(注意: Re:Earth Visualizer エディター内ではこのオプションは `true` に設定されます)。 * **disableShadow:** 描画されたジオメトリに影を表示するかどうかを設定します。デフォルト: `false`。 * **rightClickToAbort:** 右クリックで現在の描画を中止できるようにします。デフォルト: `true`(注意: Re:Earth Visualizer エディター内ではこのオプションは `false` に設定されます)。 * **autoResetInteractionMode:** 描画完了後にビューアのインタラクションモードを自動的にデフォルトにリセットします。デフォルト: `true`。 ノート SketchAppearance は LayerAppearance の部分的な実装です。詳細については、[レイヤアピアランス型](/ja/developer/plugin/api-reference/layers/#%E3%83%AC%E3%82%A4%E3%83%A4%E3%82%A2%E3%83%94%E3%82%A2%E3%83%A9%E3%83%B3%E3%82%B9%E5%9E%8B) を参照してください。 ## メソッド [Section titled “メソッド”](#メソッド) ### setTool [Section titled “setTool”](#settool) スケッチツールを特定のタイプに設定します。`undefined` を指定するとスケッチモードを終了します。 #### 構文 [Section titled “構文”](#構文-2) ```ts reearth.sketch.setTool: (type: SketchType | undefined) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ) ##### type [Section titled “type”](#type) **型** `SketchType | undefined` #### 戻り値 [Section titled “戻り値”](#戻り値-2) なし(void)。このメソッドは値を返しません。 ### overrideOptions [Section titled “overrideOptions”](#overrideoptions) 現在のスケッチオプションを上書きします。 #### 構文 [Section titled “構文”](#構文-3) ```ts reearth.sketch.overrideOptions: (options: SketchOptions) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-1) ##### options [Section titled “options”](#options-1) **型** `SketchOptions` #### 戻り値 [Section titled “戻り値”](#戻り値-3) なし(void)。このメソッドは値を返しません。 ## イベント [Section titled “イベント”](#イベント) ノート 共通のイベントメソッド(`on`、`off`)の詳細については、[イベント](/ja/developer/plugin/api-reference/events) ページを参照してください。 ### create [Section titled “create”](#create) このイベントは、スケッチ描画が正常に完了したときにトリガーされます。 #### 構文 [Section titled “構文”](#構文-4) ```ts reearth.sketch.on("create", (prop: SketchEventProps) => void); ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-2) ##### prop [Section titled “prop”](#prop) **型** ```ts type SketchEventProps = { layerId?: string; featureId?: string; feature?: SketchFeature; }; ``` * **layerId:** スケッチレイヤの ID です。`dataOnly` オプションが有効な場合、このプロパティは利用できません。 * **featureId:** スケッチフィーチャーの ID です。`dataOnly` オプションが有効な場合も利用できません。 * **feature:** `properties` に `id`、`type`、`positions`、`extrudedHeight` を含む `GeoJSON` オブジェクトです。 #### 使用例 [Section titled “使用例”](#使用例) ```ts reearth.sketch.setTool("polygon"); reearth.sketch.on("create", (props) => { console.log(`New sketch feature created:`, props); }); ``` ### toolChange [Section titled “toolChange”](#toolchange) このイベントは、スケッチツールが変更されたときにトリガーされます。 #### 構文 [Section titled “構文”](#構文-5) ```ts reearth.sketch.on("toolChange", (type: SketchType | undefined) => void); ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-3) ##### type [Section titled “type”](#type-1) **型** `SketchType | undefined` #### 使用例 [Section titled “使用例”](#使用例-1) ```ts reearth.sketch.on("toolChange", (tool) => { console.log(`Sketch tool changed:`, tool); }); // イベントを確認するために非同期で以下を実行してください: reearth.sketch.setTool("polygon"); reearth.sketch.setTool(undefined); ``` # reearth.timeline > `reearth.timeline` の API リファレンスです。 **`reearth.timeline`** 名前空間は、`reearth` 環境でタイムライン機能を管理・操作するためのメソッドとプロパティを提供します。時間ベースのデータやアニメーションを制御・監視・同期する必要があるシナリオ向けに設計されています。 ## プロパティ [Section titled “プロパティ”](#プロパティ) ### startTime [Section titled “startTime”](#starttime) startTime プロパティは、`reearth` 環境におけるタイムラインの開始点を表します。タイムラインが開始する時刻を定義するオプションの Date オブジェクトです。このプロパティは、プラグインが時間固有のデータやアニメーションを扱う必要がある場合に便利です。 #### 構文 [Section titled “構文”](#構文) ```ts reearth.timeline.startTime?: Date; ``` ###### `Date` [Section titled “Date”](#date) タイムラインの開始時刻を表す JavaScript Date オブジェクトです。startTime が定義されていない場合、タイムラインの開始時刻は関係ないか、動的に決定されます。 #### 使用例 [Section titled “使用例”](#使用例) ```javascript // 使用例: タイムラインの開始時刻を確認してログに出力する if (reearth.timeline.startTime) { console.log("Timeline Start Time:", reearth.timeline.startTime.toISOString()); } else { console.log("Timeline Start Time is not set."); } ``` ### stopTime [Section titled “stopTime”](#stoptime) stopTime プロパティは、`reearth` 環境におけるタイムラインの終了点を表します。タイムラインが停止する時刻を定義するオプションの Date オブジェクトです。このプロパティは、プラグイン内で時間制限のあるデータやアニメーションを管理する際に便利です。 #### 構文 [Section titled “構文”](#構文-1) ```ts reearth.timeline.stopTime?: Date; ``` ###### `Date` [Section titled “Date”](#date-1) タイムラインの停止時刻を表す JavaScript Date オブジェクトです。stopTime が定義されていない場合、タイムラインに固定の終了点がないか、動的に決定されることを示している場合があります。 #### 使用例 [Section titled “使用例”](#使用例-1) ```javascript // 使用例: タイムラインの停止時刻を確認してログに出力する if (reearth.timeline.stopTime) { console.log("Timeline Stop Time:", reearth.timeline.stopTime.toISOString()); } else { console.log("Timeline Stop Time is not set."); } ``` ### currentTime [Section titled “currentTime”](#currenttime) currentTime プロパティは、`reearth` 環境におけるタイムライン上の現在時刻を表します。タイムラインが進行するにつれて更新されるオプションの Date オブジェクトです。このプロパティは、プラグインのイベントやデータビジュアライゼーションをタイムラインの現在位置と同期させる際に便利です。 #### 構文 [Section titled “構文”](#構文-2) ```ts reearth.timeline.currentTime?: Date; ``` ###### `Date` [Section titled “Date”](#date-2) タイムライン上の現在時刻を表す JavaScript Date オブジェクトです。currentTime が定義されていない場合、タイムラインが初期化されていないか、現在非アクティブであることを示している場合があります。 #### 使用例 [Section titled “使用例”](#使用例-2) ```javascript // 使用例: タイムラインの現在時刻を確認してログに出力する if (reearth.timeline.currentTime) { console.log( "Current Timeline Time:", reearth.timeline.currentTime.toISOString() ); } else { console.log("Current Timeline Time is not set."); } ``` ### isPlaying [Section titled “isPlaying”](#isplaying) このプロパティは、タイムラインが現在再生中かどうかを示します。タイムラインの再生状態を反映するブール値です。このプロパティは、タイムラインのアニメーションやイベントを制御・監視する際に便利です。 #### 構文 [Section titled “構文”](#構文-3) ```ts reearth.timeline.isPlaying?: boolean; ``` **型** `boolean` * `true`:タイムラインは現在再生中です。 * `false`:タイムラインは一時停止中です。 `isPlaying` が定義されていない場合、タイムラインが初期化されていないことを示している場合があります。 #### 使用例 [Section titled “使用例”](#使用例-3) ```javascript // 使用例 1: タイムラインが再生中か一時停止中かをログに出力する if (reearth.timeline.isPlaying === true) { console.log("The timeline is currently playing."); } else if (reearth.timeline.isPlaying === false) { console.log("The timeline is paused."); } else { console.log("The timeline state is not set or unavailable."); } // 使用例 2: タイムラインが再生中のときにアニメーションをトリガーする if (reearth.timeline.isPlaying) { console.log("Playing animation linked to the timeline..."); } // 使用例 3: タイムラインの再生状態をトグルする if (reearth.timeline.isPlaying) { reearth.timeline.pause?.(); } else { reearth.timeline.play?.(); } ``` ### speed [Section titled “speed”](#speed) speed プロパティは、`reearth` 環境におけるタイムラインの再生速度を表します。タイムラインがリアルタイムに対してどれだけ速く進行するかを決定する数値です。このプロパティは、タイムラインに紐づいたアニメーションやデータ更新のペースを制御する際に便利です。 #### 構文 [Section titled “構文”](#構文-4) ```ts reearth.timeline.speed?: number; ``` **型** `number` タイムラインの再生速度を表す数値です。例:`1.0`:リアルタイム再生、`>1.0`:リアルタイムより速い、`<1.0`:リアルタイムより遅い。speed が定義されていない場合、タイムラインの再生速度が設定または初期化されていないことを示している場合があります。 #### 使用例 [Section titled “使用例”](#使用例-4) ```javascript // 使用例 1: タイムラインの現在の再生速度をログに出力する if (reearth.timeline.speed !== undefined) { console.log("Timeline Playback Speed:", reearth.timeline.speed); } else { console.log("Timeline speed is not set."); } // 使用例 2: タイムラインの再生速度を2倍に上げる reearth.timeline.setSpeed(2.0); console.log("Playback speed set to:", reearth.timeline.speed); ``` ### stepType [Section titled “stepType”](#steptype) このプロパティは、タイムラインが時間を進行させるステップの種類を定義します。タイムラインが可変レート(時間に比例)で進むか、固定間隔で進むかを決定します。タイムラインに紐づいたデータやアニメーションの更新方法を制御する際に便利です。 #### 構文 [Section titled “構文”](#構文-5) ```ts reearth.timeline.stepType?: "rate" | "fixed"; ``` **型** `rate` タイムラインは可変レートで進行します。タイムラインは継続的に進み、進行速度は speed プロパティによって決定されます。 **型** `fixed` タイムラインは固定時間間隔(例:毎秒、毎分、毎時)で進行します。この種類は、離散的なステップや均等間隔の更新を持つタイムラインに最適です。 stepType が定義されていない場合、デフォルトのステップ種類はプラグインの設定または Re:Earth 環境によって異なる場合があります。 #### 使用例 [Section titled “使用例”](#使用例-5) ```javascript // 使用例 1: タイムラインのステップ種類をログに出力する if (reearth.timeline.stepType) { console.log("Timeline Step Type:", reearth.timeline.stepType); } else { console.log("Timeline step type is not set."); } // 使用例 2: 連続進行のためにステップ種類を 'rate' に設定する reearth.timeline.setStepType("rate"); console.log("Timeline step type set to 'rate'."); // 使用例 3: 離散ステップのためにステップ種類を 'fixed' に設定する reearth.timeline.setStepType("fixed"); console.log("Timeline step type set to 'fixed'."); ``` ### rangeType [Section titled “rangeType”](#rangetype) rangeType プロパティは、タイムラインが時間進行の範囲をどのように扱うかを定義します。タイムラインが定義された startTime と stopTime を超えて拡張できるか、特定の範囲内に制限されるかを決定します。このプロパティは、タイムラインに紐づいたアニメーションやイベントの動作を制御するために重要です。 #### 構文 [Section titled “構文”](#構文-6) ```ts reearth.timeline.rangeType?: "unbounded" | "clamped" | "bounced"; ``` **型** `unbounded` タイムラインは定義された startTime と stopTime を超えて拡張できます。境界を超えても無制限に進行できます。この種類は、継続的なアニメーションやデータ更新に便利です。 **型** `clamped` タイムラインは startTime と stopTime の範囲内に制限されます。開始時刻より前や停止時刻より後には進行できません。この種類は、時間制限のあるアニメーションやイベントに便利です。 **型** `bounced` タイムラインは startTime と stopTime の間で「バウンス」し、ループのような効果を生み出します。タイムラインが終端に達すると方向を逆転させ、開始点に向かって戻ります。この種類は、継続的なアニメーションやサイクルを作成する際に便利です。 rangeType が定義されていない場合、動作はタイムラインの設定にデフォルトするか、制限なしのままになる場合があります。 #### 使用例 [Section titled “使用例”](#使用例-6) ```javascript // 使用例 1: タイムラインの範囲種類をログに出力する if (reearth.timeline.rangeType) { console.log("Timeline Range Type:", reearth.timeline.rangeType); } else { console.log("Timeline range type is not set."); } // 使用例 2: タイムラインを無制限に進行させる reearth.timeline.setRangeType("unbounded"); console.log("Timeline range type set to 'unbounded'."); // 使用例 3: タイムラインを開始・停止時刻内に制限する reearth.timeline.setRangeType("clamped"); console.log("Timeline range type set to 'clamped'."); // 使用例 4: タイムラインのバウンス動作を有効にする reearth.timeline.setRangeType("bounced"); console.log("Timeline range type set to 'bounced'."); ``` ## メソッド [Section titled “メソッド”](#メソッド) ### tick [Section titled “tick”](#tick) tick メソッドは、タイムラインの現在のティック値を Date オブジェクトとして取得します。このメソッドは、アニメーションやプラグイン固有のイベントをタイムラインの進行と同期させる際に便利です。 #### 構文 [Section titled “構文”](#構文-7) ```ts reearth.timeline.tick?: () => Date | undefined; ``` #### 戻り値: [Section titled “戻り値:”](#戻り値) **型** `Date | undefined` * `"Date"`:タイムライン上の現在のティック値を Date オブジェクトとして表します。 * `"undefined"`:タイムラインが初期化されていないか非アクティブの場合、メソッドは undefined を返します。 #### 使用例 [Section titled “使用例”](#使用例-7) ```javascript // 使用例: 現在のティック値を取得してログに出力する const tickValue = reearth.timeline.tick?.(); if (tickValue) { console.log("Current Tick Value:", tickValue.toISOString()); } else { console.log("Timeline tick is not set or the timeline is inactive."); } ``` ### play [Section titled “play”](#play) play メソッドは、タイムラインの再生を開始します。タイムラインが現在の状態から範囲を進行し始めるようにトリガーするために使用します。このメソッドは、アニメーション、時間ベースのデータビジュアライゼーション、またはユーザーによるタイムライン操作のシナリオに便利です。 #### 構文 [Section titled “構文”](#構文-8) ```ts reearth.timeline.play?: () => void; ``` #### 戻り値: [Section titled “戻り値:”](#戻り値-1) なし `(void)`。このメソッドは値を返さずに操作を実行します。 #### 使用例 [Section titled “使用例”](#使用例-8) ```javascript // 使用例: タイムラインを再生する if (reearth.timeline.play) { reearth.timeline.play(); console.log("Timeline playback started."); } else { console.log("The play method is not available."); } ``` ### pause [Section titled “pause”](#pause) pause メソッドは、現在位置をリセットせずにタイムラインの再生を停止します。このメソッドは、タイムラインに紐づいたアニメーションや時間ベースの処理を一時的に停止し、後で同じ位置から再開できるようにする際に便利です。 #### 構文 [Section titled “構文”](#構文-9) ```ts reearth.timeline.pause?: () => void; ``` #### 戻り値: [Section titled “戻り値:”](#戻り値-2) なし `(void)`。このメソッドは値を返さずに操作を実行します。 #### 使用例 [Section titled “使用例”](#使用例-9) ```javascript // 使用例: タイムラインを一時停止する if (reearth.timeline.pause) { reearth.timeline.pause(); console.log("Timeline playback paused."); } else { console.log("The pause method is not available."); } ``` ### setTime [Section titled “setTime”](#settime) このメソッドを使用すると、タイムラインの開始・停止・現在時刻を設定できます。このメソッドは、アニメーションの同期や時間ベースのデータビジュアライゼーションの調整など、タイムラインの範囲と位置を動的に制御する際に便利です。 #### 構文 [Section titled “構文”](#構文-10) ```ts reearth.timeline.setTime?: (time: Options) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ) ##### `time` [Section titled “time”](#time) setTime メソッドの time オブジェクトを使用すると、タイムラインの3つの重要なポイントを定義できます。 **型**: ```ts type Options = { start: Date | string; stop: Date | string; current: Date | string; }; ``` * **`start: Date | string;`**:タイムラインの開始点を定義します。 * **`stop: Date | string;`**:タイムラインの終了点を定義します。 * **`current: Date | string;`**:タイムライン上の現在の時点を定義します。 #### 戻り値: [Section titled “戻り値:”](#戻り値-3) なし `(void)`。このメソッドは値を返さずに操作を実行します。 #### 使用例 [Section titled “使用例”](#使用例-10) ```javascript // 使用例: カスタムタイムライン時刻を設定する if (reearth.timeline.setTime) { reearth.timeline.setTime({ start: new Date("2023-01-01T00:00:00Z"), stop: new Date("2023-12-31T23:59:59Z"), current: new Date("2023-06-01T12:00:00Z"), }); console.log("Timeline times set successfully."); } else { console.log("The setTime method is not available."); } ``` ### setSpeed [Section titled “setSpeed”](#setspeed) このメソッドを使用すると、タイムラインの再生速度を動的に調整できます。このメソッドは、タイムラインが範囲をどれだけ速く進行するかを制御し、アニメーションや時間ベースのデータビジュアライゼーションに柔軟性を提供します。 #### 構文 [Section titled “構文”](#構文-11) ```ts reearth.timeline.setSpeed?: (speed: number) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-1) ##### `speed` [Section titled “speed”](#speed-1) **型**: `number` タイムラインの再生速度を表す数値です。`1.0`:リアルタイム再生、`>1.0`:リアルタイムより速い(例:2.0 で2倍速)、`<1.0`:リアルタイムより遅い(例:0.5 で半速)。 #### 戻り値: [Section titled “戻り値:”](#戻り値-4) なし `(void)`。このメソッドは値を返さずに操作を実行します。 #### 使用例 [Section titled “使用例”](#使用例-11) ```javascript // 使用例 1: 再生速度をリアルタイム(1.0)に設定する if (reearth.timeline.setSpeed) { reearth.timeline.setSpeed(1.0); console.log("Timeline speed set to real-time (1.0)."); } else { console.log("The setSpeed method is not available."); } // 使用例 2: ユーザー入力からタイムライン速度を動的に調整する const userSelectedSpeed = 3.0; // ユーザー入力の例 if (reearth.timeline.setSpeed) { reearth.timeline.setSpeed(userSelectedSpeed); console.log(`Timeline speed dynamically set to ${userSelectedSpeed}.`); } else { console.log("The setSpeed method is unavailable."); } ``` ### setStepType [Section titled “setStepType”](#setsteptype) setStepType メソッドを使用すると、タイムラインのステップ動作を動的に調整できます。タイムラインが可変レート(rate)で進むか、固定間隔(fixed)で進むかを制御します。アニメーションやデータ更新など、タイムラインの時間進行処理をカスタマイズする際に便利です。 #### 構文 [Section titled “構文”](#構文-12) ```ts reearth.timeline.setStepType?: (stepType: "rate" | "fixed") => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-2) ##### `stepType` [Section titled “stepType”](#steptype-1) ステップ動作を指定します。 **型**: `"rate" | "fixed"` * **`rate`**:タイムラインは時間に比例した可変レートで進行し、通常は再生速度(speed プロパティ)の影響を受けます。 * **`fixed`**:タイムラインは固定時間間隔(例:毎秒、毎分、毎時)で進行します。 #### 戻り値: [Section titled “戻り値:”](#戻り値-5) なし `(void)`。このメソッドは値を返さずに操作を実行します。 #### 使用例 [Section titled “使用例”](#使用例-12) ```javascript // 使用例 1: タイムラインのステップを 'rate' に設定する if (reearth.timeline.setStepType) { reearth.timeline.setStepType("rate"); console.log("Timeline step type set to 'rate'."); } else { console.log("The setStepType method is not available."); } // 使用例 2: タイムラインのステップを 'fixed' に設定する reearth.timeline.setStepType?.("fixed"); console.log("Timeline step type set to 'fixed'."); // 使用例 3: データ要件に基づいてタイムラインのステップ種類を動的に設定する const requiresContinuousUpdates = true; if (reearth.timeline.setStepType) { if (requiresContinuousUpdates) { reearth.timeline.setStepType("rate"); console.log("Timeline step type dynamically set to 'rate'."); } else { reearth.timeline.setStepType("fixed"); console.log("Timeline step type dynamically set to 'fixed'."); } } ``` ### setRangeType [Section titled “setRangeType”](#setrangetype) setRangeType メソッドを使用すると、タイムラインが時間進行の範囲をどのように扱うかを動的に定義できます。このメソッドは、タイムラインが定義された startTime と stopTime を超えて拡張できるか、その範囲内に制限されるか、またはループ効果を生み出しながら開始・停止時刻の間で「バウンス」するかを決定します。 #### 構文 [Section titled “構文”](#構文-13) ```ts reearth.timeline.setRangeType?: ( rangeType: "unbounded" | "clamped" | "bounced" ) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-3) ##### `rangeType` [Section titled “rangeType”](#rangetype-1) 範囲の動作を指定します。 **型**: `"unbounded" | "clamped" | "bounced"` * **`unbounded`**:タイムラインは startTime と stopTime を超えて無制限に拡張できます。 * **`clamped`**:タイムラインは定義された startTime と stopTime の範囲内に制限されます。 * **`bounced`**:タイムラインは startTime と stopTime の間で「バウンス」し、ループのような効果を生み出します。 #### 戻り値: [Section titled “戻り値:”](#戻り値-6) なし `(void)`。このメソッドは値を返さずに操作を実行します。 #### 使用例 [Section titled “使用例”](#使用例-13) ```javascript // 使用例 1: タイムラインを無制限に進行させる if (reearth.timeline.setRangeType) { reearth.timeline.setRangeType("unbounded"); console.log("Timeline range type set to 'unbounded'."); } else { console.log("The setRangeType method is not available."); } // 使用例 2: タイムラインを定義された範囲内に制限する reearth.timeline.setRangeType?.("clamped"); console.log("Timeline range type set to 'clamped'."); // 使用例 3: タイムラインのバウンス動作を有効にする if (reearth.timeline.setRangeType) { reearth.timeline.setRangeType("bounced"); console.log("Timeline range type set to 'bounced'."); } // 使用例 4: アプリケーションの要件に基づいて範囲種類を動的に設定する const useInfiniteTimeline = true; if (reearth.timeline.setRangeType) { if (useInfiniteTimeline) { reearth.timeline.setRangeType("unbounded"); console.log("Timeline range type dynamically set to 'unbounded'."); } else { reearth.timeline.setRangeType("clamped"); console.log("Timeline range type dynamically set to 'clamped'."); } } ``` ## イベント [Section titled “イベント”](#イベント) ノート 共通のイベントメソッド(`on`、`off`)の詳細については、[イベント](/ja/developer/plugin/api-reference/events) ページを参照してください。 ### tick [Section titled “tick”](#tick-1) tick イベントは、タイムラインの現在時刻が更新されるたびに発火します。これは通常、タイムラインが進行するか、手動で調整されたときにトリガーされます。 #### 構文 [Section titled “構文”](#構文-14) ```ts reearth.timeline.on("tick", (event: Date) => void): void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-4) **event:** Date tick イベント中のタイムラインの現在時刻を表す JavaScript Date オブジェクトです。 #### 使用例 [Section titled “使用例”](#使用例-14) ```javascript // タイムラインの現在時刻の各ティックをログに出力する reearth.timeline.on("tick", (e) => { console.log("Timeline tick at:", e.toISOString()); }); // 特定のティック値に基づいてアクションを実行する reearth.timeline.on("tick", (e) => { const targetTime = new Date("2023-12-25T00:00:00Z"); if (e.getTime() === targetTime.getTime()) { console.log("Merry Christmas! Timeline reached the target time."); } }); ``` ### commit [Section titled “commit”](#commit) commit イベントは、ウィジェット、プラグイン、またはその他のタイムラインブロックからの更新など、アクションによってタイムラインが変更されるたびに発火します。 #### 構文 [Section titled “構文”](#構文-15) ```ts reearth.timeline.on("commit", (event: TimelineCommitter) => void): void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-5) **event:** TimelineCommitter タイムライン変更のソースと追加のメタデータを記述するオブジェクトです。 ```ts type TimelineCommitter = { source: | "widgetContext" // ウィジェット操作によるタイムライン変更 | "pluginAPI" // プラグイン API を通じた変更 | "storyTimelineBlock" // ストーリー内のタイムラインブロックによる変更 | "storyPage"; // ストーリーページナビゲーションによってトリガーされた変更 id?: string; }; ``` * **`source: string`**:コミットアクションの起点を指定します。 * **`id?: string`**:コミットのソースに対するオプションの識別子です。 #### 使用例 [Section titled “使用例”](#使用例-15) ```javascript // タイムラインが変更されたときにコミットのソースと ID をログに出力する reearth.timeline.on("commit", (e) => { console.log(`Timeline commit from source: ${e.source}`); if (e.id) { console.log(`Commit ID: ${e.id}`); } }); // コミットのソースに基づいて特定のアクションを実行する reearth.timeline.on("commit", (e) => { if (e.source === "pluginAPI") { console.log("Timeline updated via Plugin API."); } else if (e.source === "storyPage") { console.log("Timeline updated by a story page."); } }); ``` # reearth.ui > `reearth.ui` の API リファレンスです。 **`reearth.ui`** 名前空間は、プラグイン拡張(ウィジェットまたはブロック)のユーザーインターフェース要素を管理するための幅広い機能を提供します。 ## メソッド [Section titled “メソッド”](#メソッド) ### show [Section titled “show”](#show) このメソッドは、カスタム HTML コンテンツをプラグイン拡張(プラグイン設定に基づくウィジェットまたはブロック)として `reearth` に表示します。iframe の表示状態やサイズを動的に制御でき、iframe を視覚的に表示しないモードにも対応しています。パラメータは 2 つです。表示する HTML コンテンツと、省略可能なオプションオブジェクトです。 #### 構文 [Section titled “構文”](#構文) ```ts reearth.ui.show: ( html: string, options?: Options ) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ) ##### `html` [Section titled “html”](#html) **型**: `string` レンダリングする HTML コンテンツの文字列です。 ##### `options` [Section titled “options”](#options) **省略可能** **型**: ```ts type Options = { visible?: boolean; width?: number | string; height?: number | string; extended?: boolean; }; ``` * **`visible?: boolean`**: `true` の場合、iframe を表示します。`false` の場合、iframe を非表示にし、プラグインはヘッドレスモードで動作します。デフォルト値は `true` です。 * **`width?: number | string;`**: ウィジェットの iframe の初期幅です。指定しない場合、iframe はコンテンツに合わせて自動リサイズされます。数値を指定した場合はピクセル単位として扱われます。このオプションは水平方向に拡張されていないウィジェットにのみ有効です。 * **`height?: number | string;`**: ウィジェットの iframe の初期高さです。指定しない場合、iframe はコンテンツに合わせて自動リサイズされます。数値を指定した場合はピクセル単位として扱われます。このオプションは垂直方向に拡張されていないウィジェットにのみ有効です。 * **`extended?: boolean;`**: iframe がより広い領域を占有するかどうかを示します。`true` の場合、iframe はコンテナ内の利用可能なスペースを埋めるように拡張されます。このオプションは、ウィジェットアラインシステムの拡張可能エリアに配置されたウィジェットにのみ有効です。 #### 戻り値 [Section titled “戻り値”](#戻り値) なし(void)。このメソッドは値を返しません。 #### 使用例 [Section titled “使用例”](#使用例) ```javascript const html = `

Hello world

`; // HTML UI のみ表示する reearth.ui.show(html); // HTML UI を非表示状態で表示する reearth.ui.show(html, { visible: false }); // 幅と高さを指定して HTML UI を表示する reearth.ui.show(html, { width: 400, height: 200 }); // 拡張可能エリアで iframe を拡張する reearth.ui.show(`
Extended widget content
`, { extended: true }); ``` ### postMessage [Section titled “postMessage”](#postmessage) このメソッドは、プラグインの UI コンポーネント(iframe)にメッセージを送信します。 #### 構文 [Section titled “構文”](#構文-1) ```ts reearth.ui.postMessage: (message: any) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-1) ##### `message` [Section titled “message”](#message) **型**: `any` message には、構造化クローン可能な任意の型を指定できます。 #### 戻り値 [Section titled “戻り値”](#戻り値-1) なし(void)。このメソッドは値を返しません。 #### 使用例 [Section titled “使用例”](#使用例-1) ```javascript //使用例 1: UI iframe にメッセージを送信する reearth.ui.postMessage("Hello, Re:Earth!"); //使用例 2: オブジェクト形式のメッセージを送信する reearth.ui.postMessage({ type: "greeting", text: "Hello, World!" }); ``` ### resize [Section titled “resize”](#resize) プラグインが使用する iframe のサイズを調整します。width または height が undefined の場合は自動リサイズされます。数値を指定した場合はピクセル単位として扱われます。パラメータは 3 つです。width、height、および省略可能な extended です。 UI iframe はコンテンツサイズに基づいて自動的にリサイズされます。このメソッドは、iframe のサイズを手動で設定したい場合に便利です。 #### 構文 [Section titled “構文”](#構文-2) ```ts reearth.ui.resize( width: string | number | undefined, height: string | number | undefined, extended?: boolean | undefined ) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-2) ##### `width` [Section titled “width”](#width) **型**: `string | number | undefined` ウィジェットの iframe の幅です。このフィールドは水平方向に拡張されていないウィジェットにのみ有効です。 ##### `height` [Section titled “height”](#height) **型**: `string | number | undefined` ウィジェットの iframe の高さです。このフィールドは垂直方向に拡張されていないウィジェットにのみ有効です。 ##### `extended?` [Section titled “extended?”](#extended) **省略可能** **型**: `boolean | undefined` 省略可能なパラメータです。iframe を拡張するかどうかを示すブール値です。このオプションは、ウィジェットアラインシステムの拡張可能エリアに配置されたウィジェットにのみ有効です。 * `true`: UI 要素を拡張します。 * `false`: UI 要素を拡張しません。 * `undefined`: 拡張状態を変更しません。 #### 使用例 [Section titled “使用例”](#使用例-2) ```javascript // 使用例 1: UI を 400px × 300px にリサイズする reearth.ui.resize(400, 300); // 使用例 2: サイズを変更せずに UI 要素を拡張する reearth.ui.resize(undefined, undefined, true); // 使用例 3: 高さのみ 500px に変更し、他のプロパティは変更しない reearth.ui.resize(undefined, 500); ``` ### close [Section titled “close”](#close) このメソッドは、現在の UI ウィジェットを閉じるために使用します。クローズ操作をプログラムからトリガーする手段を提供します。パラメータはありません。 #### 構文 [Section titled “構文”](#構文-3) ```ts reearth.ui.close: () => void ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-3) なし #### 戻り値 [Section titled “戻り値”](#戻り値-2) なし(void)。このメソッドは値を返しません。 #### 使用例 [Section titled “使用例”](#使用例-3) ```ts // 現在の UI ウィジェットを閉じる reearth.ui.close(); ``` ## イベント [Section titled “イベント”](#イベント) ノート 共通のイベントメソッド(`on`、`off`)の詳細については、[イベント](/ja/developer/plugin/api-reference/events) ページを参照してください。 ### update [Section titled “update”](#update) update イベントは、UI の状態またはコンテンツが変化するたびにトリガーされます。UI の状態の変化を追跡したり、最新のデータに基づいてコンテンツを更新したりする際に便利です。 #### 構文 [Section titled “構文”](#構文-4) ```ts reearth.ui.on("update", () => void): void; ``` #### 使用例 [Section titled “使用例”](#使用例-4) ```javascript reearth.ui.on("update", () => { console.log("UI updated!"); }); ``` ### close [Section titled “close”](#close-1) close イベントは、UI が閉じられたときにトリガーされます。このイベントは、クリーンアップ処理の実行、データの保存、または UI が非アクティブになったことを他のコンポーネントに通知する際に使用できます。 #### 構文 [Section titled “構文”](#構文-5) ```ts reearth.ui.on("close", () => void): void; ``` #### 使用例 [Section titled “使用例”](#使用例-5) ```javascript reearth.ui.on("close", () => { console.log("The UI was closed."); }); ``` # reearth.viewer > reearth.viewer `reearth.viewer` 名前空間は、ビューアと対話するための関数群を提供します。 ## プロパティ [Section titled “プロパティ”](#プロパティ) ### property [Section titled “property”](#property) `property` は、グローブ・地形・シーン・タイル・空など、ビューアに関する各種プロパティを提供します。 #### 構文 [Section titled “構文”](#構文) ```ts reearth.viewer.property: ViewerProperty; ``` #### 戻り値 [Section titled “戻り値”](#戻り値) **型** `ViewerProperty` 現在、`property` は明示的に設定されたプロパティのみを返します。デフォルト値は含まれません。 ノート `ViewerProperty` は Re:Earth Core からインポートされています。詳細は [ViewerProperty](https://github.com/reearth/core/blob/alpha/src/Map/types/viewerProperty.ts) を参照してください。 ### viewport [Section titled “viewport”](#viewport) `viewport` は、マップ領域に関連するプロパティと、現在のビューポート(ページ)の URL クエリパラメータを提供するために設計されています。 #### 構文 [Section titled “構文”](#構文-1) ```ts reearth.viewer.viewport: Viewport; ``` #### 戻り値 [Section titled “戻り値”](#戻り値-1) **型** ```ts type Viewport = { width: number; height: number; isMobile: boolean; query: Record; }; ``` * **width:** ビューポートの幅です。 * **height:** ビューポートの高さです。 * **isMobile:** ビューポートがモバイルデバイスかどうかを示す真偽値です。bowser のユーザーエージェント検出に基づき判定されます。 * **query:** 現在のページの URL クエリパラメータです。 ### env [Section titled “env”](#env) `env` は、現在実行中の Re:Earth Visualizer の環境情報を提供します。 #### 構文 [Section titled “構文”](#構文-2) ```ts reearth.viewer.env: Env; ``` #### 戻り値 [Section titled “戻り値”](#戻り値-2) **型** ```ts type Env = { inEditor: boolean; isBuilt: boolean; }; ``` `inEditor` と `isBuilt` は、実行されているページやタブによって異なる値を持ちます。プラグインはこれらの値に基づいて動作を切り替えることができます。 | プロパティ | エディタ - マップ/ストーリー/ウィジェットタブ | エディタ - 公開タブ | 公開済みページ | | -------- | ------------------------- | ----------- | ------- | | inEditor | true | false | false | | isBuilt | false | false | true | ### interactionMode [Section titled “interactionMode”](#interactionmode) `interactionMode` は、Re:Earth Visualizer におけるビューアのインタラクションモードを管理するプロパティとメソッドの集合を提供します。 #### interactionMode.mode [Section titled “interactionMode.mode”](#interactionmodemode) ビューアの現在のインタラクションモードです。 #### 構文 [Section titled “構文”](#構文-3) ```ts reearth.viewer.interactionMode.mode: InteractionModeType ``` #### 戻り値 [Section titled “戻り値”](#戻り値-3) **型** `InteractionModeType = "default" | "move" | "selection" | "sketch" | "spatialId"` * **`default`**: デフォルトのインタラクションモードです。 * **`move`**: 移動インタラクションモードです。このモードでは選択が無効になります。 * **`selection`**: 選択インタラクションモードです。このモードでは移動が無効になります。 * **`sketch`**: スケッチインタラクションモードです。スケッチはこのモードでのみ有効にできます。 * **`spatialId`**: Spatial ID を扱うためのインタラクションモードです。Spatial ID の選択時に使用します。 #### interactionMode.override [Section titled “interactionMode.override”](#interactionmodeoverride) ビューアのインタラクションモードを上書きします。 #### 構文 [Section titled “構文”](#構文-4) ```ts reearth.viewer.interactionMode.override: ( mode: InteractionModeType ) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ) ##### `mode` [Section titled “mode”](#mode) **型**: `InteractionModeType` 設定するインタラクションモードです。 #### 戻り値 [Section titled “戻り値”](#戻り値-4) なし(void)。このメソッドは値を返しません。 ## メソッド [Section titled “メソッド”](#メソッド) ### overrideProperty [Section titled “overrideProperty”](#overrideproperty) `overrideProperty` は、ビューアのプロパティを上書きするために使用します。 #### 構文 [Section titled “構文”](#構文-5) ```ts reearth.viewer.overrideProperty: (property: ViewerProperty) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-1) ##### property [Section titled “property”](#property-1) **型** `ViewerProperty` ノート `ViewerProperty` は Re:Earth Core からインポートされています。詳細は [ViewerProperty](https://github.com/reearth/core/blob/alpha/src/Map/types/viewerProperty.ts) を参照してください。 #### 戻り値 [Section titled “戻り値”](#戻り値-5) **型** `void` このメソッドは戻り値を持ちません。 #### 使用例 [Section titled “使用例”](#使用例) ```javascript // 地形を有効にする reearth.viewer.overrideProperty({ terrain: { enabled: true, }, }); ``` ### capture [Section titled “capture”](#capture) `capture` 関数は、現在のビューアの画像を生成します。 #### 構文 [Section titled “構文”](#構文-6) ```ts reearth.viewer.capture: ( type?: string, encoderOptions?: number ) => string | undefined; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-2) ##### type [Section titled “type”](#type) **型** `string`(省略可能) 画像フォーマットを示す文字列です。デフォルトのフォーマットは `image/png` であり、指定したフォーマットがサポートされていない場合もこのフォーマットが使用されます。 ##### encoderOptions [Section titled “encoderOptions”](#encoderoptions) **型** `number`(省略可能) `image/jpeg` や `image/webp` など非可逆圧縮をサポートするファイルフォーマットで画像を作成する際の画質を表す、0 から 1 の数値です。このオプションを指定しない場合、または値が許容範囲外の場合は、ユーザーエージェントのデフォルト品質値が使用されます。 ノート このメソッドは内部的に `canvas.toDataURL` を呼び出しています。詳細は [HTMLCanvasElement: toDataURL() method](https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toDataURL) を参照してください。 #### 戻り値 [Section titled “戻り値”](#戻り値-6) **型** `string | undefined` リクエストされたデータ URL を含む文字列です。 #### 使用例 [Section titled “使用例”](#使用例-1) ```javascript // 現在のマップのキャプチャを取得します。 // 返された画像文字列をウィジェット UI に送信してダウンロードをトリガーできます。 console.log(reearth.viewer.capture("image/png")); ``` ### open [Section titled “open”](#open) `open` メソッドは、URL を新しいタブで開くために使用します。 #### 構文 [Section titled “構文”](#構文-7) ```ts reearth.viewer.open: (url: string) => void; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-3) ##### url [Section titled “url”](#url) **型** `string` 新しいタブで開く URL です。 #### 戻り値 [Section titled “戻り値”](#戻り値-7) **型** `void` ### reload [Section titled “reload”](#reload) `reload` メソッドは、現在の Visualizer ページを再読み込みします。 #### 構文 [Section titled “構文”](#構文-8) ```ts reearth.viewer.reload: () => void; ``` #### 戻り値 [Section titled “戻り値”](#戻り値-8) **型** `void` ### tools [Section titled “tools”](#tools) `tools` モジュールは、グローブおよびシーン周辺のさまざまな計算を行うためのヘルパー関数のコレクションを提供します。 ### > getLocationFromScreenCoordinate [Section titled “> getLocationFromScreenCoordinate”](#-getlocationfromscreencoordinate) スクリーン座標から地球上の位置を返します。 #### 構文 [Section titled “構文”](#構文-9) ```ts reearth.viewer.tools.getLocationFromScreenCoordinate: ( x: number, y: number, withTerrain?: boolean ) => { lat: number; lng: number; height: number } | undefined; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-4) ##### x [Section titled “x”](#x) **型** `number` ビューア上の x ピクセル座標です。 ##### y [Section titled “y”](#y) **型** `number` ビューア上の y ピクセル座標です。 ##### withTerrain [Section titled “withTerrain”](#withterrain) **型** `boolean`(省略可能) 地形の高さを考慮するかどうかを示す真偽値です。デフォルト値は `false` です。 #### 戻り値 [Section titled “戻り値”](#戻り値-9) **型** `{ lat: number; lng: number; height: number } | undefined` 地球上の位置です。 ### > getScreenCoordinateFromPosition [Section titled “> getScreenCoordinateFromPosition”](#-getscreencoordinatefromposition) 地球上の位置からスクリーン座標を返します。 #### 構文 [Section titled “構文”](#構文-10) ```ts reearth.viewer.tools.getScreenCoordinateFromPosition: ( position: [x: number, y: number, z: number] ) => [x: number, y: number] | undefined; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-5) ##### position [Section titled “position”](#position) **型** `[x: number, y: number, z: number]` 地球上の位置(デカルト座標)です。 #### 戻り値 [Section titled “戻り値”](#戻り値-10) **型** `[x: number, y: number] | undefined` ビューア上のピクセル座標です。 ### > getTerrainHeightAsync [Section titled “> getTerrainHeightAsync”](#-getterrainheightasync) 指定した位置の地形の高さを返します。これは非同期関数です。 #### 構文 [Section titled “構文”](#構文-11) ```ts reearth.viewer.tools.getTerrainHeightAsync: ( lng: number, lat: number ) => Promise; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-6) ##### lng [Section titled “lng”](#lng) **型** `number` 位置の経度です。 ##### lat [Section titled “lat”](#lat) **型** `number` 位置の緯度です。 #### 戻り値 [Section titled “戻り値”](#戻り値-11) **型** `Promise` 指定した位置の地形の高さです。 ### > getGlobeHeight [Section titled “> getGlobeHeight”](#-getglobeheight) 指定した位置の地表の高さを返します。 #### 構文 [Section titled “構文”](#構文-12) ```ts reearth.viewer.tools.getGlobeHeight: ( lng: number, lat: number ) => number | undefined; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-7) ##### lng [Section titled “lng”](#lng-1) **型** `number` 位置の経度です。 ##### lat [Section titled “lat”](#lat-1) **型** `number` 位置の緯度です。 #### 戻り値 [Section titled “戻り値”](#戻り値-12) **型** `number | undefined` 指定した位置の地表の高さです。 ### > getCurrentLocationAsync [Section titled “> getCurrentLocationAsync”](#-getcurrentlocationasync) ユーザーの現在位置を返します。これはブラウザの Geolocation API を使用する非同期関数です。 #### 構文 [Section titled “構文”](#構文-13) ```ts reearth.viewer.tools.getCurrentLocationAsync: ( options?: Options ) => Promise; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-8) ##### options [Section titled “options”](#options) **型** `Options`(省略可能) 以下のパラメータを含むオプションオブジェクトです。 * **maximumAge:** キャッシュされた位置情報の最大有効期間(ミリ秒)です。デフォルト値は `0` です。 * **timeout:** 位置情報の取得を待機する最大時間(ミリ秒)です。デフォルト値は `10,000ms` です。 * **enableHighAccuracy:** 高精度の位置情報をリクエストするかどうかです。デフォルト値は `false` です。 ノート オプションの詳細については [Geolocation.getCurrentPosition()](https://developer.mozilla.org/docs/Web/API/Geolocation/getCurrentPosition) を参照してください。 #### 戻り値 [Section titled “戻り値”](#戻り値-13) **型** `Promise` ```ts type Location = { lat: number; lng: number; height: number; }; ``` ユーザーの現在位置です。 ### > cartographicToCartesian [Section titled “> cartographicToCartesian”](#-cartographictocartesian) 地理座標をデカルト座標に変換します。 #### 構文 [Section titled “構文”](#構文-14) ```ts reearth.viewer.tools.cartographicToCartesian: ( lng: number, lat: number, height: number, options?: { useGlobeEllipsoid?: boolean } ) => [x: number, y: number, z: number] | undefined; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-9) ##### lng [Section titled “lng”](#lng-2) **型** `number` 位置の経度です。 ##### lat [Section titled “lat”](#lat-2) **型** `number` 位置の緯度です。 ##### height [Section titled “height”](#height) **型** `number` 位置の高さです。 ##### options [Section titled “options”](#options-1) **型** `{ useGlobeEllipsoid?: boolean }`(省略可能) * **useGlobeEllipsoid:** グローブの楕円体を使用するかどうかを示す真偽値です。デフォルト値は `false` です。 #### 戻り値 [Section titled “戻り値”](#戻り値-14) **型** `[x: number, y: number, z: number] | undefined` デカルト座標の位置です。 ### > cartesianToCartographic [Section titled “> cartesianToCartographic”](#-cartesiantocartographic) デカルト座標を地理座標に変換します。 #### 構文 [Section titled “構文”](#構文-15) ```ts reearth.viewer.tools.cartesianToCartographic: ( x: number, y: number, z: number, options?: { useGlobeEllipsoid?: boolean } ) => [lng: number, lat: number, height: number] | undefined; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-10) ##### x [Section titled “x”](#x-1) **型** `number` 位置の x 座標です。 ##### y [Section titled “y”](#y-1) **型** `number` 位置の y 座標です。 ##### z [Section titled “z”](#z) **型** `number` 位置の z 座標です。 ##### options [Section titled “options”](#options-2) **型** `{ useGlobeEllipsoid?: boolean }`(省略可能) * **useGlobeEllipsoid:** グローブの楕円体を使用するかどうかを示す真偽値です。デフォルト値は `false` です。 #### 戻り値 [Section titled “戻り値”](#戻り値-15) **型** `[lng: number, lat: number, height: number] | undefined` 地理座標の位置です。 ### > transformByOffsetOnScreen [Section titled “> transformByOffsetOnScreen”](#-transformbyoffsetonscreen) スクリーン上のオフセットによって位置を変換します。 #### 構文 [Section titled “構文”](#構文-16) ```ts reearth.viewer.tools.transformByOffsetOnScreen: ( rawPosition: [x: number, y: number, z: number], screenOffset: [x: number, y: number] ) => [x: number, y: number, z: number] | undefined; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-11) ##### rawPosition [Section titled “rawPosition”](#rawposition) **型** `[x: number, y: number, z: number]` 地球上の元の位置です。 ##### screenOffset [Section titled “screenOffset”](#screenoffset) **型** `[x: number, y: number]` スクリーン上のオフセットです。 #### 戻り値 [Section titled “戻り値”](#戻り値-16) **型** `[x: number, y: number, z: number] | undefined` 変換後の位置です。 ### > isPositionVisibleOnGlobe [Section titled “> isPositionVisibleOnGlobe”](#-ispositionvisibleonglobe) 指定した位置がグローブ上で表示可能かどうかを確認します。 #### 構文 [Section titled “構文”](#構文-17) ```ts reearth.viewer.tools.isPositionVisibleOnGlobe: ( position: [x: number, y: number, z: number] ) => boolean; ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-12) ##### position [Section titled “position”](#position-1) **型** `[x: number, y: number, z: number]` 地球上の位置です。 #### 戻り値 [Section titled “戻り値”](#戻り値-17) **型** `boolean` 指定した位置がグローブ上で表示可能かどうかを示す真偽値です。 ## イベント [Section titled “イベント”](#イベント) ノート 共通イベントメソッド(`on`、`off`)の詳細については、[イベント](/ja/developer/plugin/api-reference/events) ページを参照してください。 ### resize [Section titled “resize”](#resize) `resize` イベントは、ビューアがリサイズされたときにトリガーされます。 #### 構文 [Section titled “構文”](#構文-18) ```ts reearth.viewer.on("resize", ({width: number, height: number, isMobile:boolean}) => void); ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-13) * **width:** ビューポートの幅です。 * **height:** ビューポートの高さです。 * **isMobile:** ビューポートがモバイルデバイスかどうかを示す真偽値です。bowser のユーザーエージェント検出に基づき判定されます。 #### 使用例 [Section titled “使用例”](#使用例-2) ```javascript reearth.viewer.on("resize", ({ width, height, isMobile }) => { console.log(`width: ${width}, height: ${height}, isMobile: ${isMobile}`); }); ``` ### マウスイベント [Section titled “マウスイベント”](#マウスイベント) ビューアにはリッスン可能なマウスイベントのセットがあります。これらはすべて同じパラメータを持ちます。 サポートされているイベントは以下のとおりです。 * click * doubleClick * mouseDown * mouseUp * rightClick * rightDown * rightUp * middleClick * middleDown * middleUp * mouseMove * mouseEnter * mouseLeave * wheel #### 構文 [Section titled “構文”](#構文-19) ```ts reearth.viewer.on("click", (event: MouseEvent)=> void); ``` #### パラメータ [Section titled “パラメータ”](#パラメータ-14) **event:** MouseEvent ```ts type MouseEvent = { x?: number; y?: number; lat?: number; lng?: number; height?: number; layerId?: string; delta?: number; }; ``` * **x:** ビューアを基準としたカーソルの x 座標です。 * **y:** ビューアを基準としたカーソルの y 座標です。 * **lat:** 地球上のカーソルの緯度です。 * **lng:** 地球上のカーソルの経度です。 * **height:** 地球上のカーソルの高さです。 * **layerId:** カーソルが乗っているオブジェクトのレイヤ ID です。 * **delta:** ホイールイベントのデルタ値です。 #### 使用例 [Section titled “使用例”](#使用例-3) ```javascript reearth.viewer.on("mouseMove", ({ lat, lng, height }) => { console.log(`lat: ${lat}, lng: ${lng}, height: ${height}`); }); ``` # 例 > 機能別に Visualizer プラグインの例を紹介します。 プラグインプレイグラウンドには、すぐに動かせるサンプルプラグイン(プリセット)が用意されています。ブラウザ上で開いて実行し、そのまま編集して試せるため、動作する実例を見て学ぶのに最適です。 [プラグインプレイグラウンド](https://visualizer.reearth.io/plugin-playground?plugin-id=my-plugin) を開き、**Plugins** パネルからプリセットを選択してコードを読み込み、実行してください。例は Playground 内と同じカテゴリで分類しています。 各プリセットは、**Share** ボタンで共有リンクをコピーするか、**Export** ボタンで `.zip` をダウンロードできます。非常に大きいプリセットはリンク共有できず、エクスポートのみ対応します。 ## User Interface [Section titled “User Interface”](#user-interface) `reearth.ui` および関連 API による、パネル、ナビゲーション、ポップアップ、ダイアログなどのカスタム UI 構築。 * **Responsive Panel**: ユーザーがリスト項目を追加/削除できるパネルウィジェット * **Sidebar**: 検索バーとメニュー項目を持つ折りたたみ式サイドバー * **Header**: ロゴとメニューリンクを備えた固定トップナビゲーションバー * **Popup**: ポップアップウィンドウの開閉、再配置、メッセージング(`reearth.popup` も使用) * **Modal Window**: モーダルダイアログの表示と、メッセージ受信によるクローズ(`reearth.modal` を使用) ## Data [Section titled “Data”](#data) プラグイン、UI、Visualizer 間でのデータ受け渡し、およびクライアント側でのデータ保存。 * **Messenger Between Extension and Visualizer**: マップクリック座標を取得し、そこへカメラを飛ばす(`reearth.viewer`、`reearth.extension` を使用) * **Messenger Between Extensions**: 2 つのウィジェット拡張間で双方向メッセージング(`reearth.extension` を使用) * **Extension Property**: `reearth.yml` の schema で定義したプロパティを読み取り表示(`reearth.extension` を使用) * **Client Storage**: ライト/ダークテーマの選択を保存し、次回も維持(`reearth.data` を使用) ## Viewer & Scene Settings [Section titled “Viewer & Scene Settings”](#viewer--scene-settings) `reearth.viewer` を使ったシーン環境の制御と、ビューア状態の取得。 * **Enable Shadow Style**: スイッチでシーンの影描画を切り替える * **Enable Terrain**: Cesium World Terrain と depth testing を切り替える * **Take Screenshot**: 現在の 3D ビューを PNG としてダウンロード * **Mouse Events**: クリック地点の緯度・経度・高さを表示 * **Get Current Location**: デバイスの現在地を取得してカメラを移動(`reearth.camera` も使用) ## Manage Layer [Section titled “Manage Layer”](#manage-layer) `reearth.layers` による、多様な形式のデータレイヤの追加と制御。 * **Add GeoJSON**: GeoJSON レイヤ(インライン/URL)+ マーカー/ポリゴン/ポリライン * **Add Large GeoJSON**: `useAsResource` フラグで大規模 GeoJSON を最適化 * **Add CZML**: CZML レイヤ(data URI/URL) * **Add KML**: KML レイヤ(data URI/URL) * **Add CSV**: URL の CSV からレイヤ追加(lat/lng 列をマーカーにマッピング) * **Add 3D Tiles**: 3Dタイルレイヤ(基本色/PBR スタイル) * **Add Photogrammetric 3D Model**: 写真測量 3Dタイルデータセット * **Add Point Cloud**: 3Dタイル形式の点群データセット * **Add OSM 3D Tiles**: 組み込み `osm-buildings` タイプによる OSM 建物表示 * **Add WMS**: リモートサーバーの WMS タイルレイヤ * **Add Google Photorealistic 3D Tiles**: Google のフォトリアルタイル(Google Maps API キーが必要) * **Hide, Fly To, Delete Layer**: レイヤ単位の表示/非表示、fly-to、削除操作(`reearth.camera` も使用) * **Override Layer Data**: ポリゴンのジオメトリをその場で更新 * **Show Selected Feature Information**: 選択フィーチャーのプロパティを選択時に表示 * **Add Infobox to Show All Properties**: すべてのプロパティを表示するインフォボックス * **Add Infobox to Show Specific Properties**: 指定したプロパティのみ表示するインフォボックス * **Add Infobox to Show Rich Blocks**: テキスト/画像/Markdown/動画などのリッチブロックを持つインフォボックス ## Manage Layer Style [Section titled “Manage Layer Style”](#manage-layer-style) 共有プロパティから条件分岐、フィーチャーベースのルールまで、レイヤスタイルの適用。 * **Layer Styling Examples**: GeoJSON / CZML / KML / CSV に同じスタイリングを適用 * **Feature Style 3D Tiles**: 3Dタイルの color / PBR / shadows / highlight / wireframe * **Feature Style 3D Model**: タイムライン駆動のアニメーション GLTF モデルのスタイリング(`reearth.timeline` も使用) * **Override Style**: 高さに応じた 2 種のカラーグラデーションを切り替える * **Style With Condition**: 高さ範囲に応じて色を割り当てる条件式 * **Filter Features by Style**: プロパティ条件でマーカーを表示/非表示 ## Camera [Section titled “Camera”](#camera) `reearth.camera` によるカメラ移動と制御。 * **Zoom In Out**: ズームイン/ズームアウトボタン * **Camera Rotation**: ターゲットの周りにカメラを連続回転 * **Camera Position**: ライブなカメラ位置を追跡し、手動で新しい値を適用 ## Timeline [Section titled “Timeline”](#timeline) `reearth.timeline` による時間再生制御と、時間ベースのアニメーション。 * **Playback Control**: play/pause、速度、range-type の制御+ライブ時計 * **Time Driven Features**: 時間とともに押し出し高さが変わる CZML ポリゴン(`reearth.layers` も使用) * **Time Driven Path**: 時間サンプル位置により 3D 列車モデルをルートに沿ってアニメーション(`reearth.layers` も使用) # 公式プラグイン > Re:Earth チームが管理するプラグインを紹介します。 公式プラグインは Re:Earth チームが開発・保守しているプラグインです。すぐにインストールして利用でき、プラグイン開発の実用的な参考にもなります。以下は Re:Earth Visualizer Plugins Hub で公開されているものです。 ## CMS Data Visualizer [Section titled “CMS Data Visualizer”](#cms-data-visualizer) CMS のデータを 3D マップ上に可視化し、マーカーや情報表示をカスタマイズできます。 [View on GitHub](https://github.com/reearth-plugins/cms-data-visualizer-plugin) ## CMS CSV Importer [Section titled “CMS CSV Importer”](#cms-csv-importer) Visualizer エディタから CSV データを CMS のモデルへ直接インポートします。 [View on GitHub](https://github.com/reearth-plugins/cms-csv-importer) ## Legend Panel [Section titled “Legend Panel”](#legend-panel) 分かりやすい地図凡例を作成するためのカスタマイズ可能な凡例パネル。React / TypeScript / Tailwind CSS で構築されています。 [View on GitHub](https://github.com/reearth-plugins/legend-panel-plugin) ## Navigation Panel [Section titled “Navigation Panel”](#navigation-panel) 滑らかなカメラ移動とズーム操作を、視覚的なフィードバック付きで提供する直感的なナビゲーションコントロールパネル。 [View on GitHub](https://github.com/reearth-plugins/navigation-panel-plugin) *** 公式プラグインに加え、コミュニティ製プラグインも含む最新一覧は、[Re:Earth Visualizer Plugins Hub](https://github.com/reearth-plugins/visualizer-plugin-hub) を参照してください。 # プラグインプレイグラウンドで動かす > ローカル開発環境を準備せずにプラグインを実行、編集します。 ![](/_astro/plugin-playground-attributed.C2WqFa94_Z1CDW4K.webp) ## プラグインプレイグラウンドで動かす [Section titled “プラグインプレイグラウンドで動かす”](#プラグインプレイグラウンドで動かす) プラグインプレイグラウンドは、Re:Earth Visualizer プラグインを**ブラウザ上で**作成・検証できるインタラクティブ環境です。コードを書いて実行し、結果をライブマップ上で即座に確認できます。Playground の核心はこの「変更 → 実行 → 観察」の高速ループにあり、すべてが 1 画面で完結するため、パッケージングやインストールなしにアイデアを試してすぐ効果を確認できます。インストール作業やローカル環境構築が不要なため、プラグインに初めて触れる場合でも、アイデアのプロトタイピングでも、最速で試せます。 Playground は次のリンクから開けます:[プラグインプレイグラウンド](https://visualizer.reearth.io/plugin-playground?plugin-id=my-plugin) ## Playground のレイアウト [Section titled “Playground のレイアウト”](#playground-のレイアウト) Playground は 3 つのカラムに分かれています。 * **Viewer**(左)— プラグインがリアルタイムに動作するライブマップ。下には現在のシーンの **Layers** / **Settings** / **Extension Settings** パネルがあります。 * **Plugins**(中央)— 利用可能なプラグインと、選択したプラグインを構成するファイル(`reearth.yml` や各拡張の JavaScript ファイルなど)を一覧表示します。上部にはプラグイン/ファイル管理のボタン列があります。 * **Code**(右)— 選択したファイル内容を表示するコードエディタ。ここでプラグインコードを編集します。 Playground を開くと、**Custom** カテゴリに **My Plugin** というデフォルトプラグインが既にロードされています。`reearth.yml` とサンプル拡張ファイルが事前に用意されているので、そのまま実行することも、出発点として改変することもできます。 ## Plugins パネルのボタン [Section titled “Plugins パネルのボタン”](#plugins-パネルのボタン) **Plugins** パネル上部のボタン列で作業を管理できます。 * **Add file** — 現在のプラグインに新しいファイルを追加します。 * **Import plugin** — 既存のプラグインを Playground に読み込みます。 * **Export plugin** — 現在のプラグインを `reearth.yml` と JavaScript ファイルを含む `.zip` としてダウンロードします。これは Re:Earth Visualizer にインストールするのと同じ形式です。 * **Share plugin** — プラグインの共有リンクをクリップボードにコピーし、他の人に送れるようにします。 ## プリセット例を動かす [Section titled “プリセット例を動かす”](#プリセット例を動かす) Playground には、**User Interface**、**Data**、**Viewer & Scene Settings**、**Manage Layer**、**Camera**、**Timeline** などのカテゴリに分かれた、すぐに動かせるサンプルプラグイン(プリセット)が用意されています。これらは動作する実例として最適で、実際のコードから学べます。 プリセットを実行する手順: 1. **Plugins** パネルでカテゴリを選び、プリセットを 1 つ選択します。コードが **Code** エディタに読み込まれます。 2. **Code** パネル上部の **run** ボタンをクリックします。プラグインが実行され、**Viewer** のマップ上に表示されます。 3. **Code** エディタでコードを編集し、再度 **run** をクリックすると変更が反映されます。 この「ロード → 実行 → 編集」のループが Playground 作業の中心で、各変更の効果をすぐに確認できます。 ## HTML Editor で UI を編集する [Section titled “HTML Editor で UI を編集する”](#html-editor-で-ui-を編集する) 拡張の UI は、JavaScript ファイル内のバッククォート(\`)文字列として HTML を記述します。数行なら問題ありませんが、長くなると編集しづらくなります。 その場合、**Code** パネル上部の **HTML Editor** ボタンをクリックしてください。UI 用の専用エディタが開き、通常のコードエディタと同様に HTML / CSS / JavaScript を書けます(シンタックスハイライトあり)。編集後に **Submit** をクリックすると、変更がプラグインに反映されます。 ## プラグインをエクスポートする [Section titled “プラグインをエクスポートする”](#プラグインをエクスポートする) プラグインが期待通りに動作したら、**Plugins** パネルの **Export plugin** をクリックして `.zip` としてダウンロードします。 * ダウンロードした `.zip` は、任意の Re:Earth Visualizer プロジェクトにインストールできます。 * あるいは、「[ローカル開発環境をセットアップする](/ja/developer/plugin/get-started/set-up-a-local-development-environment/)」を参照して、ローカル環境で開発を続けることもできます。 # ローカル開発環境をセットアップする > Visualizer プラグイン開発用のローカル環境を準備します。 ノート このセクションでは、現在のテンプレートベースのワークフローを説明します。Re:Earth Visualizer のプラグイン CLI は現在利用できません。 プラグインプレイグラウンドは素早い試作に最適ですが、本格的なプラグインを作る場合はローカル開発環境が適しています。自分のエディタでコードを書き、`.zip` を手動でビルドして再インストールすることなく、Re:Earth Visualizer 上でほぼ即時に変更を確認できます。 このワークフローは次の 2 つで構成されます: * テンプレートから作成するプラグインプロジェクト * DEV\_PLUGIN 機能を使い、プレビューサーバーからプラグインを直接読み込むローカル版 Re:Earth Visualizer ## 前提条件 [Section titled “前提条件”](#前提条件) このガイドでは、Re:Earth Visualizer がローカルで起動しており `http://localhost:3000` でアクセスできることを前提とします。Visualizer 本体(サーバー/DB を含む)のセットアップは別の手順です。詳細は [reearth-visualizer repository](https://github.com/reearth/reearth-visualizer) を参照してください。 また、[Node.js](https://nodejs.org/) と [Yarn](https://yarnpkg.com/) がインストールされている必要があります。 ## テンプレートからプラグインを作成する [Section titled “テンプレートからプラグインを作成する”](#テンプレートからプラグインを作成する) 推奨する開始点は、React / ShadCN / Tailwind CSS を用いた [Re:Earth Visualizer Plugin ShadCN Template](https://github.com/reearth-plugins/reearth-visualizer-plugin-shadcn-template) です。 ノート このテンプレートは便利な出発点ですが必須ではありません。どのフレームワークやライブラリを使っても構いません。重要なのは DEV\_PLUGIN 機能で、ローカルのプレビューサーバーからプラグインを読み込める点です。 テンプレートからプロジェクトを作成し、ターミナルでそのディレクトリを開いたら: 1. プロジェクトディレクトリへ移動: ```bash cd your-new-plugin ``` 2. 依存関係をインストール: ```bash yarn install ``` 3. 必要ファイルを生成するため、初回ビルドを実行: ```bash yarn build ``` 4. 開発/プレビューサーバーを起動: ```bash yarn dev-build ``` この最後のコマンドは、保存のたびに自動でビルドし、`http://localhost:5005` のプレビューサーバーから配信します。 ## Re:Earth Visualizer で DEV\_PLUGIN を有効化する [Section titled “Re:Earth Visualizer で DEV\_PLUGIN を有効化する”](#reearth-visualizer-で-dev_plugin-を有効化する) 次に、ローカル Visualizer がそのプレビューサーバーからプラグインをロードするよう設定します。 1. ローカル Re:Earth Visualizer プロジェクトの `web` ディレクトリへ移動し、まだ存在しなければ `.env` ファイルを作成します: ```bash cd web touch .env ``` 2. `env` にプレビューサーバー URL を追加します: ```bash REEARTH_WEB_DEV_PLUGIN_URLS='["http://localhost:5005"]' ``` `.env` を保存すると Web サーバーは自動的に再起動します。 ## ウィジェットプラグインをプロジェクトに追加する [Section titled “ウィジェットプラグインをプロジェクトに追加する”](#ウィジェットプラグインをプロジェクトに追加する) 両方のサーバーが起動したら、Visualizer 上でプラグインをホストするプロジェクトを用意します。 1. `http://localhost:3000` でローカル Re:Earth Visualizer を開きます。 2. ダッシュボードから新しいプロジェクトを作成します。 3. プロジェクトをダブルクリックして開きます。 4. エディタのヘッダーで **Install Dev Plugins** をクリックし、プレビューサーバーからプラグインを取得してインストールします。 5. **Widgets** タブを開き、シーンにプラグインのウィジェットを追加します。 ノート この手順はウィジェット拡張向けです。InfoboxBlock や StoryBlock の拡張を持つプラグインもインストール手順(ステップ 1〜4)は同じですが、シーンへの追加は **Widgets** タブではなく、レイヤのインフォボックス設定やストーリーページから行います。各拡張タイプがどこに表示されるかは「[拡張タイプの違い](/ja/developer/plugin/overview/extension-types/)」を参照してください。 ## 開発ループ [Section titled “開発ループ”](#開発ループ) 接続できると、日々の作業はとても短くなります。 1. プラグインコードを変更して保存すると、自動的に再ビルドされます。 2. Visualizer のエディタヘッダーで **Reload Dev Plugin Extensions** をクリックすると、更新された拡張コードが読み込まれます。 ページ全体を再読み込みするのではなく、プラグインだけが再読み込みされるため、変更はほぼ即時に反映されます。 ## DEV\_PLUGIN の 2 つのボタン [Section titled “DEV\_PLUGIN の 2 つのボタン”](#dev_plugin-の-2-つのボタン) DEV\_PLUGIN ワークフローでは、Visualizer のエディタヘッダーに 2 つのボタン(どちらもパズルピースアイコン)が追加されます。 ![](/_astro/dev-plugin-buttons-osm2.CLHG-E7i_159rUs.webp) * **Install Dev Plugins** — プレビューサーバーからプラグインを取得し、`.zip` にパッケージ化してインストールします。 * **Reload Dev Plugin Extensions** — ページを再読み込みせずに、プレビューサーバーから拡張コードを再読み込みします。 どちらを押すべきかは、変更内容に応じて次の表で判断してください。 | 変更したもの | 使用するボタン | | ------------------------------ | ---------------------------- | | プロジェクトへの初回セットアップ | Install Dev Plugins | | 拡張コード(TypeScript / JavaScript) | Reload Dev Plugin Extensions | | `reearth.yml`(プラグインマニフェスト) | Install Dev Plugins | # ユーザーが設定できるプロパティを受け取る > インスペクターでユーザーが設定したプロパティを読み取ります。 このガイドを終えると、Re:Earth Visualizer のインスペクターパネルからユーザーが設定できる項目をプラグインに追加し、拡張コードからその値を読み取れるようになります。このガイドは、`reearth.yml` と拡張ファイルの基本的な構造を把握していることを前提としています。 ユーザーが設定できるプロパティを追加するには、`reearth.yml` でスキーマを宣言します。Re:Earth Visualizer がそのスキーマをインスペクターパネルに表示し、拡張コードからは `reearth.extension` を使って値を読み取れます。 ## サンプルコード [Section titled “サンプルコード”](#サンプルコード) この例では、ユーザーが背景色を選択できるカラーピッカーを追加します。拡張コードはその色を読み取り、UI に渡してパネルの背景に適用します。 **reearth.yml** ```yaml id: accept-props-plugin name: Accept Props Plugin version: 1.0.0 extensions: - id: accept-props type: widget name: Accept Props schema: groups: - id: appearance fields: - id: primary_color type: string ui: color title: Primary color defaultValue: "#3a86ff" ``` **accept-props.js** ```javascript const color = reearth.extension.widget?.property?.appearance?.primary_color ?? "#3a86ff"; reearth.ui.show(`
`); ``` ## 結果 [Section titled “結果”](#結果) パネルが地図上に表示されます。インスペクターパネルで別の色を選択すると、プラグインをリロードした際にその色がパネルに反映されます。 ![ユーザーが設定した色のパネルが Re Visualizer の地図上に表示されている](/_astro/accept-props-osm.DjEyI0a4_2pqepg.webp) 地図データ提供:[OpenStreetMap](https://www.openstreetmap.org/copyright) ## 仕組み [Section titled “仕組み”](#仕組み) **`reearth.yml` でスキーマを宣言する** スキーマはウィジェットの `schema` キーの下に記述します。`groups` は設定パネルのセクションを定義し、各 `fields` がひとつの設定項目に対応します。 ```yaml schema: groups: - id: appearance fields: - id: primary_color type: string ui: color title: Primary color defaultValue: "#3a86ff" ``` * **`id`**: コードでフィールドを参照するために使う識別子。 * **`type`**: フィールドの値の型。`string`、`number`、`bool` などが使えます。 * **`ui`**: インスペクターに表示するウィジェットの種類。`color` を指定するとカラーピッカーが表示されます。 * **`title`**: インスペクターに表示されるラベル。 * **`defaultValue`**: 初期値。 **コードで値を読み取る** `reearth.extension` を通じてプロパティにアクセスします。パスは `widget → property → <グループ ID> → <フィールド ID>` の順になります。 ```javascript const color = reearth.extension.widget?.property?.appearance?.primary_color ?? "#3a86ff"; ``` オプショナルチェーン(`?.`)を使うのは、ウィジェット・グループ・フィールドがどれかひとつでも未設定の場合に `undefined` を返すためです。`??` はフォールバック値として機能します。 ## 次のステップ [Section titled “次のステップ”](#次のステップ) * [reearth.extension API リファレンス](/ja/developer/plugin/api-reference/extension/): ウィジェット・インフォボックスブロック・ストーリーブロックのプロパティの完全な一覧 * [プラグインの構造](/ja/developer/plugin/overview/plugin-structure/): スキーマフィールドの完全なリストと各タイプの説明 # レイヤを追加する > データをレイヤとして Visualizer のシーンに追加します。 このガイドを終えると、プラグインから地図にレイヤを追加できるようになります(例:特定の座標にマーカーを配置する)。このガイドは、`reearth.yml` と拡張ファイルの基本的な構造を把握していることを前提としています。 レイヤを追加するには、レイヤのデータと表示方法を記述したレイヤオブジェクトを `reearth.layers.add` に渡します。このメソッドは新しいレイヤの ID を返します。この ID を保持しておくと、後でレイヤを変更・削除できます。 ## サンプルコード [Section titled “サンプルコード”](#サンプルコード) この例では、東京の座標に赤いマーカーをひとつ追加します。 **reearth.yml** ```yaml id: add-layer-plugin name: Add Layer Plugin version: 1.0.0 extensions: - id: add-layer type: widget name: Add Layer ``` **add-layer.js** ```javascript const layerId = reearth.layers.add({ type: "simple", data: { type: "geojson", value: { type: "FeatureCollection", features: [ { type: "Feature", properties: {}, geometry: { type: "Point", coordinates: [139.97422779688281, 35.74642872517698], }, }, ], }, }, marker: { style: "point", pointColor: "#ff0000", pointSize: 12, }, }); if (layerId) { console.log("レイヤを追加しました。ID:", layerId); } else { console.log("レイヤの追加に失敗しました。"); } reearth.camera.flyTo( { lat: 35.74642872517698, lng: 139.97422779688281, height: 200000, }, { duration: 2 } ); ``` ## 結果 [Section titled “結果”](#結果) ウィジェットがロードされると、カメラが東京に移動し、指定した座標に赤いマーカーが表示されます。 ![Re Visualizer の地図上の東京付近に追加された赤いマーカー](/_astro/add-layer-osm.BlqkXXba_SE0cf.webp) 地図データ提供:[OpenStreetMap](https://www.openstreetmap.org/copyright) ## 仕組み [Section titled “仕組み”](#仕組み) `reearth.layers.add` にレイヤオブジェクトをひとつ渡します。オブジェクトには 3 つの重要な部分があります。 * **`type`**: レイヤの種類。データを直接提供するレイヤには `"simple"` を使います。ほとんどの場合これで対応できます。 * **`data`**: レイヤのソースデータを記述します。 * **`type`**: データ形式。この例では `"geojson"` を使用。他にも `"czml"`、`"csv"`、`"3dtiles"`、`"kml"` などがサポートされています。 * **`value`**: データ本体をインラインで指定。外部ソースからデータを読み込む場合は `value` の代わりに `url` を指定できます。 * **外観キー**: Re:Earth Visualizer にデータのレンダリング方法を指示します。この例では `marker` に `style: "point"`、`pointColor`、`pointSize` を指定。他の外観キーには `polyline`、`polygon`、`model` などがあります。 `reearth.layers.add` は新しいレイヤの ID を文字列で返します。レイヤを追加できなかった場合は `undefined` を返します。後で `reearth.layers.override` でレイヤを変更したり、`reearth.layers.delete` で削除したりする場合は、この ID を保持しておいてください。 ノート `reearth.layers.delete` で削除できるのは、プラグイン API 経由で一時的に追加したレイヤのみです。保存済みプロジェクトの一部であるレイヤは削除できません。 ## 次のステップ [Section titled “次のステップ”](#次のステップ) * [reearth.layers API リファレンス](/ja/developer/plugin/api-reference/layers/): レイヤオブジェクトの全項目、すべてのデータ型、外観オプション * [reearth.camera API リファレンス](/ja/developer/plugin/api-reference/camera/): `flyTo` とその他のカメラ操作 * [レイヤにインフォボックスを設定する](/ja/developer/plugin/guides/configure-an-infobox-for-a-layer/): ユーザーがレイヤをクリックしたときにフィーチャの詳細を表示する # 背景地図を変更する > プラグインから組み込みまたはカスタムの背景地図を変更します。 このガイドを終えると、プラグインから背景地図(地球上に表示されるベース画像)を変更できるようになります。このガイドは、`reearth.yml` と拡張ファイルの基本的な構造を把握していることを前提としています。 背景地図を変更するには、`tiles` 配列を指定して `reearth.viewer.overrideProperty` を呼び出します。各エントリがひとつのタイルソースを表します。Re:Earth Visualizer にはいくつかの組み込み背景地図が用意されており、名前で選択できます。また、URL を指定してカスタムのタイルサーバーを使うこともできます。 ノート `overrideProperty` で行った変更は一時的なものです。プロジェクトには保存されず、ページをリロードすると元に戻ります。 ## サンプルコード [Section titled “サンプルコード”](#サンプルコード) この例では、背景地図を国土地理院標準地図に切り替えます。 **reearth.yml** ```yaml id: basemap-plugin name: Basemap Plugin version: 1.0.0 extensions: - id: basemap-demo type: widget name: Basemap Demo ``` **basemap-demo.js** ```javascript reearth.viewer.overrideProperty({ tiles: [ { id: "gsi", type: "japan_gsi_standard", }, ], }); ``` ## 結果 [Section titled “結果”](#結果) ウィジェットがロードされると、地球のベース画像が国土地理院標準地図に切り替わります。 ![Re Visualizer に表示された国土地理院標準地図の背景地図](/_astro/basemap-gsi-attributed.DW27Emiw_Z16Ehsj.webp) ## 仕組み [Section titled “仕組み”](#仕組み) `reearth.viewer.overrideProperty` は実行時にビューアのプロパティを設定します。背景地図を変更するには `tiles` 配列を渡します。指定した画像が現在の背景地図と置き換わります。各タイルエントリには `id`(任意の一意な識別子)と、組み込みの `type` またはカスタムの `url` が必要です。 ### 組み込み背景地図を使う [Section titled “組み込み背景地図を使う”](#組み込み背景地図を使う) Re:Earth Visualizer の組み込み背景地図を使うには、`type` に背景地図の名前を設定します。URL は不要で、各組み込み背景地図はタイルの読み込み先を既に知っています。 | タイプ | 背景地図 | Cesium Ion トークンが必要 | | -------------------- | ------------------ | ------------------ | | `open_street_map` | OpenStreetMap | いいえ | | `japan_gsi_standard` | 国土地理院標準地図 | いいえ | | `carto_light` | CARTO ライト | いいえ | | `default` | Cesium Ion デフォルト画像 | はい | | `default_road` | Cesium Ion ロードマップ | はい | | `default_label` | Cesium Ion ラベル付き画像 | はい | | `black_marble` | 夜の地球 | はい | 「はい」と表示されている背景地図は Cesium Ion から画像を読み込むため、シーンに Cesium Ion のアクセストークンが設定されている場合のみ使用できます。 ### カスタム背景地図を使う [Section titled “カスタム背景地図を使う”](#カスタム背景地図を使う) 上記のリストにないタイルサーバーを使う場合は、標準の `{z}/{x}/{y}` テンプレート形式で `url` を指定します。 ```javascript reearth.viewer.overrideProperty({ tiles: [ { id: "custom", url: "https://example.com/tiles/{z}/{x}/{y}.png", }, ], }); ``` 注意 各背景地図にはそれぞれ利用規約と帰属表示の要件があります。組み込み・カスタムを問わず、背景地図を使用する際はプロバイダーの帰属表示ルールに従い、公開前に利用規約を確認してください。 ## 次のステップ [Section titled “次のステップ”](#次のステップ) * [reearth.viewer API リファレンス](/ja/developer/plugin/api-reference/viewer/): `overrideProperty` とその他のビューアメソッド # プラグインと Re:Earth の間で通信する > プラグインと Re:Earth の間でメッセージを送受信します。 このガイドを終えると、プラグインの UI(iframe)とロジック(拡張コード)の間でメッセージを双方向に送受信できるようになります。このガイドは、`reearth.yml` と拡張ファイルの基本的な構造を把握していることを前提としています。 Re:Earth Visualizer のプラグインは、ロジックを担う拡張コードと UI を担う iframe の 2 つの部分で構成されています。これらは `postMessage` / `on("message")` のパターンを使って通信します。 ## サンプルコード [Section titled “サンプルコード”](#サンプルコード) この例では、ボタンがひとつある UI パネルを作ります。ボタンをクリックするとロジック側にメッセージが送られ、ロジック側はカメラを東京に向け、確認メッセージを UI に返します。 **reearth.yml** ```yaml id: communicate-plugin name: Communicate Plugin version: 1.0.0 extensions: - id: communicate-demo type: widget name: Communicate Demo ``` **communicate-demo.js** ```javascript reearth.ui.show(`

待機中…

`); reearth.extension.on("message", (message) => { if (message?.action === "flyToTokyo") { reearth.camera.flyTo( { lat: 35.6762, lng: 139.6503, height: 150000 }, { duration: 2 } ); reearth.ui.postMessage({ action: "done", message: "東京へ移動しました!", }); } }); ``` ## 結果 [Section titled “結果”](#結果) 地図上にパネルが表示されます。ボタンをクリックするとカメラが東京に向かい、ステータスメッセージが「東京へ移動しました!」に変わります。 ![Re Visualizer の地図上に通信パネルが表示されている](/_astro/communicate-osm.DwQz6isk_2nGFdU.webp) 地図データ提供:[OpenStreetMap](https://www.openstreetmap.org/copyright) ## 仕組み [Section titled “仕組み”](#仕組み) プラグインには 2 つのメッセージの流れがあります。 **UI → ロジック** UI(iframe)は `parent.postMessage` を使って拡張コードにメッセージを送ります。 ```javascript parent.postMessage({ action: "flyToTokyo" }, "*"); ``` 拡張コード側では `reearth.extension.on("message", handler)` で受け取ります。 ```javascript reearth.extension.on("message", (message) => { if (message?.action === "flyToTokyo") { // 処理 } }); ``` **ロジック → UI** 拡張コードは `reearth.ui.postMessage` を使って UI にメッセージを送ります。 ```javascript reearth.ui.postMessage({ action: "done", message: "東京へ移動しました!" }); ``` UI 側では `window.addEventListener("message", handler)` で受け取ります。 ```javascript window.addEventListener("message", function (e) { if (e.data?.action === "done") { document.getElementById("status").textContent = e.data.message; } }); ``` メッセージのペイロードには任意のシリアライズ可能な値を使えます。`action` フィールドはあくまでも規約です。何を送るかは自由に決められます。 ## 次のステップ [Section titled “次のステップ”](#次のステップ) * [reearth.ui API リファレンス](/ja/developer/plugin/api-reference/ui/): `show`、`postMessage` などの完全な一覧 * [reearth.extension API リファレンス](/ja/developer/plugin/api-reference/extension/): メッセージイベントとプロパティアクセス * [プラグインシステムの仕組み](/ja/developer/plugin/overview/how-the-plugin-system-works/): 2 つの部分がどのように分離されているかの詳細 # レイヤにインフォボックスを設定する > レイヤの情報を表示するインフォボックスを設定します。 このガイドを終えると、レイヤにインフォボックスを付与できるようになります。ユーザーがそのレイヤのフィーチャをクリックすると、フィーチャの情報を表示するパネルが開きます。このガイドは、レイヤの追加に慣れていることを前提としています([レイヤを追加する](/ja/developer/plugin/guides/add-a-layer/)を参照)。 インフォボックスはレイヤ自体の `infobox` プロパティとして設定します。インフォボックスにひとつ以上のブロックを追加すると、ユーザーがそのレイヤのフィーチャを選択したときに Re:Earth Visualizer がそれらを表示します。 ## サンプルコード [Section titled “サンプルコード”](#サンプルコード) この例では、いくつかのプロパティを持つマーカーをひとつ追加し、フィーチャが選択されたときにそのすべてのプロパティを自動で表示するインフォボックスを付与します。 **reearth.yml** ```yaml id: infobox-demo-plugin name: Infobox Demo Plugin version: 1.0.0 extensions: - id: infobox-demo type: widget name: Infobox Demo ``` **infobox-demo.js** ```javascript reearth.layers.add({ type: "simple", data: { type: "geojson", value: { type: "FeatureCollection", features: [ { type: "Feature", properties: { name: "東京タワー", height: "333 m", category: "ランドマーク", }, geometry: { type: "Point", coordinates: [139.7454, 35.6586], }, }, ], }, }, infobox: { blocks: [ { pluginId: "reearth", extensionId: "propertyInfoboxBetaBlock", }, ], }, marker: { style: "point", pointColor: "#ff0000", pointSize: 12, }, }); reearth.camera.setView({ lat: 35.6586, lng: 139.7454, height: 80000, heading: 0, pitch: -1.5708, roll: 0, }); ``` ## 結果 [Section titled “結果”](#結果) 東京タワーの位置にマーカーが表示されます。クリックするとインフォボックスが開き、フィーチャのプロパティ(名前、高さ、カテゴリ)が一覧表示されます。 ![Re Visualizer の地図上にフィーチャのプロパティを表示するインフォボックス](/_astro/infobox-osm.BbPnyOYc_Z1wsXTB.webp) 地図データ提供:[OpenStreetMap](https://www.openstreetmap.org/copyright) ## 仕組み [Section titled “仕組み”](#仕組み) インフォボックスはレイヤ自体に設定します。`reearth.layers.add` に渡す `infobox` プロパティを通じて定義します。 ```javascript infobox: { blocks: [ { pluginId: "reearth", extensionId: "propertyInfoboxBetaBlock" } ] } ``` * **`blocks`**: インフォボックスに表示するブロックのリスト(順番通り)。 * **`pluginId`** と **`extensionId`**: 表示するブロックを識別します。ここでは `reearth` / `propertyInfoboxBetaBlock` という組み込みブロックを使用しており、選択されたフィーチャのすべてのプロパティを自動で一覧表示します。ブロックのコードを書かなくても完全なプロパティ表示が得られます。 インフォボックスに表示されるプロパティは、GeoJSON の各フィーチャの `properties` オブジェクトから取得されます。ここでは `name`、`height`、`category` です。プロパティを追加するとインフォボックスにも表示されます。 インフォボックスはレイヤに属しているため、ユーザーがそのレイヤのフィーチャを選択したときだけ表示されます。フィーチャをクリックするまでは何も表示されません。 ## 次のステップ [Section titled “次のステップ”](#次のステップ) * [レイヤを追加する](/ja/developer/plugin/guides/add-a-layer/): このガイドの土台となるレイヤの基本 * [reearth.layers API リファレンス](/ja/developer/plugin/api-reference/layers/): インフォボックスとブロックのオプションを含む完全なレイヤオブジェクト * [拡張タイプの違い](/ja/developer/plugin/overview/extension-types/): InfoboxBlock 拡張タイプとここで作ったものの関係 # UI を表示する > Visualizer プラグインからユーザーインターフェースを表示します。 このガイドを終えると、Re:Earth Visualizer 内でプラグインのカスタム UI を描画できるようになります。ここでは、`reearth.yml` と拡張ファイルからなる基本的なプラグイン構成を理解していることを前提とします。 プラグインは `reearth.ui.show` に HTML を渡すことで UI を表示します。Re:Earth Visualizer はその HTML を iframe 内にレンダリングします。iframe は通常の Web ページのように振る舞うため、標準の HTML / CSS / JavaScript を使って任意の UI を構築できます。 ## サンプルコード [Section titled “サンプルコード”](#サンプルコード) この例では、見出しとスタイル付きボックスを持つシンプルなパネルを描画します。 **reearth.yml** ```yaml id: ui-demo-plugin name: UI Demo Plugin version: 1.0.0 extensions: - id: ui-demo type: widget name: UI Demo ``` **ui-demo.js** ```javascript reearth.ui.show(`

Hello from my plugin

This UI is rendered inside an iframe.

`); ``` ## 結果 [Section titled “結果”](#結果) このウィジェットをシーンに追加すると、メインビューにパネルが表示されます。 ![](/_astro/display-ui-osm.CTsMLc4d_Zke3on.webp) ## 仕組み [Section titled “仕組み”](#仕組み) **`reearth.ui.show` は HTML をレンダリングします** UI は HTML 文字列として `reearth.ui.show` に渡します。UI に必要なマークアップ、スタイル、スクリプトはすべてこの文字列内に含めます。 ```javascript reearth.ui.show(`
...
`); ``` HTML は iframe 内で実行されるため、Visualizer 本体のページから隔離されます。これにより、スタイルが競合しにくく、独立した UI を作れます。 **CSS でサイズを設定します** iframe はコンテンツに合わせてサイズが決まります。ルート要素に対して `width: 240px` のように CSS で寸法を指定してください。`html, body` に `margin: 0` を設定すると、ブラウザ既定の余白が消え、UI が端まで詰まって表示されます。 ## 次に読む [Section titled “次に読む”](#次に読む) * [reearth.ui API リファレンス](/ja/developer/plugin/api-reference/ui/) — `show` / `resize` / `close` など表示関連 API の一覧 * [ユーザーが設定できるプロパティを受け取る](/ja/developer/plugin/guides/accept-user-configurable-properties/) — インスペクターから UI を設定可能にする # 大規模データセットを最適化してレンダリングする > 大規模データセットのレンダリング性能を改善します。 このガイドを終えると、パフォーマンスオプションを有効にして大規模な GeoJSON データセットを効率的に読み込めるようになります。このガイドは、レイヤの追加に慣れていることを前提としています([レイヤを追加する](/ja/developer/plugin/guides/add-a-layer/)を参照)。 座標が何千もある非常に大きな GeoJSON ファイルは、通常の方法で読み込むとレンダリングが遅くなることがあります。Re:Earth Visualizer には `useAsResource` というパフォーマンスオプションがあり、大規模な GeoJSON データをより効率的に処理できます。フィーチャが約 6,000 を超える GeoJSON にはこのオプションを使用してください。 ## サンプルコード [Section titled “サンプルコード”](#サンプルコード) この例では、パフォーマンスオプションを有効にして東京エリアの境界を表す大規模な GeoJSON レイヤを追加します。 **reearth.yml** ```yaml id: large-dataset-plugin name: Large Dataset Plugin version: 1.0.0 extensions: - id: large-dataset type: widget name: Large Dataset ``` **large-dataset.js** ```javascript reearth.layers.add({ type: "simple", data: { type: "geojson", url: "https://reearth.github.io/visualizer-plugin-sample-data/public/geojson/tokyo-boundary.geojson", geojson: { useAsResource: true, }, }, polygon: {}, }); reearth.camera.flyTo( { lat: 35.68, lng: 139.40, height: 176000 }, { duration: 2 } ); ``` ## 結果 [Section titled “結果”](#結果) GeoJSON の境界データが読み込まれ、東京エリア全体にレンダリングされます。`useAsResource` が有効になっているため、Visualizer 側からのスタイリングは適用されず、デフォルトの色で表示されます。外観を変更するには、GeoJSON ファイル自体にスタイルを定義してください(下記参照)。 ![Re Visualizer の地図上にレンダリングされた大規模な GeoJSON 境界レイヤ](/_astro/large-dataset-osm.KD3-Mz3R_qe81h.webp) 地図データ提供:[OpenStreetMap](https://www.openstreetmap.org/copyright) ## 仕組み [Section titled “仕組み”](#仕組み) パフォーマンスオプションはレイヤの `data` ブロック内の `geojson` キーに設定します。 ```javascript data: { type: "geojson", url: "https://example.com/large-data.geojson", geojson: { useAsResource: true, }, } ``` `useAsResource: true` を設定すると、Re:Earth Visualizer は大規模データセット向けに最適化された方法で GeoJSON をレンダリングします。フィーチャが約 6,000 を超える GeoJSON に推奨されます。 注意 `useAsResource` が有効な場合、Visualizer 側からレイヤをスタイリングできません(例:`polygon`、`marker`、`polyline` の外観オプション)。代わりに、GeoJSON ファイルの各フィーチャに標準のスタイルプロパティを直接定義してください。例: ```json "properties": { "stroke": "#fb0404", "stroke-width": 2, "stroke-opacity": 1 } ``` ノート このサンプルで使用している境界データは、国土交通省(MLIT)のオープンデータです。外部データを使用する際は、利用規約を確認し、帰属表示の要件に従ってください。 ## 次のステップ [Section titled “次のステップ”](#次のステップ) * [レイヤを追加する](/ja/developer/plugin/guides/add-a-layer/): このガイドの土台となるレイヤの基本 * [reearth.layers API リファレンス](/ja/developer/plugin/api-reference/layers/): 完全なレイヤとデータオブジェクト # タイムラインを再生する > プラグインからタイムラインの再生を設定、制御します。 このガイドを終えると、プラグインから Re:Earth Visualizer のタイムラインを制御できるようになります。時間範囲の設定、再生・一時停止、速度の調整、時間の進行に応じた処理が可能になります。このガイドは、`reearth.yml` と拡張ファイルの基本的な構造を把握していることを前提としています。 タイムラインは、シーンの時系列データとアニメーションを駆動します。`reearth.timeline` を通じて、プラグインはタイムラインの範囲設定、再生・一時停止、速度変更、進行に応じたイベント受信ができます。 ## サンプルコード [Section titled “サンプルコード”](#サンプルコード) この例では、時計と **再生** ボタン・**一時停止** ボタンを持つ小さなパネルを表示します。**再生** をクリックすると 2023 年を通じてタイムラインが進み、時計が現在時刻をリアルタイムで更新します。 **reearth.yml** ```yaml id: timeline-plugin name: Timeline Plugin version: 1.0.0 extensions: - id: timeline-demo type: widget name: Timeline Demo ``` **timeline-demo.js** ```javascript reearth.ui.show(`

現在時刻: -

`); reearth.timeline?.setTime?.({ start: new Date("2023-01-01T00:00:00Z"), stop: new Date("2023-12-31T23:59:59Z"), current: new Date("2023-01-01T00:00:00Z"), }); reearth.timeline?.setSpeed?.(3600 * 2); reearth.extension.on("message", (message) => { if (message?.action === "play") { reearth.timeline?.play?.(); } if (message?.action === "pause") { reearth.timeline?.pause?.(); } }); reearth.timeline?.on?.("tick", (currentTime) => { reearth.ui.postMessage({ action: "tick", time: currentTime.toISOString() }); }); ``` ## 結果 [Section titled “結果”](#結果) 時計と **再生** ボタン・**一時停止** ボタンを持つパネルが表示されます。**再生** をクリックするまでは何も動きません。クリックすると 2023 年を通じて時計が進みます。**一時停止** をクリックすると、その時点で止まります。 ![Re Visualizer の地図上に表示されたタイムラインコントロールパネル](/_astro/timeline-osm.y4qA4Nez_29T2tx.webp) 地図データ提供:[OpenStreetMap](https://www.openstreetmap.org/copyright) ## 仕組み [Section titled “仕組み”](#仕組み) `reearth.timeline` 名前空間は、タイムラインの範囲設定、再生制御、時間進行への反応のためのメソッドを提供します。 **時間範囲を設定する** `setTime` はタイムラインの範囲と開始位置を定義します。3 つの `Date` 値を持つオブジェクトを渡します。 ```javascript reearth.timeline?.setTime?.({ start: new Date("2023-01-01T00:00:00Z"), stop: new Date("2023-12-31T23:59:59Z"), current: new Date("2023-01-01T00:00:00Z"), }); ``` * **`start`**: タイムラインの開始時刻。 * **`stop`**: タイムラインの終了時刻。 * **`current`**: 再生を開始する位置。 **再生を制御する** `play` は現在位置からタイムラインを開始し、`pause` はリセットせずに停止します。 ```javascript reearth.timeline?.play?.(); reearth.timeline?.pause?.(); ``` **速度を設定する** `setSpeed` はリアルタイムに対するタイムラインの進行速度を制御します。値はリアル 1 秒あたりのタイムライン秒数です。`1` はリアルタイム、`3600 * 2` は 1 秒あたり 2 時間です。 ```javascript reearth.timeline?.setSpeed?.(3600 * 2); ``` **時間の変化に反応する** `tick` イベントは再生中に現在時刻が進むたびに発火します。ハンドラは現在時刻を `Date` として受け取ります。ハンドラは軽量に保ち、ティックごとに重い処理やログ出力を行わないようにしてください。 ```javascript reearth.timeline?.on?.("tick", (currentTime) => { reearth.ui.postMessage({ action: "tick", time: currentTime.toISOString() }); }); ``` ノート タイムラインのメソッドはオプショナルチェーン(`?.`)を使って呼び出します。タイムラインはすべてのコンテキストで利用できるとは限らないためです。 ## 次のステップ [Section titled “次のステップ”](#次のステップ) * [reearth.timeline API リファレンス](/ja/developer/plugin/api-reference/timeline/): `stepType`、`rangeType` を含むタイムラインメソッド・プロパティ・イベントの全一覧 * [プラグインと Re:Earth の間で通信する](/ja/developer/plugin/guides/communicate-between-a-plugin-and-reearth/): UI ボタンが拡張ロジックにメッセージを送る仕組み # 拡張タイプの違い > ウィジェット、InfoboxBlock、StoryBlock の拡張タイプを比較します。 プラグインは拡張を通じて機能を提供します。Re:Earth Visualizer がサポートする拡張タイプは、ウィジェット、InfoboxBlock、StoryBlock の 3 種類です。それぞれインターフェース内の異なる場所に表示され、適した用途も異なります。 拡張タイプによって表示場所とユーザーの操作方法が決まるため、適切なタイプを選ぶことはプラグインを設計する際の最初の判断になります。 | 拡張タイプ | 表示場所 | 適した用途 | | ------------ | -------------------- | -------------------------- | | ウィジェット | メインの地図ビュー上にフローティング表示 | 常に表示する操作パネルや情報 | | InfoboxBlock | 地物のインフォボックス内 | ユーザーが特定の地物を選択したときに表示する詳細情報 | | StoryBlock | ストーリーページ内 | ガイド付きのストーリーに埋め込むリッチコンテンツ | ## ウィジェット [Section titled “ウィジェット”](#ウィジェット) ウィジェットは、Visualizer のメインビュー上にフローティング表示される拡張です。Widget Align System を使って、画面の端や隅に配置できます。 シーンを開いている間は常に表示されるため、検索ボックス、凡例、ライブデータパネル、シーン内の操作を実行するボタンなど、継続的にアクセスする必要がある操作や情報に適しています。 ユーザーのシーン内での操作にかかわらず、地図上に常に表示したい操作や情報にはウィジェットを使用します。 ## InfoboxBlock [Section titled “InfoboxBlock”](#infoboxblock) InfoboxBlock は、ユーザーがレイヤ上の地物を選択したときに開くパネルであるインフォボックス内に表示される拡張です。その地物に関する情報の一部として表示されます。 InfoboxBlock は地物の選択に連動するため、整形されたデータカード、地物の属性から作成したグラフ、外部ソースから取得した詳細など、特定の地物に関連するコンテンツの表示に適しています。 ユーザーが地図上の特定の地物を選択したときだけ、その地物に関する情報を表示したい場合は InfoboxBlock を使用します。 ## StoryBlock [Section titled “StoryBlock”](#storyblock) StoryBlock は、ストーリーページに埋め込まれる拡張です。ストーリーのコンテンツの一部となり、ユーザーが物語を進めるとインラインで表示されます。 StoryBlock は、インタラクティブなグラフ、タイムライン、データに基づく図など、通常のテキストや画像を超えるカスタムコンテンツをストーリーに加える用途に適しています。 メインの地図ビューや地物のインフォボックスではなく、ストーリーページ内にカスタムコンテンツを追加したい場合は StoryBlock を使用します。 # プラグインシステムの仕組み > Visualizer プラグインを構成する WebAssembly と iframe の環境を説明します。 Visualizer のプラグインは、単一のコードとして動作するわけではありません。各プラグインは、別々の環境で動作して相互に通信する 2 つの部分に分かれています。この構成により、コードが実行される場所ごとに、できることとできないことが決まります。 ## プラグインの実行方法 [Section titled “プラグインの実行方法”](#プラグインの実行方法) プラグインが読み込まれると、Visualizer はコードを次の 2 つの環境で実行します。 * Visualizer のデータとプラグインAPIに直接アクセスできる **WebAssembly** 環境 * すべての UI 描画を担当し、標準のブラウザ API を利用できる **iframe** 環境 どちらか一方だけですべてを実行することはできません。WebAssembly 側は Visualizer のデータを読み取って操作できますが、HTML の描画や多くのブラウザ API の利用はできません。iframe 側は HTML の描画やブラウザ API の利用ができますが、Visualizer のデータへ直接アクセスできません。2 つの環境が互いを補完します。 両者は、異なる実行コンテキスト間で安全に通信するための標準的なブラウザ機能である `postMessage` を使って通信します。UI が Visualizer のデータを必要とするときは、WebAssembly 側にデータを要求します。WebAssembly 側はデータを取得し、iframe 側へ送信します。 ## WebAssembly 側 [Section titled “WebAssembly 側”](#webassembly-側) WebAssembly 側はプラグインのエントリーポイントです。プラグインが読み込まれたときに最初に実行され、Visualizer と同じスレッドで同期的に動作します。 **できること:** * Visualizer のシーンデータへアクセスする。 * プラグインAPIを呼び出す。 * レイヤのプロパティの更新など、Visualizer のシーンを部分的に変更する。 * シーンのイベントを購読する。 * `postMessage` を使って iframe 側とデータを送受信する。 **できないこと:** * HTML や UI を直接描画する。UI の描画は iframe 側で行う必要があります。 * 多くのブラウザ API を利用する。利用できるのは `console.log` など一部に限られます。 * 外部サーバーへ HTTP リクエストを送信する。 ノート WebAssembly 側の JavaScript は [QuickJS](https://bellard.org/quickjs/) で実行されます。ユーザーが使用するブラウザにかかわらず、ECMAScript 2020 をサポートします。 ## iframe 側 [Section titled “iframe 側”](#iframe-側) iframe 側は、プラグインの視覚的な要素をすべて処理します。通常のウェブページと同じように動作し、ブラウザ API を利用できます。 **できること:** * 通常のウェブページと同じように HTML を描画する。 * DOM API、Canvas、`fetch` などのブラウザ API を利用する。 * サーバーのレスポンスヘッダーに `Access-Control-Allow-Origin: *` が含まれている場合、外部サーバーへ HTTP リクエストを送信する。 * `postMessage` を使って WebAssembly 側とデータを送受信する。 **できないこと:** * Visualizer のデータへ直接アクセスしたり変更したりする。`postMessage` を通じて WebAssembly 側へ要求する必要があります。 * Visualizer のバックエンドと直接通信する。 * レスポンスヘッダーに `Access-Control-Allow-Origin: *` が含まれていないサーバーへ HTTP リクエストを送信する。iframe は null オリジンでサンドボックス化されています。 * 同じサンドボックス上の理由により、ローカルストレージを利用する。 * 親ページから明示的な権限を必要とするブラウザ API を利用する。たとえば、Clipboard API はサンドボックス化された iframe ではデフォルトで利用できません。 ## 要点 [Section titled “要点”](#要点) | 機能 | WebAssembly 側 | iframe 側 | | ------------------- | ------------- | -------- | | サンドボックス化 | ✅ | ✅ | | エントリーポイント(最初に実行) | ✅ | ❌ | | プラグインAPIへのアクセス | ✅ | ❌ | | HTML の描画 | ❌ | ✅ | | ブラウザ API の利用 | ❌ | ✅ | | `postMessage` による通信 | ✅ | ✅ | ## 制約事項 [Section titled “制約事項”](#制約事項) **`postMessage` のシリアライズ:** `postMessage` で送信できるのは、JSON としてシリアライズ可能なデータだけです。`ArrayBuffer` や `Blob` などのオブジェクトは直接送信できません。バイナリーデータは、送信前に base64 文字列へエンコードしてください。 **プラグインのサイズ:** プラグインは 10 MB 以下の `.zip` ファイルとしてパッケージ化する必要があります。 **静的アセット:** 画像、HTML、CSS などの JavaScript 以外のファイルは、プラグイン内に含めることができません。JavaScript に文字列として埋め込むか、一般公開されたサーバーに配置して URL で参照してください。 **ローカルストレージ:** ローカルストレージは両方の環境で利用できません。データを永続化するには、プラグインAPIが提供するストレージ API または外部サーバーを使用してください。 # プラグイン構成 > マニフェストと拡張のファイルから Visualizer プラグインを構成する仕組みを説明します。 Re:Earth Visualizer のプラグインは、1 つの `reearth.yml` 設定ファイルと、拡張ごとに 1 つ用意する JavaScript ファイルで構成される `.zip` ファイルです。`reearth.yml` はプラグインの情報と拡張を定義し、各 JavaScript ファイルには対応する拡張のロジックを記述します。Visualizer は、これらのファイルを使ってプラグインを読み込み、実行します。 ## `reearth.yml` [Section titled “reearth.yml”](#reearthyml) すべてのプラグインは、`.zip` のルートに `reearth.yml` という名前のファイルを含める必要があります。この YAML ファイルには、名前、バージョン、説明、拡張など、プラグインのメタデータを記述します。 reearth.yml ```yaml id: demo-plugin name: Demo Plugin version: 1.0.0 extensions: - id: demo-widget type: widget name: Demo Widget ``` 注意 `id` フィールドで使用できる文字は、英字(`a-zA-Z`)、数字(`0-9`)、ハイフン(`-`)、アンダースコア(`_`)のみで、最大 100 文字です。`reearth` は予約されているため、ID として使用できません。 サポートされているフィールドの一覧については、[プラグインマニフェストのスキーマ](https://github.com/reearth/reearth-visualizer/blob/main/server/schemas/plugin_manifest.json)を参照してください。 ## 拡張の JavaScript [Section titled “拡張の JavaScript”](#拡張の-javascript) `reearth.yml` で宣言した各拡張には、対応する JavaScript ファイルが必要です。ファイル名は拡張の `id` と完全に一致させてください。たとえば、`id: demo-widget` の拡張には `demo-widget.js` というファイルが必要です。 注意 拡張の `id` と JavaScript のファイル名は、完全に一致させてください。どちらにも空白や特殊文字を使用しないでください。 JavaScript ファイルには、その拡張のロジックを記述します。コードは WebAssembly 側で実行され、グローバルに公開されたプラグインAPIを利用できます。 demo-widget.js ```javascript reearth.ui.show(`

Hello, World!

`); ``` ノート 拡張の JavaScript は [QuickJS](https://bellard.org/quickjs/) で実行されます。ECMAScript 2020 と互換性のあるコードを使用してください。 ## パッケージ化とインストール [Section titled “パッケージ化とインストール”](#パッケージ化とインストール) `reearth.yml` とすべての拡張の JavaScript ファイルを用意したら、1 つの `.zip` ファイルにまとめます。この `.zip` は、任意の Re:Earth Visualizer プロジェクトにインストールできます。 ```text my-plugin.zip ├── reearth.yml └── demo-widget.js ``` 複数の拡張がある場合は、それぞれに対応する JavaScript ファイルを含めます。 ```text my-plugin.zip ├── reearth.yml ├── demo-widget.js └── demo-infobox-block.js ``` ノート プラグインのサイズは 10 MB 以下である必要があります。画像や CSS など、JavaScript 以外のファイルを `.zip` に含めることはできません。詳しくは[制約事項](/ja/developer/plugin/overview/how-the-plugin-system-works/#%E5%88%B6%E7%B4%84%E4%BA%8B%E9%A0%85)を参照してください。 `.zip` を繰り返し作成してインストールする手間を省き、効率よく開発する方法については、[ローカル開発環境をセットアップする](/ja/developer/plugin/get-started/set-up-a-local-development-environment/)を参照してください。 # プラグインとは? > プラグインとは何か、Re:Earth Visualizer で何ができるかを説明します。 プラグインとは、既存のアプリケーションのコアコードを変更せずに、新しい機能を追加するソフトウェアコンポーネントです。機能がプラットフォーム本体に実装されるのを待つ代わりに、自分でプラグインを開発したり、他の人が開発したプラグインをインストールしたりできます。ホストアプリケーションは、実行時にそのプラグインを読み込みます。 プラグインは、日常的に使うさまざまなソフトウェアに存在します。広告をブロックしたりパスワードを保存したりするブラウザ拡張、VS Code に言語サポートを追加するエディター拡張、背景地図に独自データを重ねる地図オーバーレイなどです。いずれも、明確に定義されたインターフェースを通じてホストアプリケーションに接続し、その機能を拡張する自己完結型のコードパッケージです。 ## Re:Earth Visualizer におけるプラグイン [Section titled “Re:Earth Visualizer におけるプラグイン”](#reearth-visualizer-におけるプラグイン) Re:Earth Visualizer のプラグインは、カスタム UI の追加、シーンの操作、データの利用などによって、プラットフォームの機能を拡張します。コードと設定ファイルをまとめたパッケージとしてプロジェクトに追加します。 インストールされたプラグインは、1 つ以上の\*\*拡張(Extension)\*\*を通じて機能を提供します。拡張は、Visualizer のインターフェース内でプラグインの動作を構成する個別の単位です。拡張タイプにはウィジェット、InfoboxBlock、StoryBlock の 3 種類があり、それぞれ目的と表示場所が異なります。 システムレベルでは、Visualizer プラグインはコアアプリケーションを変更せずに機能を追加する拡張の集まりであり、WebAssembly と iframe の 2 つの環境で動作します。詳しくは[拡張タイプの違い](/ja/developer/plugin/overview/extension-types/)を参照してください。 ## プラグインでできること [Section titled “プラグインでできること”](#プラグインでできること) プラグインを使うと、Re:Earth Visualizer のソースコードに手を加えずに、組み込み機能を超えた機能を追加できます。たとえば、次のことができます。 * 外部 API やサービスから取得したデータを、地図上やインフォボックスに表示する。 * フィルター、スライダー、検索入力など、シーンを操作するためのカスタムコントロールを作成する。 * 選択したレイヤのデータを使い、地物の選択に応じた情報を表示する。 * 静的なコンテンツだけでなく、データに応じて変化する要素をストーリーページに追加する。 * ユーザー入力やリアルタイムイベントに応じて、Visualizer 内の操作を自動化する。 ## 代表的なユースケース [Section titled “代表的なユースケース”](#代表的なユースケース) ### ナビゲーション操作 [Section titled “ナビゲーション操作”](#ナビゲーション操作) ナビゲーションウィジェットは、画面上のボタンでカメラを任意の方向へ滑らかに移動し、初期表示へ戻したり、ズームイン・ズームアウトしたりできます。キーボードショートカットや地球を直接操作する方法に代わる、直感的なナビゲーションを提供します。 ![Re Visualizer の地図上に表示されたナビゲーション操作](/_astro/navigation-pan-osm.BqADCcHg_kSpRU.webp) 地図データ: [OpenStreetMap](https://www.openstreetmap.org/copyright) ### 画像オーバーレイ [Section titled “画像オーバーレイ”](#画像オーバーレイ) このウィジェットは、設定可能な画像とキャプションを地図上に直接表示します。画像 URL とキャプションのテキストは **インスペクター** パネルで設定できるため、プラグインのコードを変更せずに更新できます。 ![Re Visualizer の地図上に表示された画像オーバーレイ](/_astro/image-overlay-osm.AgdQaJaf_Z1y2D9F.webp) 地図データ: [OpenStreetMap](https://www.openstreetmap.org/copyright) ### ライブ天気表示 [Section titled “ライブ天気表示”](#ライブ天気表示) 天気ウィジェットは、指定した場所の最新の気象情報を取得し、気温、天気、湿度、風、最終更新時刻を地図上に表示します。 ![Re Visualizer の地図上に表示されたライブ天気ウィジェット](/_astro/weather-widget-osm.DDD8eNBC_ZmsX5G.webp) 地図データ: [OpenStreetMap](https://www.openstreetmap.org/copyright) ### カメラのブックマーク [Section titled “カメラのブックマーク”](#カメラのブックマーク) カメラブックマークウィジェットは、名前を付けて場所を保存し、クリック 1 回で保存した位置へカメラを移動できます。大規模なシーン内の注目地点を簡単に行き来できます。 ![Re Visualizer の地図上に表示されたカメラブックマークウィジェット](/_astro/cam-bookmarks-osm.ix2Ixkcp_35DrU.webp) 地図データ: [OpenStreetMap](https://www.openstreetmap.org/copyright) # プラグインAPIとは? > プラグインが Re:Earth Visualizer と通信するための API を説明します。 プラグインAPIは、プラグインが Re:Earth Visualizer と通信するための仕組みです。Visualizer のソースコードへアクセスしなくても、データの読み取り、ユーザー操作への応答、地図上の表示制御、独自 UI の管理などを行えます。 API 全体は、`reearth` という 1 つのグローバルオブジェクトを通じて利用できます。プラグインに必要なすべての機能は、このオブジェクトからアクセスします。たとえば、カメラの操作には `reearth.camera`、レイヤの操作には `reearth.layers` を使用します。 API は、プラグインが行うことを基準に構成されています。プラグインはユーザーにインターフェースを提供し、地図、レイヤ、データから成るシーンを操作します。API の各要素には次の役割があります。 * **プラグイン自身(`reearth.extension`)**: 設定されたプロパティ、UI とのメッセージ通信、ライフサイクルイベントなど、プラグイン自身のコンテキストを扱います。 * **プラグインのインターフェース(`reearth.ui`、`reearth.modal`、`reearth.popup`)**: メイン UI パネル、ダイアログ、小さなアンカーウィンドウなど、ユーザーが見て操作する要素を扱います。 * **シーン(`reearth.viewer`、`reearth.camera`、`reearth.timeline`)**: ビューアの環境と設定、視点、時間に基づく再生など、ユーザーが見ている空間を扱います。 * **コンテンツ(`reearth.layers`、`reearth.data`)**: 地図レイヤやクライアント側のデータストレージなど、地図に表示するデータとプラグインが保持するデータを扱います。 * **描画・位置ツール(`reearth.sketch`、`reearth.spatialId`)**: 地図上への図形の描画や、空間 ID による位置参照を扱います。 * **システム情報(`reearth.version`、`reearth.apiVersion`、`reearth.engine`)**: Visualizer のバージョンやレンダリングエンジンなど、プラグインが動作する環境の基本情報を提供します。 これらの要素は、どのプラグインでも連携して動作します。イベントも同じ構成に含まれます。`reearth.viewer` はマウスイベント、`reearth.timeline` は `tick`、`reearth.extension` はメッセージを発行します。イベントを監視するときは、そのイベントに対応するオブジェクトへリスナーを登録します。 たとえば、保存した場所へ移動するプラグインでは、`reearth.extension` から設定を読み取り、`reearth.ui` でクリック可能な一覧を表示し、場所が選択されたときに `reearth.camera` で視点を移動します。 利用できるすべてのプロパティとメソッドについては、[API リファレンス](/ja/developer/plugin/api-reference/)を参照してください。 # FAQ > Visualizer プラグイン開発でよくある質問への回答を紹介します。 この FAQ では、個別のガイドを必要としない短い横断的な質問を扱います。目的別の手順は「ガイド」、プロパティやメソッドの詳細は「API リファレンス」を参照してください。 ## はじめに [Section titled “はじめに”](#はじめに) **Q: プラグイン開発を始めるのに、何かインストールが必要ですか?** 不要です。プラグインは 2 つの方法で作れます。1 つはブラウザだけで完結するプラグインプレイグラウンド、もう 1 つはローカル開発環境(自分のエディタ)を使う方法です。Playground は最も早く試せる方法で、ローカル環境はより大きく複雑なプラグインに向いています。 **Q: プラグインにはどんなファイルが必要ですか?** 最低限必要なのは、プラグインと拡張を記述する `reearth.yml` と、拡張ごとに 1 つの JavaScript ファイルです。これらをまとめて `.zip` としてパッケージ化します。 **Q: ウィジェット / InfoboxBlock / StoryBlock の違いは?** ウィジェットは Widget Align System を使ってメインマップビューに配置します。InfoboxBlock は、レイヤ上のフィーチャを選択したときに開くインフォボックス内に表示されます。StoryBlock はストーリーページに埋め込まれます。詳細は[拡張タイプの違い](/ja/developer/plugin/overview/extension-types/)を参照してください。 ## 開発 [Section titled “開発”](#開発) **Q:「Install Dev Plugins」と「Reload Dev Plugin Extensions」はいつ使い分けますか?** 初回セットアップと `reearth.yml` を変更したときは **Install Dev Plugins** を使用します。拡張コードを変更した後は **Reload Dev Plugin Extensions** を使用します。`reearth.yml` の変更は、プラグイン構造の再登録が必要なため、完全インストールが必要です。 **Q: プラグインの UI が表示されないのはなぜですか?** プラグイン UI は `reearth.ui.show` に HTML を渡すことで表示します。何も表示されない場合は、呼び出しが行われているか、また拡張 JavaScript のファイル名が `reearth.yml` 内の `id` と完全一致しているかを確認してください。UI は表示されているが真っ白に見える場合は、スタイルの問題の可能性があります。文字色が背景色と同じだと見えないため、UI 側で文字色と背景色を明示的に指定してください。 **Q: TypeScript は使えますか?** はい。Visualizer が実行するのは JavaScript ですが、TypeScript で書いて JavaScript にコンパイルできます。推奨テンプレートは TypeScript に対応しています。 ## 機能と制限 [Section titled “機能と制限”](#機能と制限) **Q: 外部 API からデータを取得できないのはなぜですか?** 外部サーバーへのリクエストは、拡張ロジック(WebAssembly 側)ではなく、プラグイン UI(iframe 側)から行う必要があります。また、外部サーバーはレスポンスヘッダーに `Access-Control-Allow-Origin` を含めて CORS を許可していなければなりません。そうでない場合、リクエストは失敗します。 **Q: 特定の背景地図やタイルサーバーが読み込めないのはなぜですか?** 一部の背景地図は Cesium Ion のアクセストークンを必要とします。それ以外でも、タイルサーバーが利用できない、または CORS によりブロックされる場合があります。背景地図が表示されない場合、原因はコードではなくタイルソース側にあることが多いです。 **Q: プラグインのサイズ制限はありますか?** あります。プラグインは 10 MB 以下の `.zip` としてパッケージ化する必要があります。画像や CSS などの非 JavaScript ファイルは `.zip` に同梱できません。JavaScript の文字列として埋め込むか、公開サーバーにホストして URL で参照してください。 **Q: プラグインで永続化できるデータを保存できますか?** ローカルストレージは利用できません(プラグイン UI がサンドボックス化された iframe 内で動作するため)。永続化には、プラグイン API が提供するストレージ API、または外部サーバーを利用してください。 ## 公開と共有 [Section titled “公開と共有”](#公開と共有) **Q: Playground で作ったプラグインはどう共有できますか?** **Share** ボタンで共有リンクをコピーするか、**Export** ボタンで `.zip` をダウンロードしてください。非常に大きいプラグインはリンク共有できず、エクスポートのみです。 # ツール > Visualizer プラグイン開発用ツールのドキュメントは準備中です。 注意 このセクションは現在メンテナンス中です。 # Re:Earth Flow ドキュメント > Re:Earth Flow のドキュメントは現在準備中です。 このドキュメントは現在準備中です。公開をお待ちください。 # チュートリアル > Re:Earth のプロダクトを実際に触りながら進めるチュートリアルの一覧です。 プロダクトで絞り込む \[ ] CMS \[ ] Visualizer * ![](/_astro/thumbnail.D1fjyQgk_Z1QsPlT.webp) CMS Visualizer 所要時間 60分 難易度 初級 ## [パブリックAPI で、1つのモデルからグラフと地図を作る](/ja/tutorials/public-api-chart-and-map/) Re:Earth CMS にモデルとスキーマを作り、パブリックAPI で配信して、表計算ソフトのグラフと Re:Earth Visualizer の地図で扱うまでを実践します。 * ![](/_astro/step-7-add-widget.DbxR8AQH_fX99C.webp) Visualizer 所要時間 45分 開発 難易度 初級 ## [シンプルな UI プラグインを作成してインストールする](/ja/tutorials/simple-ui-plugin/) プラグインプレイグラウンドで Welcome ウィジェットを作成し、ZIP としてエクスポートし、Re:Earth Visualizer にインストールして、シーンに追加します。 * ![](/_astro/feedback-app-all-feedback-tab.CELGNrXd_Z21iRzA.webp) CMS 所要時間 30分 開発 難易度 中級 ## [パブリックAPI で作る フィードバック収集・閲覧アプリ](/ja/tutorials/public-api-feedback-app/) バックエンド不要で、ブラウザから直接 Re:Earth CMS にデータを投稿・表示する 1 ページのフィードバックアプリを作る。 * ![](/_astro/infrastructure-inspection-map-overview.Dl_Tqa1O_15lzmx.webp) CMS Visualizer 所要時間 45分 開発 難易度 中級 ## [インテグレーションAPI で作るインフラ点検マップ](/ja/tutorials/infrastructure-inspection-map/) インテグレーションAPI を使うバックエンド経由で、点検担当者が地図上からインフラの状態を報告するアプリを作る。 * ![](/_astro/osm.ypE6KB6B_ZxQhbO.webp) Visualizer 所要時間 60分 開発 難易度 中級 ## [経路検索プラグインを作成する](/ja/tutorials/route-search-plugin/) レイヤAPI・カメラAPI・外部の経路検索サービスを使って、2 地点間の経路を検索し地球儀上に描画するウィジェットを作成します。 * ![](/_astro/terminal-events.EysB8OE9_n3UlE.webp) CMS 所要時間 60分 開発 難易度 上級 ## [Re:Earth CMS の Webhook を受信するローカルサーバーを作る](/ja/tutorials/cms-webhook-receiver/) Re:Earth CMS の Webhook を受信して署名を検証し、変更内容を表示するローカルサーバーを作り、その上に独自の通知を設計する。 * ![](/_astro/follow-result.BBJbl0qs_IBwqX.webp) Visualizer 所要時間 90分 開発 難易度 上級 ## [React と TypeScript で ISS Tracker プラグインを作成する](/ja/tutorials/iss-tracker-plugin/) ISS の現在位置を取得して追跡する Visualizer ウィジェットを作成し、テスト、パッケージ化、インストールします。 # Re:Earth CMS の Webhook を受信するローカルサーバーを作る > Re:Earth CMS の Webhook を受信して署名を検証し、変更内容を表示するローカルサーバーを作り、その上に独自の通知を設計する。 Re:Earth CMS でアイテムやアセットが変更されると、[Webhook](/ja/developer/cms/overview/webhook/) がその変更を HTTP `POST` で自分のサーバーへ送ります。このチュートリアルでは、自分のマシン上で小さな TypeScript サーバーを動かし、そのリクエストを受信して、本当に自分の CMS から届いたものかを確かめ、変更内容を読みやすい形で表示します。コンソールへの表示は出発点です。最後に、受信したイベントを誰にどう知らせるかを自分で設計します。 ## 作るもの [Section titled “作るもの”](#作るもの) CMS でアイテムを編集すると、数秒後にターミナルへ、何が・誰によって・いつ変更されたかが表示されます。 ```plaintext [item.update] YYYY-MM-DD hh:mm:ss UTC model: webhook-test item: 01abc… changed: title: "draft" → "final" by: user 01xyz… event: 01def… received: YYYY-MM-DD hh:mm:ss UTC ``` CMS からは `localhost` に届かないため、トンネルを使って自分のマシンに一時的な公開アドレスを用意し、届いたリクエストを受信サーバーへ転送します。 ```plaintext Re:Earth CMS ──POST + Reearth-Signature──► cloudflared トンネル ──► localhost:3000/webhook ``` ![構成図。Re CMS が Reearth-Signature ヘッダー付きの POST リクエストを、cloudflared トンネル経由で自分のマシン上の受信サーバー(localhost:3000/webhook)に送る。受信サーバーのレスポンスはトンネルを通って CMS に返り、受信サーバーは各イベントを notify() に渡して、コンソールに表示する。](/_astro/cms-webhook-receiver-architecture.ja.K2jyzx-5_1ljBys.svg) [完成版のソースコードと自分のプロジェクトを比較する](https://github.com/eukarya-biz/cms-webhook-tutorial) 注意 この受信サーバーは CMS の Webhook を学ぶためのもので、本番環境での利用を想定していません。正しい署名が付いたリクエストだけを受け付けますが、それ以外の認証はなく、ここで使うトンネルも開発用です。このままの状態でデプロイしないでください。 ## 前提条件 [Section titled “前提条件”](#前提条件) 始める前に、次のものを用意してください。 * Node.js 20.6 以降。受信サーバーは Node 組み込みの `--env-file` で設定を読み込むため、このバージョンが必要です。 * Git * **所有者**または**管理者**の役割を持つ Re:Earth CMS のワークスペース。インテグレーションをワークスペースに連携するには、どちらかの役割が必要です。自分が所有者であるパーソナルワークスペースなら問題ありません。 * TypeScript の基本的な知識 ## ステップ1 — CMS を準備する [Section titled “ステップ1 — CMS を準備する”](#ステップ1--cms-を準備する) Webhook はインテグレーションに属するため、まずインテグレーションを作成してワークスペースに連携し、変更を加えるための小さなモデルを作成します。 Webhook はワークスペース内のすべてのプロジェクトのイベントを受信します Webhook は、1つのプロジェクトだけでなく、インテグレーションを連携したワークスペース内のすべてのプロジェクトからイベントを受信します。このチュートリアルで行う変更だけがターミナルに届くよう、パーソナルワークスペースなど、ほかのプロジェクトがないワークスペースを使ってください。 ### インテグレーションを作成して連携する [Section titled “インテグレーションを作成して連携する”](#インテグレーションを作成して連携する) パーソナルアカウントでインテグレーションを作成し、使用するワークスペースに連携します。 1. パーソナルアカウントで、**マイインテグレーション**タブを開いてください。 2. **新規インテグレーションを作成**ボタンをクリックしてください。 3. 名前に `CMS Webhook Tutorial` と入力してください。 4. **作成**ボタンをクリックしてください。 5. 使用するワークスペースで、**インテグレーション**タブを開いてください。 6. **インテグレーションを接続**ボタンをクリックしてください。 7. `CMS Webhook Tutorial` を選択してください。 8. **接続**ボタンをクリックしてください。 ワークスペースの**インテグレーション**画面に、連携したインテグレーションが表示されます。このチュートリアルでは役割はどれでも構いません。CMS は、役割に関係なく、連携しているすべてのインテグレーションに Webhook のイベントを送ります。手順と役割の詳細は [インテグレーションの作成](/ja/developer/cms/getting-started/integration-setup/) を参照してください。 Webhook そのものは、受信サーバーに CMS から届くアドレスができてから、ステップ4で追加します。 ### テスト用のプロジェクトとモデルを作成する [Section titled “テスト用のプロジェクトとモデルを作成する”](#テスト用のプロジェクトとモデルを作成する) 同じワークスペースに `webhook-tutorial-test` という名前の[プロジェクトを作成](/ja/cms/how-to/project-create-configure-delete/)してください。その中に `webhook-test` という名前の[モデルを作成](/ja/cms/how-to/models/)し、キーが `title` の **テキスト**[フィールドを追加](/ja/cms/how-to/fields/)してください。 ステップ5では、このモデルに変更を加えてイベントを発生させます。 ## ステップ2 — 受信サーバーを自分のマシンで動かす [Section titled “ステップ2 — 受信サーバーを自分のマシンで動かす”](#ステップ2--受信サーバーを自分のマシンで動かす) 完成版の受信サーバーをクローンし、依存パッケージをインストールします。 ```bash git clone https://github.com/eukarya-biz/cms-webhook-tutorial.git cd cms-webhook-tutorial npm install cp .env.example .env ``` Windows(コマンドプロンプト)では、`cp .env.example .env` の代わりに `copy .env.example .env` を使ってください。 受信サーバーには、CMS と受信サーバーの両方が知っているランダムな値、シークレットが必要です。次のコマンドで生成します。 ```bash node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" ``` `.env` を開き、`CMS_WEBHOOK_SECRET` に表示された値を設定してください。`PORT` は `3000` のまま、`CMS_PROJECT_ID` は空のままにしてください。このシークレットはステップ4で CMS にも同じ値を入力するので、手元に控えておいてください。 注意 `.env` をコミットしたり、内容を共有したりしないでください。シークレットを知っている人は、受信サーバーが本物として受け付けるリクエストに署名できてしまいます。 CMS とつなぐ前に、署名の検証が動くことを確認します。リポジトリにはそのためのテストが含まれています。 ```bash npm test ``` 8件のテストがすべて成功します。正しく署名されたリクエストは受け付けられ、本文が変更されたもの、別のシークレットで署名されたもの、タイムスタンプが5分を超えてずれているもの、形式が正しくないヘッダーはすべて拒否されることを確認しています。 受信サーバーを起動します。 ```bash npm run dev ``` ターミナルに `CMS Webhook Receiver listening on http://localhost:3000` と表示されます。そのまま起動しておき、同じフォルダで2つ目のターミナルを開いてテストイベントを送ってください。リポジトリのテスト用スクリプトは、CMS と同じ方法でサンプルイベントにシークレットで署名します。 ```bash npm run send-test ``` 2つ目のターミナルに `Sent item.create (test-…) → 200` と表示され、1つ目のターミナルに最初の要約が表示されます。 ```plaintext [item.create] YYYY-MM-DD hh:mm:ss UTC model: webhook-test item: test-item field: title = "hello from the test script" by: user test-user event: test-… received: YYYY-MM-DD hh:mm:ss UTC ``` 受信サーバーが、正しく署名されたリクエストを受け付けました。次は、表示する前に受信サーバーがリクエストをどう扱っているかを見ていきましょう。 ## ステップ3 — 受信サーバーがリクエストを確認する仕組みを見る [Section titled “ステップ3 — 受信サーバーがリクエストを確認する仕組みを見る”](#ステップ3--受信サーバーがリクエストを確認する仕組みを見る) リクエストはすべて、`src/server.ts` の `POST /webhook` に届きます。受信サーバーは次のようにリクエストを読み取ります。 src/server.ts ```ts app.post( "/webhook", express.raw({ type: () => true, limit: "1mb" }), (req, res) => { const rawBody = Buffer.isBuffer(req.body) ? req.body : Buffer.alloc(0); const result = verifySignature( rawBody, req.get("Reearth-Signature"), secret, ); if (!result.ok) { console.warn(`Rejected webhook: ${result.reason}`); res.sendStatus(401); return; } // Then: parse the JSON, reply 200, and handle the event. }, ); ``` ここには、見た目以上に大事な点が2つあります。 **本文をそのままのバイト列で読み取ります。** CMS は送信するバイト列そのものに署名するため、受信サーバーは何かを解析する前に、そのバイト列で署名を確認する必要があります。また、CMS は `Content-Type` ヘッダーを送りません。パーサーに `type: () => true` を指定しているのはそのためです。よく使われる `type: "*/*"` の場合、Express は `Content-Type` ヘッダーがあるときにしか本文を読み取りません。すると、CMS からのリクエストはすべて本文が空のまま届き、署名の確認がすべて失敗します。 **署名は `Reearth-Signature` ヘッダーに入っています。** 形式は `v1,t=,` で、バージョン、CMS がリクエストを送った時刻(1970年からの秒数)、署名そのものが並んでいます。`src/verify.ts` は、シークレットを使って署名を計算し直し、2つを比較します。 src/verify.ts ```ts const expected = createHmac("sha256", secret) .update(`v1:${timestamp}:`) .update(rawBody) .digest("hex"); // timingSafeEqual throws if the lengths differ, so check that first. const received = Buffer.from(signature); const computed = Buffer.from(expected); if ( received.length !== computed.length || !timingSafeEqual(received, computed) ) { return { ok: false, reason: "signature mismatch" }; } ``` 署名は、`v1:`、タイムスタンプ、`:`、本文をこの順につなげたものを、シークレットを鍵として HMAC-SHA256 で計算した値です。一致する署名を作れるのはシークレットを持つ人だけなので、一致すれば、リクエストが自分の CMS から届き、途中で変更されていないことがわかります。`verifySignature` は、この比較の前に、現在時刻から5分を超えてずれたタイムスタンプも拒否します。これにより、誰かが記録したリクエストをあとから再送されても受け付けません。 確認が済むと、受信サーバーはすぐに `200` を返し、そのあとでイベントを処理します。CMS は返答を最大30秒しか待たず、`300` を超えるステータスはすべて配信失敗として扱うため、時間のかかる処理を返答より先に行うことはありません。 イベントの処理は `handleEvent()` が行います。すでに処理したイベントと、扱わない種類のイベントを読み飛ばしたうえで、`src/notify.ts` の `notify()` にイベントを渡します。先ほどの要約を表示したのはこの関数で、ステップ6で再び取り上げます。 ## ステップ4 — トンネル経由で CMS とつなぐ [Section titled “ステップ4 — トンネル経由で CMS とつなぐ”](#ステップ4--トンネル経由で-cms-とつなぐ) CMS はインターネット上で動いているため、`localhost` には届きません。[Cloudflare のクイックトンネル](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/do-more-with-tunnels/trycloudflare/)は、自分のマシンに一時的な公開アドレスを用意し、届いたリクエストを変更せずにそのまま転送します。署名の確認はこの点を前提にしています。無料で、Cloudflare のアカウントも不要です。 使用している OS に合わせて [cloudflared をインストール](https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/downloads/)してください。受信サーバーを起動したまま、新しいターミナルでトンネルを開始してください。 ```bash cloudflared tunnel --url http://localhost:3000 ``` 数秒後、末尾が trycloudflare.com のアドレスを含む枠が表示されます。そのアドレスをコピーし、このターミナルは起動したままにしておきます。閉じるとトンネルが終了し、アドレスは cloudflared を起動するたびに変わります。 インターネットからのリクエストが受信サーバーに届くこと、そして署名のないリクエストが拒否されることを確認します。`` をコピーしたアドレス全体に置き換えて、次のコマンドを実行してください。 ```bash curl -i -X POST /webhook --data '{"hello":"world"}' ``` レスポンスは `401 Unauthorized` になり、受信サーバーのターミナルに `Rejected webhook: missing Reearth-Signature header` と表示されます。 このアドレスを CMS に登録します。**マイインテグレーション**で `CMS Webhook Tutorial` インテグレーションを開き、**Webhook** タブを開いて **新規Webhook** ボタンをクリックしてください。 ![インテグレーション詳細ページの Webhook タブ。まだ Webhook が無い状態で、Webhook タブと New Webhook ボタンが強調表示されている。](/_astro/webhook-tab-empty.D3-SYlGO_1GNaUs.webp) フォームに次のように入力してください。 * **名前**:`local-receiver` * **URL**:トンネルのアドレスの末尾に `/webhook` を付けたもの(`/webhook`) * **シークレット**:`.env` の `CMS_WEBHOOK_SECRET` と同じ値 * **トリガーイベント**:アイテムとアセットのイベントすべて ![CMS Webhook Tutorial インテグレーションの新規 Webhook フォーム。名前に local-receiver、URL に末尾が /webhook の trycloudflare.com のアドレス、シークレットに your-secret-here が入力され、Item と Asset のトリガーイベントがすべてチェックされている。](/_astro/webhook-new-form.CBizc5ix_GTisI.webp) **保存**ボタンをクリックし、新しい Webhook のスイッチが **オン** になっていることを確認してください。 ![CMS Webhook Tutorial インテグレーションの Webhook タブ。local-receiver という名前の Webhook が1件あり、スイッチが ON で、URL は末尾が /webhook の trycloudflare.com のアドレスになっている。](/_astro/webhook-local-receiver-on.DhTsaluL_1eJxsc.webp) ## ステップ5 — 実際のイベントが届くのを確認する [Section titled “ステップ5 — 実際のイベントが届くのを確認する”](#ステップ5--実際のイベントが届くのを確認する) 受信サーバーのターミナルが見える状態にしておいてください。`webhook-tutorial-test` プロジェクトで次の変更を1つずつ行い、そのたびにターミナルを確認してください。 1. `webhook-test` モデルで、タイトルが `draft` の[アイテムを作成](/ja/cms/how-to/items/)してください。`[item.create]` の要約が表示され、`field:` 行に `title = "draft"` と表示されます。 2. タイトルを `final` に変更して保存してください。`[item.update]` の要約が表示され、`changed:` 行に変更前と変更後の値 `title: "draft" → "final"` が表示されます。 3. [アイテムを公開](/ja/cms/how-to/item-publish-unpublish/)してください。`[item.publish]` の要約が表示されます。 4. アイテムを非公開にしてください。`[item.unpublish]` の要約が表示されます。 5. プロジェクトのアセットに小さな画像を[アップロード](/ja/cms/how-to/assets/)してください。`[asset.create]` の要約が、ファイル名とサイズとともに表示されます。 ![受信サーバーのターミナル。3つの要約が順に表示されている。field 行が title = "draft" の item.create、changed 行が title: "draft" → "final" の item.update、item.publish。各要約にはモデル、アイテム、ユーザー、イベント ID、受信時刻が並び、ユーザー ID は隠されている。](/_astro/terminal-events.EysB8OE9_n3UlE.webp) 要約は、変更から数秒以内に表示されます。1行目の時刻と `received:` を比べてみてください。前者は CMS で変更が発生した時刻、後者は受信サーバーが受け取った時刻です。 どのイベントが届くかについて、次のことにも気づくはずです。 * **保存するたびに、別々のイベントになります。** アイテムを2回保存すると、`item.update` の要約が2つ届きます。 * **CMS でアイテムやアセットを削除しても、イベントは送られません。** `item.delete` はモデル全体を削除したときに、そのモデル内のアイテムごとに1つずつ送られます。`asset.delete` は、インテグレーションAPI でアセットを削除したときに送られます。 * **配信に失敗すると、あとで再送されます。** 受信サーバーが停止していたり、リクエストを拒否したりした場合、同じイベントがしばらく経ってから、より新しいイベントのあとに届くことがあります。受信サーバーは、処理済みのイベント ID を読み飛ばし、順序には依存しません。 作業を終えたら、Webhook のスイッチを **オフ** にしてください。トンネルを停止するとそのアドレスは使えなくなり、ワークスペースでの変更がすべて配信失敗となって、CMS があとで再送することがあります。次回は、トンネルを起動して新しいアドレスを Webhook の設定に入力し、スイッチを再び **オン** にしてください。 ## ステップ6 — 独自の通知を設計する [Section titled “ステップ6 — 独自の通知を設計する”](#ステップ6--独自の通知を設計する) コンソールへの表示で、全体の経路が動くことを確認できました。実際の受信サーバーなら、誰かに知らせるはずです。このステップでは設計を指定しません。受信サーバーに何をさせるか、そしてそれが動いているとどう判断するかは、自分で決めます。 変更する場所は、`src/notify.ts` の `notify()` です。検証済みで、フィルターを通過したイベントごとに1回呼ばれます。`async` にできるので、ほかのサービスの応答を待つこともできます。 src/notify.ts ```ts export async function notify(event: WebhookEvent): Promise { console.log(formatEvent(event)); } ``` コードを書く前に、次の問いを考えてみてください。 * **誰に、どのイベントを知らせる必要があるか。** レビュー担当者は特定のモデルの `item.publish` だけに関心があり、編集者は `item.update` に関心があるかもしれません。`event.type`、`event.data.model.key`、アイテムのフィールドは、すべてイベントに含まれています。 * **いつ知らせるか。** すぐに知らせるのか、1時間ごとにまとめて1つのメッセージにするのか。1つのアイテムを続けて保存すると、イベントも続けて届きます。 * **送信に失敗したらどうするか。** 受信サーバーはすでに `200` を返しているため、CMS はそのイベントを再送しません。再試行するのか、ログに残すのか、失われてもよいとするのかを決めます。 * **認証情報をどこに置くか。** Slack の Webhook URL やメールのパスワードもシークレットです。コードには書かず、`CMS_WEBHOOK_SECRET` と同じく `.env` に置きます。 * **CMS なしでどうテストするか。** `npm run send-test` は `--type`、`--id`、`--project` を受け付けるので、設計で扱うイベントを送れます。 よく使われる2つの通知先については、次の公式ガイドが出発点になります。 * Slack:[Sending messages using incoming webhooks](https://docs.slack.dev/messaging/sending-messages-using-incoming-webhooks) * Node.js からのメール送信:[Nodemailer](https://nodemailer.com/) 作り始める前に、自分の設計にとっての「完成」を、確認できる形で決めておきましょう。たとえば、「`webhook-test` モデルのアイテムを公開すると、そのアイテム名を含む Slack メッセージが1件投稿され、投稿に失敗した場合はログに記録される」のように決めます。そのうえで、受信サーバーがそれを満たしているか確認します。 ## トラブルシューティング [Section titled “トラブルシューティング”](#トラブルシューティング) **受信サーバーに `Rejected webhook: signature mismatch` と表示される** Webhook の**シークレット**と `.env` の `CMS_WEBHOOK_SECRET` が完全には一致していません。余分なスペースや欠けている文字がないか、両方を確認してください。受信サーバーの起動中に `.env` を編集した場合は、いったん停止して `npm run dev` を実行し直してください。受信サーバーは起動時にしか `.env` を読み込みません。 **アイテムを変更しても何も表示されない** Webhook のスイッチが **オン** になっているか、**URL** の末尾が `/webhook` になっているか、発生させているイベントが選択されているか、作業しているワークスペースにインテグレーションが連携されているかを確認してください。 **トンネルのターミナルに `Unable to reach the origin service` と表示される** トンネルは動いていますが、受信サーバーが動いていません。`npm run dev` で起動し直してください。 **受信サーバーに `Ignored … from another project` と表示される** `.env` の `CMS_PROJECT_ID` に別のプロジェクトが設定されています。空にすると、ワークスペース内のすべてのプロジェクトからのイベントを受け付けます。 ## 完了チェックリスト [Section titled “完了チェックリスト”](#完了チェックリスト) * [ ] トンネルのアドレスへの署名のないリクエストが `401` で拒否される。 * [ ] CMS でアイテムを作成・編集・公開・非公開にすると、それぞれの要約がターミナルに表示される。 * [ ] 受信サーバーが本文をそのままのバイト列で読み取る理由と、イベントを処理する前に返答する理由を説明できる。 * [ ] 通知で何をするか、そしてその「完成」が何かを決めている。 # インテグレーションAPI で作るインフラ点検マップ > インテグレーションAPI を使うバックエンド経由で、点検担当者が地図上からインフラの状態を報告するアプリを作る。 インテグレーションAPI を使って、公共インフラ(マンホール・街灯・標識・ベンチ)の状態を報告する地図アプリを作ります。小さなバックエンドがインテグレーションAPI のトークンを保持し、CMS へのリクエストをすべて代行するため、トークンがブラウザに渡ることはありません。 ## 作るもの [Section titled “作るもの”](#作るもの) 点検担当者が地図を開き、インフラの資産をクリックして、問題の種別・深刻度・メモ・任意の写真を添えた状態レポートを送信します。レポートを送信すると、インテグレーションAPI を通じて CMS にアイテムが作成・公開され、続けてその資産自身の状態と最終点検日が更新されます。「レポート履歴を見る」ボタンから、これまで送信されたレポートを一覧できます。 ![アーキテクチャ図: 点検担当者がブラウザを操作し、ブラウザは /api/reports などバックエンド自身のルートだけを呼び出す。バックエンドがインテグレーションAPI を呼び出して Re:Earth CMS に到達し、ブラウザがインテグレーションAPI を直接呼び出すことはない。](/_astro/infrastructure-inspection-map-architecture.ja.noiacxM7_Z1lmj9i.svg) ![Public Infrastructure Inspection Map アプリ。マンホール・街灯・標識・ベンチの4種類を色分けしたマーカーが地図上に表示され、左下に凡例がある](/_astro/infrastructure-inspection-map-overview.Dl_Tqa1O_15lzmx.webp) [完成したソースコードと見比べる](https://github.com/eukarya-biz/infrastructure-inspection-tutorial) 注意 このアプリはインテグレーションAPI を学ぶためのもので、本番利用を想定していません。バックエンドに認証がなく、URL を知っている人なら誰でもレポートの作成や資産データの変更ができます。独自の認証とアクセス制御を加えないまま公開しないでください。 ## 前提条件 [Section titled “前提条件”](#前提条件) * Node.js 20 以降 * Git * Re:Earth CMS のワークスペース * TypeScript の基礎知識 ## ステップ1 — CMS プロジェクトを準備する [Section titled “ステップ1 — CMS プロジェクトを準備する”](#ステップ1--cms-プロジェクトを準備する) ヒント 手作業でのクリックを省略したい場合は、アプリのリポジトリにある[セットアップスクリプト](https://github.com/eukarya-biz/infrastructure-inspection-tutorial#cms-project)が、インテグレーションAPI を通じてプロジェクト・両モデル・各フィールドをまとめて作成します。実行方法はリポジトリの README を参照してください。 ### モデルを作成する [Section titled “モデルを作成する”](#モデルを作成する) Re:Earth CMS の管理画面でプロジェクトを作成し、モデルを2つ追加します。 1. プロジェクトの **モデル** 画面で [**新規モデル**](/ja/cms/how-to/models/) をクリックし、名前を入力して **OK** をクリックします 2. モデルの **スキーマ** 画面で、[**フィールドを追加**](/ja/cms/how-to/fields/) から型をクリックして、以下の各フィールドを追加します 注意 下の2つの表にある **フィールドキー**・**フィールド型**・**選択肢** は、表のとおり正確に設定してください。バックエンドのコード(ステップ3)はこれらの値をそのまま前提にしています。キーの誤字・フィールド型の選び間違い・選択肢の誤字があると、原因がわかりにくいまま CMS へのリクエストが失敗します。 **`infrastructure-assets`** — 地図に表示する資産。 | フィールドキー | フィールド型 | 選択肢 | 必須 | | ------------------- | --------- | ----------------------------------------------------------- | --- | | `asset-id` | テキスト | — | はい | | `asset-name` | テキスト | — | はい | | `asset-type` | 選択肢 | `manhole` / `streetlight` / `traffic_sign` / `public_bench` | はい | | `location` | ジオメトリエディタ | ポイント | はい | | `current-condition` | 選択肢 | `good` / `fair` / `poor` / `critical` / `Not inspected` | いいえ | | `last-inspected-at` | 日付 | — | いいえ | | `reference-photo` | アセット | — | いいえ | ![Re:Earth CMS の infrastructure-assets モデルのスキーマ画面。Asset ID・Asset Name・Asset Type・Location・Current Condition・Last Inspected At・Reference Photo の7つのフィールドが表示されている](/_astro/infrastructure-inspection-map-schema-assets.Bhgp9Tgr_1vqKkb.webp) `current-condition` は、資産を新規作成した時点では `Not inspected` が初期値として入ります。自分で設定する必要はありません。 ノート ここでの `reference-photo` は CMS の **アセット** フィールド型(ファイル添付)です。このチュートリアルが「資産」と呼んでいるインフラ資産(マンホール・街灯など)とは別物です。下の `inspection-reports` にある `photos` フィールドも同じフィールド型です。 **`inspection-reports`** — 点検担当者が送信するレポート。 | フィールドキー | フィールド型 | 選択肢 | 必須 | | ----------------- | --------------- | ----------------------------------------------------------------------------------------------------------- | --- | | `asset-id` | テキスト | — | はい | | `asset-type` | 選択肢 | `manhole` / `streetlight` / `traffic_sign` / `public_bench` | はい | | `location` | ジオメトリエディタ | ポイント | はい | | `inspection-date` | 日付 | — | はい | | `condition` | 選択肢 | `good` / `fair` / `poor` / `critical` | はい | | `issue-category` | 選択肢 | `no_issue` / `damage` / `obstruction` / `missing_component` / `malfunction` / `cleaning_required` / `other` | はい | | `severity` | 選択肢 | `low` / `medium` / `high` / `urgent` / `not_applicable` | はい | | `notes` | テキストエリア | — | いいえ | | `photos` | アセット(複数値の設定を許可) | — | いいえ | | `report-status` | 選択肢 | `pending` / `approved` / `resolved` | はい | ![Re:Earth CMS の inspection-reports モデルのスキーマ画面。Asset ID・Asset Type・Location・Inspection Date・Condition・Issue Category・Severity・Notes・Photos・Report Status の10のフィールドが表示されている](/_astro/infrastructure-inspection-map-schema-reports.CR35LqYm_1LPbvT.webp) ### インテグレーションを作成して連携する [Section titled “インテグレーションを作成して連携する”](#インテグレーションを作成して連携する) 1. パーソナルアカウントで **マイインテグレーション** を開き、新規インテグレーションを作成します — 手順の全体は [インテグレーションの作成](/ja/developer/cms/getting-started/integration-setup/) を参照してください 2. プロジェクトのあるワークスペースで **インテグレーション** を開き、作成したインテグレーションを連携します 3. 役割を **maintainer(管理者)** に設定します ノート ここでは **writer(編集者)** では足りません。編集者は自分が作成したアイテムしか更新・削除できませんが、このアプリのバックエンドは CMS コンソールで手作業で作成した `infrastructure-assets` のアイテムを更新します — インテグレーションが作成したアイテムではありません。これを満たす最小の役割が **maintainer(管理者)** です。[インテグレーションの作成](/ja/developer/cms/getting-started/integration-setup/#%E5%BD%B9%E5%89%B2) の権限表のとおり、maintainer と owner(所有者)は現時点で権限がまったく同じなので、owner を選ぶ理由はありません。 インテグレーションのトークンをコピーします。パスワードと同様に扱い、コミットしたり、フロントエンドのコードに書いたりしないでください。 ### curl でインテグレーションAPI を試す [Section titled “curl でインテグレーションAPI を試す”](#curl-でインテグレーションapi-を試す) アプリに触れる前に、まずリクエストを1つ直接送ってみます。ステップ3 のバックエンドのコードが組み立てているのも、これと同じ形です。``・``・``・``・`` を、それぞれ自分の値に置き換えてください。`` は `https://api.cms.reearth.io/api` です。`` と `` は、CMS の管理画面でそのワークスペースやプロジェクトを開いているときのブラウザの URL バーに表示されています。`` は、上で `infrastructure-assets` を作成したときに表示された **モデルキー** です。`` は、今コピーしたインテグレーションのトークンです。 ```bash curl -X POST \ '//projects//models//items' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ "fields": [ { "key": "asset-id", "type": "text", "value": "MH-001" }, { "key": "asset-name", "type": "text", "value": "Demo Manhole 001" }, { "key": "asset-type", "type": "select", "value": "manhole" }, { "key": "location", "type": "geometryEditor", "value": "{\"type\":\"Point\",\"coordinates\":[138.26,36.06]}" } ] }' ``` CMS は作成したアイテムを返します。次のリクエストで使う `id` もここに含まれています。 ```json { "id": "01...", "fields": [ { "key": "asset-id", "type": "text", "value": "MH-001" }, { "key": "asset-name", "type": "text", "value": "Demo Manhole 001" }, { "key": "asset-type", "type": "select", "value": "manhole" }, { "key": "location", "type": "geometryEditor", "value": "{\"type\":\"Point\",\"coordinates\":[138.26,36.06]}" }, { "key": "current-condition", "type": "select", "value": "Not inspected" } ], "refs": ["latest"] } ``` 新規に作成したアイテムは **ドラフト** の状態です — `refs` には `latest` だけが入っています。アプリがステップ3 で行っているのと同じ方法で公開します。 ```bash curl -X POST \ '//projects//models//items//publish' \ -H 'Authorization: Bearer ' ``` `refs` に `public` が `latest` と並んで入るようになります — パブリックAPI からもこのアイテムを取得できる状態です。 これで資産を1件作成できました。残りは curl を繰り返す代わりに、CMS のコンソールから直接追加します — 街灯・標識・ベンチをそれぞれ用意してください。**コンテンツ** でモデルを選び、**新規アイテム** をクリックして値を入力し、**保存** します。アプリは、資産が何件か存在しない限り地図に何も表示しません。 ## ステップ2 — リポジトリをクローンしてバックエンドを設定する [Section titled “ステップ2 — リポジトリをクローンしてバックエンドを設定する”](#ステップ2--リポジトリをクローンしてバックエンドを設定する) ```bash git clone https://github.com/eukarya-biz/infrastructure-inspection-tutorial.git cd infrastructure-inspection-tutorial/backend npm install cp .env.example .env ``` Windows(コマンドプロンプト)では、`cp .env.example .env` の代わりに `copy .env.example .env` を使ってください。 `.env` に、ステップ1 で確認した値を入力します。 | 変数 | 値 | | ----------------------- | ------------------------------ | | `PORT` | バックエンドのポート番号(デフォルト `3000`) | | `CMS_BASE_URL` | Re:Earth CMS の API ベース URL | | `CMS_WORKSPACE_ID` | ステップ1 のワークスペース ID | | `CMS_PROJECT_ID` | ステップ1 のプロジェクト ID | | `CMS_ASSETS_MODEL` | `infrastructure-assets` のモデルキー | | `CMS_REPORTS_MODEL` | `inspection-reports` のモデルキー | | `CMS_INTEGRATION_TOKEN` | ステップ1 のインテグレーショントークン | 注意 これらの値は入力後によく確認してください。`CMS_WORKSPACE_ID`・`CMS_PROJECT_ID`・各モデルキーのいずれかが間違っていると、ステップ3 の CMS へのリクエストがすべて失敗します。また `.env` はコミットしたり内容を共有したりしないでください。`CMS_INTEGRATION_TOKEN` は、あなたの CMS プロジェクトに対して **maintainer(管理者)** ロールと同じ読み書き権限を持っています。 ```bash npm run dev ``` バックエンドが `http://localhost:3000` で起動します。 ## ステップ3 — バックエンドがインテグレーションAPI をどう使うか [Section titled “ステップ3 — バックエンドがインテグレーションAPI をどう使うか”](#ステップ3--バックエンドがインテグレーションapi-をどう使うか) 最初の2つのステップは、ここに来るための準備でした。このアプリが CMS に書き込む処理はすべて、`.env` のトークンを使ってインテグレーションAPI を呼びだす、いくつかのルートハンドラーを通ります。 ### 共通のリクエストヘルパー [Section titled “共通のリクエストヘルパー”](#共通のリクエストヘルパー) `backend/src/cms.ts` は、CMS へのリクエストをすべて同じ形で組み立てます。プロジェクトのベース URL に、`Authorization: Bearer ` ヘッダーを添えるだけです。 ```ts export function cmsProjectUrl(config: CmsConfig, path: string): string { return `${config.baseUrl}/${config.workspaceId}/projects/${config.projectId}${path}`; } export function cmsHeaders( config: CmsConfig, extra?: Record, ): Record { return { Authorization: `Bearer ${config.token}`, Accept: "application/json", ...extra, }; } ``` ### レポートを作成する [Section titled “レポートを作成する”](#レポートを作成する) `POST /api/reports`(`backend/src/routes/reports.ts`)は `fields` の配列を組み立て、レポートモデルの `items` エンドポイントに送信します。 ```ts const fields = [ { key: "asset-id", type: "text", value: assetId }, { key: "asset-type", type: "select", value: assetType }, { key: "location", type: "geometryEditor", value: JSON.stringify(location) }, { key: "inspection-date", type: "date", value: `${inspectionDate}T00:00:00+09:00` }, { key: "condition", type: "select", value: condition }, { key: "issue-category", type: "select", value: issueCategory }, { key: "severity", type: "select", value: severity }, { key: "report-status", type: "select", value: "pending" }, ]; if (validPhotoIds.length > 0) { fields.push({ key: "photos", type: "asset", value: validPhotoIds }); } await fetch(cmsProjectUrl(config, `/models/${modelKey}/items`), { method: "POST", headers: cmsHeaders(config, { "Content-Type": "application/json" }), body: JSON.stringify({ fields }), }); ``` インテグレーションAPI の複数値アセットフィールド `photos` のように複数のファイルを受け取るフィールドは、各写真を `POST /assets` で個別にアップロードしたあと、その ID をそのまま配列にして `value` に渡します。配列を何かのオブジェクトで包む必要はなく、空の配列は拒否されます。上のコードが、写真が1件以上アップロードされたときだけこのフィールドを追加しているのはこのためです。 新規アイテムは **ドラフト** として作成されます。アプリは作成の直後、同じインテグレーションAPI のトークンを使って公開します。 ```ts await fetch(`${itemUrl}/publish`, { method: "POST", headers: cmsHeaders(config), }); ``` ### 資産を更新する [Section titled “資産を更新する”](#資産を更新する) レポートが公開されたあと、`PATCH /api/assets/:itemId`(`backend/src/routes/assets.ts`)が資産自身の `current-condition` と `last-inspected-at` を更新し、続けて再公開してパブリックAPI 側でも変更が見えるようにします。 ```ts await fetch(itemUrl, { method: "PATCH", headers: cmsHeaders(config, { "Content-Type": "application/json" }), body: JSON.stringify({ fields: [ { key: "current-condition", type: "select", value: condition }, { key: "last-inspected-at", type: "date", value: inspectedAt }, ], }), }); await fetch(`${itemUrl}/publish`, { method: "POST", headers: cmsHeaders(config), }); ``` 実際のハンドラーには、これらの呼び出しのまわりに検証とエラー処理が加わっています。完全なコードは [`backend/src/routes/reports.ts`](https://github.com/eukarya-biz/infrastructure-inspection-tutorial/blob/main/backend/src/routes/reports.ts) と [`backend/src/routes/assets.ts`](https://github.com/eukarya-biz/infrastructure-inspection-tutorial/blob/main/backend/src/routes/assets.ts) を参照してください。 ## ステップ4 — フロントエンドを動かす [Section titled “ステップ4 — フロントエンドを動かす”](#ステップ4--フロントエンドを動かす) ```bash cd ../frontend npm install npm run dev ``` `http://localhost:5173` を開きます。フロントエンドはインテグレーションAPI を直接呼びだすことはなく、バックエンド自身のルート(`/api/assets`・`/api/reports` など)だけを呼び出します。それを Vite の開発サーバーがポート 3000 のバックエンドにプロキシします。トークンは終始バックエンド側にとどまります。 地図上の資産をクリックしてポップアップを開き、**Start inspection** をクリックしてレポートのフォームを開きます。 ![Demo Traffic Sign 001 のポップアップ。資産IDと現在の状態、Start inspection ボタンが表示されている](/_astro/infrastructure-inspection-map-popup.B4BlXZQO_Z1AzqjA.webp) ![New inspection report フォーム。点検日が入力され、Condition が Fair、Issue が Damage、Severity が Medium に設定され、notes 欄に曲がって植栽に覆われた標識ポールについてのメモが書かれている](/_astro/infrastructure-inspection-map-inspection-form.C3zbMgwb_ZO3chH.webp) フォームに入力し、**Submit report** をクリックします。すると、ステップ3 のバックエンドのルートが順番に呼び出されます — 写真のアップロード、レポートの作成、公開、資産の更新の順です。成功すると、地図のステータス欄に「Report submitted and `` updated」と表示されます。**View report history** ボタンから、これまで送信されたレポート(添付した写真を含む)を一覧できます。 ![Report history ダイアログ。標識・街灯・ベンチの3件の点検レポートが、それぞれの状態・問題種別・深刻度・ステータス・メモとともに一覧表示され、標識のレポートには写真が添付されている](/_astro/infrastructure-inspection-map-report-history.DZFpXj7Q_16kNvn.webp) ## ステップ5(任意) — Re:Earth Visualizer と連携する [Section titled “ステップ5(任意) — Re:Earth Visualizer と連携する”](#ステップ5任意--reearth-visualizer-と連携する) このステップは任意です。アプリ本体の上に乗せるおまけであり、これ以降の内容が前提とするものではありません。 2つの CMS モデルは、パブリックAPI を使えばバックエンドを介さずブラウザから直接読み取ることもできます。 1. 各モデルの [パブリックAPI](/ja/developer/cms/getting-started/public-api-quickstart-read/) 設定で **読み取り** タブを開き、モデルを有効にして **変更を保存** をクリックします 2. 各モデルの `.geojson` エンドポイントを確認します:`https://api.cms.reearth.io/api/p///.geojson` 続いて、Re:Earth Visualizer で次の操作をします。 1. 新規プロジェクトを作成します 2. 各モデルについて、**+新規レイヤー → リソースからレイヤーを追加** をクリックし、**GeoJSON** タブを選び、**ソースタイプ** をデフォルトの **アセットから** ではなく **Web から** に設定して、モデルの `.geojson` エンドポイントを **リソースURL** に貼り付け、**レイヤーに追加** をクリックします 3. **公開** タブを開き、**公開** をクリックします 公開した URL を知っている人は誰でも、Visualizer の地図上でバックエンドが書き込んでいるのと同じインフラ資産と点検レポートを見られるようになります。 ![公開済みの Re:Earth Visualizer プロジェクト。パブリックAPI から直接読み取った4件のインフラ資産のマーカーが地図上に表示されている](/_astro/infrastructure-inspection-map-visualizer.DdtAPnnE_Z1UjqEP.webp) ## トラブルシューティング [Section titled “トラブルシューティング”](#トラブルシューティング) **レポートの作成で `invalid value` が返る** 選択肢フィールドに送った値が、モデルで定義した選択肢のいずれとも一致していません。`issue-category`・`severity` など、他の選択肢フィールドの値をステップ1 のスキーマと照らし合わせてください。 **地図に資産が1件も表示されない** バックエンドの `.env` が正しいワークスペース・プロジェクト・モデルキーを指しているか、`infrastructure-assets` に1件以上アイテムが存在するかを確認してください。 **Visualizer でマーカーをクリックしても詳細が表示されない** このステップは CMS のデータをそのまま GeoJSON レイヤとして読み込んでいるだけで、クリック時に情報を表示する設定(インフォボックス)をしていないため、地図上にマーカーは表示されても、クリックすると写真などのフィールド値は表示されません。これは想定どおりの動作です。このステップはパブリックAPI での読み取りを示すためのもので、フルインタラクティブな地図表示を目的としたものではありません。実現するには、レイヤにインフォボックスを設定する Visualizer のプラグインを書く必要があり、このチュートリアルの範囲を超えます。 ## 完了チェックリスト [Section titled “完了チェックリスト”](#完了チェックリスト) * [ ] ステップ1 で作成したインフラ資産が地図に表示される * [ ] 点検レポートを送信すると `inspection-reports` にアイテムが作成・公開される * [ ] レポート送信後、対象資産の状態と最終点検日が更新される * [ ] レポート履歴に送信済みのレポートがすべて表示される * [ ] (任意)Re:Earth Visualizer でも同じデータがパブリックAPI 経由で表示される # React と TypeScript で ISS Tracker プラグインを作成する > ISS の現在位置を取得して追跡する Visualizer ウィジェットを作成し、テスト、パッケージ化、インストールします。 Re:Earth Visualizer の React・TypeScript プラグインテンプレートから始めます。ISS Tracker ウィジェットを設定し、ISS の現在位置データと接続して、Visualizer のカメラを操作します。最後に、プラグインをパッケージ化してプロジェクトにインストールします。各ステップで画面の結果を確認しながら進められます。 ## 作るもの [Section titled “作るもの”](#作るもの) 完成した **ISS Tracker プラグイン**には、ISS の現在の経度、緯度、高度が表示されます。**Update** は最新の位置を取得し、**Jump** は表示中の位置へカメラを移動します。**Follow** は5秒ごとに ISS の位置を取得し、カメラを移動します。完成したプラグインを ZIP ファイルにパッケージ化し、Visualizer プロジェクトにウィジェットとしてインストールします。 作業中のプロジェクトは、[完成版の ISS Tracker ソースコード](https://github.com/reearth-plugins/reearth-visualizer-plugin-iss-tracker)と比較できます。 ## 前提条件 [Section titled “前提条件”](#前提条件) * Node.js 20.11.0 以降 * Yarn 4.5.1 * Git * Visual Studio Code などのコードエディター * React と TypeScript の基本的な知識 * 開発用プラグインを動かすローカルの Re:Earth Visualizer フロントエンド ノート 開発用プラグインを動かすには、Re:Earth Visualizer フロントエンドをローカルで起動する必要があります。`REEARTH_WEB_DEV_PLUGIN_URLS` を設定しても、ホストされている Visualizer には反映されません。 ## ステップ1・開発環境を準備する [Section titled “ステップ1・開発環境を準備する”](#ステップ1開発環境を準備する) ### プラグインテンプレートをインストールする [Section titled “プラグインテンプレートをインストールする”](#プラグインテンプレートをインストールする) ターミナルを開き、次のコマンドを実行してください。`` は、プロジェクトを作成するディレクトリに置き換えます。 ```shell cd git clone https://github.com/reearth-plugins/reearth-visualizer-plugin-shadcn-template.git cd reearth-visualizer-plugin-shadcn-template corepack enable yarn install ``` テンプレートは、`package.json` で指定されたバージョンの Yarn を使います。Corepack を有効にすると、互換性のないグローバル版ではなく、指定されたバージョンを使えます。 ![Visualizer プラグインテンプレートを複製して Visual Studio Code で開いた画面](/_astro/template-clone.DDBs-fNj_Z2ljEmh.webp) ### ローカルの Visualizer フロントエンドを設定する [Section titled “ローカルの Visualizer フロントエンドを設定する”](#ローカルの-visualizer-フロントエンドを設定する) ローカル開発では、`http://localhost:5005` のプレビューサーバーからプラグインを読み込みます。 1. ローカルの Re:Earth Visualizer リポジトリで `web/.env` を開きます 2. 次の環境変数を追加します ```dotenv REEARTH_WEB_DEV_PLUGIN_URLS='["http://localhost:5005"]' ``` 3. ファイルを保存して、ローカルの Visualizer 開発サーバーを再起動します ### プラグインマニフェストを設定する [Section titled “プラグインマニフェストを設定する”](#プラグインマニフェストを設定する) プラグインプロジェクトで `public/reearth.yml` を開き、ファイル全体を次の内容に置き換えてください。 ```yaml id: iss-tracker-plugin name: ISS Tracker Plugin version: 1.0.0 extensions: - id: iss_tracker type: widget name: ISS Tracker ``` 拡張 ID、拡張ディレクトリ、エントリーファイル名、ビルドスクリプト名には、すべて `iss_tracker` を使います。 ### ビルドスクリプトを設定する [Section titled “ビルドスクリプトを設定する”](#ビルドスクリプトを設定する) プラグインプロジェクトで `package.json` を開き、既存の `scripts` オブジェクトだけを次の内容に置き換えてください。 ```json "scripts": { "dev:iss_tracker:main": "cross-env EXTENSION_NAME=iss_tracker UI_NAME=main vite -c configs/ui.ts", "build:iss_tracker:main": "cross-env EXTENSION_NAME=iss_tracker UI_NAME=main vite build -c configs/ui.ts", "build:iss_tracker:extension": "cross-env EXTENSION_NAME=iss_tracker vite build -c configs/extension.ts", "build:iss_tracker": "run-s build:iss_tracker:main build:iss_tracker:extension", "build": "run-s build:iss_tracker zip", "preview": "vite preview --port 5005 --strict-port", "zip": "node ./scripts/zip.mjs", "manage": "node ./scripts/manage.mjs", "type": "tsc -b", "lint": "eslint .", "fix": "eslint --fix .", "format": "prettier --write .", "dev-build": "concurrently 'yarn dev:iss_tracker:main' 'yarn build:iss_tracker:main --watch' 'yarn build:iss_tracker:extension --watch' 'vite preview --port 5005 --strict-port'" } ``` `package.json` のほかの部分は置き換えないでください。 ### 拡張ファイルの名前を変更する [Section titled “拡張ファイルの名前を変更する”](#拡張ファイルの名前を変更する) プラグインプロジェクトのルートで、テンプレートの拡張ディレクトリとエントリーファイルの名前を変更します。 ```shell mv src/extensions/demo src/extensions/iss_tracker mv src/extensions/iss_tracker/demo.ts src/extensions/iss_tracker/iss_tracker.ts ``` `src/extensions/iss_tracker/iss_tracker.ts` を開き、HTML の import を次のように変更してください。 ```typescript import html from "@distui/iss_tracker/main/index.html?raw"; ``` 関連するソースファイルが次の構成になっていることを確認してください。 ```text src/extensions/iss_tracker/ ├── iss_tracker.ts └── main/ ├── App.tsx ├── app.css ├── hooks.ts ├── index.html └── main.tsx ``` ![名前を変更した iss\_tracker 拡張ディレクトリとエントリーファイル](/_astro/extension-files.jRF6xjto_Z267dCL.webp) ### 開発用プラグインを起動してインストールする [Section titled “開発用プラグインを起動してインストールする”](#開発用プラグインを起動してインストールする) 必要な出力を作るためにプラグインを一度ビルドしてから、開発プロセスを起動します。 ```shell yarn build yarn dev-build ``` 1. `http://localhost:3000/` を開き、ローカルの Visualizer でプロジェクトを選択します 2. エディターのヘッダーで **Install Dev Plugins** と **Reload Dev Plugin Extensions** を確認します ![ローカルの Visualizer エディターにある開発用プラグインの操作項目](/_astro/dev-plugin-buttons.C-SpjD5q_kM44z.webp) 3. **Install Dev Plugins** を選択します。初めてプラグインをインストールするときと、`reearth.yml` を変更したあとに使います ![Install Dev Plugins の操作項目](/_astro/install-dev-plugin.DwInbLwj_Z24rnSB.webp) 4. 拡張または UI のコードを変更したら、**Reload Dev Plugin Extensions** を選択して最新のビルドを読み込みます ![Reload Dev Plugin Extensions の操作項目](/_astro/reload-dev-plugin.JnHJpTVz_NB0iu.webp) 5. 開発用プラグインがインストールされたことを確認します ![Visualizer にインストールされた ISS Tracker 開発用プラグイン](/_astro/dev-plugin-installed.06RAlAdp_1u7dvf.webp) 6. **Widgets** タブを開き、シーンに **ISS Tracker** を追加します ![Widgets パネルに表示された ISS Tracker ウィジェット](/_astro/add-dev-widget.CDs0U7a8_Zn7rJe.webp) 変更前のテンプレートウィジェットには、サンプルの UI が表示されます。次のステップでこの UI を置き換えます。 ![Visualizer で動作する変更前のテンプレートウィジェット](/_astro/template-widget._opNq0Q-_Z1Hf4Uc.webp) ## ステップ2・ISS Tracker を作成する [Section titled “ステップ2・ISS Tracker を作成する”](#ステップ2iss-tracker-を作成する) 完成したウィジェットには、次の3つの操作があります。 * **Update** は ISS の現在位置を取得します * **Jump** は表示中の ISS の位置へ Visualizer のカメラを移動します * **Follow** は5秒ごとに位置を取得してカメラを移動します ![Update、Jump、Follow の操作を備えた完成後の ISS Tracker UI](/_astro/follow-result.BBJbl0qs_IBwqX.webp) ### プロジェクト構成を確認する [Section titled “プロジェクト構成を確認する”](#プロジェクト構成を確認する) 主に `src` ディレクトリ内のファイルを編集します。 ```text iss-tracker-plugin/ ├── node_modules/ ├── public/ │ └── reearth.yml # Plugin definition ├── src/ │ ├── extensions/ │ │ └── iss_tracker/ # Extension directory named after its ID │ │ ├── main/ # UI project for the main view │ │ └── iss_tracker.ts # Extension script │ └── shared/ │ ├── components/ # Shared shadcn/ui components │ ├── lib/ # Shared shadcn/ui utilities │ ├── reearthTypes/ # Visualizer Plugin API types │ ├── global.css # Shared Tailwind CSS │ └── utils.ts ├── dist/ # Plugin build output ├── dist-ui/ # UI build output ├── package/ # Installable ZIP output ├── configs/ # Vite configurations ├── scripts/ ├── package.json └── README.md ``` ### テンプレートの UI を変更する [Section titled “テンプレートの UI を変更する”](#テンプレートの-ui-を変更する) `src/extensions/iss_tracker/main/App.tsx` を開きます。 既存の `CardHeader` を次の内容に置き換えてください。 ```tsx ISS Tracker View, move, and update the current location of the ISS ``` テーブル本体で、行ラベルを `Mouse` から `ISS` に変更します。 ```tsx ISS ``` 既存の `CardFooter` 全体を、次の3つの仮の操作に置き換えてください。 ```tsx ``` この時点では、すべてのボタンが動作するわけではありません。新しい動作を実装する間も既存のハンドラーが参照されるように、`handleFlyToTokyo` を一時的に **Update** に設定します。 Visualizer で **Reload Dev Plugin Extensions** を選択します。UI 開発サーバーの起動中に `http://localhost:5173/` を開くと、UI の変更がホットリロードされます。 ![ISS Tracker のラベルと3つの操作を追加したテンプレート](/_astro/interface-updated.DlW3B29l_7F9kE.webp) ### Update を実装する [Section titled “Update を実装する”](#update-を実装する) ISS 位置情報 API について このチュートリアルでは、ボランティアが提供する [Where the ISS at? REST API](https://wheretheiss.at/w/developer) を学習目的で使用します。リクエストは1秒あたり約1回に制限されています。過度なアクセスは避けてください。 `src/extensions/iss_tracker/main/hooks.ts` を開き、ファイル全体を次の内容に置き換えてください。 ```typescript import { useState } from "react"; type IssPosition = { lat: number; lon: number; height: number; }; export default () => { const [issPosition, setIssPosition] = useState(null); const handleUpdate = async () => { const position = await fetchIssLocation(); setIssPosition(position); }; return { issPosition, handleUpdate }; }; const fetchIssLocation = async (): Promise => { try { const response = await fetch( "https://api.wheretheiss.at/v1/satellites/25544", ); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const data = await response.json(); return { lat: data.latitude, lon: data.longitude, height: data.altitude * 1000, }; } catch { return null; } }; ``` このフックは、ISS の位置または `null` を保持します。`fetchIssLocation()` は現在の座標を取得し、高度を km から m に変換します。`handleUpdate()` は結果を React の状態に保存します。 次に `src/extensions/iss_tracker/main/App.tsx` を開き、既存の `useHooks()` 呼びだしを次の内容に置き換えてください。 ```tsx const { issPosition, handleUpdate } = useHooks(); ``` **Update** が新しいハンドラーを呼びだすように、`CardFooter` 全体を次の内容に置き換えてください。 ```tsx ``` テーブル行の3つの座標セルを次の内容に置き換えてください。 ```tsx ``` プラグインを再読み込みして、**Update** を選択します。ウィジェットに現在の経度、緯度、高度が表示されることを確認してください。 ![Update の選択後に座標を表示する ISS Tracker](/_astro/update-result.CNjlzdDy_Z1d2tBA.webp) ### Jump を実装する [Section titled “Jump を実装する”](#jump-を実装する) `src/extensions/iss_tracker/main/hooks.ts` を開き、ファイル全体を次の内容に置き換えてください。 ```typescript import { useState } from "react"; import { postMsg } from "@/shared/utils"; type IssPosition = { lat: number; lon: number; height: number; }; export default () => { const [issPosition, setIssPosition] = useState(null); const handleUpdate = async () => { const position = await fetchIssLocation(); setIssPosition(position); }; const handleJump = () => { flyTo(issPosition); }; return { issPosition, handleUpdate, handleJump }; }; const fetchIssLocation = async (): Promise => { try { const response = await fetch( "https://api.wheretheiss.at/v1/satellites/25544", ); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const data = await response.json(); return { lat: data.latitude, lon: data.longitude, height: data.altitude * 1000, }; } catch { return null; } }; const flyTo = (position: IssPosition | null): void => { if (!position) { console.warn("No position available to fly to."); return; } postMsg("flyTo", position); }; ``` `flyTo()` は位置があることを確認し、`postMsg()` を使ってウィジェットの iframe から拡張へ位置を送ります。 `src/extensions/iss_tracker/iss_tracker.ts` を開き、ファイル全体を次の内容に置き換えてください。 ```typescript import html from "@distui/iss_tracker/main/index.html?raw"; import { GlobalThis } from "@/shared/reearthTypes"; type IssPosition = { lat: number; lon: number; height: number; }; type FlyToMessage = { action: "flyTo"; payload: IssPosition; }; const isFlyToMessage = (message: unknown): message is FlyToMessage => { if (!message || typeof message !== "object") return false; const candidate = message as Partial; const position = candidate.payload; return ( candidate.action === "flyTo" && !!position && Number.isFinite(position.lat) && Number.isFinite(position.lon) && Number.isFinite(position.height) ); }; const reearth = (globalThis as unknown as GlobalThis).reearth; reearth.ui.show(html); reearth.extension.on("message", (message: unknown) => { if (!isFlyToMessage(message)) return; reearth.camera.flyTo( { lat: message.payload.lat, lng: message.payload.lon, height: message.payload.height, }, { duration: 1 }, ); }); ``` 拡張はメッセージを検証し、`reearth.camera.flyTo()` を呼びだします。ウィジェットでは `lon` を使いますが、カメラ API では `lng` が必要です。 最後に `src/extensions/iss_tracker/main/App.tsx` を開き、フックの呼びだしに `handleJump` を含めてください。 ```tsx const { issPosition, handleUpdate, handleJump } = useHooks(); ``` `CardFooter` 全体を次の内容に置き換えてください。 ```tsx ``` プラグインを再読み込みし、**Update**、**Jump** の順に選択します。表示中の ISS の位置へカメラが移動することを確認してください。 ### Follow を実装する [Section titled “Follow を実装する”](#follow-を実装する) `src/extensions/iss_tracker/main/hooks.ts` を開き、ファイル全体を次の完成版フックに置き換えてください。 ```typescript import { useCallback, useEffect, useRef, useState } from "react"; import { postMsg } from "@/shared/utils"; type IssPosition = { lat: number; lon: number; height: number; }; const ISS_API_URL = "https://api.wheretheiss.at/v1/satellites/25544"; const isIssApiResponse = ( value: unknown, ): value is { latitude: number; longitude: number; altitude: number } => { if (!value || typeof value !== "object") return false; const data = value as Record; return ( Number.isFinite(data.latitude) && Number.isFinite(data.longitude) && Number.isFinite(data.altitude) ); }; const fetchIssLocation = async (signal: AbortSignal): Promise => { const response = await fetch(ISS_API_URL, { signal }); if (!response.ok) { throw new Error(`ISS API request failed (${response.status}).`); } const data: unknown = await response.json(); if (!isIssApiResponse(data)) { throw new Error("The ISS API returned an unexpected response."); } return { lat: data.latitude, lon: data.longitude, height: data.altitude * 1000, }; }; const flyTo = (position: IssPosition) => { postMsg("flyTo", position); }; export default () => { const [issPosition, setIssPosition] = useState(null); const [isFollowing, setIsFollowing] = useState(false); const [error, setError] = useState(null); const activeRequest = useRef(null); const loadPosition = useCallback(async (): Promise => { activeRequest.current?.abort(); const controller = new AbortController(); activeRequest.current = controller; setError(null); try { const position = await fetchIssLocation(controller.signal); setIssPosition(position); return position; } catch (error) { if (error instanceof DOMException && error.name === "AbortError") { return null; } setError( error instanceof Error ? error.message : "Unable to load the ISS position.", ); return null; } finally { if (activeRequest.current === controller) activeRequest.current = null; } }, []); const handleUpdate = useCallback(() => { void loadPosition(); }, [loadPosition]); const handleJump = useCallback(() => { if (issPosition) flyTo(issPosition); }, [issPosition]); useEffect(() => { if (!isFollowing) return; let stopped = false; let timeoutId: ReturnType | undefined; const follow = async () => { const position = await loadPosition(); if (position) flyTo(position); if (!stopped) timeoutId = setTimeout(follow, 5000); }; void follow(); return () => { stopped = true; if (timeoutId) clearTimeout(timeoutId); activeRequest.current?.abort(); }; }, [isFollowing, loadPosition]); const toggleFollow = useCallback(() => { setIsFollowing((current) => !current); }, []); return { issPosition, isFollowing, error, handleUpdate, handleJump, toggleFollow, }; }; ``` 完成版のフックは API のレスポンスを検証します。新しいリクエストが失敗しても、最後に取得できた位置を表示したままにします。また、リクエストの重複を防ぎ、追跡モードの停止時にタイマーと実行中のリクエストを取り消します。 `src/extensions/iss_tracker/main/App.tsx` を開き、ファイル全体を次の完成版 UI に置き換えてください。 ```tsx import useHooks from "./hooks"; import { Button } from "@/shared/components/ui/button"; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from "@/shared/components/ui/card"; import { Input } from "@/shared/components/ui/input"; import { Label } from "@/shared/components/ui/label"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/shared/components/ui/table"; function App() { const { issPosition, isFollowing, error, handleUpdate, handleJump, toggleFollow, } = useHooks(); return ( ISS Tracker View, move, and update the current location of the ISS Longitude Latitude Height (m) ISS
{error && (

{error}

)}
); } export default App; ``` プラグインを再読み込みして、**Follow** を選択します。ボタンが **Unfollow** に変わり、5秒ごとに ISS の最新位置へカメラが移動することを確認してください。 ![ISS の現在位置を追跡する完成後の ISS Tracker](/_astro/follow-result.BBJbl0qs_IBwqX.webp) 注意 不要な API リクエストを避けるため、動作確認が終わったら **Unfollow** を選択してください。 ## ステップ3・プラグインをパッケージ化してインストールする [Section titled “ステップ3・プラグインをパッケージ化してインストールする”](#ステップ3プラグインをパッケージ化してインストールする) ### プラグインを検証してビルドする [Section titled “プラグインを検証してビルドする”](#プラグインを検証してビルドする) プラグインプロジェクトのルートで、次のコマンドを実行してください。 ```shell yarn type yarn lint yarn build ``` 最後のコマンドは現在のソースをビルドし、`package/iss-tracker-plugin-1.0.0.zip` を作成します。 ![package ディレクトリに生成された ISS Tracker の ZIP ファイル](/_astro/package-output.B58OLF0E_YyI1f.webp) ZIP ファイルを開き、`reearth.yml` や `iss_tracker.js` などのインストール用ファイルが別のディレクトリ内ではなく、ZIP のルートにあることを確認してください。 ![生成したプラグイン ZIP に含まれるファイル](/_astro/package-contents.DwEpummD_Z23mpYp.webp) ### ローカル開発モードを終了する [Section titled “ローカル開発モードを終了する”](#ローカル開発モードを終了する) ローカルの Re:Earth Visualizer リポジトリで `web/.env` を開きます。`REEARTH_WEB_DEV_PLUGIN_URLS` を削除するか、次のようにコメントアウトしてください。 ```dotenv # REEARTH_WEB_DEV_PLUGIN_URLS='["http://localhost:5005"]' ``` 環境ファイルを変更したら、Visualizer 開発サーバーを再起動してください。 ### ZIP ファイルをインストールする [Section titled “ZIP ファイルをインストールする”](#zip-ファイルをインストールする) 1. Visualizer プロジェクトを作成するか、既存のプロジェクトを開きます 2. プロジェクト名を選択し、**Plugins** を選択します ![Visualizer のプロジェクトメニューにある Plugins](/_astro/project-menu.Co_Cnmrr_ZULdcP.webp) 3. **Personally Installed** を開き、**Upload ZIP File from PC** を選択します ![Personally Installed にある ZIP ファイルのアップロード項目](/_astro/upload-zip.Blvs-Vp1_298NXG.webp) 4. プラグインプロジェクトの `package` ディレクトリから `iss-tracker-plugin-1.0.0.zip` をアップロードします 5. インストール済みのプラグインに **ISS Tracker Plugin** が表示されることを確認します ![インストール後の一覧に表示された ISS Tracker Plugin](/_astro/installed-plugin.BnY2-7a2_Z2iaTlh.webp) 6. エディターに戻ります ![プラグインのインストール後に Visualizer エディターへ戻る画面](/_astro/return-to-editor.BDzI3C-D_B1vXt.webp) 7. **Widgets** タブを開き、シーンに **ISS Tracker** を追加します ![Widgets タブから ISS Tracker を追加する画面](/_astro/add-dev-widget.CDs0U7a8_Zn7rJe.webp) ![シーンに表示されたインストール済みの ISS Tracker ウィジェット](/_astro/follow-result.BBJbl0qs_IBwqX.webp) ## 完成したプラグインを確認する [Section titled “完成したプラグインを確認する”](#完成したプラグインを確認する) 次の項目をすべて確認できたら、プラグインは完成です。 * インストール済みのプラグインに **ISS Tracker Plugin** が表示される * **Widgets** タブから **ISS Tracker** ウィジェットを追加できる * **Update** を選択すると、ISS の最新の座標が表示される * **Jump** を選択すると、表示中の位置へカメラが移動する * **Follow** が **Unfollow** に変わり、ISS の位置が更新されるたびにカメラが移動する # パブリックAPI で、1つのモデルからグラフと地図を作る > Re:Earth CMS にモデルとスキーマを作り、パブリックAPI で配信して、表計算ソフトのグラフと Re:Earth Visualizer の地図で扱うまでを実践します。 このチュートリアルでは、ヘッドレス CMS である Re:Earth CMS の機能を使って、データを配信します。その仕組みは [Re:Earth CMS とはなにか](/ja/cms/concepts/what-is-reearth-cms/) で説明しているので、先に読むことをおすすめします。 Re:Earth CMS にモデルを作り、パブリックAPI を通じて2つの配信先で利用するまでを、次の手順で実践します。 * データの構造を決めて Re:Earth CMS に登録する。 * 登録したデータをパブリックAPI から配信する。 * 同じデータを、表計算ソフト(Microsoft Excel)のグラフと Re:Earth Visualizer の地図でそれぞれ利用する。 モデルに入れるのは、このチュートリアル用に用意した観光施設のデータです。来場者数は実際の数値ではなく、このチュートリアル用の値です。 手順はすべて画面の操作なので、コードエディタを使う場面はありません。 ## 事前に準備するもの [Section titled “事前に準備するもの”](#事前に準備するもの) * Re:Earth のアカウント * Microsoft Excel。表計算ソフトとして使います。 Excel を用意できないときは、Google スプレッドシートで代用できます。データの取り込みの手順は本文に書いています。グラフの作成は Excel の画面で書いているので、Google スプレッドシートの操作に読み替えてください。 ## プロジェクトを作る [Section titled “プロジェクトを作る”](#プロジェクトを作る) Re:Earth CMS に、観光施設のデータを置く場所として、プロジェクトを1つ作りましょう。 1. [Re:Earth CMS](https://cms.reearth.io/) のワークスペースのホームで **新規プロジェクト** をクリックしてください。 2. **プロジェクト名** に `Tourist Spots` と入力してください。半角英数字なので、**プロジェクトエイリアス** に `tourist-spots` が自動で入ります。 3. **プロジェクトの公開範囲** で **公開** を選んでください。プランによっては **非公開** も選べます。 4. **プロジェクト概要** の入力は任意です。ここでは入力せずに進みます。 5. **プロジェクトのライセンス** で **Creative Commons Attribution 4.0 International** を選んでください。 6. **OK** をクリックしてください。 ワークスペースのホームのプロジェクト一覧に、作ったプロジェクトが表示されます。 手順3で選んだ **公開** は、プロジェクトをオープンデータとして公開する設定です。詳しくは [プロジェクトの「公開範囲」](/ja/cms/reference/publish-permissions/project/#%E5%85%AC%E9%96%8B%E7%AF%84%E5%9B%B2) を参照してください。 手順5で選んだ Creative Commons Attribution 4.0 International は、公開したデータを他者が利用・共有してよい条件を伝えるものです。作成者と著作権の表示、ライセンスへの参照を残し、改変したときはその旨を示すことを条件に、改変・再配布・商用利用のいずれも認めます。自分のデータを配信するときは、利用条件に合うライセンスを選びましょう。 ## 施設のモデルを作る [Section titled “施設のモデルを作る”](#施設のモデルを作る) 観光施設のデータを入れるモデルを、プロジェクトの中に作りましょう。 1. ワークスペースのホームのプロジェクト一覧で `Tourist Spots` を開いてください。 2. **モデル** 画面で **新規モデル** をクリックしてください。 3. **モデル名** に `Facility` と入力してください。**モデルキー** に `facility` が自動で入ります。 4. **モデル概要** は空のまま、**OK** をクリックしてください。 `Facility` モデルの **スキーマ** 画面が開きます。この画面で、モデルに入るアイテムの値を定義するスキーマを設定します。 ## フィールドを追加する [Section titled “フィールドを追加する”](#フィールドを追加する) 実際のデータを登録する前に、施設の何を記録するかをフィールドとして決めます。フィールドやスキーマという言葉や、データの登録より先にフィールドを決める理由が分からない場合は、[モデルの構造を先に決める](/ja/cms/concepts/model-structure-first/) を先に読むことをおすすめします。 次の4つのフィールドを、上から順に追加しましょう。 | 表示名 | フィールドキー | フィールド | | ---------- | ---------- | --------- | | `Name` | `name` | テキスト | | `Address` | `address` | テキスト | | `Location` | `location` | ジオメトリエディタ | | `Visitors` | `visitors` | 整数型 | 1つ目の `Name` を追加します。 1. **フィールド** タブで **フィールドを追加** を開き、**テキスト** をクリックしてください。 2. **設定** タブの **表示名** に `Name` と入力してください。**フィールドキー** に `name` が自動で入ります。 3. この値をアイテムの見出しに使うので、**タイトルとして使用** をオンにしてください。 4. **検証** タブで **このフィールドを必須項目にする** をオンにしてください。 5. **OK** をクリックしてください。 2つ目の `Address` を追加します。 1. **フィールドを追加** を開き、**テキスト** をクリックしてください。 2. **表示名** に `Address` と入力してください。 3. **検証** タブで **このフィールドを必須項目にする** をオンにしてください。 4. **OK** をクリックしてください。 3つ目の `Location` を追加します。 1. **フィールドを追加** を開き、**ジオメトリエディタ** をクリックしてください。 2. **表示名** に `Location` と入力してください。 3. **対応タイプ** で **Point** を選んでください。 4. **検証** タブで **このフィールドを必須項目にする** をオンにしてください。 5. **OK** をクリックしてください。 4つ目の `Visitors` を追加します。 1. **フィールドを追加** を開き、**整数型** をクリックしてください。 2. **表示名** に `Visitors` と入力してください。 3. **検証** タブで **このフィールドを必須項目にする** をオンにしてください。 4. **OK** をクリックしてください。 **フィールド** タブの一覧に、追加した4つのフィールドが並びます。必須にしたフィールドには `*` が、タイトルに設定した `Name` には **タイトル** が付きます。 これで、`Facility` モデルのスキーマができました。このスキーマで定めたフィールドに沿って、アイテムを登録します。 ## アイテムを登録する [Section titled “アイテムを登録する”](#アイテムを登録する) スキーマで定めたフィールドに沿って、施設を1件ずつアイテムとして登録しましょう。登録するのは次の4件です。 | `Name` | `Address` | `Location` | `Visitors` | | ------- | -------------- | --------------- | ---------- | | 国立西洋美術館 | 東京都台東区上野公園7-7 | 画面上の地図のエディタから入力 | `100000` | | 浅草寺 | 東京都台東区浅草2-3-1 | 画面上の地図のエディタから入力 | `300000` | | 恩賜上野動物園 | 東京都台東区上野公園9-83 | 画面上の地図のエディタから入力 | `200000` | | 国立科学博物館 | 東京都台東区上野公園7-20 | 画面上の地図のエディタから入力 | `150000` | `Name` と `Address` に選んだ **テキスト** は、文字を自由に入力する欄です。`Location` に選んだ **ジオメトリエディタ** は、画面上の地図に点を置いて値を入れる欄です。`Visitors` に選んだ **整数型** は、小数を含まない数値を入れる欄です。 1件目を登録しましょう。 1. **コンテンツ** の **モデル** からモデル名 `Facility` を選んでください。 2. **新規アイテム** をクリックしてください。 3. 各フィールドに値を入れてください。 1. `Name` に `国立西洋美術館` と入力してください。 2. `Address` に `東京都台東区上野公園7-7` と入力してください。 3. `Location` の地図にある検索バーに `国立西洋美術館` と入力して検索してください。地図がその施設の周辺に移動します。 4. 地図の右上にあるマップピンのアイコンをクリックしてください。 5. 地図上で施設の位置をクリックしてください。点が置かれ、`Location` の欄に座標が入ります。 6. `Visitors` に `100000` と入力してください。 4. **保存** をクリックしてください。 保存すると、アイテムのステータスに **ドラフト** が付きます。 同じ手順で、残り3件を登録しましょう。フィールドはモデルの中で固定されているので、2件目以降も同じ4つの欄に値を入れて登録できます。 これで、配信するデータの登録が完了しました。 Re:Earth CMS が行うのは、データの管理と配信までです。配信したデータをどう扱うかは配信先で決まり、このチュートリアルでは表計算ソフトと Re:Earth Visualizer の2つを使います。次のステップでは、配信するための設定を Re:Earth CMS で行います。 ## アイテムを公開する [Section titled “アイテムを公開する”](#アイテムを公開する) Re:Earth CMS は、API を通じてデータを配信します。このチュートリアルでは、認証なしで公開データを読み取れるパブリックAPI を使います。詳しくは [パブリックAPI設定](/ja/cms/reference/publish-permissions/public-api-settings/) を参照してください。 パブリックAPI が配信するのは、ステータスが **公開済み** のアイテムだけです。登録した4件のうち、3件を **公開済み** にしましょう。 1. **コンテンツ** 画面の一覧で、`国立西洋美術館`・`浅草寺`・`恩賜上野動物園` の3件の行のチェックボックスにチェックを入れてください。 2. **公開** をクリックしてください。 3. **アイテムの公開** の確認で **はい** をクリックしてください。 3件のステータスが **公開済み** に変わります。`国立科学博物館` は **ドラフト** のままです。これから配信されるのは、いま **公開済み** にした3件です。 ## エンドポイントを取得する [Section titled “エンドポイントを取得する”](#エンドポイントを取得する) パブリックAPI は、配信するモデルごとに URL を持ちます。この URL を **エンドポイント** と呼びます。配信先は、エンドポイントからそのモデルのアイテムを取得します。 `Facility` モデルのエンドポイントを取得しましょう。 1. 左メニューの **パブリックAPI** を開いてください。 2. **読み取り** タブを開いてください。 3. モデル名 `Facility` の行の **エンドポイント** の URL をコピーしてください。 有料プランのワークスペースで、プロジェクトの公開範囲を **非公開** にしている場合は、手順3の前に `Facility` の行の **有効** をオンにして、**変更を保存** をクリックしてください。 パブリックAPI は、アイテムを JSON・CSV・GeoJSON のいずれかの形式で配信できます。 次のステップでは、Excel や Re:Earth Visualizer を使って、Re:Earth CMS で作成したモデルの配信や再利用を実践してみましょう。 ## 表計算ソフトで表示する [Section titled “表計算ソフトで表示する”](#表計算ソフトで表示する) Re:Earth CMS で取得したエンドポイントの URL を Excel に取り込んで、配信されているデータを表示してみましょう。 1. Excel で空白のブックを作成してください。 2. **データ** タブの **データの取得** から、**その他のデータソースから** の **Web から** をクリックしてください。 3. **URL** に、「エンドポイントを取得する」の手順3でコピーした URL を貼り付けてください。 4. 貼り付けた URL の末尾に `.csv` を入力してください。 5. **OK** をクリックしてください。 6. **Web コンテンツへのアクセス** が表示されます。**匿名** での接続であることを確認し、レベルを変えずに **接続** をクリックしてください。 7. **読み込み** をクリックしてください。 Google スプレッドシートで進めるときは、手順1から7の代わりに次の操作をしてください。 1. Google スプレッドシートで空白のスプレッドシートを作成してください。 2. セル `A1` に `=IMPORTDATA("")` と入力してください。 3. `"` と `"` の間に、「エンドポイントを取得する」の手順3でコピーした URL を貼り付けてください。 4. 貼り付けた URL の末尾に `.csv` を入力してください。 5. Enter キーを押してください。 新しいシートに、配信されているデータがテーブルとして表示されます。手順4でエンドポイントの URL の末尾に `.csv` を付けたので、Re:Earth CMS から Excel へ CSV の形式で配信されます。 テーブルの1行目は、「フィールドを追加する」で定義したフィールドキーが入力されています。 `id` は、アイテムごとに Re:Earth CMS が自動で付ける識別子です。CSV の形式では、ジオメトリエディタのフィールドが配信されないため、`Location` のフィールドは表示されません。 2行目から下は、「アイテムを登録する」で登録し、「アイテムを公開する」で **公開済み** にした3件のアイテムが入力されています。 `国立科学博物館` のアイテムは **ドラフト** のままのため配信されていません。 このように、パブリックAPI のエンドポイントを利用すると、`Facility` モデルで定義したフィールドキーと、公開したアイテムが、表計算ソフトで扱える構造で配信されます。 ## 表計算ソフトでグラフを作る [Section titled “表計算ソフトでグラフを作る”](#表計算ソフトでグラフを作る) APIで配信された Re:Earth CMS のデータは、受け取ったツールのなかで再利用できます。テーブルの `visitors` の列から、施設ごとの来場者数を比べるグラフを作りましょう。 1. `name` の `B1` から `B4` までを選択してください。 2. Ctrl キーを押しながら、`visitors` の `D1` から `D4` までを選択してください。 3. **挿入** タブの **縦棒/横棒グラフの挿入** から **集合縦棒** をクリックしてください。 「アイテムを登録する」で `Visitors` に入力した値が、施設名ごとの縦棒グラフとして表示されます。 ![Excel の画面。1行目に id・name・address・visitors の列見出しが並び、その下に施設名ごとの来場者数の縦棒グラフが表示されている](/_astro/excel-chart.GMX9oAIw_2ucIGe.webp) このグラフは、配信された `visitors` の列から作ったものです。グラフの種類も、どの列を軸と棒に使うかも、手順1から手順3で Excel の側で指定しました。 Re:Earth CMS には、グラフの設定はひとつもありません。どのフィールドを使って何を作るかは、配信先で決めています。 次のステップでは、Re:Earth Visualizer の画面で操作します。 ## Re:Earth Visualizerで地図に表示する [Section titled “Re:Earth Visualizerで地図に表示する”](#reearth-visualizerで地図に表示する) Excel に取り込んだものと同じエンドポイントの URL を Re:Earth Visualizer に入力して、施設を地図に表示しましょう。 はじめに、プロジェクトを Re:Earth Visualizer に作ります。 1. [Re:Earth Visualizer](https://visualizer.reearth.io/) のダッシュボードで **+新規プロジェクト** をクリックしてください。 2. **プロジェクト名** に `Tourist Spots Map` と入力してください。 3. **プロジェクト別名** に `tourist-spots-map` と入力してください。 4. **プロジェクトの公開範囲** で **公開** を選んでください。プランによっては **非公開** も選べます。 5. **説明** の入力は任意です。ここでは入力せずに進みます。 6. **Choose a license** で **Creative Commons Attribution 4.0 International** を選んでください。 7. **適用** をクリックしてください。 8. ダッシュボードに追加されたプロジェクトのカードをダブルクリックしてください。 作ったプロジェクトに、Re:Earth CMS のデータをレイヤとして追加しましょう。 1. 左パネルの **+新しいレイヤー** をクリックしてください。 2. **リソースからレイヤーを追加** を選んでください。 3. データソースマネージャーの **GeoJSON** タブで、ソースタイプを **ウェブから** にしてください。 4. **リソースURL** に、「エンドポイントを取得する」の手順3でコピーした URL を入力してください。 5. 入力した URL の末尾に `.geojson` を付けてください。 6. **レイヤーに追加** をクリックしてください。 7. レイヤの一覧に追加されたレイヤの **移動** をクリックしてください。 地図が施設の周辺に移動し、「アイテムを公開する」で **公開済み** にした3件がピンで表示されます。レイヤを追加する手順5で末尾に `.geojson` を付けたことで、地図で扱うための GeoJSON の形式で配信されました。 「表計算ソフトで表示する」では列に出てこなかった `Location` の座標が、GeoJSON では配信されています。ピンの位置は、「アイテムを登録する」の手順3で地図上に置いた点の座標です。 エンドポイントの末尾を変えると、表計算ソフトではテーブルとして受け取ったデータを、Re:Earth Visualizer では地理空間データとして扱えます。地図のピン1つが、アイテム1件に対応しています。 GeoJSON形式のデータでも、`Location` フィールドのほかに、`Name`・`Address`・`Visitors` フィールドも配信されています。Re:Earth Visualizer のインフォボックスを使って、3つのフィールドの値が配信されていることを確かめましょう。 1. 地図に表示された施設のどれかをクリックしてください。 2. **インスペクター** パネルの **インフォボックス** タブを開いてください。 3. **有効** スイッチをオンにしてください。 インフォボックスが表示されます。この中に、フィールドごとのブロックを追加します。 1. `Name` フィールドのブロックを追加してください。 1. インフォボックスの左上にある **+** をクリックし、**テキスト** を選んでください。 2. 追加されたブロックをクリックしてください。 3. ブロックの右上に表示される鉛筆のアイコンをクリックしてください。 4. **コンテンツ** の入力欄の右にある ****をクリックし、一覧から `name` を選んでください。 5. **\[→** をクリックしてください。 2. `Address` フィールドのブロックを追加してください。 1. **+** をクリックし、**テキスト** を選んでください。 2. 追加されたブロックをクリックしてください。 3. ブロックの右上に表示される鉛筆のアイコンをクリックしてください。 4. **コンテンツ** の入力欄の右にある ****をクリックし、一覧から `address` を選んでください。 5. **\[→** をクリックしてください。 3. `Visitors` フィールドのブロックを追加してください。 1. **+** をクリックし、**テキスト** を選んでください。 2. 追加されたブロックをクリックしてください。 3. ブロックの右上に表示される鉛筆のアイコンをクリックしてください。 4. **コンテンツ** の入力欄の右にある ****をクリックし、一覧から `visitors` を選んでください。 5. **\[→** をクリックしてください。 地図上の施設をクリックすると、インフォボックスにそのアイテムの `Name`・`Address`・`Visitors` フィールドの値が表示されます。3つのピンを順にクリックして、それぞれの施設の値が表示されることを確かめましょう。 ![Re:Earth Visualizer の画面。地図に3つのピンが表示され、選択したピンのインフォボックスに国立西洋美術館の名称・住所・来場者数が表示されている](/_astro/visualizer.DR9xk0hC_ZT936N.webp) ブロックを追加する手順で ****の一覧に並んでいた `name`・`address`・`visitors` は、「表計算ソフトで表示する」で1行目に並んでいた列見出しと同じです。 「表計算ソフトでグラフを作る」では施設どうしを比べる列として使った `visitors` を、ここでは1件ずつの値として表示しています。 ## 未公開のアイテムを配信する [Section titled “未公開のアイテムを配信する”](#未公開のアイテムを配信する) 「アイテムを公開する」でチェックを入れなかった `国立科学博物館` は、まだ **ドラフト** のままです。これを公開して、2つの配信先が両方とも変わることを確かめましょう。 はじめに、Re:Earth CMS に戻ります。 1. **コンテンツ** の **モデル** から `Facility` を選んでください。 2. `国立科学博物館` の行のチェックボックスにチェックを入れてください。 3. **公開** をクリックしてください。 4. **アイテムの公開** の確認で **はい** をクリックしてください。 `国立科学博物館` のステータスが **公開済み** に変わり、パブリックAPI が配信するアイテムは4件になります。 続いて、Excel で配信されるデータがどう変わったのかを確かめましょう。 1. テーブルの中のセルをクリックしてください。 2. **テーブル デザイン** タブの **更新** をクリックしてください。 Google スプレッドシートには **更新** に当たるボタンがありません。Google スプレッドシートで進めているときは、手順1と手順2の代わりに、セル `A1` の数式を数式バーからコピーし、セルの内容を消してから貼り付けてください。数式を入れ直すと、表が更新されます。 表に `国立科学博物館` の行が増えます。グラフに加えるには、「表計算ソフトでグラフを作る」の手順1と手順2で選んだ `B1:B4` と `D1:D4` を、`B1:B5` と `D1:D5` に広げます。 続いて、Re:Earth Visualizer で配信されるデータがどう変わったのかを確かめましょう。 1. 「Re:Earth Visualizerで地図に表示する」で利用したRe:Earth Visualizer のプロジェクトを開き、ブラウザの再読み込みをしてください。 2. デフォルトのカメラ位置(北米上空)に戻ってしまった場合には、レイヤの **移動** ボタンを押して該当のレイヤまでカメラを移動させてください。 地図のピンが4件に増えていることが確認できます。 ## 振り返り [Section titled “振り返り”](#振り返り) 表計算ソフトや地図に出ている値は、`Facility` モデルのスキーマで決めたフィールドの値です。Re:Earth CMS で行ったのは、「フィールドを追加する」で構造を決め、「アイテムを登録する」で構造に沿って値を入れ、「アイテムを公開する」で配信の対象にすることまでです。 Excel と Re:Earth Visualizer は、その配信先です。どちらも同じ1つのエンドポイントから、それぞれ適切な形式(拡張子)のデータで受け取りました。 受け取ったデータから何を作るかは、配信先の画面で決めました。Excel では `name` と `visitors` を選んで縦棒グラフにし、Re:Earth Visualizer では `Location` をもとに地図に表示されたピンに `Name`・`Address`・`Visitors` のインフォボックスを足して可視化しました。 Re:Earth CMS のモデルは、こうしてデータベースとして運用できます。配信先はここで使った2つに限らず、エンドポイントの URL さえあれば、別のサービスからも自分で作るフロントエンドからも、同じデータを同じ構造で扱えます。 ## 実践したことを確かめる [Section titled “実践したことを確かめる”](#実践したことを確かめる) ここまでで実践したことをもとに、次の4つを考えてみましょう。 1. Re:Earth CMS で管理している座標を持つデータを地図のアプリで使いたいとき、パブリックAPI からどの形式でエンドポイントの URL を取得するとよいでしょうか。 2. Re:Earth Visualizer のインフォボックスのフォントサイズを変えたいとき、編集するのは Re:Earth Visualizer と Re:Earth CMS のどちらでしょうか。また、インフォボックスに出ている施設名と住所を変えたいときは、どちらを編集するでしょうか。 3. Re:Earth CMS を自分で使うとしたら、どんなことに使ってみたいでしょうか。その用途のために、モデルにはどんなフィールドが必要でしょうか。 4. 3で検討したモデルのデータを、パブリックAPI のどの形式のエンドポイントを使って、どんなフロントエンドで使えそうでしょうか。 # パブリックAPI で作る フィードバック収集・閲覧アプリ > バックエンド不要で、ブラウザから直接 Re:Earth CMS にデータを投稿・表示する 1 ページのフィードバックアプリを作る。 Re:Earth CMS のパブリックAPI を使い、バックエンド不要のシンプルな 1 ページのフィードバックアプリを作ります。ブラウザから直接 CMS にデータを投稿し、公開済みのフィードバックを一覧表示します。 ## 作成するもの [Section titled “作成するもの”](#作成するもの) ブラウザから Re:Earth CMS のパブリックAPI に直接アクセスする、バックエンド不要の 1 ページアプリです。Submit タブでフィードバックを投稿し、All Feedback タブで公開済みのフィードバックを一覧表示します。投稿されたデータは CMS に下書き状態で保存され、管理画面またはインテグレーションAPI で公開するとブラウザの一覧に反映されます。 Submit タブは、名前・製品・カテゴリ・コメントを入力してフィードバックを送信するフォームです。 ![Feedback アプリの Submit タブ。名前(任意)・製品・カテゴリ・コメントの入力欄と Submit ボタンがある](/_astro/feedback-app-dev-submit.TmH6NyP0_2hGe15.webp) All Feedback タブは、公開済みのフィードバックをカード形式で一覧表示します。 ![Feedback アプリの All Feedback タブ。公開済みのフィードバックがカード形式で一覧表示され、それぞれにカテゴリのタグ・製品名・名前・コメントが表示されている](/_astro/feedback-app-all-feedback-tab.CELGNrXd_Z21iRzA.webp) ![アーキテクチャ図。Browser 内の Submit タブと All Feedback タブが、それぞれ POST と GET で Re:Earth CMS Public API のエンドポイントにアクセスし、その先の Re:Earth CMS で投稿が下書きとして保存され、管理画面またはインテグレーションAPI で公開すると GET で取得できるようになる](/_astro/feedback-app-architecture.D7oE1nt1_Z2higfa.svg) ## 事前準備 [Section titled “事前準備”](#事前準備) * Re:Earth CMS のアカウントとプロジェクトがあること * テキストエディタとブラウザアプリケーションがあること * Node.js がインストールされていること(Vite を使う場合) ## ステップ1・CMS でモデルを作る [Section titled “ステップ1・CMS でモデルを作る”](#ステップ1cms-でモデルを作る) Re:Earth CMS の管理画面で、以下のフィールドを持つモデルを作成します。 | フィールドキー | フィールド型 | 選択肢 | 必須 | | ---------- | ------- | --------------------------------------------------- | -- | | `name` | テキスト | — | ❌ | | `product` | オプション | `visualizer` / `cms` / `flow` | ✅ | | `category` | オプション | `bug` / `improvement` / `feature_request` / `other` | ✅ | | `comment` | テキストエリア | — | ✅ | ![Re:Earth CMS の Schema 画面。feedback モデルに name・product・category・comment の4つのフィールドが追加され、右側に Add Field パネルが表示されている](/_astro/feedback-app-schema.Br8eoq_e_1ArC45.webp) モデルを作成したら、パブリックAPIを設定します。 1. プロジェクトが非公開の場合は、読み取りから、対象のモデルの **パブリックAPI を有効**にし、**変更を保存**をクリックする(公開プロジェクトでは不要です) 2. 書き込みから、許可するオリジンを `http://localhost:5500/` に設定する 3. 書き込みから、対象のモデルの **パブリックAPI を有効**にする 4. 書き込みから、**変更を保存**をクリックする 注意 読み取りと書き込みには、それぞれ独立した **変更を保存** ボタンがあります。どちらのタブも、このボタンを押すまで変更は保存されません。保存せずにページを離れると書き込みが無効のままになり、ステップ2の POST リクエストが失敗します。 設定が完了すると、Public API ページの Posting タブは以下のような状態になります。 ![Re:Earth CMS の Public API ページの Posting タブ。Allowed Origins に http://localhost:5500 が登録され、feedback モデルの Enable トグルがオンになっている](/_astro/feedback-app-public-api-posting.BZ1HRLGF_17Qnf8.webp) パブリックAPI のセットアップ方法は [読み取り](/ja/developer/cms/getting-started/public-api-quickstart-read/) と [書き込み](/ja/developer/cms/getting-started/public-api-quickstart-write/) のページを参照してください。 ## ステップ2・curl で API の動作を確認する [Section titled “ステップ2・curl で API の動作を確認する”](#ステップ2curl-で-api-の動作を確認する) コードを書く前に、curl を使って API が正しく動作するか確認しましょう。 ``・``・`` を実際の値に置き換えて実行してください。 ### GET — 公開済みアイテムの一覧を取得する [Section titled “GET — 公開済みアイテムの一覧を取得する”](#get--公開済みアイテムの一覧を取得する) パブリックAPI はブラウザや curl から認証なしで呼び出せます。コマンドラインツールから以下のコマンドを実行して、レスポンスが返ってくることを確認します。 ```bash curl 'https://api.cms.reearth.io/api/p///' ``` まだアイテムを公開していない場合は、`results` が空の JSON が返ります。 ```json { "results": [], "totalCount": 0 } ``` パブリックAPI の読み取りから、エンドポイントの URL をクリックすることで同様に取得できます。 ![Re:Earth CMS の Public API ページの Reading タブ。feedback モデルの GET エンドポイントの URL が赤枠で強調されている](/_astro/feedback-app-public-api-reading.BZp0Qa5O_Z2oiMso.webp) ### POST — フィードバックを投稿する [Section titled “POST — フィードバックを投稿する”](#post--フィードバックを投稿する) 次に、フィードバックを 1 件投稿してみます。`fields` のキーと値が CMS のモデル定義と一致している必要があります。 ```bash curl -X POST \ 'https://api.cms.reearth.io/api/p////items' \ -H 'Content-Type: application/json' \ -H 'Origin: http://localhost:5500' \ -d '{ "fields": { "name": "Test", "product": "cms", "category": "improvement", "comment": "I would like the documentation to be more comprehensive." } }' ``` パブリックAPI の書き込みから、エンドポイントの隣の Copy をクリックすると、curl リクエストをコピーできます。 ![Re:Earth CMS の Public API ページの Posting タブ。feedback モデルの POST エンドポイントの隣に Copy ボタンがあり、Copy というツールチップが表示されている](/_astro/feedback-app-public-api-posting-copy.DLN3Z_aK_CjAlk.webp) 成功すると、作成されたアイテムの JSON が返ります。 ```json { "id": "01m098...", "$createdAt": "2026-08-19T00:00:00.000Z", "fields": { "name": "Test", "product": "cms", "category": "improvement", "comment": "I would like the documentation to be more comprehensive." } } ``` 投稿は **下書き状態** のため、GET で取得しても一覧には表示されません。CMS の管理画面でアイテムを公開すると、パブリックAPI の GET で取得できるようになります。 ![Re:Earth CMS の Content 画面。feedback モデルに投稿したアイテムが1件表示され、ステータスが Draft になっている](/_astro/feedback-app-content-draft.CnITzpDk_Z1XMnXx.webp) ## ステップ3・作業ディレクトリを作る [Section titled “ステップ3・作業ディレクトリを作る”](#ステップ3作業ディレクトリを作る) 作業用のディレクトリを作成し、移動します。 ```bash mkdir feedback-app cd feedback-app ``` このディレクトリの中に `index.html`・`style.css`・`app.js` の 3 ファイルを作成していきます。 ## ステップ4・アプリを作る [Section titled “ステップ4・アプリを作る”](#ステップ4アプリを作る) API の動作が確認できたら、フロントエンドアプリを作ります。`index.html`・`style.css`・`app.js` の 3 ファイルで構成します。 注意 ここで扱うコードは学習用のサンプルです。本番環境で利用する場合は、入力値のバリデーションを追加し、認証・アクセス制御などのセキュリティ対策も検討してください。 ### index.html [Section titled “index.html”](#indexhtml) HTML の構造を定義します。タブの切り替えや投稿フォーム、一覧表示エリアを配置しています。 ```html Re:Earth Feedback

Feedback

Loading...
``` ### style.css [Section titled “style.css”](#stylecss) スタイルを定義します。 ```css *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: "Inter", system-ui, sans-serif; background: #f8f9fb; min-height: 100vh; display: flex; align-items: flex-start; justify-content: center; padding: 40px 16px; } .card { background: #fff; border-radius: 16px; padding: 40px; width: 100%; max-width: 520px; box-shadow: 0 4px 24px rgba(0, 0, 0, 0.07); } .logo { font-size: 0.75rem; font-weight: 700; letter-spacing: 0.1em; color: #6b7280; margin-bottom: 20px; } h1 { font-size: 1.5rem; font-weight: 700; color: #111827; margin-bottom: 24px; } .tabs { display: flex; gap: 4px; background: #f3f4f6; border-radius: 10px; padding: 4px; margin-bottom: 32px; } .tab { flex: 1; padding: 8px; border: none; border-radius: 7px; font-size: 0.875rem; font-weight: 600; cursor: pointer; background: transparent; color: #6b7280; transition: all 0.15s; } .tab.active { background: #fff; color: #111827; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1); } .field { margin-bottom: 20px; } label { display: block; font-size: 0.8rem; font-weight: 600; color: #374151; margin-bottom: 6px; } input, select, textarea { width: 100%; padding: 10px 14px; border: 1.5px solid #e5e7eb; border-radius: 8px; font-size: 0.9rem; color: #111827; background: #fff; transition: border-color 0.15s; outline: none; appearance: none; } input:focus, select:focus, textarea:focus { border-color: #2563eb; } textarea { resize: vertical; min-height: 100px; } .btn { width: 100%; margin-top: 8px; padding: 12px; background: #2563eb; color: #fff; border: none; border-radius: 8px; font-size: 0.95rem; font-weight: 600; cursor: pointer; transition: background 0.15s; } .btn:hover { background: #1d4ed8; } .btn:disabled { background: #93c5fd; cursor: not-allowed; } #message { margin-top: 16px; font-size: 0.85rem; text-align: center; color: #6b7280; } #message.success { color: #16a34a; } #message.error { color: #dc2626; } .feedback-item { border: 1px solid #e5e7eb; border-radius: 10px; padding: 16px; margin-bottom: 12px; } .feedback-meta { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; flex-wrap: wrap; } .tag { font-size: 0.75rem; font-weight: 700; padding: 2px 10px; border-radius: 99px; } .tag-bug { background: #fee2e2; color: #dc2626; } .tag-improvement { background: #e0f2fe; color: #0284c7; } .tag-feature_request { background: #fef9c3; color: #ca8a04; } .tag-other { background: #f3f4f6; color: #6b7280; } .feedback-product { font-size: 0.8rem; color: #6b7280; } .feedback-name { font-size: 0.8rem; color: #9ca3af; margin-left: auto; } .feedback-comment { font-size: 0.9rem; color: #374151; line-height: 1.6; } .empty, .loading { text-align: center; color: #9ca3af; font-size: 0.9rem; padding: 40px 0; } .section { display: none; } .section.active { display: block; } ``` ### app.js [Section titled “app.js”](#appjs) アプリのロジックを担います。タブの切り替え・一覧の取得・フォームの送信の 3 つの処理を実装します。 ``・``・`` を実際の値に置き換えてください。 ```js const WORKSPACE = ""; const PROJECT = ""; const MODEL = ""; const BASE = `https://api.cms.reearth.io/api/p/${WORKSPACE}/${PROJECT}/${MODEL}`; const PRODUCT_LABEL = { visualizer: "Re:Earth Visualizer", cms: "Re:Earth CMS", flow: "Re:Earth Flow", }; const CATEGORY_LABEL = { bug: "🐛 Bug Report", improvement: "✨ Improvement", feature_request: "💡 Feature Request", other: "💬 Other", }; // タブ切り替え document.querySelectorAll(".tab").forEach((tab) => { tab.addEventListener("click", () => { document .querySelectorAll(".tab") .forEach((t) => t.classList.remove("active")); document .querySelectorAll(".section") .forEach((s) => s.classList.remove("active")); tab.classList.add("active"); document .getElementById(`${tab.dataset.tab}-section`) .classList.add("active"); if (tab.dataset.tab === "list") { loadList(); } }); }); // 一覧取得 async function loadList() { const content = document.getElementById("list-content"); try { const resp = await fetch(BASE); if (!resp.ok) { throw new Error(`Request failed (${resp.status})`); } const data = await resp.json(); if (!data.results || data.results.length === 0) { content.className = "empty"; content.textContent = "No feedback yet."; return; } content.className = ""; content.innerHTML = ""; for (const item of data.results) { const el = document.createElement("div"); el.className = "feedback-item"; const meta = document.createElement("div"); meta.className = "feedback-meta"; const tag = document.createElement("span"); tag.className = `tag tag-${item.category}`; tag.textContent = CATEGORY_LABEL[item.category] ?? item.category; const product = document.createElement("span"); product.className = "feedback-product"; product.textContent = PRODUCT_LABEL[item.product] ?? item.product; const name = document.createElement("span"); name.className = "feedback-name"; name.textContent = item.name ?? "Anonymous"; meta.append(tag, product, name); const comment = document.createElement("p"); comment.className = "feedback-comment"; comment.textContent = item.comment; el.append(meta, comment); content.appendChild(el); } } catch (err) { content.className = "empty"; content.textContent = "Failed to load feedback."; console.error(err); } } // 投稿 const message = document.getElementById("message"); const btn = document.getElementById("submit-btn"); document .getElementById("feedback-form") .addEventListener("submit", async (e) => { e.preventDefault(); btn.disabled = true; message.className = ""; message.textContent = "Submitting..."; const formData = new FormData(e.target); const body = { fields: { name: formData.get("name") || undefined, product: formData.get("product"), category: formData.get("category"), comment: formData.get("comment"), }, }; try { const resp = await fetch(`${BASE}/items`, { method: "POST", headers: { "Content-Type": "application/json", Accept: "application/json", }, body: JSON.stringify(body), }); btn.disabled = false; if (!resp.ok) { const data = await resp.json().catch(() => ({})); message.className = "error"; message.textContent = `Error: ${data.message ?? `Request failed (${resp.status})`}`; return; } message.className = "success"; message.textContent = "Submitted! It will appear in the list once published in CMS."; e.target.reset(); } catch (err) { btn.disabled = false; message.className = "error"; message.textContent = "Failed to submit. "; console.error(err); } }); ``` 一覧取得(GET)の処理について `loadList()` 関数でパブリックAPI にアクセスし、公開済みのフィードバックを取得します。`await fetch(BASE)` で GET リクエストを送り、`resp.ok` を確認して HTTP エラーを空の一覧と取り違えないようにしたうえで、レスポンスの `results` 配列をループして DOM にカードを追加しています。一覧タブを開くたびに実行するため、一覧には常に現在の公開状態が表示されます。 投稿(POST)の処理について フォームの送信イベントを受け取り、`fetch()` の `method: "POST"` で投稿します。フォームの値を `fields` オブジェクトにまとめてリクエストボディに渡します。`name` フィールドは任意項目のため、空の場合は `undefined` にして送信から除外しています。送信中はボタンを `disabled` にして二重送信を防いでいます。 ## ステップ5・開発サーバーを起動する [Section titled “ステップ5・開発サーバーを起動する”](#ステップ5開発サーバーを起動する) 3 ファイルが揃ったら、ローカルサーバーを起動してブラウザで確認します。 ```bash npx vite --port 5500 ``` 起動後、`http://localhost:5500` をブラウザで開きます。 Submit タブは以下のように表示されます。 ![Feedback アプリの Submit タブ。名前(任意)・製品・カテゴリ・コメントの入力欄と Submit ボタンがある](/_astro/feedback-app-dev-submit.TmH6NyP0_2hGe15.webp) All Feedback タブは、まだフィードバックを投稿していないため次のように表示されます。 ![Feedback アプリの All Feedback タブ。まだ投稿がないため「No feedback yet.」と表示されている](/_astro/feedback-app-dev-empty-list.D6ttiU3D_Z1mUJ1V.webp) 補足 `index.html` をブラウザで直接開く(`file://`)と、セキュリティ制限により `fetch` が動作しない場合があります。必ずローカルサーバー経由でアクセスしてください。VS Code を使っている場合は、Live Server 拡張機能でも同様に確認できます。 ## ステップ6・動作確認 [Section titled “ステップ6・動作確認”](#ステップ6動作確認) サーバーが起動したら、実際に動作を確認してみましょう。 1. ブラウザでアプリを開き、**Submit タブ**からフィードバックを入力して送信する ![Feedback アプリの Submit タブ。名前・製品・カテゴリ・コメントが入力された状態](/_astro/feedback-app-verify-submit.BgX0pDqy_h8t2O.webp) 2. Re:Earth CMS の管理画面を開き、作成したモデルのアイテム一覧を確認する — 投稿したフィードバックが **下書き状態**で登録されていることを確認する ![Re:Earth CMS の Content 画面。feedback モデルに2件のアイテムがあり、いずれもステータスが Draft になっている](/_astro/feedback-app-verify-draft-list.Dm7hDynw_MP4K0.webp) 3. アイテムを選択し、**Publish** をクリックして公開する ![Re:Earth CMS の Content 画面。2件のアイテムが選択され、ステータスが Published に変わっている。上部に Publish・Add to Request・Unpublish・Delete のツールバーが表示されている](/_astro/feedback-app-verify-publish.UAAWSQQf_1QSPbW.webp) 4. アプリに戻り、**All Feedback タブ**を開く — 公開したフィードバックが一覧に表示されることを確認する ![Feedback アプリの All Feedback タブ。公開された2件のフィードバックがカード形式で一覧表示されている](/_astro/feedback-app-all-feedback-tab.CELGNrXd_Z21iRzA.webp) 下書き状態について パブリックAPI で投稿されたアイテムは **下書き状態**で保存されます。パブリックAPI の読み取りでは公開済みのアイテムのみ取得できるため、下書き状態のアイテムは一覧に表示されません。 下書き状態のアイテムを公開するには、以下のいずれかの方法を使います。 * CMS の管理画面からアイテムを公開する * インテグレーションAPI の `/publish` エンドポイントを使って公開する ## トラブルシューティング [Section titled “トラブルシューティング”](#トラブルシューティング) **送信したフィードバックが一覧に表示されない** 投稿されたフィードバックはデフォルトで **下書き状態**で保存されます。CMS の管理画面でアイテムを公開すると一覧に反映されます。 **送信時に `400 Bad Request` が返る** `product` と `category` フィールドの値が、CMS のモデルで定義した選択肢と完全に一致しているか確認してください(例: `Visualizer` ではなく `visualizer`)。 **`429 Too Many Requests` が返る** パブリックAPI にはレートリミットがあります。短時間に大量のリクエストを送信すると発生します。しばらく待ってから再試行してください。 **一覧に「Failed to load feedback」と表示される** プロジェクトのパブリックAPI が有効になっているか、URL のモデルキーが正しいかを確認してください。 ## 完了チェックリスト [Section titled “完了チェックリスト”](#完了チェックリスト) * [ ] Submit タブからフィードバックを送信できる * [ ] CMS の Content 画面で、送信したフィードバックが下書き状態のアイテムとして確認できる * [ ] CMS の管理画面からアイテムを公開できる * [ ] All Feedback タブに、公開したフィードバックが一覧表示される # 経路検索プラグインを作成する > レイヤAPI・カメラAPI・外部の経路検索サービスを使って、2 地点間の経路を検索し地球儀上に描画するウィジェットを作成します。 [プラグインプレイグラウンド](https://visualizer.reearth.io/plugin-playground?plugin-id=my-plugin)を使って、2 地点間の経路を検索して地球儀上に描画するプラグインを作成します。ブラウザ上で完結するため、ローカル環境を用意する必要はありません。 ## 作るもの [Section titled “作るもの”](#作るもの) 経路検索ウィジェットは、2 地点間の経路を地球儀上に描画します。開始地点と終了地点は、座標を直接入力するか地図をクリックして指定します。徒歩・自転車・車のいずれかの移動手段を選ぶと、ウィジェットは外部の経路検索サービスを呼び出して経路を取得します。取得した経路は、クリックすると距離と所要時間を表示するクリック可能な線として描画されます。両端点にはマーカーが表示され、ボタンひとつですべてをクリアできます。 ![完成した経路検索ウィジェットと、東京の 2 地点間に青で描画された徒歩の経路。両端にマーカーが表示されている](/_astro/osm.ypE6KB6B_ZxQhbO.webp) このウィジェットは、プラグインAPI の次の 4 つの部分を使用します。 * **UI と Visualizer 間の通信** — [`reearth.ui`](/ja/developer/plugin/api-reference/ui/) と [`reearth.extension`](/ja/developer/plugin/api-reference/extension/) を通じて、ウィジェットの iframe とプラグインロジックの間で双方向にデータをやり取りします * **外部 API との連携** — `fetch` で経路検索サービスを呼び出し、レスポンスを GeoJSON に変換します * **[レイヤAPI](/ja/developer/plugin/api-reference/layers/)** — 実行時にレイヤを追加・更新・検索・削除します * **[カメラAPI](/ja/developer/plugin/api-reference/camera/)** — シーンの初期表示位置を設定します ## 前提条件 [Section titled “前提条件”](#前提条件) * Re:Earth Visualizer のプロジェクト * ブラウザのタブで開いた[プラグインプレイグラウンド](https://visualizer.reearth.io/plugin-playground?plugin-id=my-plugin) * HTML・CSS・JavaScript の基礎知識。このガイドは、一般的な Web 開発ではなく Re:Earth プラグイン API について説明します。 はじめてプラグインを作成する場合は、先に「[プラグインプレイグラウンドで動かす](/ja/developer/plugin/get-started/run-in-plugin-playground/)」「[UI を表示する](/ja/developer/plugin/guides/display-ui/)」「[プラグインと Re:Earth の間で通信する](/ja/developer/plugin/guides/communicate-between-a-plugin-and-reearth/)」に取り組んでください。これらのガイドでは、プレイグラウンドの画面構成、`reearth.yml` マニフェスト、エクスポートとインストールの手順、そしてこのガイドでも使うメッセージのやり取りの方法を扱います。 ## ステップ 1 — プラグインのファイルを開く [Section titled “ステップ 1 — プラグインのファイルを開く”](#ステップ-1--プラグインのファイルを開く) プレイグラウンドのファイルツリーの **Custom** セクションで、**My Plugin** を選択します。すでに `reearth.yml` マニフェストと `demo-widget` ファイルが含まれており、この 2 つのファイルを編集します。 ## ステップ 2 — マニフェストを編集する [Section titled “ステップ 2 — マニフェストを編集する”](#ステップ-2--マニフェストを編集する) `reearth.yml` を開き、内容を 1 つのウィジェット拡張に置き換えます。 ![プレイグラウンドのコードパネルに reearth.yml マニフェストが開かれ、ファイルツリーで My Plugin が選択されている](/_astro/manifest.BOmEM8HR_Z1ej6UO.webp) ```yaml id: route-search-plugin name: Route Search version: 1.0.0 extensions: - id: demo-widget type: widget name: Route Search description: Search and draw a route between two points widgetLayout: defaultLocation: zone: outer section: left area: top ``` 拡張の `id` は `demo-widget` のまま、既存の `demo-widget` ファイルと一致させます。拡張の id とファイル名は一致していなければなりません。プラグインの `id` には英小文字・数字・`_`・`-` を使用でき、スペースは使用できず、`reearth` は指定できません。同じ id のプラグインがすでにプロジェクトにあると、後のインストールが失敗するため、他と重複しない id を選んでください。 ## ステップ 3 — ウィジェットの UI を作成する [Section titled “ステップ 3 — ウィジェットの UI を作成する”](#ステップ-3--ウィジェットの-ui-を作成する) `demo-widget` を選択し、内容を次のコードに置き換えます。`reearth.ui.show` は HTML 文字列を受け取り、iframe 内にウィジェットとして描画します。 ![プレイグラウンドのファイルツリーで demo-widget ファイルが選択され、コードパネルに初期状態のコードが表示されている](/_astro/widget-ui.CFfAf9vI_Z1Hw3mX.webp) ```javascript reearth.ui.show(`

経路検索

`); ``` 入力欄のプレースホルダーに表示されている `lng,lat` は経度・緯度を指します。以降も、コードに合わせて経度・緯度を `lng,lat` と表記します。 ウィジェットの動作は、この後の手順で ` ``` iframe 内では、メッセージは `window.addEventListener("message", ...)` を通じて届きます。ピックモードが有効な間、座標は開始地点または終了地点の入力欄に書き込まれます。座標の順序は `lng,lat` で、これは経路検索サービスが想定する順序です。 📍 アイコンをクリックしてから地図をクリックすると、クリックした地点の座標が入力欄に表示されます。 ![地図をクリックした後、開始地点と終了地点の入力欄に座標が入力された経路検索ウィジェットと、ハイライトされたメッセージリスナーのコード](/_astro/step-5-select-points.Bwo8ZAl-_ZXAkP8.webp) ## ステップ 6 — 選択した地点にマーカーを表示する [Section titled “ステップ 6 — 選択した地点にマーカーを表示する”](#ステップ-6--選択した地点にマーカーを表示する) 選択した各地点のマーカーは、レイヤAPI で表示します。 ### ウィジェットからマーカーをリクエストする [Section titled “ウィジェットからマーカーをリクエストする”](#ウィジェットからマーカーをリクエストする) ` `); // ---------- プラグインロジック(Visualizer コンテキストで実行される) ---------- reearth.viewer.overrideProperty({ tiles: [ { id: "osm", type: "open_street_map", }, ], }); reearth.viewer.on("click", (event) => { const { lat, lng } = event; if (lat === undefined || lng === undefined) return; // 空や何もない場所をクリックした場合 reearth.ui.postMessage({ type: "position", lat, lng }); }); let startMarkerId = null; let endMarkerId = null; let routeLayerId = null; reearth.extension.on("message", (msg) => { if (msg.action === "addMarkerLayer") { const value = { type: "FeatureCollection", features: [ { type: "Feature", properties: {}, geometry: { type: "Point", coordinates: [msg.lng, msg.lat] } }, ], }; const markerId = msg.pointName === "start" ? startMarkerId : endMarkerId; if (markerId) { reearth.layers.override(markerId, { data: { type: "geojson", value } }); } else { const newId = reearth.layers.add({ type: "simple", title: msg.pointName, data: { type: "geojson", value }, marker: { pointColor: "blue", pointSize: 12, style: "point" }, }); if (msg.pointName === "start") startMarkerId = newId; else endMarkerId = newId; } } else if (msg.action === "addRouteLayer") { // 検索するたびに経路が積み重ならないよう、直前の経路を削除する if (routeLayerId) reearth.layers.delete(routeLayerId); routeLayerId = reearth.layers.add({ type: "simple", title: "route", data: { type: "geojson", value: msg.geojson }, infobox: { blocks: [{ pluginId: "reearth", extensionId: "propertyInfoboxBetaBlock" }], }, polyline: { strokeColor: "blue", strokeWidth: 2 }, }); } else if (msg.action === "deleteRouteAndMarkerLayer") { if (routeLayerId) { reearth.layers.delete(routeLayerId); routeLayerId = null; } if (startMarkerId) { reearth.layers.delete(startMarkerId); startMarkerId = null; } if (endMarkerId) { reearth.layers.delete(endMarkerId); endMarkerId = null; } } }); reearth.camera.setView({ lat: 35.68426, lng: 139.71043, height: 2000, heading: 0, pitch: -0.785, roll: 0, }); ``` # シンプルな UI プラグインを作成してインストールする > プラグインプレイグラウンドで Welcome ウィジェットを作成し、ZIP としてエクスポートし、Re:Earth Visualizer にインストールして、シーンに追加します。 プラグインプレイグラウンドにあらかじめ用意されたファイルを使って、Welcome ウィジェットを作成し、ビューアで実行し、ボタンでカメラを東京に移動させます。その後、同じウィジェットを ZIP ファイルとしてエクスポートし、Re:Earth Visualizer にインストールして、シーンに追加します。ローカルのセットアップは不要です。 ## 作るもの [Section titled “作るもの”](#作るもの) 完成した Welcome ウィジェットには短いメッセージと「Fly to Tokyo」ボタンが含まれます。ボタンをクリックすると、プラグインにメッセージが送信され、カメラが東京に移動してウィジェットのステータスメッセージが更新されます。完成したプラグインは ZIP ファイルとしてエクスポートされ、Visualizer プロジェクトにインストールされます。 ![Visualizer に表示された「Fly to Tokyo」ボタン付きの完成した Welcome ウィジェット](/_astro/overview.AwCWljmE_Tfyl9.webp) ## 前提条件 [Section titled “前提条件”](#前提条件) * Re:Earth Visualizer のアカウントと、少なくとも 1 つの Visualizer プロジェクト * モダンなデスクトップブラウザ * HTML と JavaScript の基本的な知識 * ローカルの開発ツールは不要です ## ステップ 1 — プラグインプレイグラウンドを開く [Section titled “ステップ 1 — プラグインプレイグラウンドを開く”](#ステップ-1--プラグインプレイグラウンドを開く) [プラグインプレイグラウンド](https://visualizer.reearth.io/plugin-playground?plugin-id=my-plugin)は、Re:Earth Visualizer に組み込まれたブラウザベースのエディタです。ローカルに何もインストールせずに、プラグインを書いて、プレビューし、エクスポートできます。 1. Re:Earth Visualizer を開いてサインインします。 2. 左サイドバーの **エディター** → **プラグイン** に移動します。 3. **プラグインプレイグラウンド** をクリックしてエディターを開きます。 4. ファイルツリーの **Custom** セクションで **My Plugin** を選択します。すでに `reearth.yml` マニフェストとサンプルエクステンションファイルが含まれています。既存のマニフェストとウィジェットファイルを編集します。 ![ファイルツリーの Custom セクションで My Plugin が選択されたプラグインプレイグラウンド](/_astro/step-1-playground.DRd4urGA_Z2i0MfV.webp) ## ステップ 2 — プラグインマニフェストを編集する [Section titled “ステップ 2 — プラグインマニフェストを編集する”](#ステップ-2--プラグインマニフェストを編集する) `reearth.yml` をクリックし、内容を以下に置き換えます: ```yaml id: welcome-widget-plugin name: Welcome Widget version: 1.0.0 extensions: - id: demo-widget type: widget name: Welcome description: A simple welcome widget widgetLayout: defaultLocation: zone: outer section: left area: top ``` Re:Earth プラグインには 1 つ以上のエクステンションを含めることができます。このチュートリアルでは、**ウィジェットエクステンション** — Visualizer のメインビューに表示されるユーザーインターフェースコンポーネント — を作成します。その位置はウィジェットアラインシステムで調整できます。マニフェストがエクステンションを宣言し、対応する JavaScript ファイルがその UI と動作を提供します。ここでは、エクステンション ID `demo-widget` が `demo-widget.js` に対応します。この名前は正確に一致させてください。 [プラグインの構造](/ja/developer/plugin/overview/plugin-structure/)と[エクステンションタイプの違い](/ja/developer/plugin/overview/extension-types/)について詳しく学ぶ。 ![Welcome ウィジェットエクステンションを宣言するよう reearth.yml を編集後のプラグインプレイグラウンド](/_astro/step-2-manifest.DO2_qeFE_Z1ISHAN.webp) マニフェストに **Welcome** という名前のウィジェットが宣言されました。エクステンション ID `demo-widget` は既存のファイル `demo-widget.js` と一致しています。ウィジェットが正しく動作するよう、これらの名前は正確に一致させてください。 ## ステップ 3 — ウィジェットのコードを編集する [Section titled “ステップ 3 — ウィジェットのコードを編集する”](#ステップ-3--ウィジェットのコードを編集する) `demo-widget.js` を選択してコードパネルで開きます。JavaScript エディターでコードを編集してください。ライブプレイグラウンドでは、このファイルの **HTML エディター** コントロールが無効になっています。 その内容を以下に置き換えます: ```javascript const html = `

👋 Welcome

Click the button to fly to Tokyo.