Version 3 (modified by hayashi, 14 years ago) |
---|
Creating OGR based Web Services
TOC(noheading)? Prev. | WorkShop table of content | Next
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 引数のアクセスに加えて、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形式における同じクエリを見つけられるでしょう:
<wps:Execute service="WPS" version="1.0.0" xmlns:wps="http://www.opengis.net/wps/1.0.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wps/1.0.0 ../wpsExecute_request.xsda"> <ows:Identifier>Buffer</ows:Identifier> <wps:DataInputs> <wps:Input> <ows:Identifier>InputPolygon</ows:Identifier> <ows:Title>Playground area</ows:Title> <wps:Reference xlink:href="http://localhost:8082/geoserver/ows/?SERVICE=WFS&REQUEST=GetFeature&VERSION=1.0.0&typename=topp:states&SRS=EPS G:4326&FeatureID=states.15"/> </wps:Input> <wps:Input> <ows:Identifier>BufferDistance</ows:Identifier> <wps:Data> <wps:LiteralData uom="degree">2</wps:LiteralData> </wps:Data> </wps:Input> </wps:DataInputs> <wps:ResponseForm> <wps:ResponseDocument> <wps:Output> <ows:Identifier>Buffer</ows:Identifier> <ows:Title>Area serviced by playground.</ows:Title> <ows:Abstract>Area within which most users of this playground will live.</ows:Abstract> </wps:Output> </wps:ResponseDocument> </wps:ResponseForm> </wps:Execute>
Python バージョン
すでにユーティリティ機能の createGeometryFromWFS と outputResult を定義しているので、コードはこれと同じくらい簡単です:
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 <LiteralData> DataType = float <Default> uom = degree value = 10 </Default> <Supported> uom = meter </Supported> </LiteralData>
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カーネルにたずねることが出来ます。