Changeset 2526
- Timestamp:
- 11/07/03 19:39:55 (5 years ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/branch-4-0/mapserver_docs/wms-server-howto.xml
r2520 r2526 4 4 <!-- $Id$ --> 5 5 <article> 6 <articleinfo>7 <title>Mapserver WMS Server HOWTO - Version 4.0</title>8 <author>9 <firstname>Jeff</firstname>10 <surname>McKenna</surname>11 <affiliation>12 <orgname>DM Solutions Group Inc.</orgname>13 <address>14 <email>mckenna@dmsolutions.ca</email>15 </address>16 </affiliation>17 </author>18 <date>2003-11-07</date>19 <abstract>20 <!-- a short description of the contents of the doc -->21 <para>6 <articleinfo> 7 <title>Mapserver WMS Server HOWTO - Version 4.0</title> 8 <author> 9 <firstname>Jeff</firstname> 10 <surname>McKenna</surname> 11 <affiliation> 12 <orgname>DM Solutions Group Inc.</orgname> 13 <address> 14 <email>mckenna@dmsolutions.ca</email> 15 </address> 16 </affiliation> 17 </author> 18 <date>2003-11-07</date> 19 <abstract> 20 <!-- a short description of the contents of the doc --> 21 <para> 22 22 This document describes the procedures for setting up an OGC compliant Web Map Server (WMS) through 23 23 the use of MapServer v3.5 (and later). 24 24 </para> 25 <para>Last Updated: 2003-11-07</para>26 </abstract>27 </articleinfo>28 <sect1 id="intro">29 <title>Introduction</title>30 <para>25 <para>Last Updated: 2003-11-07</para> 26 </abstract> 27 </articleinfo> 28 <sect1 id="intro"> 29 <title>Introduction</title> 30 <para> 31 31 A WMS (or Web Map Server) allows for use of data from several different servers, and enables for the creation of a 32 32 network of Map Servers from which clients can build customized maps. 33 The following documentation is based on the <ulink url="http://www.opengis.org/ techno/specs/01-047r2.pdf">33 The following documentation is based on the <ulink url="http://www.opengis.org/docs/01-047r2.pdf"> 34 34 Open GIS Consortium's (OGC) Web Map Server Interfaces Implementation Specification v1.1.0</ulink>. 35 35 </para> 36 <para>36 <para> 37 37 MapServer v3.5 or more recent is required to implement WMS features. At the time this document was written, Mapserver 38 38 supports the following WMS versions: 1.0.0, 1.0.7, and 1.1.0 (a.k.a. 1.0.8). 39 39 </para> 40 <para>40 <para> 41 41 This document assumes that you are already familiar with certain aspects of MapServer: 42 42 </para> 43 <itemizedlist>44 <listitem>45 <para>43 <itemizedlist> 44 <listitem> 45 <para> 46 46 MapServer application development and setting up .map files. 47 47 </para> 48 </listitem>49 <listitem>50 <para>48 </listitem> 49 <listitem> 50 <para> 51 51 Familiarity with the WMS spec would be an asset. A link to the WMS specification document is included in 52 52 the <link linkend="links">"WMS-Related Information"</link> section below. 53 53 </para> 54 </listitem>55 </itemizedlist>56 <sect2 id="howitworks">57 <title>How does a WMS Work</title>58 <para>54 </listitem> 55 </itemizedlist> 56 <sect2 id="howitworks"> 57 <title>How does a WMS Work</title> 58 <para> 59 59 WMS servers interact with their clients via the HTTP protocol. In most cases, 60 60 a WMS server is a CGI program. This is also the case with MapServer. 61 61 </para> 62 <para>62 <para> 63 63 The WMS specification defines a number of request types, and for each of 64 64 them a set of query parameters and associated behaviors. A WMS-compliant 65 65 server MUST be able to handle at least the following 2 types of WMS requests: 66 66 </para> 67 <orderedlist>68 <listitem>69 <para>70 <emphasis>GetCapabilities:</emphasis> return an XML document with metadata of the Web Map67 <orderedlist> 68 <listitem> 69 <para> 70 <emphasis>GetCapabilities:</emphasis> return an XML document with metadata of the Web Map 71 71 Server's information 72 72 </para> 73 </listitem>74 <listitem>75 <para>76 <emphasis>GetMap:</emphasis> return an image of a map according to the user's needs.77 </para> 78 </listitem>79 </orderedlist>80 <para>73 </listitem> 74 <listitem> 75 <para> 76 <emphasis>GetMap:</emphasis> return an image of a map according to the user's needs. 77 </para> 78 </listitem> 79 </orderedlist> 80 <para> 81 81 And support for the following types is optional: 82 82 </para> 83 <orderedlist continuation="continues">84 <listitem>85 <para>86 <emphasis>GetFeatureInfo:</emphasis> return info about feature(s) at a query (mouse click)83 <orderedlist continuation="continues"> 84 <listitem> 85 <para> 86 <emphasis>GetFeatureInfo:</emphasis> return info about feature(s) at a query (mouse click) 87 87 location. MapServer supports 3 types of responses to this request: 88 88 </para> 89 <orderedlist>90 <listitem>91 <para>89 <orderedlist> 90 <listitem> 91 <para> 92 92 Text/plain output with attribute info. 93 93 </para> 94 </listitem>95 <listitem>96 <para>94 </listitem> 95 <listitem> 96 <para> 97 97 Text/html output using MapServer query templates specified in the CLASS template parameter. 98 98 The MIME type returned by the Class templates defaults to text/html and can be controlled using the 99 99 metadata <link linkend="mime_type">"wms_feature_info_mime_type"</link>. 100 100 </para> 101 </listitem>102 <listitem>103 <para>101 </listitem> 102 <listitem> 103 <para> 104 104 Gml features. 105 105 </para> 106 </listitem>107 </orderedlist>108 </listitem>109 <listitem>110 <para>111 <emphasis>DescribeLayer:</emphasis> return an XML description of one or more map layers. This106 </listitem> 107 </orderedlist> 108 </listitem> 109 <listitem> 110 <para> 111 <emphasis>DescribeLayer:</emphasis> return an XML description of one or more map layers. This 112 112 applies only to SLD WMS servers and is not currently supported by 113 113 MapServer. 114 114 </para> 115 </listitem>116 </orderedlist>117 <para>115 </listitem> 116 </orderedlist> 117 <para> 118 118 With respect to MapServer specifically, it is the "mapserv" CGI program that 119 119 knows how to handle WMS requests. So setting up a WMS server with MapServer … … 121 121 appropriate metadata in it. This is covered in the rest of this document. 122 122 </para> 123 </sect2>124 <sect2 id="links">125 <title>Links to WMS-Related Information</title>126 <itemizedlist>127 <listitem>128 <para>123 </sect2> 124 <sect2 id="links"> 125 <title>Links to WMS-Related Information</title> 126 <itemizedlist> 127 <listitem> 128 <para> 129 129 The Mapserver WMS Client HOWTO: 130 130 <ulink url="http://mapserver.gis.umn.edu/doc/wms-client-howto.html"> 131 131 http://mapserver.gis.umn.edu/doc/wms-client-howto.html</ulink> 132 </para>133 </listitem>134 <listitem>135 <para>132 </para> 133 </listitem> 134 <listitem> 135 <para> 136 136 Open GIS Consortium (OGC) Home Page: 137 137 <ulink url="http://www.opengis.org/">http://www.opengis.org/</ulink> 138 </para>139 </listitem>140 <listitem>141 <para>138 </para> 139 </listitem> 140 <listitem> 141 <para> 142 142 WMS 1.0.0 specification: 143 <ulink url="http://www.opengis.org/ techno/specs/00-028.pdf">144 http://www.opengis.org/ techno/specs/00-028.pdf</ulink>145 </para>146 </listitem>147 <listitem>148 <para>143 <ulink url="http://www.opengis.org/docs/00-028.pdf"> 144 http://www.opengis.org/docs/00-028.pdf</ulink> 145 </para> 146 </listitem> 147 <listitem> 148 <para> 149 149 WMS 1.1.0 specification: 150 <ulink url="http://www.opengis.org/techno/specs/01-047r2.pdf"> 151 http://www.opengis.org/techno/specs/01-047r2.pdf</ulink> 152 </para> 153 </listitem> 154 <listitem> 155 <para> 150 <ulink url="http://www.opengis.org/docs/01-047r2.pdf"> 151 http://www.opengis.org/docs/01-047r2.pdf</ulink> 152 </para> 153 </listitem> 154 <listitem> 155 <para> 156 WMS 1.1.1 specification: 157 <ulink url="http://www.opengis.org/docs/01-068r2.pdf"> 158 http://www.opengis.org/docs/01-068r2.pdf</ulink> 159 </para> 160 </listitem> 161 <listitem> 162 <para> 156 163 WMS-Dev mailing list and archive: 157 164 <ulink url="http://www.intl-interfaces.net/mailman/listinfo/wms-dev"> 158 165 http://www.intl-interfaces.net/mailman/listinfo/wms-dev</ulink> 159 </para>160 </listitem>161 <listitem>162 <para>166 </para> 167 </listitem> 168 <listitem> 169 <para> 163 170 WMS FAQ: 164 171 <ulink url="http://www.intl-interfaces.net/cookbook/WMS/faq/faqw.py?req=home"> 165 172 http://www.intl-interfaces.net/cookbook/WMS/faq/faqw.py?req=home</ulink> 166 </para>167 </listitem>168 <listitem>169 <para>173 </para> 174 </listitem> 175 <listitem> 176 <para> 170 177 WMS XML Capabilities validator: 171 178 <ulink url="http://www.digitalearth.gov/wmt/xml/validator.html"> 172 179 http://www.digitalearth.gov/wmt/xml/validator.html</ulink> 173 </para>174 </listitem>175 <listitem>176 <para>180 </para> 181 </listitem> 182 <listitem> 183 <para> 177 184 WMS Cookbook: 178 185 <ulink url="http://www.intl-interfaces.net/cookbook/WMS/"> 179 186 http://www.intl-interfaces.net/cookbook/WMS/</ulink> 180 </para>181 </listitem>182 </itemizedlist>183 </sect2>184 </sect1>185 <!-- Section1: Integration or developing an application-->186 <sect1 id="settingup">187 <title>Setting Up a WMS Server Using Mapserver</title>188 <sect2 id="install">189 <title>Install the Required Software</title>190 <para>187 </para> 188 </listitem> 189 </itemizedlist> 190 </sect2> 191 </sect1> 192 <!-- Section1: Integration or developing an application--> 193 <sect1 id="settingup"> 194 <title>Setting Up a WMS Server Using Mapserver</title> 195 <sect2 id="install"> 196 <title>Install the Required Software</title> 197 <para> 191 198 WMS requests are handled by the "mapserv" CGI program. Not all versions of the 192 199 mapserv program do include WMS support (it is included by default when you … … 195 202 use the "-v" command-line switch and look for "SUPPORTS=WMS_SERVER". 196 203 </para> 197 <example>198 <title>On Unix:</title>199 <programlisting>204 <example> 205 <title>On Unix:</title> 206 <programlisting> 200 207 $ ./mapserv -v 201 208 MapServer version 3.5 (pre-alpha) OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP … … 203 210 INPUT=GDAL INPUT=SHAPEFILE 204 211 </programlisting> 205 </example>206 <example>207 <title>On Windows:</title>208 <programlisting>212 </example> 213 <example> 214 <title>On Windows:</title> 215 <programlisting> 209 216 C:\apache\cgi-bin> mapserv -v 210 217 MapServer version 3.5 (pre-alpha) OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP … … 212 219 INPUT=GDAL INPUT=SHAPEFILE 213 220 </programlisting> 214 </example>215 </sect2>216 <sect2 id="mapfile">217 <title>Setup a Mapfile For Your WMS</title>218 <para>221 </example> 222 </sect2> 223 <sect2 id="mapfile"> 224 <title>Setup a Mapfile For Your WMS</title> 225 <para> 219 226 Each instance of WMS server that you setup needs to have its own mapfile. 220 227 It is just a regular MapServer mapfile in which some parameters and some … … 222 229 to produce a valid GetCapabilites output. 223 230 </para> 224 <para>231 <para> 225 232 Here is the list of parameters and metadata items that usually optional with 226 233 MapServer, but are required (or strongly recommended) for a WMS configuration: 227 234 </para> 228 <para>235 <para> 229 236 At the map level: 230 237 </para> 231 <itemizedlist>232 <listitem>233 <para>238 <itemizedlist> 239 <listitem> 240 <para> 234 241 Map NAME 235 242 </para> 236 </listitem>237 <listitem>238 <para>243 </listitem> 244 <listitem> 245 <para> 239 246 Map PROJECTION 240 247 </para> 241 </listitem>242 <listitem>243 <para>248 </listitem> 249 <listitem> 250 <para> 244 251 Map Metadata (in the WEB Object): 245 252 </para> 246 <itemizedlist>247 <listitem>248 <para>253 <itemizedlist> 254 <listitem> 255 <para> 249 256 wms_title 250 257 </para> 251 </listitem>252 <listitem>253 <para>258 </listitem> 259 <listitem> 260 <para> 254 261 wms_onlineresource 255 262 </para> 256 </listitem>257 <listitem>258 <para>263 </listitem> 264 <listitem> 265 <para> 259 266 wms_srs (unless PROJECTION object is defined using "init=epsg:...") 260 267 </para> 261 </listitem>262 </itemizedlist>263 </listitem>264 </itemizedlist>265 <para>268 </listitem> 269 </itemizedlist> 270 </listitem> 271 </itemizedlist> 272 <para> 266 273 And for each layer: 267 274 </para> 268 <itemizedlist>269 <listitem>270 <para>275 <itemizedlist> 276 <listitem> 277 <para> 271 278 Layer NAME 272 279 </para> 273 </listitem>274 <listitem>275 <para>280 </listitem> 281 <listitem> 282 <para> 276 283 Layer PROJECTION 277 284 </para> 278 </listitem>279 <listitem>280 <para>285 </listitem> 286 <listitem> 287 <para> 281 288 Layer Metadata 282 289 </para> 283 <itemizedlist>284 <listitem>285 <para>290 <itemizedlist> 291 <listitem> 292 <para> 286 293 wms_title 287 294 </para> 288 </listitem>289 <listitem>290 <para>295 </listitem> 296 <listitem> 297 <para> 291 298 wms_srs (optional since the layers inherit the map's SRS value) 292 299 </para> 293 </listitem>294 </itemizedlist>295 </listitem>296 </itemizedlist>297 <para>300 </listitem> 301 </itemizedlist> 302 </listitem> 303 </itemizedlist> 304 <para> 298 305 Let's go through each of these paramters in more detail: 299 306 </para> 300 <itemizedlist>301 <listitem>302 <para>307 <itemizedlist> 308 <listitem> 309 <para> 303 310 Map Name and wms_title: 304 311 </para> 305 <para>312 <para> 306 313 WMS Capabilities requires a Name and a Title tag for every layer. The 307 314 Map's NAME and wms_title metadata will be used to set the root layer's … … 309 316 WMS context corresponds to the whole mapfile. 310 317 </para> 311 </listitem>312 <listitem>313 <para>318 </listitem> 319 <listitem> 320 <para> 314 321 Layer Name and wms_title metadata: 315 322 </para> 316 <para>323 <para> 317 324 Every individual layer needs its own unique name and title. 318 325 Layer names are also used in GetMap and GetFeatureInfo requests to refer 319 326 to layers that should be included in the map output and in the query. 320 327 </para> 321 </listitem>322 <listitem id="projection_srs">323 <para>328 </listitem> 329 <listitem id="projection_srs"> 330 <para> 324 331 Map PROJECTION and wms_srs metadata: 325 332 </para> 326 <para>333 <para> 327 334 WMS servers have to advertise the projection in which they are able to 328 335 serve data using EPSG projection codes (see … … 331 338 Recent versions of the PROJ4 library come with a table of EPSG 332 339 initialization codes and allow users to define a projection like this: </para> 333 <programlisting>340 <programlisting> 334 341 PROJECTION 335 342 "init=epsg:4269" 336 343 END 337 344 </programlisting> 338 <para>345 <para> 339 346 (Note that "epsg" has to be in lowercase when used in the PROJ4 'init' directive.) 340 347 </para> 341 <para>348 <para> 342 349 If the MAP PROJECTION block is provided in the format "init=epsg:xxxx" then 343 350 MapServer will also use this information to generate a <BoundingBox> tag for … … 345 352 element of WMS capabilities, but it is good practice to allow MapServer to include it when possible. 346 353 </para> 347 <para>354 <para> 348 355 The above is sufficient for MapServer to recognize the EPSG code and 349 356 include it in SRS tags in the capabilities output (wms_srs metadata is not … … 354 361 definition of the data's projection. 355 362 </para> 356 <para>363 <para> 357 364 Here is an example of a server whose data is in an Lambert Conformal Conic 358 365 projection (for which there is no EPSG code). It's capabilities output … … 360 367 PROJECTION object is set to the real projection that the data is in: 361 368 </para> 362 <programlisting>369 <programlisting> 363 370 NAME DEMO 364 371 ... … … 383 390 ... 384 391 </programlisting> 385 </listitem> 386 <listitem> 387 <para> 392 <para> 393 In addition to EPSG:xxxx projections, a WMS server can advertize projections in the AUTO:xxxx namespace. AUTO projections 42001 to 42005 are internally supported by MapServer. However, AUTO projections are useful only with smart WMS clients, since the client needs to define the projection parameters in the WMS requests to the server. For more information see Annex E of the <ulink url="http://www.opengis.org/docs/01-068r2.pdf">WMS 1.1.1 specification</ulink> and section 6.5.5.2 of the same document. See also the <link linkend="FAQ">FAQ</link> on AUTO projections at the end of this document. 394 </para> 395 </listitem> 396 <listitem> 397 <para> 388 398 Layer PROJECTION and wms_srs metadata: 389 399 </para> 390 <para>400 <para> 391 401 By default in the WMS context, layers inherit the SRS or their parent layer 392 402 (the map's projection in the MapServer case). For this reason it is not … … 394 404 for every layer. 395 405 </para> 396 <para>406 <para> 397 407 However, if your server wants to advertise multiple projections, then at least 398 408 a PROJECTION object is required in every layer, otherwise the layers won't … … 400 410 MapServer. 401 411 </para> 402 <para>412 <para> 403 413 Layer PROJECTION and wms_srs metadata are defined exactly the same way as 404 414 the map's PROJECTION and wms_srs metadata. 405 415 </para> 406 <para>416 <para> 407 417 For vector layers, if a PROJECTION block is provided in the format "init=epsg:xxxx" then 408 418 MapServer will also use this information to generate a <BoundingBox> tag for … … 410 420 element of WMS capabilities, but it is good practice to allow MapServer to include it when possible. 411 421 </para> 412 </listitem>413 <listitem id="wms_onlineresource">414 <para>422 </listitem> 423 <listitem id="wms_onlineresource"> 424 <para> 415 425 The "wms_onlineresource" metadata: 416 426 </para> 417 <para>427 <para> 418 428 The wms_onlineresource metadata is set in the map's web object metadata and 419 429 specifies the URL that should be used to access your server. This is … … 423 433 recommended that you provide the wms_onlineresource metadata. 424 434 </para> 425 <para>426 See section 6.2.1 of the <ulink url="http://www.opengis.org/ techno/specs/01-047r2.pdf">435 <para> 436 See section 6.2.1 of the <ulink url="http://www.opengis.org/docs/01-047r2.pdf"> 427 437 WMS 1.1.0 specification</ulink> for the whole story about 428 438 the online resource URL. Basically, what you need is a complete HTTP URL … … 430 440 parameter, and and terminated by "?" or "&". 431 441 </para> 432 <para>442 <para> 433 443 Here is a valid online resource URL: 434 444 </para> 435 <programlisting>445 <programlisting> 436 446 http://my.host.com/cgi-bin/mapserv?map=mywms.map& 437 447 </programlisting> 438 <para>448 <para> 439 449 By creating a wrapper script on the server it is possible to hide the 440 450 "map=" parameter from the URL and then your server's online resource 441 451 URL could be something like: 442 452 </para> 443 <programlisting>453 <programlisting> 444 454 http://my.host.com/cgi-bin/mywms? 445 455 </programlisting> 446 <para>456 <para> 447 457 This is covered in more detail in the section <link linkend="onlineresourceurl"> 448 458 "More About the Online Resource URL"</link> below. 449 459 </para> 450 </listitem>451 </itemizedlist>452 </sect2>453 <sect2 id="test">454 <title>Test Your WMS Server</title>455 <sect3 id="val_capabilities">456 <title>Validate the Capabilities Metadata</title>457 <para>460 </listitem> 461 </itemizedlist> 462 </sect2> 463 <sect2 id="test"> 464 <title>Test Your WMS Server</title> 465 <sect3 id="val_capabilities"> 466 <title>Validate the Capabilities Metadata</title> 467 <para> 458 468 OK, now that we've got a mapfile, we have to check the XML capabilities 459 469 returned by our server to make sure nothing is missing. 460 470 </para> 461 <para>471 <para> 462 472 Using a web browser, access your server's online resource URL to which you 463 473 add the parameter "REQUEST=GetCapabilities" to the end, e.g. 464 474 </para> 465 <programlisting>475 <programlisting> 466 476 http://my.host.com/cgi-bin/mapserv?map=mywms.map&REQUEST=GetCapabilities 467 477 </programlisting> 468 <para>478 <para> 469 479 This should return a document of MIME type application/vnd.ogc.wms_xml, so 470 480 your browser is likely going to prompt you to save the file. Save it and 471 481 open it in a text editor (Emacs, Notepad, etc.) 472 482 </para> 473 <para>483 <para> 474 484 If you get an error message in the XML output then take necessary actions. 475 485 Common problems and solutions are listed in the <link linkend="FAQ">FAQ</link> at the end of this 476 486 document. 477 487 </para> 478 <para>488 <para> 479 489 If everything went well, you should have a complete XML capabilities document. 480 490 Search it for the word "WARNING"... MapServer inserts XML comments starting … … 484 494 otherwise things are likely not going to work. 485 495 </para> 486 </sect3>487 <sect3 id="val_getmap">488 <title>Test With a GetMap Request</title>489 <para>496 </sect3> 497 <sect3 id="val_getmap"> 498 <title>Test With a GetMap Request</title> 499 <para> 490 500 OK, now that we know that our server can produce a valid XML GetCapabilities 491 501 response we should test the GetMap request. 492 502 </para> 493 <para>503 <para> 494 504 Simply adding <filename>"VERSION=1.1.0&REQUEST=GetMap"</filename> to your server's URL should 495 505 generate a map with the default map size and all the layers with STATUS ON or 496 506 DEFAULT displayed, e.g. 497 507 </para> 498 <programlisting>508 <programlisting> 499 509 http://my.host.com/cgi-bin/mapserv?map=mywms.map&VERSION=1.1.0&REQUEST=GetMap 500 510 </programlisting> 501 <para>511 <para> 502 512 (Note that this works with MapServer's WMS interface even if it would be an 503 513 incomplete GetMap request according to the WMS spec. It lacks several … … 505 515 it is good enough.) 506 516 </para> 507 </sect3>508 <sect3 id="val_client">509 <title>Test with a Real Client</title>510 <para>517 </sect3> 518 <sect3 id="val_client"> 519 <title>Test with a Real Client</title> 520 <para> 511 521 If you have access to a WMS client, then register your new server's online 512 522 resource with it and you should be off and running. 513 523 </para> 514 <para>524 <para> 515 525 If you don't have your own WMS client installed already, here are a few pointers: 516 526 </para> 517 <itemizedlist>518 <listitem>519 <para>527 <itemizedlist> 528 <listitem> 529 <para> 520 530 MapServer itself can be used as a WMS client, see the 521 531 <ulink url="http://mapserver.gis.umn.edu/doc/wms-client-howto.html">WMS Client HOWTO<
