@@ -264,6 +264,11 @@ func mapContactInfo(contactInfo smoothoperatorv1.ContactInfo) (serviceContactInf
264264func MapWMSToCapabilitiesGeneratorInput (wms * pdoknlv3.WMS , ownerInfo * smoothoperatorv1.OwnerInfo ) (* capabilitiesgenerator.Config , error ) {
265265 canonicalServiceURL := wms .URL ()
266266
267+ layer , err := getLayers (wms , canonicalServiceURL .String ())
268+ if err != nil {
269+ return nil , err
270+ }
271+
267272 abstract := mapperutils .EscapeQuotes (wms .Spec .Service .Abstract )
268273
269274 config := capabilitiesgenerator.Config {
@@ -310,7 +315,7 @@ func MapWMSToCapabilitiesGeneratorInput(wms *pdoknlv3.WMS, ownerInfo *smoothoper
310315 },
311316 Exception : wms130.ExceptionType {Format : []string {"XML" , "BLANK" }},
312317 ExtendedCapabilities : nil ,
313- Layer : getLayers ( wms , canonicalServiceURL . String ()) ,
318+ Layer : layer ,
314319 },
315320 OptionalConstraints : nil ,
316321 },
@@ -413,13 +418,15 @@ func getDcpType(url string, fillPost bool) *wms130.DCPType {
413418 return & result
414419}
415420
416- func getLayers (wms * pdoknlv3.WMS , canonicalURL string ) []wms130.Layer {
417- return []wms130.Layer {
418- mapLayer (wms .Spec .Service .Layer , canonicalURL , nil , nil , nil ),
421+ func getLayers (wms * pdoknlv3.WMS , canonicalURL string ) ([]wms130.Layer , error ) {
422+ layer , err := mapLayer (wms .Spec .Service .Layer , canonicalURL , nil , nil , nil , nil )
423+ if err != nil {
424+ return nil , err
419425 }
426+ return []wms130.Layer {* layer }, nil
420427}
421428
422- func mapLayer (layer pdoknlv3.Layer , canonicalURL string , authorityURL * wms130.AuthorityURL , identifier * wms130.Identifier , parentStyleNames []string ) wms130.Layer {
429+ func mapLayer (layer pdoknlv3.Layer , canonicalURL string , authorityURL * wms130.AuthorityURL , identifier * wms130.Identifier , parentStyleNames []string , parentBBoxes [] * wms130. LayerBoundingBox ) ( * wms130.Layer , error ) {
423430 if layer .Authority != nil {
424431 authorityURL = & wms130.AuthorityURL {
425432 Name : layer .Authority .Name ,
@@ -435,39 +442,46 @@ func mapLayer(layer pdoknlv3.Layer, canonicalURL string, authorityURL *wms130.Au
435442 }
436443 }
437444
445+ crsses , exBbox , bboxes , err := mapBBoxes (layer .BoundingBoxes , parentBBoxes )
446+ if err != nil {
447+ return nil , err
448+ }
449+
438450 l := wms130.Layer {
439- Queryable : smoothoperatorutils .Pointer (1 ),
440- Opaque : nil ,
441- Name : layer .Name ,
442- Title : mapperutils .EscapeQuotes (smoothoperatorutils .PointerVal (layer .Title , "" )),
443- Abstract : smoothoperatorutils .Pointer (mapperutils .EscapeQuotes (smoothoperatorutils .PointerVal (layer .Abstract , "" ))),
444- KeywordList : & wms130.Keywords {Keyword : layer .Keywords },
445- // TODO
446- //CRS: defaultCrs,
447- //EXGeographicBoundingBox: &defaultBoundingBox,
448- //BoundingBox: allDefaultBoundingBoxes,
449- Dimension : nil ,
450- Attribution : nil ,
451- AuthorityURL : authorityURL ,
452- Identifier : identifier ,
453- DataURL : nil ,
454- FeatureListURL : nil ,
455- Style : getLayerStyles (layer , canonicalURL , parentStyleNames ),
456- Layer : []* wms130.Layer {},
451+ Queryable : smoothoperatorutils .Pointer (1 ),
452+ Opaque : nil ,
453+ Name : layer .Name ,
454+ Title : mapperutils .EscapeQuotes (smoothoperatorutils .PointerVal (layer .Title , "" )),
455+ Abstract : smoothoperatorutils .Pointer (mapperutils .EscapeQuotes (smoothoperatorutils .PointerVal (layer .Abstract , "" ))),
456+ KeywordList : & wms130.Keywords {Keyword : layer .Keywords },
457+ CRS : crsses ,
458+ EXGeographicBoundingBox : exBbox ,
459+ BoundingBox : bboxes ,
460+ Dimension : nil ,
461+ Attribution : nil ,
462+ AuthorityURL : authorityURL ,
463+ Identifier : identifier ,
464+ DataURL : nil ,
465+ FeatureListURL : nil ,
466+ Style : getLayerStyles (layer , canonicalURL , parentStyleNames ),
467+ Layer : []* wms130.Layer {},
457468 }
458469
459470 if layer .MinScaleDenominator != nil {
460471 float , err := strconv .ParseFloat (* layer .MinScaleDenominator , 64 )
461- if err = = nil {
462- l . MinScaleDenominator = & float
472+ if err ! = nil {
473+ return nil , err
463474 }
475+ l .MinScaleDenominator = & float
476+
464477 }
465478
466479 if layer .MaxScaleDenominator != nil {
467480 float , err := strconv .ParseFloat (* layer .MaxScaleDenominator , 64 )
468- if err = = nil {
469- l . MaxScaleDenominator = & float
481+ if err ! = nil {
482+ return nil , err
470483 }
484+ l .MaxScaleDenominator = & float
471485 }
472486
473487 if layer .DatasetMetadataURL != nil {
@@ -489,11 +503,81 @@ func mapLayer(layer pdoknlv3.Layer, canonicalURL string, authorityURL *wms130.Au
489503
490504 // Map sublayers
491505 for _ , sublayer := range layer .Layers {
492- mapped := mapLayer (sublayer , canonicalURL , authorityURL , identifier , append (parentStyleNames , layerStyleNames ... ))
493- l .Layer = append (l .Layer , & mapped )
506+ mapped , err := mapLayer (sublayer , canonicalURL , authorityURL , identifier , append (parentStyleNames , layerStyleNames ... ), bboxes )
507+ if err != nil {
508+ return nil , err
509+ }
510+ l .Layer = append (l .Layer , mapped )
494511 }
495512
496- return l
513+ return & l , nil
514+ }
515+
516+ func mapBBoxes (layerBBoxes []pdoknlv3.WMSBoundingBox , parentBBoxes []* wms130.LayerBoundingBox ) ([]wms130.CRS , * wms130.EXGeographicBoundingBox , []* wms130.LayerBoundingBox , error ) {
517+ bboxMap := make (map [string ]* wms130.LayerBoundingBox )
518+ crsstrings := []string {}
519+ for _ , bbox := range parentBBoxes {
520+ crsstrings = append (crsstrings , bbox .CRS )
521+ bboxMap [bbox .CRS ] = bbox
522+ }
523+ for _ , bbox := range layerBBoxes {
524+ minX , err := strconv .ParseFloat (bbox .BBox .MinX , 64 )
525+ if err != nil {
526+ return nil , nil , nil , err
527+ }
528+ minY , err := strconv .ParseFloat (bbox .BBox .MinY , 64 )
529+ if err != nil {
530+ return nil , nil , nil , err
531+ }
532+ maxX , err := strconv .ParseFloat (bbox .BBox .MaxX , 64 )
533+ if err != nil {
534+ return nil , nil , nil , err
535+ }
536+ maxY , err := strconv .ParseFloat (bbox .BBox .MaxY , 64 )
537+ if err != nil {
538+ return nil , nil , nil , err
539+ }
540+ if ! slices .Contains (crsstrings , bbox .CRS ) {
541+ crsstrings = append (crsstrings , bbox .CRS )
542+ }
543+ bboxMap [bbox .CRS ] = & wms130.LayerBoundingBox {
544+ CRS : bbox .CRS ,
545+ Minx : minX ,
546+ Miny : minY ,
547+ Maxx : maxX ,
548+ Maxy : maxY ,
549+ }
550+ }
551+
552+ var exBbox * wms130.EXGeographicBoundingBox
553+ bboxes := []* wms130.LayerBoundingBox {}
554+ crsses := []wms130.CRS {}
555+
556+ for _ , crs := range crsstrings {
557+ crsSplit := strings .Split (crs , ":" )
558+ code , err := strconv .Atoi (crsSplit [1 ])
559+ if err != nil {
560+ return nil , nil , nil , err
561+ }
562+ crsses = append (crsses , wms130.CRS {
563+ Namespace : crsSplit [0 ],
564+ Code : code ,
565+ })
566+
567+ bbox := bboxMap [crs ]
568+ bboxes = append (bboxes , bbox )
569+
570+ if crs == "CRS:84" {
571+ exBbox = & wms130.EXGeographicBoundingBox {
572+ WestBoundLongitude : bbox .Minx ,
573+ EastBoundLongitude : bbox .Maxx ,
574+ SouthBoundLatitude : bbox .Miny ,
575+ NorthBoundLatitude : bbox .Maxy ,
576+ }
577+ }
578+
579+ }
580+ return crsses , exBbox , bboxes , nil
497581}
498582
499583func getLayerStyles (layer pdoknlv3.Layer , canonicalURL string , parentStyleNames []string ) (styles []* wms130.Style ) {
0 commit comments