Skip To Content

ホスト タイル レイヤーの公開

公開され、ポータルでホストされているタイル レイヤーは、描画済みのマップ画像、つまりタイルのコレクションを使用した大規模データセットの高速表示をサポートします。 ホストされたタイルは、操作レイヤー用の地理情報を提供します。たとえば、ある地域の道路をタイルにすると、道路標識のフィーチャ レイヤーの参照情報になります。

ポータルでホストするタイル レイヤーは、次のいずれかの方法で公開できます。

公開時にタイルのキャッシュを自動的に構築するか、公開後にキャッシュを手動で構築することができます。詳細については、「タイル キャッシュのベスト プラクティス」をご参照ください。

マップまたはサービス定義ファイルをホスト タイル レイヤーとして公開するには、コンテンツを作成したり、ホスト タイル レイヤーを公開する権限を持っている必要があります。

ArcMap でのマップの定義と公開

ArcMap からタイル レイヤーを公開して、ポータル上でホストできます。

ArcMap を起動する前に、ArcGIS for Desktop がポータルと接続されていることを確認します。

  1. ArcMap を起動し、公開するマップを開きます。
  2. コンテンツの作成やホスト タイル レイヤーの公開ができる権限を持っているアカウントを使用してポータルにサイン インします。
    1. [ファイル] > [サイン イン] の順にクリックします。
    2. ポータルのユーザー名とパスワードを入力し、[サイン イン] をクリックします。
  3. マップを公開します。
  4. [ファイル] > [共有] > [サービス] の順にクリックします。
  5. [サービスを公開] を選択し、[次へ] をクリックします。
    注意:

    代わりにサービスを上書きすると、既存のマップ タイル アイテムがポータルから削除され、新規のアイテムが同じ名前で作成されます。 その新しいアイテムはルート フォルダーに作成され、新規 ID が割り当てられます。共有を再構成する必要があります。また、必要に応じて、再公開前に配置されていたフォルダーにそのアイテムを再び移動します。

  6. 接続タイプのドロップダウン リストで、[マイ ホスト サービス] を選択します。タイルの名前を入力して、[続行] をクリックします。
  7. [サービス エディター] で必要なプロパティを設定します。ここでは、対象タイルの使用を許可するユーザーを選択し、そのタイルをサーバーでどのように公開するかを詳細に設定できます。

    タイルを配置するための最適な構成方法については、ArcGIS for Server ヘルプの「サービスのチューニングと構成」をご参照ください。そこで参照されているプロパティの中には、ArcGIS for Server にのみ適用され、ホスト タイル レイヤーを操作する場合には使用しないものがあります。

    ヒント:

    このセッション中に [サービス エディター] を閉じると、作業をドラフト サービスとして保存するかどうかを確認するメッセージが表示されます。ドラフト サービスを保存しておくと、後でサービス構成作業を再開することができます。デフォルトでは、ドラフト サービスは、[マイ ホスト マップ] への接続の [ドラフト] フォルダーに保存されます。詳細については、ArcGIS for Server ヘルプの「ドラフト サービスについて」をご参照ください。

  8. ホスト タイル レイヤー専用に設定する必要のあるプロパティもいくつかあります。これらについて、以下の手順で詳しく説明します。
  9. [サービス エディター] の左側のウィンドウで、[ケーパビリティ] をクリックして、[タイル マッピング] をオンにして、マップをタイル レイヤーとして公開します。マップ ビューアーにレイヤーを追加したときに、レイヤーのポップアップを構成したい場合は、[フィーチャ アクセス] をオンにして、フィーチャ レイヤーをタイルとともに公開します。

    [サービス エディター] の左側のウィンドウにあるサブアイテム [タイル マッピング] をクリックすると、公開されるタイル レイヤーに対してクライアントが可能な操作について、詳細なプロパティを設定できます。

  10. [キャッシュ] アイテムをクリックして、タイル キャッシュのプロパティを設定します。詳細については、ArcGIS for Server ヘルプの「マップ キャッシュの作成」をご参照ください。一部の高度なキャッシュ設定は、ArcGIS for Server で直接公開しているときのみ使用可能であることに注意してください。
  11. [サービス エディター] の左側のウィンドウで [アイテム説明] をクリックし、タイル レイヤーのサマリーとタグを入力します。この情報は、公開する前に入力する必要があります。詳細については、ArcGIS for Server ヘルプの「マップ サービスのプロパティの設定」にあるアイテム説明のセクションをご参照ください。
  12. [サービス エディター] の左側のウィンドウで、[共有] をクリックして、ホスト タイル レイヤーを共有するユーザーを選択します。デフォルトでは、ホスト タイル レイヤーは、[マイ コンテンツ] のみで共有されており、そのユーザーだけがアクセス可能になっています。自分のタイル レイヤーは [マイ コンテンツ] からいつでも表示できますが、すべてのユーザーや組織のメンバー、または特定のグループのメンバーと共有することもできます。
  13. [サービス エディター] で、[分析] 統計情報の更新 をクリックします。

    マップを公開できるかどうかが検証されます。公開するには、[準備] ウィンドウで [エラー] エラー を修正する必要があります。さらに必要であれば、警告メッセージと情報メッセージに従って問題を修正し、公開されるタイルのパフォーマンスと外観を改善します。これらの問題の解決の詳細については、ArcGIS for Server ヘルプの「GIS リソースの分析」をご参照ください。

  14. 必要に応じて、[サービス エディター][プレビュー] プレビュー をクリックします。Web 上でタイル レイヤーがどのように表示されるかを確認することができます。
  15. エラーを修正し、必要に応じて警告とメッセージを修正したら、[公開] 公開 をクリックします。
    注意:

    データがこの時点でサーバーにコピーされます。公開に要する時間は、データのサイズ、ネットワーク接続の速度と帯域幅によって変わります。 また、タイルを生成する時間も確保しておく必要があります。

