1: <?php
2:
3: namespace Mapbender\WmsBundle\Component;
4:
5: use Mapbender\WmsBundle\Entity\WmsSource;
6: use Mapbender\CoreBundle\Component\BoundingBox;
7: use Mapbender\CoreBundle\Entity\Contact;
8: use Mapbender\CoreBundle\Entity\Keyword;
9: use Mapbender\WmsBundle\Entity\WmsLayerSource;
10: use Mapbender\WmsBundle\Component\RequestInformation;
11:
12: 13: 14: 15: 16:
17: class WmsCapabilitiesParser111 extends WmsCapabilitiesParser
18: {
19:
20: 21: 22: 23:
24: public function __construct(\DOMDocument $doc)
25: {
26: parent::__construct($doc);
27: }
28:
29: 30: 31: 32: 33:
34: public function parse()
35: {
36: $wms = new WmsSource();
37: $root = $this->doc->documentElement;
38:
39: $wms->setVersion($this->getValue("./@version", $root));
40: $this->parseService($wms, $this->getValue("./Service", $root));
41: $capabilities = $this->xpath->query("./Capability/*", $root);
42: foreach($capabilities as $capabilityEl)
43: {
44: if($capabilityEl->localName === "Request")
45: {
46: $this->parseCapabilityRequest($wms, $capabilityEl);
47: } else if($capabilityEl->localName === "Exception")
48: {
49: $this->parseCapabilityException($wms, $capabilityEl);
50: } else if($capabilityEl->localName === "Layer")
51: {
52: $rootlayer = new WmsLayerSource();
53: $wms->addLayer($rootlayer);
54: $layer = $this->parseLayer($wms, $rootlayer, $capabilityEl);
55: }
56: else if($capabilityEl->localName === "UserDefinedSymbolization")
57: {
58: $this->parseUserDefinedSymbolization($wms, $capabilityEl);
59: }
60:
61: }
62: return $wms;
63: }
64:
65: 66: 67: 68: 69: 70: 71:
72: private function parseService(WmsSource $wms, \DOMElement $contextElm)
73: {
74: $wms->setName($this->getValue("./Name/text()", $contextElm));
75: $wms->setTitle($this->getValue("./Title/text()", $contextElm));
76: $wms->setDescription($this->getValue("./Abstract/text()", $contextElm));
77:
78: $keywordElList = $this->xpath->query("./KeywordList/Keyword",
79: $contextElm);
80: foreach($keywordElList as $keywordEl)
81: {
82: $keyword = new Keyword();
83: $keyword->setValue(trim($this->getValue("./text()", $keywordEl)));
84: $keyword->setSourceclass($wms->getClassname());
85: $keyword->setSourceid($wms);
86:
87:
88: }
89:
90: $wms->setOnlineResource($this->getValue("./OnlineResource/@xlink:href",
91: $contextElm));
92:
93: $wms->setFees($this->getValue("./Fees/text()", $contextElm));
94: $wms->setAccessConstraints($this->getValue("./AccessConstraints/text()",
95: $contextElm));
96:
97: $contact = new Contact();
98: $contact->setPerson($this->getValue("./ContactInformation/ContactPersonPrimary/ContactPerson/text()",
99: $contextElm));
100: $contact->setOrganization($this->getValue("./ContactInformation/ContactPersonPrimary/ContactOrganization/text()",
101: $contextElm));
102: $contact->setPosition($this->getValue("./ContactInformation/ContactPosition/text()",
103: $contextElm));
104:
105: $contact->setAddressType($this->getValue("./ContactInformation/ContactAddress/AddressType/text()",
106: $contextElm));
107: $contact->setAddress($this->getValue("./ContactInformation/ContactAddress/Address/text()",
108: $contextElm));
109: $contact->setAddressCity($this->getValue("./ContactInformation/ContactAddress/City/text()",
110: $contextElm));
111: $contact->setAddressStateOrProvince($this->getValue("./ContactInformation/ContactAddress/StateOrProvince/text()",
112: $contextElm));
113: $contact->setAddressPostCode($this->getValue("./ContactInformation/ContactAddress/PostCode/text()",
114: $contextElm));
115: $contact->setAddressCountry($this->getValue("./ContactInformation/ContactAddress/Country/text()",
116: $contextElm));
117:
118: $contact->setVoiceTelephone($this->getValue("./ContactInformation/ContactVoiceTelephone/text()",
119: $contextElm));
120: $contact->setFacsimileTelephone($this->getValue("./ContactInformation/ContactFacsimileTelephone/text()",
121: $contextElm));
122: $contact->setElectronicMailAddress($this->getValue("./ContactInformation/ContactElectronicMailAddress/text()",
123: $contextElm));
124:
125: $wms->setContact($contact);
126: }
127:
128: 129: 130: 131: 132: 133: 134:
135: private function parseCapabilityRequest(WmsSource $wms,
136: \DOMElement $contextElm)
137: {
138: $operations = $this->xpath->query("./*", $contextElm);
139: foreach($operations as $operation)
140: {
141: if($operation->localName === "GetCapabilities")
142: {
143: $getCapabilities = $this->parseOperationRequestInformation($operation);
144: $wms->setGetCapabilities($getCapabilities);
145: } else if($operation->localName === "GetMap")
146: {
147: $getMap = $this->parseOperationRequestInformation($operation);
148: $wms->setGetMap($getMap);
149: } else if($operation->localName === "GetFeatureInfo")
150: {
151: $getFeatureInfo = $this->parseOperationRequestInformation($operation);
152: $wms->setGetFeatureInfo($getFeatureInfo);
153: } else if($operation->localName === "GetLegendGraphic")
154: {
155: $getLegendGraphic = $this->parseOperationRequestInformation($operation);
156: $wms->setGetLegendGraphic($getLegendGraphic);
157: } else if($operation->localName === "DescribeLayer")
158: {
159: $describeLayer = $this->parseOperationRequestInformation($operation);
160: $wms->setDescribeLayer($describeLayer);
161: } else if($operation->localName === "GetStyles")
162: {
163: $getStyles = $this->parseOperationRequestInformation($operation);
164: $wms->setGetStyles($getStyles);
165: } else if($operation->localName === "PutStyles")
166: {
167: $putStyles = $this->parseOperationRequestInformation($operation);
168: $wms->setPutStyles($putStyles);
169: }
170: }
171: }
172:
173: 174: 175: 176: 177: 178: 179:
180: private function parseOperationRequestInformation(\DOMElement $contextElm)
181: {
182: $requestImformation = new RequestInformation();
183: $tempList = $this->xpath->query("./Format", $contextElm);
184: if($tempList !== null)
185: {
186: foreach($tempList as $item)
187: {
188: $requestImformation->addFormat($this->getValue("./text()", $item));
189: }
190: }
191: $requestImformation->setHttpGet($this->getValue(
192: "./DCPType/HTTP/Get/OnlineResource/@xlink:href",
193: $contextElm));
194: $requestImformation->setHttpPost($this->getValue(
195: "./DCPType/HTTP/Post/OnlineResource/@xlink:href",
196: $contextElm));
197:
198: return $requestImformation;
199: }
200:
201: 202: 203: 204: 205: 206: 207: 208:
209: private function parseCapabilityException(WmsSource $wms,
210: \DOMElement $contextElm)
211: {
212: $tempList = $this->xpath->query("./Format", $contextElm);
213: if($tempList !== null)
214: {
215: foreach($tempList as $item)
216: {
217: $wms->addExceptionFormat($this->getValue("./text()", $item));
218: }
219: }
220: }
221:
222: 223: 224: 225: 226: 227: 228: 229:
230: private function parseUserDefinedSymbolization(WmsSource $wms,
231: \DOMElement $contextElm)
232: {
233: if($contextElm !== null)
234: {
235: $wms->setSupportSld($this->getValue("./@SupportSLD", $contextElm));
236: $wms->setUserLayer($this->getValue("./@UserLayer", $contextElm));
237: $wms->setUserStyle($this->getValue("./@UserStyle", $contextElm));
238: $wms->setRemoteWfs($this->getValue("./@RemoteWFS", $contextElm));
239: $wms->setInlineFeature($this->getValue("./@InlineFeature",
240: $contextElm));
241: $wms->setRemoteWcs($this->getValue("./@RemoteWCS", $contextElm));
242: }
243: }
244:
245: 246: 247: 248: 249: 250: 251: 252: 253:
254: private function parseLayer(WmsSource $wms, WmsLayerSource $wmslayer,
255: \DOMElement $contextElm)
256: {
257: $wmslayer->setQueryable($this->getValue("./@queryable", $contextElm));
258: $wmslayer->setCascaded($this->getValue("./@cascaded", $contextElm));
259: $wmslayer->setOpaque($this->getValue("./@opaque", $contextElm));
260: $wmslayer->setNoSubset($this->getValue("./@noSubsets", $contextElm));
261: $wmslayer->setFixedWidth($this->getValue("./@fixedWidth", $contextElm));
262: $wmslayer->setFixedHeight($this->getValue("./@fixedHeight", $contextElm));
263:
264: $wmslayer->setName($this->getValue("./Name/text()", $contextElm));
265: $wmslayer->setTitle($this->getValue("./Title/text()", $contextElm));
266: $wmslayer->setAbstract($this->getValue("./Abstract/text()", $contextElm));
267:
268: $keywordElList = $this->xpath->query("./KeywordList/Keyword",
269: $contextElm);
270: foreach($keywordElList as $keywordEl)
271: {
272: $keyword = new Keyword();
273: $keyword->setValue(trim($this->getValue("./text()", $keywordEl)));
274: $keyword->setSourceclass($wmslayer->getClassname());
275: $keyword->setSourceid($wmslayer);
276:
277:
278: }
279:
280: $tempList = $this->xpath->query("./SRS", $contextElm);
281: if($tempList !== null)
282: {
283: foreach($tempList as $item)
284: {
285: $wmslayer->addSrs($this->getValue("./text()", $item));
286: }
287: }
288: $latlonbboxEl = $this->getValue("./LatLonBoundingBox", $contextElm);
289: if($latlonbboxEl !== null)
290: {
291: $latlonBounds = new BoundingBox();
292: $latlonBounds->setSrs("EPSG:4326");
293: $latlonBounds->setMinx($this->getValue("./@minx", $latlonbboxEl));
294: $latlonBounds->setMiny($this->getValue("./@miny", $latlonbboxEl));
295: $latlonBounds->setMaxx($this->getValue("./@maxx", $latlonbboxEl));
296: $latlonBounds->setMaxy($this->getValue("./@maxy", $latlonbboxEl));
297:
298: $wmslayer->setLatlonBounds($latlonBounds);
299: }
300:
301: $tempList = $this->xpath->query("./BoundingBox", $contextElm);
302: if($tempList !== null)
303: {
304: foreach($tempList as $item)
305: {
306: $bbox = new BoundingBox();
307: $bbox->setSrs($this->getValue("./@SRS", $item));
308: $bbox->setMinx($this->getValue("./@minx", $item));
309: $bbox->setMiny($this->getValue("./@miny", $item));
310: $bbox->setMaxx($this->getValue("./@maxx", $item));
311: $bbox->setMaxy($this->getValue("./@maxy", $item));
312:
313: $wmslayer->addBoundingBox($bbox);
314: }
315: }
316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329:
330: $attributionEl = $this->getValue("./Attribution", $contextElm);
331: if($attributionEl !== null)
332: {
333: $attribution = new Attribution();
334: $attribution->setTitle($this->getValue("./Title/text()",
335: $attributionEl));
336: $attribution->setOnlineResource($this->getValue("./OnlineResource/@xlink:href",
337: $attributionEl));
338: $logoUrl = new LegendUrl();
339: $logoUrl->setHeight($this->getValue("./LogoURL/@height",
340: $attributionEl));
341: $logoUrl->setWidth($this->getValue("./LogoURL/@width",
342: $attributionEl));
343: $onlineResource = new OnlineResource();
344: $onlineResource->setHref($this->getValue("./LogoURL/OnlineResource/@xlink:href",
345: $attributionEl));
346: $onlineResource->setFormat($this->getValue("./LogoURL/Format/text()",
347: $attributionEl));
348: $logoUrl->setOnlineResource($onlineResource);
349: $attribution->setLogoUrl($logoUrl);
350: $wmslayer->setAttribution($attribution);
351: }
352:
353: $authorityList = $this->xpath->query("./AuthorityURL", $contextElm);
354: $identifierList = $this->xpath->query("./Identifier", $contextElm);
355: if($authorityList !== null)
356: {
357: foreach($authorityList as $authorityEl)
358: {
359: $authority = new Authority();
360: $authority->setName($this->getValue("./@name", $authorityEl));
361: $authority->setUrl($this->getValue("./OnlineResource/@xlink:href",
362: $authorityEl));
363: $wmslayer->addAuthority($authority);
364: }
365: }
366: if($identifierList !== null)
367: {
368: foreach($identifierList as $identifierEl)
369: {
370: $identifier = new Identifier();
371: $identifier->setAuthority($this->getValue("./@authority",
372: $identifierEl));
373: $identifier->setValue($this->getValue("./text()", $identifierEl));
374: $wmslayer->setIdentifier($identifier);
375: }
376: }
377:
378: $metadataUrlList = $this->xpath->query("./MetadataURL", $contextElm);
379: if($metadataUrlList !== null)
380: {
381: foreach($metadataUrlList as $metadataUrlEl)
382: {
383: $metadataUrl = new MetadataUrl();
384: $onlineResource = new OnlineResource();
385: $onlineResource->setFormat($this->getValue("./Format/text()",
386: $metadataUrlEl));
387: $onlineResource->setHref($this->getValue("./OnlineResource/@xlink:href",
388: $metadataUrlEl));
389: $metadataUrl->setOnlineResource($onlineResource);
390: $metadataUrl->setType($this->getValue("./@type", $metadataUrlEl));
391: $wmslayer->addMetadataUrl($metadataUrl);
392: }
393: }
394:
395: $dimensionList = $this->xpath->query("./Dimension", $contextElm);
396: if($dimensionList !== null)
397: {
398: foreach($dimensionList as $dimensionEl)
399: {
400: $dimension = new Dimension();
401: $dimension->setName($this->getValue("./@name", $dimensionEl));
402: $dimension->setUnits($this->getValue("./@units", $dimensionEl));
403: $dimension->setUnitSymbol($this->getValue("./@unitSymbol",
404: $dimensionEl));
405: $wmslayer->addDimensionl($dimension);
406: }
407: }
408:
409: $extentList = $this->xpath->query("./Extent", $contextElm);
410: if($extentList !== null)
411: {
412: foreach($extentList as $extentEl)
413: {
414: $extent = new Extent();
415: $extent->setName($this->getValue("./@name", $extentEl));
416: $extent->setDefault($this->getValue("./@default", $extentEl));
417: $extent->setMultipleValues($this->getValue("./@multipleValues",
418: $extentEl) !== null ? (bool) $this->getValue("./@name",
419: $extentEl)
420: : null);
421: $extent->setNearestValue($this->getValue("./@nearestValue",
422: $extentEl) !== null ? (bool) $this->getValue("./@name",
423: $extentEl)
424: : null);
425: $extent->setCurrent($this->getValue("./@current", $extentEl) !== null
426: ? (bool) $this->getValue("./@name",
427: $extentEl) : null);
428: $extent->setExtentValue($this->getValue("./text()", $extentEl));
429: $wmslayer->addExtent($extent);
430: }
431: }
432:
433: $dataUrlList = $this->xpath->query("./DataURL", $contextElm);
434: if($dataUrlList !== null)
435: {
436: foreach($dataUrlList as $dataUrlEl)
437: {
438: $onlineResource = new OnlineResource();
439: $onlineResource->setFormat($this->getValue("./Format/text()",
440: $dataUrlEl));
441: $onlineResource->setHref($this->getValue("./OnlineResource/@xlink:href",
442: $dataUrlEl));
443:
444: $wmslayer->addDataUrl($onlineResource);
445: }
446: }
447:
448: $featureListUrlList = $this->xpath->query("./FeatureListURL",
449: $contextElm);
450: if($featureListUrlList !== null)
451: {
452: foreach($featureListUrlList as $featureListUrlEl)
453: {
454: $onlineResource = new OnlineResource();
455: $onlineResource->setFormat($this->getValue("./Format/text()",
456: $featureListUrlEl));
457: $onlineResource->setHref($this->getValue("./OnlineResource/@xlink:href",
458: $featureListUrlEl));
459:
460: $wmslayer->addFeatureListUrl($onlineResource);
461: }
462: }
463:
464: $tempList = $this->xpath->query("./Style", $contextElm);
465: if($tempList !== null)
466: {
467: foreach($tempList as $item)
468: {
469: $style = new Style();
470: $style->setName($this->getValue("./Name/text()", $item));
471: $style->setTitle($this->getValue("./Title/text()", $item));
472: $style->setAbstract($this->getValue("./Abstract/text()", $item));
473:
474: $legendUrlEl = $this->getValue("./LegendURL", $item);
475: if($legendUrlEl !== null)
476: {
477: $legendUrl = new LegendUrl();
478: $legendUrl->setWidth($this->getValue("./@width",
479: $legendUrlEl));
480: $legendUrl->setHeight($this->getValue("./@height",
481: $legendUrlEl));
482: $onlineResource = new OnlineResource();
483: $onlineResource->setFormat($this->getValue("./Format/text()",
484: $legendUrlEl));
485: $onlineResource->setHref($this->getValue("./OnlineResource/@xlink:href",
486: $legendUrlEl));
487: $legendUrl->setOnlineResource($onlineResource);
488: $style->setLegendUrl($legendUrl);
489: }
490:
491: $styleUrlEl = $this->getValue("./StyleURL", $item);
492: if($styleUrlEl !== null)
493: {
494: $onlineResource = new OnlineResource();
495: $onlineResource->setFormat($this->getValue("./Format/text()",
496: $styleUrlEl));
497: $onlineResource->setHref($this->getValue("./OnlineResource/@xlink:href",
498: $styleUrlEl));
499: $style->setStyleUlr($onlineResource);
500: }
501:
502: $stylesheetUrlEl = $this->getValue("./StyleSheetURL", $item);
503: if($stylesheetUrlEl !== null)
504: {
505: $onlineResource = new OnlineResource();
506: $onlineResource->setFormat($this->getValue("./Format/text()",
507: $stylesheetUrlEl));
508: $onlineResource->setHref($this->getValue("./OnlineResource/@xlink:href",
509: $stylesheetUrlEl));
510: $style->setStyleSheetUrl($onlineResource);
511: }
512: $wmslayer->addStyle($style);
513: }
514: }
515: $scaleHintEl = $this->getValue("./ScaleHint", $contextElm);
516: if($scaleHintEl !== null)
517: {
518: $scaleHint = new MinMax();
519: $min = $this->getValue("./@min", $scaleHintEl);
520: $scaleHint->setMin($min !== null ? floatval($min) : null);
521: $max = $this->getValue("./@max", $scaleHintEl);
522: $scaleHint->setMax($max !== null ? floatval($max) : null);
523: $wmslayer->setScaleHint($scaleHint);
524:
525:
526:
527:
528:
529:
530:
531:
532:
533:
534:
535:
536:
537:
538:
539:
540: $minScale = ($scaleHint->getMin()/sqrt(2.0))*$this->resolution/2.54*100;
541: $maxScale = ($scaleHint->getMax()/sqrt(2.0))*$this->resolution/2.54*100;
542: $scale = new MinMax();
543: $scale->setMax(round($maxScale));
544: $scale->setMin(round($minScale));
545: $wmslayer->setScale($scale);
546: }
547:
548: $tempList = $this->xpath->query("./Layer", $contextElm);
549: if($tempList !== null)
550: {
551: foreach($tempList as $item)
552: {
553: $subwmslayer = $this->parseLayer($wms, new WmsLayerSource(),
554: $item);
555: $subwmslayer->setParent($wmslayer);
556: $subwmslayer->setSource($wms);
557: $wmslayer->addSublayer($subwmslayer);
558: $wms->addLayer($subwmslayer);
559: }
560: }
561: $wmslayer->setSource($wms);
562: return $wmslayer;
563: }
564:
565: }
566:
567: