= 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ファイルを詳述する必要があることに注意してください。
==== バッファ !MetadataFile ファイル ====
クライアントにサービスがこのパラメータをサポートするようにするため、 サービス・メタデータ・ファイルに{{{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]