タイル レイヤーをポータルで公開したら、カタログ ウィンドウの [マイ ホスト サービス] ノードを展開すると、そのタイル レイヤーが表示されます。

ホスト タイル レイヤーは、ポータル Web サイトの [マイ コンテンツ] ページに、[タイル] と [サービス定義] という 2 つの個別のアイテムとして一覧表示されます。サービス定義は、マップ、マップのデータ、およびタイルの公開方法に関する詳細が含まれる圧縮ファイルです。サービス定義は、ArcGIS for Server を実行しているコンピューターに転送して公開することができます。

ArcGIS Pro でのマップの定義と公開

ArcGIS Pro のマップからタイル レイヤーを公開して、ポータル上でホストできます。

マップ作成時に使用されていた複雑なカートグラフィック シンボルの中には、Web ブラウザーで表示できないものがあることにも注意してください。ほとんどのシンボル タイプは利用できますが、公開時にシンボルがダウングレードされる場合があります。サポートされるシンボルの種類の詳細については、ArcGIS for Server ヘルプの「フィーチャ サービスの作成」を参照し、必要に応じて公開前にマップ シンボルに変更を加えます。

  1. ArcGIS Pro を起動し、公開するマップを含むプロジェクトを開きます。
  2. ポータルへの接続がアクティブであり、コンテンツの作成やホスト タイル レイヤーの公開ができる権限を持っているアカウントを使用して組織サイトにサイン インしていることを確認します。
  3. タイル レイヤーを公開するには、次のいずれかを実行します。
    • [コンテンツ] ウィンドウでレイヤーを選択します。選択したレイヤーを右クリックして、[Web レイヤーとして共有] をクリックします。
    • マップ内のすべてのレイヤーを公開するには、[共有] タブの [共有] グループで [Web レイヤー] をクリックし、[Web レイヤーの公開] をクリックします。

    ヒント:

    [Web レイヤーとして共有] メニュー オプションがアクティブでない場合、次のいずれかの原因が考えられます。

    • サイン インに使用したアカウントに、ホスト フィーチャ レイヤーを公開する権限がない。
    • Web レイヤーをホストするために必要なホスティング サーバーでポータルが構成されていない。
    • サポートされていないマルチパッチ レイヤーを公開しようとしている。

  4. タイル レイヤーの名前を入力します。レイヤーは、デフォルトでは [マイ コンテンツ] に保存されます。[マイ コンテンツ] 内のフォルダーに保存するには、フォルダー名を入力するか、既存のフォルダーに移動します。
  5. [すべてのデータをコピー] を選択します。
  6. [レイヤー タイプ] には [タイル] を選択します。

    これにより、自動的に他の [レイヤー タイプ] オプションがオフに設定されます。データをコピーするときは一度に 1 つのレイヤー タイプしかオンにすることはできません。

  7. タイル レイヤーのサマリーとタグを入力します。
  8. タイル レイヤーの共有方法を指定します。公開するすべてのレイヤーが、組織のパーソナル ワークスペース ([マイ コンテンツ]) に自動的に共有されます。次のいずれかに共有するまで、他のユーザーはコンテンツにアクセスできません。
    • Portal for ArcGIS - このオプションを選択すると、レイヤーを組織内のすべての認証済みユーザーと共有できます。
    • すべてのユーザー - このオプションを選択すると、ポータルにアクセスできるすべてのユーザーがレイヤーを使用できるようになります。
    • グループ - 所属するグループのメンバーとレイヤーを共有できます。
  9. [構成] をクリックし、[Web レイヤー プロパティの構成] ボタンをクリックしてキャッシュ設定を指定します。
    1. [タイル スキーマ] を選択します。
    2. [詳細レベル] バーをリサイズおよびドラッグして、タイル レイヤーの最小および最大縮尺を示します。

      最小および最大縮尺を変更すると、生成されるキャッシュの推定サイズが変わります。

    3. レイヤーの公開時に [キャッシュの自動構築]、もしくは、レイヤーの公開後に [キャッシュを手動で構築] を選択します。

      レイヤーを公開した後、ポータルの Web サイトでタイル レイヤーを開いて、手動でキャッシュを構築します。

  10. [コンテンツ] タブをクリックして、タイル レイヤーに対象のデータ レイヤーが含まれていることを確認します。
  11. [分析] をクリックして、エラーや問題がないか確認します。

    問題が見つかると、[メッセージ] タブに表示されます。各メッセージを右クリックすると、詳細情報を表示したり、エラーや警告に関するヘルプを確認したり、推奨される解決策を入手したりできます。公開する前に、エラーを修正する必要があります。さらに必要であれば、警告に従って問題を修正し、ホスト タイル レイヤーのパフォーマンスと外観を改善します。

  12. エラーを修正し、必要に応じて警告を修正したら、[公開] をクリックします。
    注意:
    データがこの時点でサーバーにコピーされます。公開に要する時間は、データのサイズ、ネットワークの速度と帯域幅によって変わります。

