<\/HEAD>
世界中の機関はさまざまな技術を使ってウェブ上にデータを公開しており、ArcGIS内でアクセス可能にするための標準は存在しますが、ArcGIS内で最もパフォーマンスが良いのは自社のサービスです。 時には、記録システムからArcGIS OnlineやPortalへ定期的にデータを同期することが理にかなっています。 このブログはその効率的な方法についてです。<\/P>
<\/P>
さらに読むべきかどうか確認するために、ブログ添付ファイルのNZ_Street_Address.lyrx<\/STRONG>をダウンロードし、Proで新しいマップに追加してください。その後、LocateペインとArcGIS World Geocoding Serviceを使ってニュージーランドのウェリントン(またはお好みの他のニュージーランドの地域)にズームインします。 1:5000以上のスケールにズームインし、パン操作を行い、ラベルクラスStandard Number、Suffix Number、Range Numberをオンにして住所ポイントの家番号を確認してください。 フィーチャを識別し、選択してください。 これはArcGIS Online標準フィーチャデータストア内のフィーチャレイヤーにアクセスしています。 以下はアイテム<\/A>とサービス<\/A>へのリンクです。 適切なインターネット接続があれば良好なマップ探索体験が得られます。 ご覧のレイヤーには200万以上のフィーチャがあります。 データをダウンロードできます。 ジオプロセシングで使用できます。 データは毎週メンテナンスされており、同期プロセスは毎週数千件の更新を平均して2分未満で完了します。 この方法はコーディング不要です。 あなたがアクセス可能なデータでこれを行いたい場合は読み進めてください(画像はクリックで拡大可能です)。<\/P><\/P>
<\/P>
<\/P>
まず、この処理の候補となるデータソースは何でしょうか? ArcGIS Data Interoperability<\/STRONG>エクステンションでアクセス可能なものすべてです。これは
多くのフォーマットとフィード<\/A>を多様なストレージリポジトリでサポートしています。 私の具体例ではWFS<\/STRONG>サービス経由で利用可能なデータを使用していますが、これは議論上重要ではなく、この方法は汎用的です。<\/P><\/P>もう少し詳しく見てみましょう。 ArcGIS Onlineをアクティブポータルとして設定し、「LDS」と「ETL」の検索タグで「All Portal」からデータを追加します。<\/P><\/P>
<\/P><\/P>同じポイントフィーチャ(デフォルトシンボロジー付き)が表示されますが、目次には「Timestamps」というスタンドアロンテーブルがあり、1行だけあります:<\/P><\/P><\/P>
<\/P><\/P>UpdatedUTCの値は各同期時に更新されるためグラフィックとは異なりますが、同期の鍵となる値です。 これはフィーチャサービス内のレイヤーとして存在します。 同期時刻(UTC)はフィーチャ更新を書き込むプロセスの最終ステップです。<\/P><\/P>ではすべての手順とは何でしょうか? 続けるにはArcGIS Pro 2.3+ with Data Interoperabilityエクステンションがインストール・有効化されている必要があります。またブログダウンロードSynchronize.zip内のツールボックスとETLツールソース.fmwファイルもダウンロードしてください。ツールボックスをプロジェクトに追加すると以下のETLツールが表示されます:<\/P><\/P>
<\/P>
各ETLツールを右クリックし、その.fmwファイルへのソースパスを修正してください。
私のターゲットデータはバルクダウンロードとして利用可能で、それをファイルジオデータベースとして取得しました。住所ポイントフィーチャクラスをプロジェクトホームジオデータベースにコピーしました。いずれにせよ必要ならETLプロセスを使ってターゲットデータをプロジェクトホームジオデータベースに入れてください。
次にMakeTimestampTableを使ってTimestampテーブルを作成しました。このようになります:
以下注記ですが、「Timestamps」というテーブル名はあまり良くないアイデアですが、とりあえずこのまま進めます

