NextイントロダクションこのパートではZOOのサービス提供機能を作成します。これにはOSGeoLiveのDVDに含まれているZOOのインストーラーで組み込まれるOGRのC言語API、Pythonモジュールを使います。目標とするゴールは、OGRとGEOSベースの簡単な空間関数をWPSサービスとして使うことです。最初にBoundary(境界)の関数からスタートしましょう。この関数の詳細については後ほど説明いたします。徐々にZOOサービスとしてコードを書き、テストを行います。Hull(凸構造体)の関数についても行います。Difference(対称性の差異)などがこのワークショップの終わりには組み込まれていることになります。述べたように、このワークショップではサービスを記述する言語はCもしくはPython(もしくは両方!)を選ぶことができます。解説はC言語に沿って行いますが、この解説はPythonを利用する方にも非常に役立つ内容になっています。どちらの言語を使用するか決めたらインストラクターに報告してください。どちらの言語を選択されても、ワークショップの結果は同じです。メタデータファイルの準備ZOOメタデータの用意ZOOのサービスは、ZOOメタデータファイル(.zcfg)とZOOサービスプロバイダーと呼ばれる機能の応じたランタイム実装モジュールとの組み合わせによって成り立ちます。はじめに順を追って.zcfgファイルを用意しましょう。最初に、ファイル先頭にある括弧中に以下のようにサービス名を定義します。[Boundary]この名前は非常に重要です。この名前はサービス名になりサービスプロバイダーの機能を表します。タイトル(Title)とこのサービスが何を行うのかについての短い要約(Abstract)は、利用者のために書いておくべきです。リクエストによって返されます。ような特定情報を追加することができます。falseにすることで指定できます。trueZOOサービス・メタデータファイルのメインのセクションでは、二つの重要事項を指定します。あなたが使用する言語とあわせてください。共用ライブラリを使うことになります。ライブラリファイルはZOOカーネルと同じディレクトリに置いてください。ファイルを使うことになります。メインセクションでは、下記の例のように他の任意の情報を追加することもできます。Demo</MetaData>これで主要なメタデータ情報が定義できました。次はZOOサービスで使われるデータの入力方法を定義します。サービスに必要な任意の入力を定義できます。ZOOのカーネルは.zcfgファイルに定義したデータよりも多くのデータを処理するリクエストを受け付けることに注意してください。これらのデータはフィルタリングされることなくサービスへと渡されます。この例のBoundaryサービスでは、一つのポリゴンが入力として使用され、それに対してBoundary関数が実行されます。ブロックで行われます。書式はサービスを定義するときと同じで、名前は括弧でくくられています。セクションに追加することができます。パラメータは必ず設定してください。これらは、どのパラメータがサービス関数で実行するのに必要なのかをZOOカーネルに通知するのに使われます。</MetaData>メタデータは、どのようなタイプのデータがサービスでサポートされるのかを定義します。このBoundary関数の例では、入力するポリゴンはGMLファイル形式またはJSON文字列形式で提供することができます。次のステップではデフォルトのデータ形式とサポートする入力フォーマットを定義しましょう。ブロックで定義する必要があります。ブロックのみを使います。</Supported></ComplexData>次に、同様のメタデータ情報をサービスの出力についても定義します。ブロック内に次のように定義します。/usr/lib/cgi-bin)へコピーしてください。.zfgファイルさえあれば完了します。関数専用の非常に簡単なものの作成に着目しましょう。メタデータは既にOKです。それでは、サービスのコード作成に入りましょう。mapsと呼ばれる特別なデータ型の中で、あなたの作成したサービス機能の引数を受け渡します。サービスをC言語で記述するために、あなたはこのread/writeモードのデータ型にどのようにアクセスするかを学ぶ必要があります。単純なリンクされたリストで、キー値のペアを格納するために用いられます。ポインタからなります。中の既存のmapに関わる以外には、mapsの生成に関わらなくてよいという事です。アクセスする構文は次の通りです。フィールドへのアクセスと読み込みはご存じのとおりです、今からこのようなデータ構造への書き込みはどのように行うかを学習しましょう。関数が使用されるということに注意してください。既存の場合(※NULLではないという意味)、その値は自動的に更新されます。map.このデータ型はすべてのC言語ベースのZOOサービスにおいて使用されるほど、本当に重要です。それは、個々のデータ型の利用を除いて、他の言語でも同様にであることを示しています。場合、ディクショナリー型が用いられ、さらに簡単に操作することができます。サービスを書く準備をしましょう。レスポンスを入力値に利用することが出来るでしょう。関数を使用しましょう。はじめにすることは、完全なWFSレスポンスに定義されたジオメトリを抽出する関数を書くことです。呼び出しに注目してください。定義されており、zoo-kernel/service_internal.cに記述されています。サービスの定義を始めることができます。入力値はいつも同様の種類ではないことに注意してください。使用することは、JSON文字列は完全なGeoJSONのものではなくてジオメトリオブジェクトだけを含むものであることを意味します。Driverにも利用されているjson-cライブラリのインスタンスを使うことにより)。ジオメトリオブジェクトに結果を格納することができます。して正しいフォーマットの値だけを格納しなければなりません。使用して書き換えた場合は、あなたはキー名に対応する値を埋めることだけを行うように注意してください。表現のジオメトリを準備ます。ZOOサービスは実装されたので、あなたは共有ライブラリを作るためそれをコンパイルする必要があります。addToMap)を使用したので、あなたはそれらのファイルをあなたのCコードに含める必要があります。リンクする必要があります。アクセスするために必要となるファイルもまた含めなければなりません。"C"を宣言するブロックコード内にあなたのコードを格納しなければなりません。ファイルの中に最終的なコードを格納されなければなりません。FUNCTIONS>}サービスの完全なソースは準備が出来たので、次にシェアードライブラリとしてコードをコンパイルした結果のシェアードオブジェクトに対応するサービスを生成する必要があります。環境変数は事前にセットする必要があることに注意してください。ファイルのディレクトリへのパスのすべてを含む必要があります。それらは要求通りのパスを生成します。カーネルとソースツリーを見ることができます。カーネルのフルパスを使用することもできることに注意してください。-I../../zoo-kernelを加える必要があります。正しくセットするインクルードパスをたので、リンクに対応するライブラリ(LDFLAGS環境変数として定義)に取り組みましょう。用いることができます。いうファイルが得られます。ディレクトリにできました。ZOOサービスシェアードオブジェクトと対応するメタファイルの両方をコピーしましょう。サービスのソースツリーの意味するところが解りましたね。配置をするためのものです。サービスプロバイダは、ZOOカーネルを通しての実行リクエストから利用される準備が出来ました。すべてのコピーするコードは下記のとおりです。3私たちは既に詳細を伝えていて、コードは同様な方法で作られているため、ここでは関数本体については述べません。プロバイダーが配置されます。リクエストとして使用します。付け加えることができることに注意してください。ドキュメントを格納する必要があるかもしれません。していない実行の時と比べて、ZOOカーネルの挙動は正確には同じでないということに注意してください。置かれた情報をクライアントに与えます。クライアントアプリケーションのキャッシングシステムを備えているということで大変便利になるということに注意してください。カーネルにどのような種類の結果が欲しいかを伝えることができます。RawDataOutputを問い合わせることができます。初期値を戻しておくことに注意してください。リクエストを書くことは時により困難です。リクエストを用いましょう。送信ボタンをクリックします。リクエストを使用して実行したときと同様に結果を得られます。値はこのようなデータ入力を取り扱うもっとも簡単な方法です。両方を入力データとして取り扱えるということです。文字列を指定して受け渡される指定をしました。追加したのと同じことです。簡単に追加することができます。サービスの配置については、下記に示すたとおりです。サービスと全く同じです。OGR_G_GetBoundaryではなく)。関数をまったくコピーペーストすることは良くありませんので、すべての場合において、新しいサービスの関数本体の記述を行うもっと一般的な方法があります。呼ばれる関数ポインタを使用します。プロバイダに追加されます。関数を定義する必要があります。確保するためでもあります。リクエストの実行とテストのために、最初の行のサービス名を書き換える必要があります。修正した値をセットできることに注意してください。フォーマットも同じものが使われています。関数を簡単にコピーペーストして、Geometry関数が呼ばれている行を変更します。C言語で行ったように、もっと一般化して単純にする方法を教えましょう。ジオメトリの抽出にある最初のステップですが、まずはじめにその関数を作りましょう。同様に出力値を埋め、他の関数に対しても自動的に行われるよう定義しましょう。3Pythonにおいても。使う必要があるということに注意してください。各々にコピーしてください。コマンドを使い、サービスプロバイダを再配置します。我々はバッファサービスを使用することができますが、他のサービスに比べ多くの引数を必要とします。実際コードは、境界や凸包、そして中心点生成サービスを実装する際に使用されるものと少々異なっているからです。ブロックを定義できるでしょう。そのような種類の入力値の読込処理は、以前使用したのと同じ機能が使用されます。バージョンあなたが、最初の境界サービスのソースコードへ戻るならば、以下について非常に複雑になったとは気づかれないでしょう。代わりに)呼び出されるべように変更するだけです。ディレクトリにあるZOOサービスプロバイダーの旧バージョンと置き換えなければなりません。対応するZOOのメタデータファイルを同じディレクトリに置かなければなりません。ファイルで定義されるよりも多くの引数を渡すことができます。改名したコピーを使用して、バッファ識別子を記載してみましょう。リクエストを用いてサービスをテストしてください。バッファの結果を得られるでしょう。入力値がサービスをパスするかどうか上のコードをチェックすることに注意しましょう。なければデフォルト値として1を使用するようにして下さい。前の入力値を使わないようにするためです。値を変更することができます。セミコロンによって分割されることに注意してください。設定する場合、異なる結果が与えられるでしょう。ソースコード上で1をデフォルト値と定めたため、いかなるパラメータも渡されないからです。インプットを、ジオメトリインスタンスにおけるバッファ方法を引数として加えたのみです。ファイルに追加した後で、ZOOカーネルのディレクトリの中に(もしくは、ZOOサービスプロバイダのルートディレクトリからインストールする形で)それをコピーしてください。ファイルを詳述する必要があることに注意してください。加えなければなりません。ブロックに以下のラインを加えてください。設定されているので、パスを通す必要はありません。ZOOカーネルは、任意のパラメータのためにデフォルト設定値とサービス機能にデフォルト値を通すことを知る必要があります。ファイルのフルコピーを取得できます。ZOOカーネルにたずねることができます。