公開が完了したら、[Web レイヤーの管理] をクリックして、ポータル Web サイトを開くことができます。

ArcMap でタイル パッケージを構築および共有してから公開

ArcMap では、マップ ドキュメントのタイルを作成し、それを簡単に転送できるタイル パッケージ (*.tpk) ファイルで保存できます。ArcMap でタイル パッケージを作成し、ポータルで共有してから、そのタイル パッケージをホスト タイル レイヤーとして公開できます。

以下で 2 つの異なるワークフローを説明します。最初のワークフローは、小規模から中規模のサイズのタイル パッケージに使用でき、タイルをタイル パッケージから公開するときに、凡例やテキスト エレメントなどのマップ ドキュメントのエレメントを維持します。2 番目のワークフローは、大規模なタイル パッケージを公開するときに推奨されますが、タイルをタイル パッケージから公開するときにデータのみを維持します。

中小規模のタイル パッケージを公開するには、次の手順に従います。

  1. ArcMap でマップを開きます。
  2. コンテンツの作成やホスト タイル レイヤーの公開ができる権限を持っているアカウントを使用してポータルにサイン インします。
  3. [カスタマイズ] > [ArcMap オプション] > [共有]の順にクリックし、[ArcGIS Runtime ツールの有効化] がオンになっていることを確認します。

    これにより、次の手順で使用するメニュー オプションが有効になります。

  4. ArcMap で、[ファイル] > [共有] > [タイル パッケージ] の順にクリックします。
  5. 次の手順で、すべての設定を行います。他の設定も必要に応じて行います。
    1. [タイル パッケージ] タブで、[パッケージを自分の ArcGIS ポータル アカウントにアップロード] を選択します。
    2. [タイル フォーマット] タブで、[ArcGIS Online / Bing Maps / Google マップ][タイル スキーマ] として選択します。
    3. [アイテム説明] タブで、必要に応じてアイテムをマークします。
    4. [共有] タブで、パッケージをパブリックまたは特定のグループと共有するかを選択できます。
  6. [共有] をクリックします。

    タイル パッケージを作成する前にマップを保存するよう求められる場合があります。

    特に縮尺の大きなマップが含まれている場合は、タイル パッケージの生成に時間がかかる場合があります。

  7. タイル パッケージの生成が終わったら、ArcMap でタイル パッケージを作成したときに使用した同じアカウントを使用してポータルにサイン インし、[マイ コンテンツ] をクリックします。
  8. タイル パッケージをクリックし、アイテムの詳細ページを表示します。
  9. [公開] をクリックします。
  10. タイトルとタグを入力し、[公開] をクリックします。