宛先ファイルジオデータベースパスを対象フィーチャと同じものに修正してください。編集モードでMakeTimestampTableを実行すると便利な日付ピッカーで初期タイムスタンプ値を選択できます。私はUTC時間を使いましたが厳密である必要はありませんでした。もし厳密にしたい場合でグリニッジUK在住なら時計を見て現在の夏時間調整は無視してください。それ以外の場合はテーブル作成後にPythonで任意値から調整してください:

次にUpdatedUTCをDownloadedUTCと等しく計算すると完成です:

このブログ執筆時点で「Timestamps」というテーブル名は多くのデータベース技術(ファイルジオデータベース含む)の予約語に近いため非常に悪いアイデアだとわかりましたが、ここでは目的に影響しないのでそのままにします。ただし本番環境では別名をご使用ください!
次にフィーチャサービスを立ち上げます。ターゲットデータとタイムスタンプテーブルをマップに追加し、目次で両方選択します:

右クリックしてWeb レイヤーとして共有を選択します:


サービス設定画面で希望するフォルダー内のフィーチャレイヤーとして構成し、ロードさせます。
Synchronize.tbxにはLoadDataというETLツールも含まれており、それもフィーチャサービス作成可能です。

次にETLツールSynchronizeによる同期処理について説明します:

設計はターゲットデータによりますが、大まかな流れは:
- 処理開始時点の現在UTC時刻取得
- Timestampsレイヤー(テーブル)をEsriウェブレイヤーから読み込み
- ターゲットデータを記録システムから読み込み
- ターゲットソースとEsriウェブレイヤー間で挿入・更新・削除差分抽出
- 一意識別子比較による挿入・更新・削除検証
- 削除コミット
- 更新書き込み
- 挿入書き込み
- Timestampsレイヤー(テーブル)更新(処理開始時取得UTC時刻)
私のターゲットデータではキュレーター提供の変更セットAPIがあり、WFS呼び出しへfrom/to時間指定でき正確な挿入・更新・削除セット取得可能でした。もしあなたのデータにも作成・編集・廃止日時があれば自分でも可能です。何も情報がない場合は両方ソースから全データ読み込みしUpdateDetectorトランスフォーマーによる力技変更検出もできますが時間がかかることがあります。
Synchronize ETLツールには目立たない機能もあります。フィーチャ書き込み順序はNavigatorペイン上から下へのライター順序によって決まり、タイムスタンプ更新書き込みは最後になるよう強制されています。そのため何か失敗した場合誤った更新になりません。またArcGIS OnlineやPortalフィーチャライターではDeleteおよびUpdateモード時ObjectID値が必要です。 Esriサービス内でフィーチャーと共に送信されるため、値はFeatureReaderでストリームの途中で取得され、レイヤーの一意識別子で結合されます。 同様に、Insertsストリームは書き込み前に既存の一意識別子を探し、存在しないことがわかっているフィーチャーのみが通過します。<\/P>
<\/P>
冒頭の段落で、このアプローチはコーディングを使用しないと言いました。 ただし、バッチ番号を20チャンクのモジュロで計算してターゲットサービスのObjectIDを取得するために数学関数(floor)が使われています。 これが必要なコーディングに最も近いもので、もちろんPythonを使っても自由です。<\/P>
<\/P>
コーディングについて言及しましたが、本番環境では同期処理をスケジュールタスクとして実行したいでしょう。 これはPythonスクリプトとして始まります。 ここではETLのウェブ接続などがプロセス所有者に利用可能であることを前提としたスタブを示します。これは接続ファイルをよく知られたディレクトリで共有することで簡単に実現できます。 <\/P>
<\/P>
<\/P>
<\/P>
別途ブログで紹介するもう一つのアプローチは、FMEエンジン実行ファイルを直接スケジュールタスクで呼び出す方法です。<\/P>
<\/P>
提供されているETLツールをぜひ探求し、このフォーラムに質問を送ってください。<\/P>
<\/P>
これが皆さん自身の同期処理構築への自信につながれば幸いです。お楽しみください!<\/P><\/BODY><\/HTML>