ここで新しい用語を作ります - Total Integration(トータルインテグレーション) - これは あらゆるデータとあらゆるArcGISサービスの継続的かつ自動化された統合 を意味し、データの移動と、そのデータが支えるウェブサービスの更新を組み合わせた概念です。 手動のETLは不要で、ETL後に切り離されたプロセスもなく、ダウンタイムもなく、ただ単に継続的な Enterprise Service Bus のメンテナンスを、一つのプロセスで行うべき方法で実現します。<\/P>
機能の詳細を「ワクワクして」共有すると言うのは陳腐になってきましたが、私は本当に Notebookを軽量スケジューラーとして使うことでウェブツールの自動化を大衆に届けられると感じています。<\/P>
私の例のシナリオは偶然にもポータルロケーター(つまりジオコードサービス)、非常に一般的な基盤サービスの維持管理についてですが、行間を読み取り、データがどのように変わってもあなたの全てのサービス群が継続的に管理されている様子を想像してください。 もちろん、サービスを維持管理する必要はなく、あなたのウェブツールは任意の種類のジオプロセシングを行っているかもしれません。<\/P>
Socrataからのサンフランシスコロケーターデータ<\/span><\/span><\/P>Total Integrationにはいくつかのパーツがありますが、それらを連携させることがコツです。論理的なステップは次の通りです:<\/P>データを移動し、対象となるウェブサービス(該当する場合)を更新する web tool(ウェブツール)<\/STRONG> を公開する<\/LI>そのウェブツールをスケジュールで自動化する<\/LI><\/OL>私の場合はウェブツール内で ArcGIS Data Interoperability(データインターオペラビリティ)<\/STRONG> を使用していますが、それは私のデータソースによるものです。 私にとってのひらめきは、ETLとコアジオプロセシングを組み合わせて ウェブツール内で サービス更新 を含め、さらにホストされた ArcGIS Online hosted Notebook(ホストノートブック) を軽量スケジューラーとして使い完全自動化できることに気づいた瞬間でした。<\/P>普段はノーコード派ですが、少しPythonが関わっています。しかしご安心ください、ブログダウンロードでコードパターンを共有しています。ブログシナリオではArcPyの使用度が高いですが、それは現在ArcGISにポータルロケーターを再構築するジオプロセシングツールがないためです(自分へのメモ:作成予定)。多くの場合はModelBuilder内で呼び出されるData Interoperabilityでウェブツールを構築し、ArcPyコードなしで済むでしょう。<\/P>それでは少しArcPyとArcGIS Python APIをNotebookで使い、一連の流れをまとめましょう。始めましょう!<\/P>統合対象のソースデータセットはサンフランシスコ市および郡のEnterprise Addressing System Addresses with Units(ユニット付き住所)<\/A>です。 このデータは毎日変わり、私は営業開始前に毎日ポータルロケーターを更新したいと思っています。以下はProで作成したData Interoperabilityワークスペースで、対話的にこの作業を行います:<\/P>
ポータルロケーター更新<\/span><\/span><\/P>ETLツールはSocrataが提供するURL上のCSVファイルを読み込み, フィーチャをスクラッチジオデータベースに書き込み, 最新データと以前の状態(ポータルフィーチャサービスで管理)との間で 変更検出 を行い, 変更内容をフィーチャサービスとスクラッチジオデータベース内のEditsフィーチャクラス両方に書き込みます。 また、新規または変更された住所の便利な要約をメール送信します。 このツールはブログダウンロードにあり、Pro 3.0+ と Data Interoperability が必要です。<\/P>
ネタバレ注意 (読むにはハイライトしてください)<\/noscript>スクラッチ環境についての注意:
この記事公開後、スクラッチジオデータベースが破損して実行時にウェブツールが時折失敗することに気づきました。その修正としてスクラッチ環境使用方法をリファクタリングし、実行時に一意名を生成するようにしました。 ファイルジオデータベースライターは実行時にロックされるため、自動上書きを設定できません。<\/div>スクラッチ環境についての注意:この記事公開後、スクラッチジオデータベースが破損して実行時にウェブツールが時折失敗することに気づきました。その修正としてスクラッチ環境使用方法をリファクタリングし、実行時に一意名を生成するようにしました。 ファイルジオデータベースライターは実行時にロックされるため、自動上書きを設定できません。<\/div><\/div><\/noscript><\/div><\/div>ではETLツールによって変更がどのようにポータルロケーターへプッシュされるか? シャットダウンスクリプト を使い、ジオプロセシングスクラッチ環境内でArcPyを呼び出すことで実現します! Data Interoperability ETLツール は ジオプロセシングツールです そしてこの場合スクラッチジオデータベースは次の スクリプトパラメーター によって見つかります:<\/P> <\/P>import arcpy
scratchGDB = arcpy.CreateScratchName("xyz",".gdb","Workspace",arcpy.env.scratchFolder)
arcpy.AddMessage('Using scratch GDB {}'.format(scratchGDB))
return scratchGDB<\/code><\/pre><P> <\/P><P>同様にスクラッチフォルダーも見つかります:<\/P><P> <\/P><pre class="lia-code-sample language-python"><code>import arcpy
scratchFolder = str(arcpy.env.scratchFolder)
arcpy.AddMessage('Using scratch folder {}'.format(scratchFolder))
return scratchFolder<\/code><\/pre><P> <\/P><P>ウェブツールとして共有するとログには以下のメッセージが表示されます:<\/P><P><STRONG>Using scratch GDB C:\Users\arcgis\AppData\Local\Temp\scratch\xx0.gdb<\/STRONG><BR \/><STRONG>Using scratch folder C:\Users\arcgis\AppData\Local\Temp\scratch<\/STRONG><\/P><P>さて強力な部分ですが、ArcPyを<A title="Shutdown Scripts" href="https:\/\/docs.safe.com\/fme\/2022.0\/html\/DataInterop_Documentation/FME_Workbench/Workbench/Startup_and_Shutdown_Python_Scripts.htm" target="_blank" rel="noopener nofollow noreferrer">シャットダウンスクリプト</A>内で使いロケーターサービスを再作成します。ロケーター作成コードはCreate Locatorツール実行後の履歴アイテムからコピーしたものが起源で、それ以外はヘルプ読解から得たものです。<\/P><P> <\/P><pre class="lia-code-sample language-python"><code># 編集があればポータルロケーターを再作成
import arcpy
import datetime
import fme
import os
import pytz
scratchGDB = fme.macroValues['ScratchGDB']
scratchFolder = fme.macroValues['ScratchFolder']
portalURL = fme.macroValues['PortalURL']
serverURL = fme.macroValues['ServerURL']
portalUser = fme.macroValues['PortalUser']
portalPassword = fme.macroValues['PortalPassword']
arcpy.env.workspace = scratchGDB
arcpy.env.overwriteOutput = True
if arcpy.Exists('Edits') and arcpy.Exists('AddressesWithUnits'):
# データ変更があればロケーター作成または再作成
arcpy.geocoding.CreateLocator("USA",
r"{}\\AddressesWithUnits PointAddress".format(scratchGDB),
"'PointAddress.HOUSE_NUMBER AddressesWithUnits.Full_Address_Number';"+
"'PointAddress.STREET_NAME AddressesWithUnits.Street_Name';"+
"'PointAddress.STREET_SUFFIX_TYPE AddressesWithUnits.Street_Type';"+
"'PointAddress.SUB_ADDRESS_UNIT AddressesWithUnits.Unit_Number';"+
"'PointAddress.NEIGHBORHOOD AddressesWithUnits.Neighborhood';"+
"'PointAddress.CITY AddressesWithUnits.City';"+
"'PointAddress.SUBREGION AddressesWithUnits.County';"+
"'PointAddress.REGION AddressesWithUnits.Region';"+
"'PointAddress.POSTAL AddressesWithUnits.ZIP_Code';"+
"'PointAddress.COUNTRY AddressesWithUnits.Country';",
r"{}\\SanFrancisco".format(scratchFolder),
"ENG",None,None,None,"GLOBAL_HIGH")
# SDドラフトとSDファイル作成
locator_path = os.path.join(scratchFolder,'SanFrancisco')
sddraft_file = os.path.join(scratchFolder,'SanFrancisco.sddraft')
sd_file = os.path.join(scratchFolder,'SanFrancisco.sd')
service_name = 'SanFrancisco'
pst = pytz.timezone('US\\Pacific')
sfNow = datetime.datetime.now(pst)
sfNowStr = sfNow.strftime('%Y:%m:%d %H:%M:%S')
summary = 'Point Address With Units locator for the City of San Francisco updated at {} PST'.format(sfNowStr)
summary += '\\nBuilt from the Socrata data source: https://data.sfgov.org/Geographic-Locations-and-Boundaries/Addresses-with-Units-Enterprise-Addressing-System/ramy-di5m'
tags = 'San Francisco,EAS'
analyze_messages = arcpy.CreateGeocodeSDDraft(locator_path,
sddraft_file,
service_name,
copy_data_to_server = True,
summary = summary,
tags = tags,
max_result_size=50,
max_batch_size=1000,
suggested_batch_size=150,
overwrite_existing_service=True)
# ロケーターをアップロード
if analyze_messages['errors'] == {}:
arcpy.SignInToPortal(portalURL,portalUser,portalPassword)
arcpy.server.StageService(sddraft_file,sd_file)
arcpy.server.UploadServiceDefinition(sd_file,serverURL)
# スクラッチGDBのクリーンアップ
try:
arcpy.management.Delete(scratchGDB)
except:
pass
これが私がwebツールとして公開したETLツールです。 webツールのオーケストレーション方法に進む前に、作成と公開に関するいくつかのヒントがあります。
- ETLツールはジオプロセシング環境に関してパラメータなしです。なぜなら、すべての入力を公開しないように設定したからです。 これはURL上の入力CSVファイルに関する動作を回避するためです。 ArcGIS EnterpriseはURLをデータストアとして登録したり、実行時にサーバーにデータをコピーできないため、パラメータを公開しないことで隠しています。
- ETLツールはポータルへのアクセスとメールサービスへの認証にいくつかのweb接続を使用します。 これらはTools>Options>Web ConnectionsメニューからXMLファイルとしてコピーし、サーバーにコピーし、arcgisサービス所有者としてサーバーにログオンし、fmeworkbench.exeからWorkbenchを起動して同じインターフェースからインポートすることでサーバーに配置します。 インポート後は各接続を再認証してください。
- サーバー上でスクラッチ環境を使用しているため(これはプロセス間で共有されています。この動作は変更される可能性があります)、webツールのジオプロセシングサービスは最大1インスタンスで実行されるよう設定されています。これにより、スクラッチファイルジオデータベースへの書き込みでインスタンス間の競合が発生するのを防ぎます(複数ジョブはキューイングされます)。 サーバー環境に書き込む複数のwebツールを公開する必要がある場合は、一時的なワークスペースを使用するようリファクタリングしてください。
この時点で私たちは望むことを行うwebツールを持っています。次にスケジュールでオーケストレーションする必要があります。 これにはArcGIS OnlineのホストされたNotebookを使用します。 これは私が初めて作成したノートブックです(私のノーコード背景が出ています)ので、私にできればあなたにもできます。 webツールは私のポータルで実行されますが、ノートブックはOnlineで実行されます。 ノートブックには問題ありません。webツールはOnlineで実行されていません。裏ではノートブックがポータルに認証し、submitJob RESTリクエストを送信しているだけです。 OnlineノートブックはポータルGISインスタンスへの接続方法を知っています。 こちらが単一セルノートブック(Standard runtime)です:
Online hosted Notebook
どれほど簡単でしょうか? 非常に簡単です。 最も難しかったのはIT担当者からポータルがArcGIS Onlineからの通信を受け入れる証明書を取得することでした(同僚のRenato S.のおかげです)。 私がしたことはヘルプを読み、ヘルプ例のパスや名前を自分用に置き換えただけです。 web toolboxをインポートした後に使う関数名を見つけるためにコードをIDLEに入れてintellisenseでメソッドを確認しました。
その後ノートブック編集中にTasksエディターへ行き、平日の午前6時にノートブックが実行されるよう設定しました。 タスクエディターの時間ピッカーはブラウザクライアントのローカル時間値を使用することに注意してください。
これでシステムが稼働し、毎日組織には最新のロケーターがポータル内で維持されます!
Locator item details plus today's address changes email