タイルが展開され、ホスト タイル レイヤーがポータルに作成されます。これで、[マイ コンテンツ] でマップ タイルを表示できるようになりました。

大きなタイル パッケージを作成および共有するには、前のワークフローを使用せず、[タイル キャッシュ] ツールセットを使用することをお勧めします。これらのツールでは、複数のプロセシング コアを活用できます。

これらのツールを次の順序で実行します。

  1. [タイル キャッシュのタイル スキーマの生成 (Generate Tile Cache Tiling Scheme)] ツールを実行して、タイル グリッドと画像形式を定義します。
  2. [タイル キャッシュの管理 (Manage Tile Cache)] ツールを実行して、タイルを作成します。
  3. [タイル キャッシュのエクスポート (Export Tile Cache)] ツールを実行して、タイル パッケージを作成します。
  4. [パッケージの共有 (Share Package)] ツール ([パッケージ] ツールセット内) を実行して、タイルをポータル上にアップロードします。

ポップアップを構成する場合、ホスト タイル レイヤーが含まれているフィーチャ レイヤーを指定する必要があることに注意してください。

ArcGIS Pro でタイル パッケージを構築し、組織サイトにアップロードします。

[マップ タイル パッケージの作成 (Create Map Tile Package)] ジオプロセシング ツールを使用してタイル パッケージを作成し、パッケージを組織サイトに追加してから、タイル レイヤーを公開します。

  1. パッケージ化するデータを含むプロジェクトを開きます。
  2. [マップ タイル パッケージの作成 (Create Map Tile Package)] ジオプロセシング ツールを開いて実行します。
  3. タイル パッケージの生成が終わったら、コンテンツの作成やホスト タイル レイヤーの公開ができるアカウントの権限を使用してポータルにサイン インし、[マイ コンテンツ] をクリックします。
  4. [コンピューター上]タイル パッケージを追加します
  5. [このファイルをホスト レイヤーとして公開します] チェックボックスをオンにします。
  6. タイトルとタグを入力し、[アイテムの追加] をクリックします。

タイルが展開され、ホスト タイル レイヤーがポータルに作成されます。これで、[マイ コンテンツ] でマップ タイルおよびタイル パッケージを表示できるようになりました。

ベクター タイル パッケージの構築と公開

ArcGIS Pro のリリース 1.2 以降では、マップのベクター タイルを作成し、それを簡単に転送できるベクター タイル パッケージ (*.vtpk) ファイルで保存できます。ArcGIS Pro からポータルにベクター タイル パッケージを共有し、アップロードされたベクター タイル パッケージをホスト タイル レイヤーとして公開できます。 作成されたホスト タイル レイヤーを、マップ ビューアーまたはカスタム アプリケーションのベースマップで使用します。

  1. タイルにパッケージ化して公開するマップ ベクター データを含む ArcGIS Pro プロジェクトを開きます。
  2. コンテンツを作成できる権限を持つアカウントを使用して、ArcGIS Pro からポータルにサイン インします。
  3. [ベクター タイル パッケージの作成] ツールを使用して、ベクター タイル パッケージを作成します。
  4. ベクター タイル パッケージをポータルに追加し、タイル レイヤーを公開するには、2 つのオプションがあります。
  5. ベクター タイル パッケージが 2GB を超える場合は、以下の手順に従ってパッケージを追加し、公開します。
    1. [パッケージの共有] ジオプロセシング ツールを実行して、ベクター タイル パッケージをポータルに追加します。
    2. ポータル Web サイトにサイン インして [マイ コンテンツ] を開きます。ホスト タイル レイヤーを公開する権限を持っている必要があります。
    3. タイル パッケージをクリックしてアイテムの詳細ページを表示し、[公開] をクリックします。
    4. タイトルとタグを入力し、[公開] をクリックします。
  6. ベクター タイル パッケージが 2GB 未満の場合は、前述の方法でポータルに追加してタイル レイヤーを公開するか、ポータルにサイン インしてベクター タイル パッケージを追加します。
    1. ポータル Web サイトにサイン インして [マイ コンテンツ] をクリックします。コンテンツの作成やホスト タイル レイヤーの公開ができる権限を持っている必要があります。
    2. [アイテムの追加] > [コンピューター上] の順にクリックします。
    3. ベクター タイル パッケージ ファイル (*.vtpk) の場所を参照します。
    4. [このファイルをタイル レイヤーとして公開します] はチェックを入れたままにしておきます。
    5. タイトルとタグを入力し、[アイテムの追加] をクリックします。

