【ESRI Community Blog】
ArcGIS ではレイヤーやテーブルの属性に時間フィールドを追加することで、時間情報を使用することができます。ArcGIS Enterprise や ArcGIS Online でホストされたデータに時間フィールドが含まれている場合、Web マップやアプリで使用する際に特に気にせず使用されていると思います。
一方で、エンタープライズジオデータベースに作成されたフィーチャクラスに時間フィールドが存在する場合はどのような挙動になるのか、ここでは ArcGIS Pro 2.9 と ArcGIS Enterprise 10.9.1 および PostgreSQL に作成されたエンタープライズジオデータベースを使用した場合についてご説明します。
ArcGIS Pro とジオデータベース
ArcGIS Pro 2.9 で PostgreSQL 上のエンタープライズジオデータベースに作成したフィーチャクラスの時間フィールドのデータ型は、データベースではタイムゾーン情報を持たない timestamp without time zone で作成されます。
以下はArcGIS Pro を使用して作成したフィーチャクラスを psql で PostgreSQL に接続してテーブル定義を表示した状態です。
「jikan」列が ArcGIS の Date データタイプで作成したフィールドで、データ型が「timestamp without time zone」で作成されていることが分かります。
ArcGIS Pro からこのフィーチャクラスを編集してデータを追加した場合、クライアントである ArcGIS Pro がインストールされたマシンのWindows の時間設定は日本の場合は日本の時間として PostgreSQL に送信されます。、PostgreSQL が動作するデータベースサーバーとデータベースのロケール時間(lc_time)は Japanese と日本に設定され、timestamp without time zone を使用している場合は、受け取った時間をそのまま日本時間で格納します。このように OS やサーバーがすべて日本時間の設定の(ロケールが一致している)場合は、入力した時間がそのまま格納されます(「jikantext」フィールドには「jikan」フィールドに入力した日時をテキストとして格納しています)。
ArcGIS Server とジオデータベース
このフィーチャクラスをマップサービスとして公開します。ArcGIS Server Manager でサービスのパラメーターを確認すると、日付フィールド設定の [タイム ゾーン]はデフォルトの [None] に設定されています。
デフォルトの設定でこのマップサービスを Map Viewerで開くと、下記のように 9 時間進んだ時間で表示されます。
ArcGIS Server は時間フィールドの値は UTC で格納されている前提でデータを扱います。Map Viewerは、マップサービスのパラメーターからタイムゾーンが無い(None)サービスであると判断し、ブラウザのロケール設定に従って UI を設定された言語で表示するため、UTC として取得した時間を JST に変換して表示する(実際には JST = UTC → JST という変換を行う)ため、9 時間進んだ時間で表示されています。
エンタープライズジオデータベースのフィーチャクラスを使用したマップサービスでは、タイムゾーンを、データベースの設定に合わせて変更します。
ArcGIS Server Manager でサービスのパラメーター画面を開き、日本の場合は JST である UTCに 9 時間を加える [(UTC+09:00) Osaka, Sapporo, Tokyo] を設定します。
設定が完了したら、[保存して再起動] をクリックしてサービスを再起動します。
タイムゾーンの設定をデータベースの時間と一致させた結果、Map Viewer の表示も日本の時間で表示されるようになります。
本記事では、PostgreSQL の場合についてご紹介しましたが、この設定自体は Oracle や SQL Server 上に作成したエンタープライズジオデータベースのフィーチャクラスを使用したマップサービスでも同様の振る舞いとなります。
(ArcGIS Pro や ArcGIS API for JavaScript を使用して作成されたアプリケーション以外のArcGIS クライアントではロケール設定が必要となる場合があります)
まとめ
ArcGIS で作成した時間フィールドを持つ、エンタープライズジオデータベースのフィーチャクラスまたはテーブルはタイムゾーンの情報を持たない時間型を使用して作成されます。
このデータを ArcGIS Server のサービスとして公開する場合には、
- サービスのパラメーターの[日付フィールド設定]でDBMS の設定と同じタイムゾーンを設定する
ことで、Web サービスとクライアント/サーバー双方で適切な時間表示で利用できるようになります。
補足:データ型にタイムゾーンが設定されていた場合
ArcGIS では RDBMS 上のタイムゾーンを持つ時間フィールドを作成することはできませんが、SQL でデータベースに作成したタイムゾーンが有効な時間型のフィールドを持つテーブルを [ジオデータベースに登録] ツールで登録することで、フィーチャクラスまたはテーブルとして使用できます。
ここでは前述の環境で、タイムゾーンを持つ時間フィールドを ArcGIS で使用した場合の挙動をご紹介します。
使用したテーブルを作成したSQL
create table jikantesttz (
jikandate timestamp with time zone, jikantext character varying(255), shape st_point); |
このフィーチャクラスを編集した場合、日時を入力した後、入力したものとは異なる値が表示されます。これは ArcGIS Pro では編集確定後、改めて DBMS からデータを取得し属性編集画面にデータを表示することと、PostgreSQL に格納された値は UTC とタイムゾーンの情報を持つのに対して、ArcGIS ではタイムゾーンの情報を無いものとして扱うため、UTC 時間(入力した値 -9 時間)で表示されます。
以下は psql で直接 PostgreSQL の値を確認した内容ですが、入力した値はデータベースには正しく格納されていることが分かります。
サービス パラメーターのタイム ゾーンはデフォルト設定の None を使用し(UTC として扱う)、公開されたサービスを Map Viewer から参照した場合は、ブラウザのロケールに合わせて適切な時間(日本語ロケールの場合は日本時間)で表示されます。
PostgreSQL のタイムゾーンが有効な日付型を使用することは可能ですが、上記のように ArcGIS Pro では記載する振る舞いとはなりません。また、Oracle や SQL Server でタイムゾーンが有効な日付型は、ArcGIS では使用することができません(ジオデータベースの登録に失敗します)。