= Creating OGR based Web Services =
[[TOC(noheading)]]
[wiki:ZooWorkshop/FOSS4GJapan/ja/UsingZooFromOSGeoLiveVM Prev.] | [wiki:ZooWorkshop/FOSS4GJapan WorkShop table of content] | [wiki:ZooWorkshop/FOSS4GJapan/ja/BuildingWPSClientUsingOL Next]
[[Image(http://www.lafon-svv.com/html/images/ligne_horizontale.gif,width=530px,height=0.5px,nolink)]]
== Introduction ==
翻訳中・・・
== Preparing ZOO metadata file ==
翻訳中・・・
=== Boundary ===
翻訳中・・・
==== C Version ====
翻訳中・・・
==== Python Version ====
翻訳中・・・
==== Testing the Service using Execute Request ====
翻訳中・・・
===== The simple and unreadable way =====
翻訳中・・・
===== Simplification and readability of request =====
翻訳中・・・
=== Creating Services for other functions (!ConvexHull and Centroid) ===
翻訳中・・・
==== C Version ====
翻訳中・・・
==== Python Version ====
翻訳中・・・
=== バッファサービス作成 ===
我々はバッファサービスを使用することができますが、他のサービスに比べ多くの引数を必要とします。実際コードは、境界や凸包、そして中心点生成サービスを実装する際に使用されるものと少々異なっているからです。
バッファサービスもまた、入力引数としてジオメトリを必要としますが、使用するのは {{{BufferDistance}} のパラメータです。これにより、単純な整数値として {{{BufferDistance}} の{{{LitteralData}}} ブロックを定義できるでしょう。そのような種類の入力値の読込処理は、以前使用したのと同じ機能が使用されます。
==== C バージョン ====
あなたが、最初の境界サービスのソースコードへ戻るならば、以下について非常に複雑になったとは気づかれないでしょう。実際、あなたはBufferDistance 引数のアクセスに加えて、[http://www.gdal.org/ogr/ogr__api_8h.html#1ca0bd5c0fcb4b1af3c3973e467b0ec0 OGR_G_Buffer] が( {{{OGR_G_GetBoundary}}} の代わりに)呼び出されるべように変更するだけです。ここに、全てのlcodeを示します:
{{{
int Buffer(maps*& conf,maps*& inputs,maps*& outputs){
OGRGeometryH geometry,res;
map* tmp1=getMapFromMaps(inputs,"InputPolygon","value");
if(tmp==NULL){
setMapInMaps(conf,"lenv","message","Unable to fetch InputPolygon value.");
return SERVICE_FAILED;
}
map* tmp1=getMapFromMaps(inputs,"InputPolygon","mimeType");
if(strncmp(tmp->value,"application/json",16)==0)
geometry=OGR_G_CreateGeometryFromJson(tmp->value);
else
geometry=createGeometryFromWFS(conf,tmp->value);
double bufferDistance=1;
tmp=getMapFromMaps(inputs,"BufferDistance","value");
if(tmp!=NULL)
bufferDistance=atof(tmp->value);
res=OGR_G_Buffer(geometry,bufferDistance,30);
tmp1=getMapFromMaps(outputs,"Result","mimeType");
if(strncmp(tmp1->value,"application/json",16)==0){
char *tmp=OGR_G_ExportToJson(res);
setMapInMaps(outputs,"Result","value",tmp);
setMapInMaps(outputs,"Result","mimeType","text/plain");
free(tmp);
}
else{
char *tmp=OGR_G_ExportToGML(res);
setMapInMaps(outputs,"Result","value",tmp);
free(tmp);
}
outputs->next=NULL;
OGR_G_DestroyGeometry(geometry);
OGR_G_DestroyGeometry(res);
return SERVICE_SUCCEEDED;
}
}}}
新しいコードは、あなたの{{{service.c}}} ファイルに挿入し、再コンパイルの後に {{{/usr/lib/cgi-bin/}}} ディレクトリにあるZOOサービスプロバイダーの旧バージョンと置き換えなければなりません。もちろん、対応するZOOのメタデータファイルを同じディレクトリに置かなければなりません。
以前の説明にあったように、ZOOカーネルは、zcfg ファイルで定義されるよりも多くの引数を渡すことができます。ですから、{{{Boundary.zcfg}}} ファイルを {{{Buffer.zcfg}}} と改名したコピーを使用して、バッファ識別子を記載してみましょう。その際、以前も行ったように {{{Execute}}} リクエストを用いてサービスをテストしてください。そうすると、{{{ResponseDocument}}} でバッファの結果を得られるでしょう。
{{{BufferDistance}}} 入力値がサービスをパスするかどうか上のコードをチェックすることに注意しましょう。 もし、そうでなければデフォルト値として1を使用するようにして下さい。前の入力値を使わないようにするためです。
リクエストに !DataInputs 値を加えることによって、ジオメトリのバッファを計算するのにあなたのサービスで使用された{{{BufferDistance}}} 値を変更することができます。KVP シンタックスを使用することで、各 !DataInputs が、セミコロンによって分割されることに注意してください。
以前のリクエスト:
{{{
DataInputs=InputPolygon=Reference@xlink:href=http%3A%2F%2Flocalhost%3A8082%2Fgeoserver%2Fows%3FSERVICE%3DWFS%26REQUEST%3DGetFeature%26VERSION%3D1.0.0%26typename%3Dtopp%3Astates%26SRS%3DEPSG%3A4326%26FeatureID%3Dstates.15
}}}
以下のように置き換えます:
{{{
DataInputs=InputPolygon=Reference@xlink:href=http%3A%2F%2Flocalhost%3A8082%2Fgeoserver%2Fows%3FSERVICE%3DWFS%26REQUEST%3DGetFeature%26VERSION%3D1.0.0%26typename%3Dtopp%3Astates%26SRS%3DEPSG%3A4326%26FeatureID%3Dstates.15;BufferDistance=2
}}}
{{{BufferDistance}}} 値を 2 に設定する場合、異なる結果が与えられるでしょう。なぜなら、ソースコード上で1をデフォルト値と定めたため、いかなるパラメータも渡されないからです。
ここで、 http://localhost/test_services.html のHTMLフォームから使用するXML形式における同じクエリを見つけられるでしょう:
{{{
#!xml
Buffer
InputPolygon
Playground area
BufferDistance
2
Buffer
Area serviced by playground.
Area within which most users of this playground will live.
}}}
==== Python バージョン ====
すでにユーティリティ機能の createGeometryFromWFS と outputResult を定義しているので、コードはこれと同じくらい簡単です:
{{{
#!python
def Buffer(conf,inputs,outputs):
geometry=extractInputs(inputs["InputPolygon"])
try:
bdist=int(inputs["BufferDistance"]["value"])
except:
bdist=10
rgeom=geometry.Buffer(bdist)
outputResult(outputs["Result"],rgeom)
geometry.Destroy()
rgeom.Destroy()
return 3
}}}
ここでは、["!BufferDistance"]["!value"] のインプットを、ジオメトリインスタンスにおけるバッファ方法を引数として加えたのみです。一旦このコードを、ogr_ws_service_provider.py ファイルに追加した後で、ZOOカーネルのディレクトリの中に(もしくは、ZOOサービスプロバイダのルートディレクトリからインストールする形で)それをコピーしてください。また、次のセクションで Buffer.zcfg ファイルを詳述する必要があることに注意してください。
==== バッファ メタファイル ====
クライアントにサービスがこのパラメータをサポートすることを知らせるようにするため、 サービス・メタデータ・ファイルに {{{BufferDistance}}} を加えなければなりません。 そうした上で、あなたのオリジナルのBoundary.zcfg ファイルを Buffer.zcfg ファイルとしてコピーして、!DataInputs のブロックに以下のラインを加えてください。
{{{
[BufferDistance]
Title = Buffer Distance
Abstract = Distance to be used to calculate buffer.
minOccurs = 0
maxOccurs = 1
DataType = float
uom = degree
value = 10
uom = meter
}}}
{{{minOccurs}}} は、パラメータの入力が任意であることを意味するために 0 が設定されているので、パスを通す必要はありません。 むしろ、ZOOカーネルは、任意のパラメータのためにデフォルト設定値とサービス機能にデフォルト値を通すことを知る必要があります。
あなたは、ここで {{{Buffer.zcfg}}} ファイルのフルコピーを取得できます。
http://zoo-project.org/trac/browser/trunk/zoo-services/ogr/base-vect-ops/cgi-env/Buffer.zcfg
あなたは、バッファサービスついて !GetCapabilities や !DescribeProcess そして Execute をZOOカーネルにたずねることが出来ます。
[wiki:ZooWorkshop/FOSS4GJapan/ja/UsingZooFromOSGeoLiveVM Prev.] | [wiki:ZooWorkshop/FOSS4GJapan WorkShop table of content] | [wiki:ZooWorkshop/FOSS4GJapan/ja/BuildingWPSClientUsingOL Next]