ZooWorkshop/FOSS4GJapan/ja/CreatingOGRBasedWebServices

Version 2 (modified by hayashi, 9 years ago)

--

Creating OGR based Web Services

TOC(noheading)? Prev. | WorkShop table of content | Next

http://www.lafon-svv.com/html/images/ligne_horizontale.gif

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&amp;REQUEST=GetFeature&amp;VERSION=1.0.0&amp;typename=topp:states&amp;SRS=EPS
G:4326&amp;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ファイルを詳述する必要があることに注意してください。

バッファ MetadataFile ファイル

クライアントにサービスがこのパラメータをサポートするようにするため、 サービス・メタデータ・ファイルに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カーネルにたずねることが出来ます。

Prev. | WorkShop table of content | Next

Search

ZOO Sponsors

http://www.zoo-project.org/trac/chrome/site/img/geolabs-logo.pnghttp://www.zoo-project.org/trac/chrome/site/img/neogeo-logo.png http://www.zoo-project.org/trac/chrome/site/img/apptech-logo.png http://www.zoo-project.org/trac/chrome/site/img/3liz-logo.png http://www.zoo-project.org/trac/chrome/site/img/gateway-logo.png

Become a sponsor !

Knowledge partners

http://www.zoo-project.org/trac/chrome/site/img/ocu-logo.png http://www.zoo-project.org/trac/chrome/site/img/gucas-logo.png http://www.zoo-project.org/trac/chrome/site/img/polimi-logo.png http://www.zoo-project.org/trac/chrome/site/img/fem-logo.png http://www.zoo-project.org/trac/chrome/site/img/supsi-logo.png http://www.zoo-project.org/trac/chrome/site/img/cumtb-logo.png

Become a knowledge partner

Related links

http://zoo-project.org/img/ogclogo.png http://zoo-project.org/img/osgeologo.png