ベクター タイルが展開され、ホスト タイル レイヤーが作成されます。[マイ コンテンツ] でタイル レイヤーを表示し、マップ ビューアーに追加できます。

注意:

ベクター タイル レイヤーは、Internet Explorer 11 以降、および Chrome や Firefox などのほとんどすべてのデスクトップ ブラウザーの最新バージョンで表示できます。Microsoft Edge は現在サポートされていません。

また、ベクター タイル レイヤーは、ハードウェアが新しいコンピューターであるほど最高のパフォーマンスを実現します。

ホスト フィーチャ レイヤーからの公開

ポータルのホスティング サーバーが ArcGIS Data Store を使用している場合、既存のホスト フィーチャ レイヤーを使用して、ホスト タイル レイヤーをポータルで公開できます。 これは、ArcGIS 製品をローカルにインストールしていない場合に便利なワークフローです。たとえば、シェープファイルをホスト フィーチャ レイヤーとして公開し、そのホスト フィーチャ レイヤーをホスト タイル レイヤーとして公開できます。

注意:

ホスト フィーチャ レイヤーの変更内容は自動的にはホスト タイル レイヤーに反映されません。更新されたホスト フィーチャ レイヤーからホスト タイル レイヤーを再公開する必要があります。

ホスト フィーチャ レイヤーからホスト タイル レイヤーを公開する場合、一部のスタイル設定の制限が適用されるので注意してください。

ホスト フィーチャ レイヤーからホスト タイル レイヤーを公開するには、次の手順に従います。

  1. ホスト タイル レイヤーを公開する権限を持つアカウントでサイン インして、[マイ コンテンツ] をクリックします。
  2. 公開するには、次のどちらかを実行します。
    • 公開するホスト フィーチャ レイヤーをクリックし、[公開] をクリックします。
    • [作成] > [タイル レイヤー] の順にクリックし、[フィーチャ レイヤー] を選択してタイルとして公開します。
  3. ホスト タイル レイヤーのタイトル、タグ、サマリーを入力し、フォルダーを選択します。
  4. 必要に応じて、[表示範囲] ドロップダウン リストで縮尺を選択し、レイヤーを表示する範囲を変更します。
  5. [OK] をクリックします。
  6. タイルを生成する縮尺の横にあるチェックボックスをオンにします。次に、[タイルの作成] をクリックします。
    注意:

    縮尺範囲に大きな縮尺を含めると、タイルの生成と保存に消費されるクレジットの数が大幅に増える可能性があります。データの精度を超えるタイルを作成しないでください。

  7. 作成されるタイルの数についてのメッセージを確認します。処理を続行する場合は、[はい、タイルを作成します。] をクリックします。

サービス定義ファイルからの公開

タイルの公開およびキャッシュの作成では、多くのサーバー リソースが使用されます。多数のタイル レイヤーを公開する必要がある場合、マップの作成者は、タイル レイヤーをポータルに公開するために必要なすべての情報を含むサービス定義 (*.sd) ファイルを ArcMap で作成することをお勧めします。次に、スクリプトを使用して、サービス定義ファイルをアップロードし、それを営業時間の後にポータルに公開します。結果のタイル レイヤーは、ポータルのホスティング サーバーでホストされます。

サービス定義ファイルの作成

