source: branches/PublicaMundi_David-devel/docs/_build/html/workshop/2014/js_services_chaining.html @ 659

Last change on this file since 659 was 659, checked in by nbozon, 9 years ago

Massive update of zoo docs

File size: 63.4 KB
Line 
1
2
3<!DOCTYPE html>
4<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
5<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
6<head>
7  <meta charset="utf-8">
8  <meta name="viewport" content="width=device-width, initial-scale=1.0">
9 
10  <title>Playing with buildign blocks - Creating JavaScript Web Services &mdash; ZOO-Project 1.4a0 documentation</title>
11 
12  <link href="http://fonts.googleapis.com/css?family=Days+One" rel="stylesheet" type="text/css">
13 
14 
15
16 
17
18 
19 
20   
21      <link rel="search" type="application/opensearchdescription+xml" title="Search within ZOO-Project 1.4a0 documentation" href="../../_static/opensearch.xml"/>
22   
23
24 
25
26 
27 
28    <link rel="stylesheet" href="../../_static/css/theme.css" type="text/css" />
29 
30
31 
32
33 
34    <link rel="top" title="ZOO-Project 1.4a0 documentation" href="../../index.html"/> 
35
36 
37  <script src="_static/js/modernizr.min.js"></script>
38
39</head>
40
41<body class="wy-body-for-nav" role="document">
42
43  <div class="wy-grid-for-nav">
44
45   
46    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
47      <div class="wy-side-nav-search">
48       
49
50       
51          <a class="shrink" href="../../contents.html"><img src="http://zoo-project.org/img/zoo-sun-logo.png" class="img-responsive sun" style="display: inline;"> ZOO</a>
52       
53
54       
55        </a>
56
57       
58<div role="search">
59  <form id="rtd-search-form" class="wy-form" action="../../search.html" method="get">
60    <input type="text" name="q" placeholder="Search docs" />
61    <input type="hidden" name="check_keywords" value="yes" />
62    <input type="hidden" name="area" value="default" />
63  </form>
64</div>
65
66       
67      </div>
68
69      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
70       
71         
72         
73              <ul>
74<li class="toctree-l1"><a class="reference internal" href="../../intro.html">Introduction</a><ul>
75<li class="toctree-l2"><a class="reference internal" href="../../intro.html#what-is-zoo-project">What is ZOO-Project ?</a></li>
76<li class="toctree-l2"><a class="reference internal" href="../../intro.html#zoo-project-components">ZOO-Project components</a></li>
77<li class="toctree-l2"><a class="reference internal" href="../../intro.html#open-source">Open Source</a></li>
78</ul>
79</li>
80<li class="toctree-l1"><a class="reference internal" href="../../install/index.html">ZOO-Project installation</a><ul>
81<li class="toctree-l2"><a class="reference internal" href="../../install/install-prerequisites.html">Prerequisites</a></li>
82<li class="toctree-l2"><a class="reference internal" href="../../install/install-download.html">Download</a></li>
83<li class="toctree-l2"><a class="reference internal" href="../../install/install-confoptions.html">Configuration options</a></li>
84<li class="toctree-l2"><a class="reference internal" href="../../install/install-installation.html">Installation on Unix/Linux</a></li>
85<li class="toctree-l2"><a class="reference internal" href="../../install/install-installation.html#installation-on-mac-osx">Installation on Mac OSX</a></li>
86<li class="toctree-l2"><a class="reference internal" href="../../install/install-installation.html#installation-on-windows">Installation on Windows</a></li>
87</ul>
88</li>
89<li class="toctree-l1"><a class="reference internal" href="../../kernel/index.html">ZOO-Kernel</a><ul>
90<li class="toctree-l2"><a class="reference internal" href="../../kernel/what.html">What is ZOO-Kernel ?</a></li>
91<li class="toctree-l2"><a class="reference internal" href="../../kernel/configuration.html">ZOO-Kernel configuration</a></li>
92<li class="toctree-l2"><a class="reference internal" href="../../kernel/mapserver.html">Optional MapServer support</a></li>
93<li class="toctree-l2"><a class="reference internal" href="../../kernel/orfeotoolbox.html">Optional Orfeo Toolbox support</a></li>
94</ul>
95</li>
96<li class="toctree-l1"><a class="reference internal" href="../../services/index.html">ZOO-Services</a><ul>
97<li class="toctree-l2"><a class="reference internal" href="../../services/introduction.html">What are ZOO-Services ?</a></li>
98<li class="toctree-l2"><a class="reference internal" href="../../services/zcfg-reference.html">ZOO-Service configuration file</a></li>
99<li class="toctree-l2"><a class="reference internal" href="../../services/process-profiles.html">Process profiles registry</a></li>
100<li class="toctree-l2"><a class="reference internal" href="../../services/howtos.html">Create your own ZOO-Services</a></li>
101<li class="toctree-l2"><a class="reference internal" href="../../services/status.html">ZOO Status Service</a></li>
102<li class="toctree-l2"><a class="reference internal" href="../../services/debug.html">How To Debug ZOO Services</a></li>
103<li class="toctree-l2"><a class="reference internal" href="../../services/zoo-services.html">Available ZOO-Services</a></li>
104</ul>
105</li>
106<li class="toctree-l1"><a class="reference internal" href="../../api/index.html">ZOO-API</a><ul>
107<li class="toctree-l2"><a class="reference internal" href="../../api/what.html">What is ZOO-API ?</a></li>
108<li class="toctree-l2"><a class="reference internal" href="../../api/howto.html">Using ZOO-API</a></li>
109<li class="toctree-l2"><a class="reference internal" href="../../api/classes.html">ZOO-API Classes</a></li>
110<li class="toctree-l2"><a class="reference internal" href="../../api/examples.html">Examples</a></li>
111</ul>
112</li>
113<li class="toctree-l1"><a class="reference internal" href="../../client/index.html">ZOO-Client</a><ul>
114<li class="toctree-l2"><a class="reference internal" href="../../client/what.html">What is ZOO-Client ?</a></li>
115<li class="toctree-l2"><a class="reference internal" href="../../client/howto.html">Using ZOO-Client</a></li>
116<li class="toctree-l2"><a class="reference internal" href="../../client/example.html">Example application</a></li>
117</ul>
118</li>
119</ul>
120
121         
122       
123      </div>
124      &nbsp;
125    </nav>
126
127    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
128
129     
130      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
131        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
132        <a href="../../contents.html">ZOO-Project</a>
133      </nav>
134
135
136     
137      <div class="wy-nav-content">
138        <div class="rst-content">
139          <div role="navigation" aria-label="breadcrumbs navigation">
140  <ul class="wy-breadcrumbs">
141
142    <li><a href="../../contents.html"> Docs</a> &#8725; &#160;</li>
143     
144    <li>Playing with buildign blocks - Creating JavaScript Web Services</li>
145      <li class="wy-breadcrumbs-aside">
146       
147          <a href="../../_sources/workshop/2014/js_services_chaining.txt" rel="nofollow"> View page source</a>
148       
149      </li>
150  </ul>
151  <hr/>
152</div>
153          <div role="main" class="document">
154           
155  <div class="section" id="playing-with-buildign-blocks-creating-javascript-web-services">
156<span id="ogr-base-vect-ops"></span><h1><a class="toc-backref" href="#table-of-contents">Playing with buildign blocks - Creating JavaScript Web Services</a><a class="headerlink" href="#playing-with-buildign-blocks-creating-javascript-web-services" title="Permalink to this headline"></a></h1>
157<div class="contents topic" id="table-of-contents">
158<p class="topic-title first">Table of Contents</p>
159<ul class="simple">
160<li><a class="reference internal" href="#playing-with-buildign-blocks-creating-javascript-web-services" id="id12">Playing with buildign blocks - Creating JavaScript Web Services</a><ul>
161<li><a class="reference internal" href="#introduction" id="id13">Introduction</a></li>
162<li><a class="reference internal" href="#zoo-api-overview" id="id14">ZOO-API Overview</a></li>
163<li><a class="reference internal" href="#the-mask-service" id="id15">The Mask Service</a><ul>
164<li><a class="reference internal" href="#the-zcfg" id="id16">The ZCFG</a></li>
165<li><a class="reference internal" href="#the-javascript-service" id="id17">The JavaScript service</a></li>
166<li><a class="reference internal" href="#publish-and-use-your-service" id="id18">Publish and use your Service</a></li>
167</ul>
168</li>
169<li><a class="reference internal" href="#buffermask-service" id="id19">BufferMask Service</a><ul>
170<li><a class="reference internal" href="#id6" id="id20">The ZCFG</a></li>
171<li><a class="reference internal" href="#id7" id="id21">The JavaScript service</a></li>
172<li><a class="reference internal" href="#id8" id="id22">Publish and use your Service</a></li>
173</ul>
174</li>
175<li><a class="reference internal" href="#bufferrequest-service" id="id23">BufferRequest service</a><ul>
176<li><a class="reference internal" href="#id10" id="id24">The ZCFG</a></li>
177<li><a class="reference internal" href="#the-javascript-code" id="id25">The JavaScript code</a></li>
178<li><a class="reference internal" href="#id11" id="id26">Publish and use your Service</a></li>
179</ul>
180</li>
181<li><a class="reference internal" href="#add-union-into-the-chain" id="id27">Add Union into the chain</a></li>
182<li><a class="reference internal" href="#conclusion" id="id28">Conclusion</a></li>
183</ul>
184</li>
185</ul>
186</div>
187<div class="section" id="introduction">
188<h2><a class="toc-backref" href="#table-of-contents">Introduction</a><a class="headerlink" href="#introduction" title="Permalink to this headline"></a></h2>
189<p>This section illustrate how you can use JavaScript on the server-side to chain
190services together to build new ones. You will create a ZOO Services Provider
191using the services you seen before and the WFS server using the ZOO-API. The
192final goal is to query all POIs included in a buffer around a feature and
193to highlight them using a mask around this buffer. The following screenshot show
194you the expected result:</p>
195<a class="reference internal image-reference" href="../../_images/BufferMaskAndRequest_Level_15.png"><img alt="../../_images/BufferMaskAndRequest_Level_15.png" class="align-center" src="../../_images/BufferMaskAndRequest_Level_15.png" style="width: 650px;" /></a>
196<p>For the routing interface result should look like this:</p>
197<a class="reference internal image-reference" href="../../_images/BufferMaskAndRequest_Routing_Level_15.png"><img alt="../../_images/BufferMaskAndRequest_Routing_Level_15.png" class="align-center" src="../../_images/BufferMaskAndRequest_Routing_Level_15.png" style="width: 650px;" /></a>
198<p>You can decompose the result above in two different ones: the mask around the
199buffer and the points included in the buffer. So you will create two different
200Services: one called <code class="docutils literal"><span class="pre">BufferMask</span></code> and another one called <code class="docutils literal"><span class="pre">BufferRequest</span></code>.</p>
201<p>But before implementing any JavaScript Service, you will get an overview of how
202to use ZOO-API from your ZOO-Project installation in the next section.</p>
203<p>As before, you first create a new directory to store files for your new Services
204Provider:</p>
205<div class="highlight-guess"><div class="highlight"><pre>mkdir -p ~/zoo-ws/jschains/cgi-env/
206</pre></div>
207</div>
208</div>
209<div class="section" id="zoo-api-overview">
210<h2><a class="toc-backref" href="#table-of-contents">ZOO-API Overview</a><a class="headerlink" href="#zoo-api-overview" title="Permalink to this headline"></a></h2>
211<p>ZOO-API and ZOO-Kernel JavaScript support make you able to run services
212implemented in JavaScript on the server side. JavaScript is a popular programing
213language but mostly used on the client side. Let say from a browser, but here it
214is a bit different.</p>
215<p>To support JavaScript language ZOO-Kernel use the
216<a class="reference external" href="https://developer.mozilla.org/en/SpiderMonkey">SpiderMonkey</a> API to create a
217javascript runtime environment from which it will load your JS file then extract
218the function corresponding to the service to run it using the prefilled
219parameters. The JavaScript runtime environment created by the ZOO-Kernel
220depend on your setup. If you placed the <code class="docutils literal"><span class="pre">ZOO-api.js</span></code> and <code class="docutils literal"><span class="pre">ZOO-proj4js.js</span></code> in
221the same directory as your ZOO-Kernel it means that your environment will
222contains ZOO-API and Proj4js which will be loaded before your service. In such case you can access to the Classes defined in the JavaScript ZOO-API
223to manipulate geographic data, for more informations please refer to the
224<a class="reference external" href="http://zoo-project.org/docs/api/index.html">ZOO-API Documentation</a>.</p>
225<p>Even if it can be useful to run JavaScript on the server side, you should
226remember that some basic JavaScript functions you are familiar with does not
227exist or get a different behavior. For instance the simple <code class="docutils literal"><span class="pre">alert</span></code>
228function will display messages in apache error logs rather than in a window when
229used from a browser. The <code class="docutils literal"><span class="pre">alert</span></code> function can be used as follow:</p>
230<div class="highlight-guess"><div class="highlight"><pre>alert(&quot;My alert message&quot;);
231</pre></div>
232</div>
233<p>There is no XMLHttpRequest available in the JavaScript evironement your service
234will run into. Hopefully, the ZOO-Kernel expose a C function to the JavaScript
235world named: <code class="docutils literal"><span class="pre">JSRequest</span></code>. This function make you able from your JavaScript
236services to call other WPS services (locally or remotelly) or other kind OGC
237services such as WFS. When you are using the ZOO-API it is possible to call
238Services using a <code class="docutils literal"><span class="pre">ZOO.Process</span></code> instance <a class="footnote-reference" href="#f3" id="id1">[1]</a>, to parse WPS Responses using
239<code class="docutils literal"><span class="pre">ZOO.Format.WPS</span></code>
240(cf. <a class="reference external" href="http://zoo-project.org/docs/api/zoo-process.html">ref</a>).</p>
241<p>As for Python services you already seen in previous sections, the functions
242corresponding to a Service should take three arguments: <code class="docutils literal"><span class="pre">conf</span></code>, <code class="docutils literal"><span class="pre">inputs</span></code> and
243<code class="docutils literal"><span class="pre">outputs</span></code> <a class="footnote-reference" href="#f4" id="id2">[2]</a>. Nevertheless, as the ZOO-Kernel is not able to access the
244values modified <a class="footnote-reference" href="#f5" id="id3">[3]</a> by the Service code, rather than returning an integer as
245in Python, here you&#8217;ll need to return both the integer value representing the
246Status of your Service in a JavaScript Object and the resulting <code class="docutils literal"><span class="pre">outputs</span></code>
247values as an Object <a class="footnote-reference" href="#f6" id="id4">[4]</a>. You can see in the following an example of a JavaScript
248Service code:</p>
249<div class="highlight-none"><div class="highlight"><pre>function SampleService(conf,inputs,outputs){
250  var resultValue=someComputation(inputs);
251  return
252    {
253        result: ZOO.SERVICE_SUCCEEDED,
254        outputs: { &quot;Result&quot;: { &quot;mimeType&quot;: &quot;application/json&quot;, &quot;value&quot;: resultValue } }
255    };
256}
257</pre></div>
258</div>
259<p>Before starting to implement the Services we will need to get our final
260BufferRequest service, let start with a simplier one.</p>
261</div>
262<div class="section" id="the-mask-service">
263<h2><a class="toc-backref" href="#table-of-contents">The Mask Service</a><a class="headerlink" href="#the-mask-service" title="Permalink to this headline"></a></h2>
264<p>In this section you will learn how to create your first JavaScript service which
265will simply return a rectangular mask around a selected feature. To build this
266mask you will use the Buffer service to create a buffer big enough around a
267selected geometry to cover a significant part of your map. You can see the
268expected result in the following screenshot:</p>
269<a class="reference internal image-reference" href="../../_images/Mask_Level_12.png"><img alt="../../_images/Mask_Level_12.png" class="align-center" src="../../_images/Mask_Level_12.png" style="width: 650px;" /></a>
270<p>As before, you will first start by writting the ZCFG, then you will write the
271JavaScript source code and finish by publishing your Services Provider.</p>
272<div class="section" id="the-zcfg">
273<h3><a class="toc-backref" href="#table-of-contents">The ZCFG</a><a class="headerlink" href="#the-zcfg" title="Permalink to this headline"></a></h3>
274<p>Open a file named
275<code class="docutils literal"><span class="pre">~/zoo-ws/jschains/cgi-env/Mask.zcfg</span></code>
276with your favorite text editor and add the following content:</p>
277<div class="highlight-none"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
278 2
279 3
280 4
281 5
282 6
283 7
284 8
285 9
28610
28711
28812
28913
29014
29115
29216
29317
29418
29519
29620
29721
29822
29923
30024
30125
30226
30327
30428
30529
30630
30731</pre></div></td><td class="code"><div class="highlight"><pre>[Mask]
308 Title = Compute mask
309 Abstract = Compute mask around a geometry
310 processVersion = 1
311 storeSupported = true
312 statusSupported = true
313 serviceProvider = foss4gws.js
314 serviceType = JS
315 &lt;DataInputs&gt;
316  [InputData]
317   Title = The feature
318   Abstract = The feature to run the service with
319   minOccurs = 1
320   maxOccurs = 1
321   &lt;ComplexData&gt;
322    &lt;Default&gt;
323    mimeType = text/xml
324    encoding = utf-8
325    &lt;/Default&gt;
326   &lt;/ComplexData&gt;
327 &lt;/DataInputs&gt;
328 &lt;DataOutputs&gt;
329  [Result]
330   Title = The resulting feature
331   Abstract = The feature created by the service.
332   &lt;ComplexOutput&gt;
333     &lt;Default&gt;
334     mimeType = application/json
335     &lt;/Default&gt;
336   &lt;/ComplexOutput&gt;
337 &lt;/DataOutputs&gt;
338</pre></div>
339</td></tr></table></div>
340<p>Here you simply define one default <code class="docutils literal"><span class="pre">ComplexData</span></code> for both <code class="docutils literal"><span class="pre">inputData</span></code> and
341<code class="docutils literal"><span class="pre">Result</span></code>: a GML and a GeoJSON respectively <a class="footnote-reference" href="#f7" id="id5">[5]</a>.</p>
342</div>
343<div class="section" id="the-javascript-service">
344<h3><a class="toc-backref" href="#table-of-contents">The JavaScript service</a><a class="headerlink" href="#the-javascript-service" title="Permalink to this headline"></a></h3>
345<p>As you will have to request the Buffer service many times from your service, you
346will first define a <code class="docutils literal"><span class="pre">Buffer</span></code> function as follow. It uses the <code class="docutils literal"><span class="pre">ZOO.Process</span></code>
347to request the Buffer service you seen in the previous section.</p>
348<p>Open a file named
349<code class="docutils literal"><span class="pre">~/zoo-ws/jschains/cgi-env/foss4gws.js</span></code> and
350add the following content:</p>
351<div class="highlight-javascript"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
352 2
353 3
354 4
355 5
356 6
357 7
358 8
359 9
36010
36111
36212
36313
36414
36515
36616
36717
36818
36919
37020
37121
37222
37323</pre></div></td><td class="code"><div class="highlight"><pre><span class="kd">var</span> <span class="nx">zoo_url</span><span class="o">=</span><span class="s1">&#39;http://localhost/cgi-bin/zoo_loader.cgi&#39;</span><span class="p">;</span>
374<span class="kd">var</span> <span class="nx">mapfile</span><span class="o">=</span><span class="s2">&quot;/var/data/maps/project_WS2014.map&quot;</span><span class="p">;</span>
375<span class="kd">var</span> <span class="nx">mapserv_url</span><span class="o">=</span><span class="s2">&quot;http://localhost/cgi-bin/mapserv?map=&quot;</span><span class="o">+</span><span class="nx">mapfile</span><span class="p">;</span>
376
377<span class="kd">function</span> <span class="nx">Buffer</span><span class="p">(</span><span class="nx">inputData</span><span class="p">,</span><span class="nx">bDist</span><span class="p">){</span>
378
379  <span class="c1">// Create all required ZOO.formats</span>
380  <span class="kd">var</span> <span class="nx">fJ</span><span class="o">=</span><span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Format</span><span class="p">.</span><span class="nx">JSON</span><span class="p">();</span>
381  <span class="kd">var</span> <span class="nx">fGJ</span><span class="o">=</span><span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Format</span><span class="p">.</span><span class="nx">GeoJSON</span><span class="p">();</span>
382  <span class="kd">var</span> <span class="nx">fWPS</span><span class="o">=</span><span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Format</span><span class="p">.</span><span class="nx">WPS</span><span class="p">();</span>
383
384  <span class="c1">// Pass the value as json</span>
385  <span class="kd">var</span> <span class="nx">myInputs</span> <span class="o">=</span> <span class="p">{</span>
386      <span class="nx">InputPolygon</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;complex&#39;</span><span class="p">,</span> <span class="nx">value</span><span class="o">:</span> <span class="nx">fGJ</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="nx">inputData</span><span class="p">),</span> <span class="nx">mimeType</span><span class="o">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">},</span>
387      <span class="nx">BufferDistance</span><span class="o">:</span> <span class="p">{</span><span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;float&#39;</span><span class="p">,</span> <span class="s2">&quot;value&quot;</span><span class="o">:</span> <span class="nx">bDist</span> <span class="p">}</span>
388  <span class="p">};</span>
389  <span class="kd">var</span> <span class="nx">myOutputs</span><span class="o">=</span> <span class="p">{</span> <span class="nx">Result</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;RawDataOutput&#39;</span><span class="p">,</span> <span class="s2">&quot;mimeType&quot;</span><span class="o">:</span> <span class="s2">&quot;application/json&quot;</span> <span class="p">}</span> <span class="p">};</span>
390  <span class="kd">var</span> <span class="nx">myProcess</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Process</span><span class="p">(</span><span class="nx">zoo_url</span><span class="p">,</span><span class="s1">&#39;BufferPy&#39;</span><span class="p">);</span>
391  <span class="kd">var</span> <span class="nx">myExecuteResult</span><span class="o">=</span><span class="nx">myProcess</span><span class="p">.</span><span class="nx">Execute</span><span class="p">(</span><span class="nx">myInputs</span><span class="p">,</span><span class="nx">myOutputs</span><span class="p">);</span>
392
393  <span class="k">return</span> <span class="nx">fGJ</span><span class="p">.</span><span class="nx">read</span><span class="p">(</span><span class="nx">myExecuteResult</span><span class="p">);</span>
394
395<span class="p">}</span>
396</pre></div>
397</td></tr></table></div>
398<p>From line 12 to 16, you give a GeoJSON string (created from <code class="docutils literal"><span class="pre">inputData</span></code>) for
399InputPolygon and, on line 15, you set the BufferDistance value to <code class="docutils literal"><span class="pre">bDist</span></code>.
400On line 17, you define Result as a RawDataOutput, so you won&#8217;tl have to parse the
401WPS response using the ZOO.Format.WPS.</p>
402<p>On line 18, you create a
403<a class="reference external" href="http://zoo-project.org/docs/api/zoo-process.html#zoo-process">ZOO.Process</a>
404instance providing the ZOO-Kernel url and the Service name. Then, on line 19, you
405run the request passing inputs and outputs previously defined (from line 12 to 15). On line 21 you return the GeoJSON red.</p>
406<p>Now, you get your <code class="docutils literal"><span class="pre">Buffer</span></code> function, it is time to create your first JavaScript
407service. So, edit your <code class="docutils literal"><span class="pre">foss4gws.js</span></code> file you created before and add the following content:</p>
408<div class="highlight-javascript"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
409 2
410 3
411 4
412 5
413 6
414 7
415 8
416 9
41710
41811
41912
42013
42114
42215
42316
42417
42518
42619
42720
42821
42922
43023
43124
43225
43326
43427
43528</pre></div></td><td class="code"><div class="highlight"><pre><span class="kd">function</span> <span class="nx">Mask</span><span class="p">(</span><span class="nx">conf</span><span class="p">,</span><span class="nx">inputs</span><span class="p">,</span><span class="nx">outputs</span><span class="p">){</span>
436
437  <span class="c1">// Create all required ZOO.formats</span>
438  <span class="kd">var</span> <span class="nx">fGML</span><span class="o">=</span><span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Format</span><span class="p">.</span><span class="nx">GML</span><span class="p">();</span>
439  <span class="kd">var</span> <span class="nx">fGJ</span><span class="o">=</span><span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Format</span><span class="p">.</span><span class="nx">GeoJSON</span><span class="p">();</span>
440
441  <span class="c1">// Read the input GML</span>
442  <span class="kd">var</span> <span class="nx">inputData</span><span class="o">=</span><span class="nx">fGML</span><span class="p">.</span><span class="nx">read</span><span class="p">(</span><span class="nx">inputs</span><span class="p">[</span><span class="s2">&quot;InputData&quot;</span><span class="p">][</span><span class="s2">&quot;value&quot;</span><span class="p">]);</span>
443
444  <span class="c1">// Compute Buffer</span>
445  <span class="kd">var</span> <span class="nx">bufferResultAsJSON</span><span class="o">=</span><span class="nx">Buffer</span><span class="p">(</span><span class="nx">inputData</span><span class="p">,</span><span class="mf">0.015</span><span class="p">);</span>
446
447  <span class="c1">// Create the Buffer result BBOX and store its geometry in a ZOO.Feature</span>
448  <span class="kd">var</span> <span class="nx">bbox</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Bounds</span><span class="p">();</span>
449  <span class="kd">var</span> <span class="nx">bounds</span><span class="o">=</span><span class="nx">bufferResultAsJSON</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">geometry</span><span class="p">.</span><span class="nx">getVertices</span><span class="p">();</span>
450  <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">t</span> <span class="k">in</span> <span class="nx">bounds</span><span class="p">){</span>
451    <span class="nx">bbox</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">bounds</span><span class="p">[</span><span class="nx">t</span><span class="p">]);</span>
452  <span class="p">}</span>
453  <span class="kd">var</span> <span class="nx">finalG</span><span class="o">=</span><span class="nx">bbox</span><span class="p">.</span><span class="nx">toGeometry</span><span class="p">();</span>
454  <span class="kd">var</span> <span class="nx">result</span><span class="o">=</span><span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Feature</span><span class="p">(</span><span class="nx">finalG</span><span class="p">,{</span><span class="s2">&quot;name&quot;</span><span class="o">:</span> <span class="s2">&quot;Result1000&quot;</span><span class="p">});</span>
455
456  <span class="c1">// Return the created feature</span>
457  <span class="k">return</span> <span class="p">{</span>
458      <span class="nx">result</span><span class="o">:</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">SERVICE_SUCCEEDED</span><span class="p">,</span>
459      <span class="nx">outputs</span><span class="o">:</span> <span class="p">{</span> <span class="s2">&quot;Result&quot;</span><span class="o">:</span> <span class="p">{</span> <span class="nx">mimeType</span><span class="o">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="nx">value</span><span class="o">:</span> <span class="nx">fGJ</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="nx">result</span><span class="p">)</span> <span class="p">}</span> <span class="p">}</span>
460  <span class="p">};</span>
461
462<span class="p">}</span>
463</pre></div>
464</td></tr></table></div>
465</div>
466<div class="section" id="publish-and-use-your-service">
467<h3><a class="toc-backref" href="#table-of-contents">Publish and use your Service</a><a class="headerlink" href="#publish-and-use-your-service" title="Permalink to this headline"></a></h3>
468<p>Now you get both your ZCFG and your service code ready, you need to deploy your
469new Services Provider using the following command:</p>
470<div class="highlight-bash"><div class="highlight"><pre>sudo cp ~/zoo-ws/jschains/cgi-env/* /usr/lib/cgi-bin
471</pre></div>
472</div>
473<p>Now you are ready to use your JavaScript service by loading the following <a class="reference external" href="http://localhost/zoo-ws/spatialtools.html">url</a>, click on a street then click on
474the &#8220;Mask&#8221; button.</p>
475</div>
476</div>
477<div class="section" id="buffermask-service">
478<h2><a class="toc-backref" href="#table-of-contents">BufferMask Service</a><a class="headerlink" href="#buffermask-service" title="Permalink to this headline"></a></h2>
479<p>In this section you will implement a simple JavaScript service which will be able create
480a hole in the mask you created in <a class="reference external" href="#mask-service">previous section</a>. This service
481will be used to highlight the buffer zone around a selected fature. You get a preview of
482the expected result in the following screenshot:</p>
483<a class="reference internal image-reference" href="../../_images/BufferMask_Level_15.png"><img alt="../../_images/BufferMask_Level_15.png" class="align-center" src="../../_images/BufferMask_Level_15.png" style="width: 650px;" /></a>
484<div class="section" id="id6">
485<h3><a class="toc-backref" href="#table-of-contents">The ZCFG</a><a class="headerlink" href="#id6" title="Permalink to this headline"></a></h3>
486<p>Open the file named
487<code class="docutils literal"><span class="pre">~/zoo-ws/jschains/cgi-env/BufferMask.zcfg</span></code>
488with your favorite text editor and copy / paste the following content:</p>
489<div class="highlight-none"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
490 2
491 3
492 4
493 5
494 6
495 7
496 8
497 9
49810
49911
50012
50113
50214
50315
50416
50517
50618
50719
50820
50921
51022
51123
51224
51325
51426
51527
51628
51729
51830
51931</pre></div></td><td class="code"><div class="highlight"><pre>[BufferMask]
520 Title = Compute buffer mask
521 Abstract = Compute buffer mask around a geometry
522 processVersion = 1
523 storeSupported = true
524 statusSupported = true
525 serviceProvider = foss4gws.js
526 serviceType = JS
527 &lt;DataInputs&gt;
528  [InputData]
529   Title = The feature
530   Abstract = The feature to run the service with
531   minOccurs = 1
532   maxOccurs = 1
533   &lt;ComplexData&gt;
534    &lt;Default&gt;
535    mimeType = text/xml
536    encoding = utf-8
537    &lt;/Default&gt;
538   &lt;/ComplexData&gt;
539 &lt;/DataInputs&gt;
540 &lt;DataOutputs&gt;
541  [Result]
542   Title = The resulting feature
543   Abstract = The feature created by the service.
544   &lt;ComplexOutput&gt;
545     &lt;Default&gt;
546     mimeType = application/json
547     &lt;/Default&gt;
548   &lt;/ComplexOutput&gt;
549 &lt;/DataOutputs&gt;
550</pre></div>
551</td></tr></table></div>
552<p>This ZCFG is similar to the previous one. Please, refer to comments in the
553<a class="reference external" href="#the-zcfg">previous section</a> for more informations.</p>
554</div>
555<div class="section" id="id7">
556<h3><a class="toc-backref" href="#table-of-contents">The JavaScript service</a><a class="headerlink" href="#id7" title="Permalink to this headline"></a></h3>
557<p>In this Service you will use same source code (until line 19) you used in the
558<a class="reference external" href="#the-javascript-service">previous section</a>. Indeed, you should compute the Mask
559as you did before then compute Buffer for creating a hole in the mask (on line 22) to run
560the Difference service (from line 25 to 40).</p>
561<div class="highlight-guess"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
562 2
563 3
564 4
565 5
566 6
567 7
568 8
569 9
57010
57111
57212
57313
57414
57515
57616
57717
57818
57919
58020
58121
58222
58323
58424
58525
58626
58727
58828
58929
59030
59131
59232
59333
59434
59535
59636
59737
59838
59939
60040
60141
60242
60343
60444
60545
60646
60747
60848
60949</pre></div></td><td class="code"><div class="highlight"><pre> <span class="kd">function</span> <span class="nx">BufferMask</span><span class="p">(</span><span class="nx">conf</span><span class="p">,</span><span class="nx">inputs</span><span class="p">,</span><span class="nx">outputs</span><span class="p">){</span>
610
611   <span class="c1">// Create all required ZOO.formats</span>
612   <span class="kd">var</span> <span class="nx">fGML</span><span class="o">=</span><span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Format</span><span class="p">.</span><span class="nx">GML</span><span class="p">();</span>
613   <span class="kd">var</span> <span class="nx">fGJ</span><span class="o">=</span><span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Format</span><span class="p">.</span><span class="nx">GeoJSON</span><span class="p">();</span>
614
615   <span class="c1">// Read the input GML</span>
616   <span class="kd">var</span> <span class="nx">inputData</span><span class="o">=</span><span class="nx">fGML</span><span class="p">.</span><span class="nx">read</span><span class="p">(</span><span class="nx">inputs</span><span class="cp">[</span><span class="s2">&quot;InputData&quot;</span><span class="cp">][</span><span class="s2">&quot;value&quot;</span><span class="cp">]</span><span class="p">);</span>
617
618   <span class="c1">// Compute Buffer</span>
619   <span class="kd">var</span> <span class="nx">bufferResultAsJSON</span><span class="o">=</span><span class="nx">Buffer</span><span class="p">(</span><span class="nx">inputData</span><span class="p">,</span><span class="mf">0.015</span><span class="p">);</span>
620
621   <span class="c1">// Create the Buffer result BBOX</span>
622   <span class="kd">var</span> <span class="nx">bbox</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Bounds</span><span class="p">();</span>
623   <span class="kd">var</span> <span class="nx">bounds</span><span class="o">=</span><span class="nx">bufferResultAsJSON</span><span class="cp">[</span><span class="mi">0</span><span class="cp">]</span><span class="p">.</span><span class="nx">geometry</span><span class="p">.</span><span class="nx">getVertices</span><span class="p">();</span>
624   <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">t</span> <span class="k">in</span> <span class="nx">bounds</span><span class="p">){</span>
625     <span class="nx">bbox</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">bounds</span><span class="cp">[</span><span class="nx">t</span><span class="cp">]</span><span class="p">);</span>
626   <span class="p">}</span>
627   <span class="kd">var</span> <span class="nx">finalG</span><span class="o">=</span><span class="nx">bbox</span><span class="p">.</span><span class="nx">toGeometry</span><span class="p">();</span>
628
629  <span class="c1">// Compute Buffer standard buffer</span>
630  <span class="kd">var</span> <span class="nx">bufferResultAsJSON</span><span class="o">=</span><span class="nx">Buffer</span><span class="p">(</span><span class="nx">inputData</span><span class="p">,</span><span class="mf">0.0015</span><span class="p">);</span>
631
632  <span class="c1">// Request Difference service using Buffer result and features in the BBOX</span>
633  <span class="kd">var</span> <span class="nx">result</span><span class="o">=</span><span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Feature</span><span class="p">(</span><span class="nx">finalG</span><span class="p">,{</span><span class="s2">&quot;name&quot;</span><span class="o">:</span> <span class="s2">&quot;Result1000&quot;</span><span class="p">});</span>
634  <span class="kd">var</span> <span class="nx">myProcess2</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Process</span><span class="p">(</span><span class="nx">zoo_url</span><span class="p">,</span><span class="s1">&#39;DifferencePy&#39;</span><span class="p">);</span>
635  <span class="kd">var</span> <span class="nx">myInputs2</span> <span class="o">=</span> <span class="p">{</span>
636      <span class="nx">InputEntity1</span><span class="o">:</span> <span class="p">{</span>
637          <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;complex&#39;</span><span class="p">,</span>
638          <span class="nx">value</span><span class="o">:</span> <span class="nx">fGJ</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="nx">finalG</span><span class="p">),</span>
639          <span class="nx">mimeType</span><span class="o">:</span> <span class="s2">&quot;application/json&quot;</span>
640      <span class="p">},</span>
641      <span class="nx">InputEntity2</span><span class="o">:</span> <span class="p">{</span>
642          <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;complex&#39;</span><span class="p">,</span>
643          <span class="nx">value</span><span class="o">:</span> <span class="nx">fGJ</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="nx">bufferResultAsJSON</span><span class="p">),</span>
644          <span class="nx">mimeType</span><span class="o">:</span> <span class="s2">&quot;application/json&quot;</span>
645      <span class="p">}</span>
646  <span class="p">};</span>
647  <span class="kd">var</span> <span class="nx">myOutputs2</span><span class="o">=</span> <span class="p">{</span><span class="nx">Result</span><span class="o">:</span> <span class="p">{</span><span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;RawDataOutput&#39;</span><span class="p">,</span>  <span class="nx">mimeType</span><span class="o">:</span> <span class="s2">&quot;application/json&quot;</span> <span class="p">}</span> <span class="p">};</span>
648  <span class="kd">var</span> <span class="nx">myExecuteResult4</span><span class="o">=</span><span class="nx">myProcess2</span><span class="p">.</span><span class="nx">Execute</span><span class="p">(</span><span class="nx">myInputs2</span><span class="p">,</span><span class="nx">myOutputs2</span><span class="p">);</span>
649
650   <span class="c1">// Return the bbox</span>
651   <span class="kd">var</span> <span class="nx">result</span><span class="o">=</span><span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Feature</span><span class="p">(</span><span class="nx">finalG</span><span class="p">,{</span><span class="s2">&quot;name&quot;</span><span class="o">:</span> <span class="s2">&quot;Result1000&quot;</span><span class="p">});</span>
652   <span class="k">return</span> <span class="p">{</span>
653       <span class="nx">result</span><span class="o">:</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">SERVICE_SUCCEEDED</span><span class="p">,</span>
654       <span class="nx">outputs</span><span class="o">:</span> <span class="p">{</span> <span class="s2">&quot;Result&quot;</span><span class="o">:</span> <span class="p">{</span><span class="nx">mimeType</span><span class="o">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="nx">value</span><span class="o">:</span> <span class="nx">myExecuteResult4</span> <span class="p">}</span> <span class="p">}</span>
655   <span class="p">};</span>
656
657 <span class="p">}</span>
658</pre></div>
659</td></tr></table></div>
660</div>
661<div class="section" id="id8">
662<h3><a class="toc-backref" href="#table-of-contents">Publish and use your Service</a><a class="headerlink" href="#id8" title="Permalink to this headline"></a></h3>
663<p>Now, you can publish your service as you did <a class="reference external" href="#publish-your-service">before</a>. To
664use your service, please use the following <a class="reference external" href="http://localhost/zoo-ws/spatialtools.html">url</a>.</p>
665</div>
666</div>
667<div class="section" id="bufferrequest-service">
668<h2><a class="toc-backref" href="#table-of-contents">BufferRequest service</a><a class="headerlink" href="#bufferrequest-service" title="Permalink to this headline"></a></h2>
669<p>In this section, you will create a new Service: <code class="docutils literal"><span class="pre">BufferRequest</span></code> which will request
670POIs included in the Buffer around a selected feature <a class="footnote-reference" href="#f8" id="id9">[6]</a>. You will use the <code class="docutils literal"><span class="pre">poi</span></code>
671layer served as WFS through your local mapserver installation. You can see in the
672following screenshot the expected result:</p>
673<a class="reference internal image-reference" href="../../_images/BufferRequest_Level_15.png"><img alt="../../_images/BufferRequest_Level_15.png" class="align-center" src="../../_images/BufferRequest_Level_15.png" style="width: 650px;" /></a>
674<div class="section" id="id10">
675<h3><a class="toc-backref" href="#table-of-contents">The ZCFG</a><a class="headerlink" href="#id10" title="Permalink to this headline"></a></h3>
676<p>Open the file named
677<code class="docutils literal"><span class="pre">~/zoo-ws/jschains/cgi-env/BufferRequest.zcfg</span></code>
678with your favorite text editor and copy / paste the following content:</p>
679<div class="highlight-none"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
680 2
681 3
682 4
683 5
684 6
685 7
686 8
687 9
68810
68911
69012
69113
69214
69315
69416
69517
69618
69719
69820
69921
70022
70123
70224
70325
70426
70527
70628
70729
70830
70931</pre></div></td><td class="code"><div class="highlight"><pre>[BufferRequest]
710 Title = Compute buffer request
711 Abstract = Compute buffer request around a geometry
712 processVersion = 1
713 storeSupported = true
714 statusSupported = true
715 serviceProvider = foss4gws.js
716 serviceType = JS
717 &lt;DataInputs&gt;
718  [InputData]
719   Title = The feature
720   Abstract = The feature to run the service with
721   minOccurs = 1
722   maxOccurs = 1
723   &lt;ComplexData&gt;
724    &lt;Default&gt;
725    mimeType = text/xml
726    encoding = utf-8
727    &lt;/Default&gt;
728   &lt;/ComplexData&gt;
729 &lt;/DataInputs&gt;
730 &lt;DataOutputs&gt;
731  [Result]
732   Title = The resulting feature
733   Abstract = The feature created by the service.
734   &lt;ComplexOutput&gt;
735     &lt;Default&gt;
736     mimeType = application/json
737     &lt;/Default&gt;
738   &lt;/ComplexOutput&gt;
739 &lt;/DataOutputs&gt;
740</pre></div>
741</td></tr></table></div>
742</div>
743<div class="section" id="the-javascript-code">
744<h3><a class="toc-backref" href="#table-of-contents">The JavaScript code</a><a class="headerlink" href="#the-javascript-code" title="Permalink to this headline"></a></h3>
745<p>As in the previous Service, you will compute a buffer around the input feature. But then
746you will request POIs available in the Buffer extent using a WFS request to use them to
747run <code class="docutils literal"><span class="pre">Intersection</span></code> service using the initial Buffer. The WFS request is useful to limit
748the number of points to use when requesting the <code class="docutils literal"><span class="pre">Intersection</span></code> Service.</p>
749<div class="highlight-javascript"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
750 2
751 3
752 4
753 5
754 6
755 7
756 8
757 9
75810
75911
76012
76113
76214
76315
76416
76517
76618
76719
76820
76921
77022
77123
77224
77325
77426
77527
77628
77729
77830
77931
78032
78133
78234
78335
78436
78537
78638
78739
78840
78941
79042
79143
79244
79345</pre></div></td><td class="code"><div class="highlight"><pre><span class="kd">function</span> <span class="nx">BufferRequest</span><span class="p">(</span><span class="nx">conf</span><span class="p">,</span><span class="nx">inputs</span><span class="p">,</span><span class="nx">outputs</span><span class="p">){</span>
794
795  <span class="c1">// Create all required ZOO.formats</span>
796  <span class="kd">var</span> <span class="nx">fGJ</span><span class="o">=</span><span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Format</span><span class="p">.</span><span class="nx">GeoJSON</span><span class="p">();</span>
797  <span class="kd">var</span> <span class="nx">fGML</span><span class="o">=</span><span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Format</span><span class="p">.</span><span class="nx">GML</span><span class="p">();</span>
798
799  <span class="c1">// Read the input GML</span>
800  <span class="kd">var</span> <span class="nx">inputData</span><span class="o">=</span><span class="nx">fGML</span><span class="p">.</span><span class="nx">read</span><span class="p">(</span><span class="nx">inputs</span><span class="p">[</span><span class="s2">&quot;InputData&quot;</span><span class="p">][</span><span class="s2">&quot;value&quot;</span><span class="p">]);</span>
801
802  <span class="c1">// Compute Buffer</span>
803  <span class="kd">var</span> <span class="nx">bufferResultAsJSON</span><span class="o">=</span><span class="nx">Buffer</span><span class="p">(</span><span class="nx">inputData</span><span class="p">,</span><span class="mf">0.0015</span><span class="p">);</span>
804
805  <span class="c1">// Create the Buffer result BBOX</span>
806  <span class="kd">var</span> <span class="nx">bbox</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Bounds</span><span class="p">();</span>
807  <span class="kd">var</span> <span class="nx">bounds</span><span class="o">=</span><span class="nx">bufferResultAsJSON</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nx">geometry</span><span class="p">.</span><span class="nx">getVertices</span><span class="p">();</span>
808  <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">t</span> <span class="k">in</span> <span class="nx">bounds</span><span class="p">){</span>
809    <span class="nx">bbox</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">bounds</span><span class="p">[</span><span class="nx">t</span><span class="p">]);</span>
810  <span class="p">}</span>
811
812  <span class="c1">// Request Intersection service using Buffer result and WFS request using the</span>
813  <span class="c1">// BBOX</span>
814  <span class="kd">var</span> <span class="nx">myProcess2</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Process</span><span class="p">(</span><span class="nx">zoo_url</span><span class="p">,</span><span class="s1">&#39;Intersection&#39;</span><span class="p">);</span>
815  <span class="kd">var</span> <span class="nx">req</span><span class="o">=</span><span class="s2">&quot;&amp;amp;SERVICE=WFS&amp;amp;version=1.0.0&amp;amp;request=GetFeature&amp;amp;typename=poi1&quot;</span><span class="p">;</span>
816  <span class="nx">req</span><span class="o">+=</span><span class="s2">&quot;&amp;amp;SRS=EPSG:4326&amp;amp;BBOX=&quot;</span><span class="p">;</span>
817  <span class="kd">var</span> <span class="nx">myInputs2</span> <span class="o">=</span> <span class="p">{</span>
818    <span class="nx">InputEntity1</span><span class="o">:</span> <span class="p">{</span>
819      <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;complex&#39;</span><span class="p">,</span>
820      <span class="nx">value</span><span class="o">:</span> <span class="nx">fGJ</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="nx">bufferResultAsJSON</span><span class="p">),</span>
821      <span class="nx">mimeType</span><span class="o">:</span> <span class="s2">&quot;application/json&quot;</span>
822    <span class="p">},</span>
823    <span class="nx">InputEntity2</span><span class="o">:</span> <span class="p">{</span>
824      <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;complex&#39;</span><span class="p">,</span>
825      <span class="nx">xlink</span><span class="o">:</span> <span class="nx">mapserv_url</span><span class="o">+</span><span class="nx">req</span><span class="o">+</span><span class="nx">bbox</span><span class="p">.</span><span class="nx">left</span><span class="o">+</span><span class="s2">&quot;,&quot;</span><span class="o">+</span><span class="nx">bbox</span><span class="p">.</span><span class="nx">bottom</span><span class="o">+</span><span class="s2">&quot;,&quot;</span><span class="o">+</span><span class="nx">bbox</span><span class="p">.</span><span class="nx">right</span><span class="o">+</span><span class="s2">&quot;,&quot;</span><span class="o">+</span><span class="nx">bbox</span><span class="p">.</span><span class="nx">top</span><span class="p">,</span>
826      <span class="nx">mimeType</span><span class="o">:</span> <span class="s2">&quot;text/xml&quot;</span>
827    <span class="p">}</span>
828  <span class="p">};</span>
829  <span class="kd">var</span> <span class="nx">myOutputs2</span><span class="o">=</span> <span class="p">{</span><span class="nx">Result</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;RawDataOutput&#39;</span><span class="p">,</span> <span class="s2">&quot;mimeType&quot;</span><span class="o">:</span> <span class="s2">&quot;application/json&quot;</span> <span class="p">}</span> <span class="p">};</span>
830  <span class="kd">var</span> <span class="nx">myExecuteResult4</span><span class="o">=</span><span class="nx">myProcess2</span><span class="p">.</span><span class="nx">Execute</span><span class="p">(</span><span class="nx">myInputs2</span><span class="p">,</span><span class="nx">myOutputs2</span><span class="p">);</span>
831
832  <span class="k">return</span> <span class="p">{</span>
833    <span class="nx">result</span><span class="o">:</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">SERVICE_SUCCEEDED</span><span class="p">,</span>
834    <span class="nx">outputs</span><span class="o">:</span> <span class="p">[</span> <span class="p">{</span><span class="nx">name</span><span class="o">:</span><span class="s2">&quot;Result&quot;</span><span class="p">,</span> <span class="nx">mimeType</span><span class="o">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">,</span> <span class="nx">value</span><span class="o">:</span> <span class="nx">myExecuteResult4</span><span class="p">}</span> <span class="p">]</span>
835  <span class="p">};</span>
836
837<span class="p">}</span>
838</pre></div>
839</td></tr></table></div>
840<div class="admonition warning">
841<p class="first admonition-title">Warning</p>
842<p class="last">to take advantage of the ZOO-Kernel cache system, you directly use the WFS
843request  as <code class="docutils literal"><span class="pre">xlink:href</span></code> rather than value for <code class="docutils literal"><span class="pre">InputEntity2</span></code> (from line 31 to 34) and use <code class="docutils literal"><span class="pre">text/xml</span></code> <code class="docutils literal"><span class="pre">mimeType</span></code>
844(on line 40). Indeed, the ZOO-API doesn&#8217;t use the internal cache mechanisms.</p>
845</div>
846</div>
847<div class="section" id="id11">
848<h3><a class="toc-backref" href="#table-of-contents">Publish and use your Service</a><a class="headerlink" href="#id11" title="Permalink to this headline"></a></h3>
849<p>Now, you can publish your service as you did <a class="reference external" href="#publish-your-service">before</a>. To
850use your service, please use the following <a class="reference external" href="http://localhost/zoo-ws/spatialtools.html">url</a>.</p>
851<div class="admonition note">
852<p class="first admonition-title">Note</p>
853<p class="last">You can click on &#8220;Buffer Request and Mask&#8221;  to get the same result as presented
854in  <a class="reference external" href="#introduction">the initial screenshot</a>.</p>
855</div>
856</div>
857</div>
858<div class="section" id="add-union-into-the-chain">
859<h2><a class="toc-backref" href="#table-of-contents">Add Union into the chain</a><a class="headerlink" href="#add-union-into-the-chain" title="Permalink to this headline"></a></h2>
860<p>As you can see in the following screenshot, when using the Buffer
861service using a feature collection containing more than one geometry,
862the result is made of multiple geometries. So, running Buffer service
863on the routing interface will result in multiple buffer:</p>
864<a class="reference internal image-reference" href="../../_images/Buffer_Routing_Level_15.png"><img alt="../../_images/Buffer_Routing_Level_15.png" class="align-center" src="../../_images/Buffer_Routing_Level_15.png" style="width: 650px;" /></a>
865<p>So, to get the same result as you got when selecting a single
866road, you should use Union of geometry (input or the one outputed by the
867<code class="docutils literal"><span class="pre">Buffer</span></code> Service). As you are using the JavaScript ZOO-API, you can
868simply update the <code class="docutils literal"><span class="pre">Buffer</span></code> JavaScript function you defined earlier, to
869first call the Union of each geometry avaible in a feature collection
870prior to request (or after requesting) the Buffer Service. Hopefully,
871there is already this Python Service available, its name is
872<code class="docutils literal"><span class="pre">UnionOne1</span></code>, so you just need to add it in your Service chain.</p>
873<p>Here is the final code for the Buffer JavaScript function:</p>
874<div class="highlight-javascript"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
875 2
876 3
877 4
878 5
879 6
880 7
881 8
882 9
88310
88411
88512
88613
88714
88815
88916
89017
89118
89219
89320
89421
89522
89623
89724
89825
89926
90027
90128</pre></div></td><td class="code"><div class="highlight"><pre><span class="kd">function</span> <span class="nx">Buffer</span><span class="p">(</span><span class="nx">inputData</span><span class="p">,</span><span class="nx">bDist</span><span class="p">){</span>
902
903  <span class="c1">// Create all required ZOO.formats</span>
904  <span class="kd">var</span> <span class="nx">fJ</span><span class="o">=</span><span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Format</span><span class="p">.</span><span class="nx">JSON</span><span class="p">();</span>
905  <span class="kd">var</span> <span class="nx">fGJ</span><span class="o">=</span><span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Format</span><span class="p">.</span><span class="nx">GeoJSON</span><span class="p">();</span>
906  <span class="kd">var</span> <span class="nx">fWPS</span><span class="o">=</span><span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Format</span><span class="p">.</span><span class="nx">WPS</span><span class="p">();</span>
907
908  <span class="c1">// Call the UnionOne1 Service</span>
909  <span class="kd">var</span> <span class="nx">myInputs0</span> <span class="o">=</span> <span class="p">{</span>
910      <span class="nx">InputPolygon</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;complex&#39;</span><span class="p">,</span> <span class="nx">value</span><span class="o">:</span> <span class="nx">fGJ</span><span class="p">.</span><span class="nx">write</span><span class="p">(</span><span class="nx">inputData</span><span class="p">),</span> <span class="nx">mimeType</span><span class="o">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">},</span>
911      <span class="nx">BufferDistance</span><span class="o">:</span> <span class="p">{</span><span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;float&#39;</span><span class="p">,</span> <span class="s2">&quot;value&quot;</span><span class="o">:</span> <span class="nx">bDist</span> <span class="p">}</span>
912  <span class="p">};</span>
913  <span class="kd">var</span> <span class="nx">myOutputs0</span><span class="o">=</span> <span class="p">{</span> <span class="nx">Result</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;RawDataOutput&#39;</span><span class="p">,</span> <span class="s2">&quot;mimeType&quot;</span><span class="o">:</span> <span class="s2">&quot;application/json&quot;</span> <span class="p">}</span> <span class="p">};</span>
914  <span class="kd">var</span> <span class="nx">myProcess0</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Process</span><span class="p">(</span><span class="nx">zoo_url</span><span class="p">,</span><span class="s1">&#39;UnionOne1&#39;</span><span class="p">);</span>
915  <span class="kd">var</span> <span class="nx">myExecuteResult0</span><span class="o">=</span><span class="nx">myProcess0</span><span class="p">.</span><span class="nx">Execute</span><span class="p">(</span><span class="nx">myInputs0</span><span class="p">,</span><span class="nx">myOutputs0</span><span class="p">);</span>
916
917  <span class="c1">// Call the BufferPy Service</span>
918  <span class="kd">var</span> <span class="nx">myInputs</span> <span class="o">=</span> <span class="p">{</span>
919      <span class="nx">InputPolygon</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;complex&#39;</span><span class="p">,</span> <span class="nx">value</span><span class="o">:</span> <span class="nx">myExecuteResult0</span><span class="p">,</span> <span class="nx">mimeType</span><span class="o">:</span> <span class="s2">&quot;application/json&quot;</span><span class="p">},</span>
920      <span class="nx">BufferDistance</span><span class="o">:</span> <span class="p">{</span><span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;float&#39;</span><span class="p">,</span> <span class="s2">&quot;value&quot;</span><span class="o">:</span> <span class="nx">bDist</span> <span class="p">}</span>
921  <span class="p">};</span>
922  <span class="kd">var</span> <span class="nx">myOutputs</span><span class="o">=</span> <span class="p">{</span> <span class="nx">Result</span><span class="o">:</span> <span class="p">{</span> <span class="nx">type</span><span class="o">:</span> <span class="s1">&#39;RawDataOutput&#39;</span><span class="p">,</span> <span class="s2">&quot;mimeType&quot;</span><span class="o">:</span> <span class="s2">&quot;application/json&quot;</span> <span class="p">}</span> <span class="p">};</span>
923  <span class="kd">var</span> <span class="nx">myProcess</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ZOO</span><span class="p">.</span><span class="nx">Process</span><span class="p">(</span><span class="nx">zoo_url</span><span class="p">,</span><span class="s1">&#39;BufferPy&#39;</span><span class="p">);</span>
924  <span class="kd">var</span> <span class="nx">myExecuteResult</span><span class="o">=</span><span class="nx">myProcess</span><span class="p">.</span><span class="nx">Execute</span><span class="p">(</span><span class="nx">myInputs</span><span class="p">,</span><span class="nx">myOutputs</span><span class="p">);</span>
925
926  <span class="k">return</span> <span class="nx">fGJ</span><span class="p">.</span><span class="nx">read</span><span class="p">(</span><span class="nx">myExecuteResult</span><span class="p">);</span>
927
928<span class="p">}</span>
929</pre></div>
930</td></tr></table></div>
931</div>
932<div class="section" id="conclusion">
933<h2><a class="toc-backref" href="#table-of-contents">Conclusion</a><a class="headerlink" href="#conclusion" title="Permalink to this headline"></a></h2>
934<p>After understanding how basic Geometric Operation Services works, here you built step by step new JavaScript services which reuse the previous ones and combine them in different ways. This was achieved using the ZOO-API, composed by C functions exposed by the ZOO-Kernel to the JavaScript services runtime environement and the JS files which can be optionally installed.</p>
935<p class="rubric">Footnotes</p>
936<table class="docutils footnote" frame="void" id="f3" rules="none">
937<colgroup><col class="label" /><col /></colgroup>
938<tbody valign="top">
939<tr><td class="label"><a class="fn-backref" href="#id1">[1]</a></td><td>The <code class="docutils literal"><span class="pre">ZOO.Process</span></code> class uses <code class="docutils literal"><span class="pre">JSRequest</span></code> (cf. <a class="reference external" href="http://zoo-project.org/docs/api/zoo-format-wps.html">ref</a>). You will get example
940of use <a class="reference external" href="#the-javascript-service">later</a>.</td></tr>
941</tbody>
942</table>
943<table class="docutils footnote" frame="void" id="f4" rules="none">
944<colgroup><col class="label" /><col /></colgroup>
945<tbody valign="top">
946<tr><td class="label"><a class="fn-backref" href="#id2">[2]</a></td><td>So <code class="docutils literal"><span class="pre">conf</span></code>, <code class="docutils literal"><span class="pre">inputs</span></code> and <code class="docutils literal"><span class="pre">outputs</span></code> are simple JavaScript objects, similar
947to the Python dictionaries used in the <a class="reference external" href="ogr_base_vect_ops.html">previous section</a>.</td></tr>
948</tbody>
949</table>
950<table class="docutils footnote" frame="void" id="f5" rules="none">
951<colgroup><col class="label" /><col /></colgroup>
952<tbody valign="top">
953<tr><td class="label"><a class="fn-backref" href="#id3">[3]</a></td><td>Such as <code class="docutils literal"><span class="pre">conf</span></code>, <code class="docutils literal"><span class="pre">inputs</span></code> and <code class="docutils literal"><span class="pre">outputs</span></code>.</td></tr>
954</tbody>
955</table>
956<table class="docutils footnote" frame="void" id="f6" rules="none">
957<colgroup><col class="label" /><col /></colgroup>
958<tbody valign="top">
959<tr><td class="label"><a class="fn-backref" href="#id4">[4]</a></td><td>You can also return a conf Object if you get any informations updated from your JavaScript service (such as cookie for instance)</td></tr>
960</tbody>
961</table>
962<table class="docutils footnote" frame="void" id="f7" rules="none">
963<colgroup><col class="label" /><col /></colgroup>
964<tbody valign="top">
965<tr><td class="label"><a class="fn-backref" href="#id5">[5]</a></td><td>Using one of the available <code class="docutils literal"><span class="pre">ZOO.formats</span></code> you are also able to support various
966<code class="docutils literal"><span class="pre">ComplexData</span></code> for both input and output of the service. To simplify the
967presentation here, you will use only this default ones.</td></tr>
968</tbody>
969</table>
970<table class="docutils footnote" frame="void" id="f8" rules="none">
971<colgroup><col class="label" /><col /></colgroup>
972<tbody valign="top">
973<tr><td class="label"><a class="fn-backref" href="#id9">[6]</a></td><td>So in the hole you created in the previous section.</td></tr>
974</tbody>
975</table>
976</div>
977</div>
978
979
980          </div>
981          <footer>
982 
983
984  <hr/>
985  <div class="pfoot">
986  <div role="contentinfo">
987    <p>
988        &copy; Copyright 2009-2015, ZOO-Project team.
989    </p>
990  </div>
991  Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> inspired by <a href="https://readthedocs.org">Read the Docs</a>.
992</div>
993</footer>
994
995        </div>
996      </div>
997
998    </section>
999
1000  </div>
1001 
1002
1003
1004 
1005
1006    <script type="text/javascript">
1007        var DOCUMENTATION_OPTIONS = {
1008            URL_ROOT:'../../',
1009            VERSION:'1.4a0',
1010            COLLAPSE_INDEX:false,
1011            FILE_SUFFIX:'.html',
1012            HAS_SOURCE:  true
1013        };
1014    </script>
1015      <script type="text/javascript" src="../../_static/jquery.js"></script>
1016      <script type="text/javascript" src="../../_static/underscore.js"></script>
1017      <script type="text/javascript" src="../../_static/doctools.js"></script>
1018
1019 
1020
1021 
1022 
1023    <script type="text/javascript" src="../../_static/js/theme.js"></script>
1024 
1025
1026 
1027 
1028  <script type="text/javascript">
1029      jQuery(function () {
1030          SphinxRtdTheme.StickyNav.enable();
1031      });
1032  </script>
1033   
1034
1035</body>
1036</html>
Note: See TracBrowser for help on using the repository browser.

Search

Context Navigation

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