ポータルでホストされるタイル レイヤーに必要なデータとシンボルを含むサービス定義ファイルを作成するには、マップ作成者は次の手順に従う必要があります。

  1. ArcMap を起動し、ポータルにサイン インします。
  2. マップを作成して保存します。

    マップの作成と公開の詳細については、ArcGIS ヘルプの「マップ サービス」をご参照ください。

  3. サービス定義ファイルを作成します。
  4. [ファイル] > [共有] > [サービス] の順にクリックします。
  5. [サービス定義ファイルを保存] を選択し、[次へ] をクリックします。
  6. [接続の選択] をクリックして、ドロップダウン リストから [マイ ホスト サービス] を選択します。
  7. ファイルの名前を入力し、[次へ] をクリックします。
  8. サービス定義ファイルを作成するクライアント コンピューター上のディレクトリを指定して、[続行] をクリックします。

    [サービス エディター] が開きます。

  9. [サービス エディター] の左側のウィンドウで、[キャッシュ] をクリックします。
  10. [タイル スキーマ] を選択します。
  11. タイルおよび [キャッシュ サイズの計算] に最小縮尺と最大縮尺を選択します。
  12. [サービスの公開後にキャッシュを手動で構築します] をクリックします。
  13. また、[高度な設定] をクリックし、タイル キャッシュの詳細なキャッシュ設定を設定することもできます。
  14. [サービス エディター] の左側のウィンドウで [アイテム説明] をクリックし、タイル レイヤーの情報を入力します。

    サービス定義ファイルを作成する前に、少なくともサマリーとタグを入力する必要があります。

  15. [分析] 統計情報の更新 をクリックして、エラーがないことを確認します。

    エラーがあれば、サービス定義ファイルをステージングする前に、修正する必要があります。必要に応じて、返された警告およびメッセージに対して修正を加えることができます。

  16. エラーを修正し、必要に応じて警告とメッセージを修正したら、[ステージ] ステージ をクリックします。

サービス定義ファイルが指定した場所に保存されます。

サービス定義の読み込みと公開

作成者からサービス定義ファイルを取得したら、それをポータルの [マイ コンテンツ] に手動でアップロードしてタイル レイヤーを公開するか、スクリプトをスケジュールして、ファイルをアップロードし、公開します。

手動によるアップロードと公開

ポータル Web サイトにサイン インし、サービス定義ファイルをポータルに追加して公開します。

  1. コンテンツの作成やホスト タイル レイヤーの公開ができる権限を持つメンバーとしてポータルにサイン インして、[マイ コンテンツ] を開きます。
  2. [アイテムの追加] をクリックします。
  3. コンピューターから読み込むファイルを選択します。
  4. 参照ボタンをクリックして、サービス定義ファイルを選択します。
  5. [このファイルをサービスとして公開します] をオンにします。
  6. タグの項目をカンマで区切って入力します。

    タグは、アイテムを説明し、アイテムの検索を容易にする単語または短いフレーズです。「Federal land」は 1 つのタグと見なされますが、「Federal,land」は 2 つのタグと見なされます。

  7. [アイテムの追加] をクリックして、サービス定義ファイルを追加し、タイル レイヤーを公開します。

    タイル レイヤーがポータルのホスティング サーバーで公開され、サービス定義とタイルが [マイ コンテンツ] に追加されます。

  8. タイル レイヤーを公開したら、[タイルの構築開始] オプションを選択できます。そのリンクをクリックして、タイルを作成します。

デフォルトでは、サービス定義ファイルとホスト タイル レイヤーにアクセスできるのは公開したユーザーだけです。ファイルとタイルは、組織内の他のユーザーや特定のグループと共有できます。

アップロードおよび公開するためのスクリプトの実行

サービス定義ファイルを営業時間の後にアップロードして公開するには、ArcGIS Server コンピューターで次のスクリプトを自動実行します。

  1. 次のスクリプトをテキスト ファイルにコピーし、拡張子 *.pyを付けてファイルを保存します。

    import os, sys, json, urllib, urllib2, httplib, urlparse, mimetools, mimetypes
    from cStringIO import StringIO
    
    # generates a new token from Portal
    def generate_token(baseurl, username, password):
        tokenUrl = urlparse.urljoin(baseurl, 'sharing/generateToken')
        postdata = { 'username': username, 'password': password,
                   'client': 'requestip', 'expiration': 60, 'f': 'json' }
        encoded_postdata = urllib.urlencode(postdata)
        opener = urllib2.build_opener()
        try: resp = opener.open(tokenUrl, data=encoded_postdata)
        except urllib2.HTTPError as e: raise Exception('Unable to connect to Portal, please check the url: {} {}'.format(e.code, e.reason))
        resp_json = json.loads(resp.read())
        if 'error' in resp_json: raise Exception('\n'.join(resp_json['error']['details']))
        return resp_json['token']
        sys.exit(1)
    
    # create proper multi-part POST request data
    def _encode_multipart_formdata(fields, files):
        boundary = mimetools.choose_boundary()
        buf = StringIO()
        for (key, value) in fields.iteritems():
            buf.write('--%s\r\n' % boundary)
            buf.write('Content-Disposition: form-data; name="%s"' % key)
            buf.write('\r\n\r\n%s\r\n' % str(value))
        for (key, filepath, filename) in files:
            buf.write('--%s\r\n' % boundary)
            buf.write('Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % (key, filename))
            buf.write('Content-Type: %s\r\n' % (mimetypes.guess_type(filename)[0] or 'application/octet-stream'))
            f = open(filepath, "rb")
            try:
                buf.write('\r\n' + f.read() + '\r\n')
            finally:
                f.close()
        buf.write('--' + boundary + '--\r\n\r\n')
        buf = buf.getvalue()
        return boundary, buf
    
    # send multi-part POST request
    def _postmultipart(host, selector, fields, files, ssl):
        boundary, body = _encode_multipart_formdata(fields, files)
        headers = { 'Content-Type': 'multipart/form-data; boundary={0}'.format(boundary) }
        if ssl: h = httplib.HTTPSConnection(host)
        else: h = httplib.HTTPConnection(host)
        
        h.request('POST', selector, body, headers)
        resp = h.getresponse()
    
        return resp.read()
    
    # first upload the SD file and create an item in Portal
    def addSDItem(baseurl, user, token, title, file, folder = ''):
        addUrl = 'sharing/rest/content/users/{}/{}addItem'
        if folder != '': addUrl = addUrl.format(user, folder + '/')
        else: addUrl = addUrl.format(user, '')
        
        url = urlparse.urljoin(baseurl, addUrl)
    
        files = [('file', file, os.path.split(file)[1])]
        fields = { 'token' : token, 'f' : 'json', 'type' : 'Service Definition', 'title' : title, 
                   'tags' : 'sampletag', 'name': title, 'typeKeywords' : 'Data, Service Definition, ArcGIS, sd' }
    
        ssl = url.startswith('https://')
        
        parsed_url = urlparse.urlparse(url)
        
        print('Uploading {} to {}..'.format(file, baseurl))
        resp = _postmultipart(parsed_url.netloc, str(parsed_url.path), fields, files, ssl)
        resp_json = json.loads(resp)
    
        if 'error' in resp_json:
          raise Exception('Unable to upload file {}: {}'.format(file, resp_json['error']['message']))
        
        return resp_json['id']
        
    # second publish the uploaded SD item as a new tiled service
    def publishTiles(baseurl, user, token, itemid):
        publishUrl = urlparse.urljoin(baseurl, 'sharing/rest/content/users/{}/publish'.format(user))
        query_dict= { 'f' : 'json', 'token': token, 'itemid': itemid, 'buildInitialCache' : True,
                      'publishParameters' : { 'name' : 'cities' }, 'fileType': 'serviceDefinition' }
                      
        query_string = urllib.urlencode(query_dict)
        print('Publishing tile service from item..')
        response = urllib.urlopen(publishUrl, query_string)
            
        resp_json = json.loads(response.read())
        
        if 'error' in resp_json: raise Exception('Unable to publish item: {}'.format(resp_json['error']['message']))
    
    # read input from command line when run as a standalone script
    if __name__ == '__main__':
        try: 
          url = sys.argv[1]
          user = sys.argv[2]
          password = sys.argv[3]
          f = sys.argv[4]
          title = sys.argv[5]
          if not url.endswith('/'): url += '/' # make sure the url ends with /
        except: # if too few parameters are passed on command line, show usage help
          print('Usage: ')
          print('       publishServiceItem.py [portalUrl] [userName] [password] [sdFilePath] [titleOfServiceItem]')
          print('')
          print('portalUrl           The secure url to the portal, e.g. https://portalmachine.example.com/arcgis/')
          print('userName            The username of a user to publish the service.')
          print('                    This user must have the required publishing privileges.')
          print('password            The password of the user')
          print('sdFilePath          Path to the .sd file containing the service definition')
          print('                    E.g. c:\\temp\cachedService.sd')
          print('titleOfServiceItem  The title to assign to the published item in the portal.')
          sys.exit(1)  
    
        token = generate_token(url, user, password)
    
        id = addSDItem(url, user, token, title, f)
        publishTiles(url, user, token, id)
        print('Publishing complete. Tile generation has been started and may take a while to finish.')

  2. バッチ ファイルまたはシェル スクリプトを作成し、Python スクリプトを実行するようスケジュール設定します。
  3. ファイルで、Python スクリプトを呼び出し、サイトに固有のオプションを指定します。

    たとえば、スクリプト「publishServiceItem.py」を実行するには、ポータルの URL、接続の際に使用するユーザー名、ユーザーのパスワード、サービス定義ファイルのパス、作成するサービスのタイトルを入力します。この例では、ポータルの URL は https://portal.domain.com/arcgis/、ユーザー名とパスワードは pub1 と pub.1、サービス定義ファイルのパスは C:\maps\SDs\mymap.sd、サービス名は studytiles です。

    publishServiceItem.py https://portal.domain.com/arcgis/ pub1 pub.1 C:\maps\SDs\mymap.sd studytiles

    ヒント:

    また、次の単純化されたスクリプトを使用して、ポータルにサービス定義ファイルをアップロードし、タイル レイヤーを公開し、キャッシュを構築することもできます。ただし、このスクリプトを実行するには、別の Python パッケージ (PortalPy および Python Requests) を追加インストールする必要があります。PortalPy は Portal for ArcGIS と一緒にインストールされます。このモジュールのインストールと使用の詳細については、Portal for ArcGIS のヘルプの「PortalPy を使用した管理タスクのスクリプト化」をご参照ください。

    import portalpy, requests, urlparse, sys, os
    
    # first upload the SD file and create an item in Portal
    def addSDItem(baseurl, user, token, title, file, folder = ''):
        addUrl = 'sharing/rest/content/users/{}/{}addItem'
        if folder != '': addUrl = addUrl.format(user, folder + '/')
        else: addUrl = addUrl.format(user, '')
        
        url = urlparse.urljoin(baseurl, addUrl)
    
        files = { 'file' : (os.path.split(file)[1], open(file, 'rb')) }
        fields = { 'token' : token, 'f' : 'json', 'type' : 'Service Definition', 'title' : title, 
                   'tags' : 'sampletag', 'name': title, 'typeKeywords' : 'Data, Service Definition, ArcGIS, sd' }
    
        print('Uploading {} to {}..'.format(file, baseurl))
        
        # send POST with upload request
        # verify=False turns off SSL cert validation, turn on for production environments with CA-signed certs
        resp = requests.post(url, data=fields, files=files, verify=False)
        resp_json = resp.json()
    
        if 'error' in resp_json:
          raise Exception('Unable to upload file {}: {}'.format(file, resp_json['error']['message']))
        
        return resp_json['id']
    
    # second publish the uploaded SD item as a new tiled service
    def publishTiles(baseurl, user, token, itemid):
        publishUrl = urlparse.urljoin(baseurl, 'sharing/rest/content/users/{}/publish'.format(user))
        query_dict= { 'f' : 'json', 'token': token, 'itemid': itemid, 'buildInitialCache' : True,
                      'publishParameters' : "{ 'name' : 'cities' }", 'fileType': 'serviceDefinition' }
        
        print('Publishing tile service from item..')
        
        # send POST with publish request
        # verify=False turns off SSL cert validation, turn on for production environments with CA-signed certs
        response = requests.post(publishUrl, data=query_dict, verify=False) 
            
        resp_json = response.json()
        
        if 'error' in resp_json: raise Exception('Unable to publish item: {}'.format(resp_json['error']['message']))
    
    # read input from command line when run as a standalone script
    if __name__ == '__main__':
        try: 
          url = sys.argv[1]
          user = sys.argv[2]
          password = sys.argv[3]
          f = sys.argv[4]
          title = sys.argv[5]
          if not url.endswith('/'): url += '/' # make sure the url ends with /
        except: # if too few parameters are passed on command line, show usage help
          print('Usage: ')
          print('       publishServiceItem.py [portalUrl] [userName] [password] [sdFilePath] [titleOfServiceItem]')
          print('')
          print('portalUrl           The secure url to the portal, e.g. https://portalmachine.example.com/arcgis/')
          print('userName            The username of a user to publish the service.')
          print('                    This user must have the required publishing privileges.')
          print('password            The password of the user')
          print('sdFilePath          Path to the .sd file containing the service definition')
          print('                    E.g. c:\\temp\cachedService.sd')
          print('titleOfServiceItem  The title to assign to the published item in the portal.')
          sys.exit(1) 
    
        portal = portalpy.Portal(url, user, password)
        token = portal.generate_token(user, password)
    
        id = addSDItem(url, user, token, title, f)
        publishTiles(url, user, token, id)
        print('Publishing complete. Tile generation has been started and may take a while to finish.')

  4. ポータルの使用状況が最低になったときにスクリプトが実行されるようスケジュール設定します。

    スクリプトのスケジュール設定の詳細については、ArcGIS ジオプロセシングのヘルプの「Python スクリプトを指定の時間に実行するようスケジュールを設定する」をご参照ください。