WMTS Layer im 3D Modus nicht sichtbar

Issue #776 resolved
Dominik Fröhlich created an issue

Die auf WMTS basierenden Layer sind bei aktiviertem 3D Modus nicht mehr sichtbar. Das ist vor Allem deshalb ärgerlich, da die 3D Gebäude erst ab einer bestimmten Höhe sichtbar sind und der User schlimmstenfalls ein weißes Kartenfenster ohne Orientierungsmöglichkeit bekommt und von einer Störung ausgeht.

Z.B. https://geoportal.freiburg.de/freigis/

Der VCS Viewer kann seltsamerweise eigentlich WMTS. Die Hintergrundlayer in unserem dezidierten 3D Modell sind alle WMTS:

https://3d.freiburg.de

Ich vermute daher, dass die Konfiguration nicht korrekt an den VCS/Cesium Teil übergeben wird?

Gruß

Dominik

Comments (32)

  1. Dennis Sen

    Moin,

    ich kann das Problem nachstellen (Konfig für Dev-Mode wird gleich oben angehängt), habe es aber noch nicht gelöst. Beim Herumprobieren konnte ich mit nur einem aktiven Layer auch dies erzeugen:

    Sieht so aus, als wäre das ein tiefergehendes Problem in der Verbindung mit Cesium …

    Soweit festgestellt:

    • Der Layer ist da (d.h. in der Map eingebunden, nicht nur im Themenbaum)
    • Projektion/Zoomstufen passen auf den ersten Blick
    • Es liegt nicht an Sichtbarkeit/zIndex/Transparenz des Layers
    • Es liegt nicht an minScale/maxScale (habe mal 0 bis 999999 eingestellt)
    • Wenn ich herumscrolle/-zoome, wird selten einmal auch etwas vom WMTS geladen

    Bin gerade etwas ideenlos, wie ich weitersuchen könnte. 🤔

  2. Dominik Fröhlich reporter

    Na das sieht ja interessant aus… 😉
    Bei mir wird afaik nichts vom WMTS geladen, checke ich aber gleich nochmal. Lädt der WMTS sinnvolle Kacheln? Also welche, die er auch im 2D laden würde? Ansonsten gehen da vlt irgendwo die bounds verloren?

    EDIT: Sicher, dass er den WMTS lädt und nicht den WMS für die Minimap?

  3. Dennis Sen

    Es war wohl die Minimap. Nachdem ich sie rausgenommen habe, kann ich den Effekt jedenfalls nicht mehr reproduzieren.

  4. Dennis Sen

    Ah, habe jetzt eine Stelle gefunden. WMTS wird in der masterportalAPI aussortiert. Layer ist zwar in der Map, aber irgendein Baustein fehlt dafür … mal schauen, jetzt habe ich immerhin eine Stelle. 🙂

  5. Dennis Sen

    Aktueller Stand:

    Ich habe im Masterportal während des Dev-Modus in node_modules/@masterportal/masterportalapi/src/maps/olcs/3dUtils/wmsRasterSynchronizer.js Code für den WMTS hinzugefügt; die Funktion convertLayerToCesiumImageries sieht nun so aus, neuer Teil mit // hervorgehoben:

    function convertLayerToCesiumImageries (olLayer, viewProj) {
            const layerOptions = {
                "show": false
            };
            let source = {},
                cesiumLayer = {},
                provider = null;
    
            if (!(olLayer instanceof Tile) && !(olLayer instanceof ImageLayer)) {
                return null;
            }
    
            source = olLayer.getSource();
            console.error(source)
    
            if (source instanceof TileWMS) {
                console.log("tile")
                provider = this.createProviderForTileWMS(source, viewProj, olLayer);
            }
            else if (source instanceof ImageWMS) {
                console.log("ImageWMS")
                return [this.createImageryLayerForImageWMS(olLayer, viewProj)];
            }
            else if (source instanceof StaticImageSource) {
                console.log("StaticImageSource")
                provider = this.createProviderForStaticImageSource(source);
            }
            // // // // // // //
            // ENTER NEW PART //
            // // // // // // //
            else if (source instanceof WMTS) {
                const options = {
                        url: source.getUrls()[0],
                        format : source.getFormat(),
                        layer: source.getLayer(),
                        style : source.getStyle(),
                        tileMatrixSetID : source.getMatrixSet(),
                        credit : source.getAttributions()
                    },
                    tileGrid = source.tileGrid;
    
                if (tileGrid) {
                    options.tileWidth = tileGrid.getTileSize(0);
                    options.tileHeight = tileGrid.getTileSize(1);
    
                    const extent = tileGrid.getExtent()
    
                    if (extent && viewProj) {
                        const minMax =
                            this.getMinMaxLevelFromTileGrid(tileGrid, extent, viewProj);
    
                        options.minimumLevel = minMax[0];
                        options.maximumLevel = minMax[1];
                        options.rectangle =
                            olcsCore.extentToRectangle(extent, viewProj);
                    }
                }
    
                console.log('source', source)
                console.log('WebMapTileServiceImageryProvider.options', options)
                provider = new Cesium.WebMapTileServiceImageryProvider(options);
            }
            // // // // // // //
            // LEAVE NEW PART //
            // // // // // // //
            else {
                console.warn("Sources other than TileImage are currently not supported.");
                return null;
            }
    
            cesiumLayer = new Cesium.ImageryLayer(provider, layerOptions);
    
            return cesiumLayer ? [cesiumLayer] : null;
        }
    

    Jetzt wird der Layer vom Klienten auch angefragt, aber leider mit völlig falschen Kachelnummern, etwa https://sgx.geodatenzentrum.de/wmts_topplus_open/tile/1.0.0/web/default/EU_EPSG_25832_TOPPLUS/17/45570/68372.png – da ist halt nichts mehr.

    In der Doku seitens Cesium https://cesium.com/learn/cesiumjs/ref-doc/WebMapTileServiceImageryProvider.html#.ConstructorOptions finde ich keine weiteren Hinweise (das mäßig dokumentierte “dimensions” sieht noch verdächtig aus, aber was das “Object” wohl sein soll? Direkt die dimensions aus `source.getDimensions()` reinwerfen nutzte nichts), und die Beispiele zu ol-cesium gehen gar nicht erst in diese Tiefe: https://codesandbox.io/s/rhf3b?file=/main.js

    Ich bin mir auch nicht sicher, ob hier wegen des Koordinatenreferenzsystems im WMTS ein Reprojektionsbug den Fortschritt verhindert: https://github.com/openlayers/ol-cesium/pull/690 Dort scheinen laut den verlinkten Bildern ja auch Inhalte an die falsche Stelle zu rutschen.

    An der Stelle bin ich jetzt gerade ratlos, wie es weitergehen kann. @geowerkstatt Hat jemand von euch mit tieferen 3D-Kenntnissen Zeit für dieses Issue? Ich habe das Gefühl nur eine Zeile von der richtigen Lösung entfernt zu sein …

  6. Friedrich Müller

    @Dennis Sen Ich gucke mir das gerade mal an.

    Evtl. hilft das Beispiel von OLCS weiter:

    https://github.com/openlayers/ol-cesium/blob/master/examples/wmts.js

    https://openlayers.org/ol-cesium/examples/wmts.html

    Ich habe auch mal testweise einen anderen WMTS eingebunden, der funktioniert zwar in 2D, in 3D liefert er aber keine Kacheln zurück:

    {
    "id": "2020",
    "name": "EOC Basemap",
    "capabilitiesUrl": "https://tiles.geoservice.dlr.de/service/wmts?SERVICE=WMTS&REQUEST=GetCapabilities",
    "typ": "WMTS",
    "layers": "eoc:basemap",
    "optionsFromCapabilities": true
    }

    Liegt wohl an dem Wert "optionsFromCapabilities": true . Mit selbstdefinierten Werten funktioniert eine Anzeige. (Z.B Erstes Beispiel in der services.json md)

    Hier müsste wahrscheinlich noch was erweitert werden?

    Wg. der Problematik, dass außerhalb eines Dienste-extents eine Fehlermeldung auftritt wo der Dienst keine Kacheln liefern kann. Würde ich erstmal unkritisch sehen -falls man dies spontan nicht noch abfangen kann. Müsste man dann evtl. mal in einem Folgeticket betrachten.

    Dieses Verhalten tritt ja nicht nur beim WMTS auf, sondern auch bei WMS etc:

  7. Dennis Sen

    Moin Friedrich,

    danke für deine Untersuchung. Das mit optionsFromCapabilities war ein guter Hinweis, ich habe da näher reingeschaut und bemerkt, dass tatsächlich zu viel in den optionsFromCapabilities stand. Ein Teil des Codes oben scheint auch unnötig gewesen zu sein.

    Unter dem PR https://bitbucket.org/geowerkstatt-hamburg/masterportalapi/pull-requests/62/issue-776-fix-3d-wmts an der masterportalAPI habe ich den Fix mit lauffähigem Beispiel eingestellt; ein Bug tritt noch auf, der ist dort näher beschrieben; da müssen wir vermutlich auf olcs warten (oder dort unterstützen?).

  8. Friedrich Müller

    Moin Dennis,

    ging ja flott mit dem fix 👍

    Danke für den Hinweis mit dem OLCS Bug- Subscriben ist erstmal eine gute Idee.

    Deinen PR gucke ich mir an.

  9. Dennis Sen

    Der PR ist in der masterportalAPI gemerged und mit der 2.4.0 der masterportalAPI veröffentlicht worden; diese ist nun in der Masterportal-Version 2.23.0 mit verbaut. Die Sichtbarkeit von WMTS-Layern kann nun also gern einmal geprüft werden. 🙂

    Dabei wird der im Screenshot in https://bitbucket.org/geowerkstatt-hamburg/masterportalapi/pull-requests/62/issue-776-fix-3d-wmts dargestellte Bug auf “hohen” (weit entfernten) Zoomstufen weiter auftreten.

    Viele Grüße

  10. Dennis Sen

    Ich habe die angehängte Konfiguration einmal ausprobiert. Der 3D-Modus für WMTS funktioniert soweit. Auf sehr weit entfernten Zoomstufen (z.B. ganzer Planet sichtbar) gibt es leider den im PR angemerkten Fehler, für einzelne Bundesländer/Städte sollte aber alles rund laufen.

    Viele Grüße

  11. Dominik Fröhlich reporter

    Hallo,

    erst mal danke für den fix!

    In der 2.26.1 wird jetzt bei uns allerdings wieder eine tilematrix “undefined” abgefragt. Bug wieder da oder neuer Issue?

    Gruß

    Dominik

  12. Dominik Fröhlich reporter

    Beim TopPlus WMTS wird in der 2.26.1 im 3D Modus eine Tilematrix “{TileMatrix}” abgefragt:

    https://sgx.geodatenzentrum.de/wmts_topplus_open/tile/1.0.0/web/default/EU_EPSG_25832_TOPPLUS/%7BTileMatrix%7D/22784/34185.png

    Reproduzierbar in:

    https://geoportal.freiburg.de/freigis_dev/index_2261.html

    EDIT: die fragliche LayerID ist “topplus_wmts”:

    {
        "id": "topplus_wmts",
        "name": "TopPlusOpen",
        "capabilitiesUrl": "https://sgx.geodatenzentrum.de/wmts_topplus_open/1.0.0/WMTSCapabilities.xml",
        "optionsFromCapabilities": true,
        "urls": [
          "https://sgx.geodatenzentrum.de/wmts_topplus_open/tile/1.0.0/web/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png"
        ],
        "typ": "WMTS",
        "layers": "web",
        "format": "image/png",
        "version": "1.0.0",
        "origin": [
          -3803165.98427,
          8805908.08285
        ],
        "isBaseLayer": true,
        "style": "default",
        "transparent": false,
        "tileSize": "256",
        "minScale": "3000",
        "maxScale": "2500000",
        "tileMatrixSet": "EU_EPSG_25832_TOPPLUS",
        "coordinateSystem": "EPSG:25832",
        "legend": [
          "https://sg.geodatenzentrum.de/wms_topplus_open?styles=&layer=web&service=WMS&format=image/png&sld_version=1.1.0&request=GetLegendGraphic&version=1.1.1"
        ],
        "requestEncoding": "REST",
        "resLength": "13",
        "layerAttribution": "Quellenvermerk: © Bundesamt für Kartographie und Geodäsie",
        "datasets": [
          {
            "md_id": "A1C4E929-3EC9-4758-9677-DB4970D226AB",
            "csw_url": " https://gdk.gdi-de.org/gdi-de/srv/ger/csw?",
            "show_doc_url": "https://gdk.gdi-de.org/gdi-de/srv/ger/catalog.search#/metadata/"
          }
        ]
      },
    

    Der issue tritt aber auch bei anderen WMTS auf.

    EDIT2:

    die Layerdefinition ist stark verkürzbar:

    {
    "id": "topplus_wmts",
    "name": "TopPlusOpen",
    "capabilitiesUrl": "https://sgx.geodatenzentrum.de/wmts_topplus_open/1.0.0/WMTSCapabilities.xml",
    "urls": "https://sgx.geodatenzentrum.de/wmts_topplus_open",
    "optionsFromCapabilities": true,
    "tileMatrixSet": "EU_EPSG_25832_TOPPLUS",
    "typ": "WMTS",
    "layers": "web",
    "isBaseLayer": true,
    "legend": [
    "https://sg.geodatenzentrum.de/wms_topplus_open?styles=&layer=web&service=WMS&format=image/png&sld_version=1.1.0&request=GetLegendGraphic&version=1.1.1"
    ],
    "layerAttribution": "Quellenvermerk: © Bundesamt für Kartographie und Geodäsie",
    "datasets": [
    {
    "md_id": "A1C4E929-3EC9-4758-9677-DB4970D226AB",
    "csw_url": " https://gdk.gdi-de.org/gdi-de/srv/ger/csw?",
    "show_doc_url": "https://gdk.gdi-de.org/gdi-de/srv/ger/catalog.search#/metadata/"
    }
    ]
    },
    

    ändert aber nichts.

  13. Dennis Sen

    Moin @Dominik Fröhlich ,

    ich habe einen PR https://bitbucket.org/geowerkstatt-hamburg/masterportal/pull-requests/4009 erstellt, der die Dokumentation dahingehend verschärft. Ich habe da auch länger drüber gebrütet, bis mir aufgefallen ist, dass hier das Setzen von “tileMatrixSet“ das Problem erzeugt.

    Oder hast du einen Anwendungsfall, in dem das tileMatrixSet gesetzt werden muss? Dann müsste ich noch mal tiefer graben, woran es liegt.

    Die verkürzte Layerdefinition abzüglich “tileMatrixSet“ hat bei mir aber in der masterportalAPI funktioniert:

  14. Dennis Sen

    Ich schließe einmal der Übersicht halber, da es meiner Einschätzung nach ein Konfigurationsproblem war.

    Es sei denn, natürlich, dass du meine vorangehende Frage noch bejahst. Dann mach gern wieder auf, dann ist ja auch doch was zu tun.

  15. Dominik Fröhlich reporter

    Hallo Dennis,

    leider nicht resolved.

    Oder hast du einen Anwendungsfall, in dem das tileMatrixSet gesetzt werden muss?

    Klar muss TileMatrixSet gesetzt werden, sonst benutzt er die falsche Projektion. Er soll ja die "EU_EPSG_25832_TOPPLUS" verwenden und nicht “WEBMERCATOR”, was ganz grausig verzerrt wäre…

    EDIT: Ich befürchte, dass das ein Problem mit der Interaktion zwischen OpenLayers und Cesium ist, das die Projektion nicht kann, siehe https://github.com/openlayers/ol-cesium/issues/771

    Gruß

    Dominik

  16. Dominik Fröhlich reporter

    Priority increased to major for increassing number of 3D applications stuck without background maps…

  17. Dominik Fröhlich reporter

    It is definetly a projection issue. WMTS with WEBMERCATOR as projection do work, the ones in ETRS 25832 do not.

    As kind of a workaround i added some of the most important background maps twice in our portal with a (2D) or (3D) name extension and a corresponding ‘"supported": ["2D"]’ or “3D” flag in the config.json. However, this is not a permanent solution for they now appear twice in the menu (must stay like this, to be able to toggle them on or off) and, even worse, the MasterPortal appears to confuse about the 2D/3D state on init, so both will be loaded at startup until 2D/3D mode is toggled the first time. Setting of

    startingMap3D: false
    

    in the config.js has no effect on this behaviour.

  18. Finn-Rasmus Darge

    Hallo Herr Fröhlich,

    ich habe mir das Ticket einmal geschnappt und habe eine Nachfrage. Sie schreiben, dass das "TileMatrixSet" benötigt wird: "Er soll ja die 'EU_EPSG_25832_TOPPLUS' verwenden und nicht 'WEBMERCATOR', was ganz grausig verzerrt wäre..."

    Wenn ich dem Vorschlag von Dennis folge und das "TileMatrixSet" aus der "service-internet.json"-Konfiguration für den Layer entferne, funktioniert die Anzeige bei mir und sieht so aus wie bei Ihrer Notlösung, bei der zwei Layer jeweils für 2D/3D konfiguriert werden.

    Beim WMTS ohne "TileMatrixSet" greift die Projektion "EPSG:3857", aber das ist dann verzerrt, wie Sie schreiben? Ich sehe dort keinen Unterschied zum 2D-Modus und würde gerne wissen, was Ihr Wunschzustand ist. Oder geht es darum, dass der WMTS auch mit gesetztem "tileMatrixSet": "EU_EPSG_25832_TOPPLUS" so funktionieren soll?

    Vielen Dank im Voraus.

    Viele Grüße,
    Finn-Rasmus Darge

  19. Dominik Fröhlich reporter

    Hallo Herr Darge,

    das Problem ist, dass die Dienste im “normalen” 2D Modus das Tileset für 25832 brauchen und nicht Webmercator (da sonst eben dort furchtbar verzerrt). Gleichzeitig funktionieren sie dann im Cesium nicht mehr.

    Eine optimale Lösung gibt es hier wohl nicht so lange Ceium nur Webmercator kann. Eine Verzerrung wäre mir im 3D allerdings weniger wichtig, da hier spätestens beim Kippen sowieso verzerrt wird.

    Gleichzeitig sollten natürlich keine 2 Definitionen notwendig sein um den selben Dienst sowohl im 2D also auch im 3D verfügbar zu machen. Zumal man wie oben beschrieben in einen weiteren Bug läuft, so dass dann beide Dienste geladen werden.

    Gruß

    Dominik Fröhlich

  20. Finn-Rasmus Darge

    Hallo Herr Fröhlich,

    vielen Dank für die schnelle Antwort, das bringt etwas Licht ins Dunkle. Können Sie mir von diesem Fall "die Dienste im 'normalen' 2D-Modus das Tileset für 25832 brauchen und nicht Webmercator (da sonst eben dort furchtbar verzerrt)." einen Screenshot schicken? Bei mir sieht es in 2D und 3D absolut identisch aus, und ich kann keine Verzerrung erkennen wenn “tileMatrixSet” entfernt wurde. Wie kann ich das reproduzieren?

    Ich gebe Ihnen aber schon recht, dass es mit einer optimalen Lösung schwierig aussieht. Da die "services-internet.json" beim Start des Portals verarbeitet wird, ist die Konfiguration des Layers erst einmal festgesetzt. Anpassungen bei den Anfragen einzubauen, je nach 2D- oder 3D-Modus, klingt für mich nicht richtig und ziemlich provisorisch.

    Mit freundlichen Grüßen,
    Finn-Rasmus Darge

  21. Dominik Fröhlich reporter

    Hallo Herr Darge,

    ich habe Ihnen zur Verdeutlichung mal in unserer _dev Instanz für die TopPlusOpen ohne TileMatrixSet die Beschränkung auf 3D rausgenommen. Sie ist jetzt auch im 2D Modus verfügbar, sieht aber eben entsprechend gruselig aus:

    https://geoportal.freiburg.de/freigis_dev

    Hier mal der direkte Vergleich: Einmal ein Ausschnitt mit richtiger Projektion

    und einmal der selbe Ausschnitt als Webmercator mit winzigen verwaschenen Labeln

    Gruß

    Dominik Fröhlich

  22. Dominik Fröhlich reporter

    EDIT nach einmal drüber schlafen:
    Eine vlt bessere Möglichkeit wäre, das MasterPortal würde am Anfang sicher feststellen ob es 2D oder 3D ist. Dann könnte man einfach eine Group aus beiden Definitionen laden wobei die Webmercator nur 3D und die ETRS nur 2D darf.

    EDIT2:

    ODER das Portal könnte beim Erstellen eines WMTS Layers immer beide configs laden (so verfügbar) und dann nur die Webmercator an Cesium weitergeben. Wäre sauberer in der Handhabung aber schwieriger umszusetzen.

  23. Finn-Rasmus Darge

    @geowerkstatt Für diesen Fall könnte eine Erweiterung der services-internet.json Parameter sinnvoll sein. Als Beispiel würde hier ja ein vielleicht ein Feld wie
    "onlyIn2D: ["tileMatrixSet"]" im besagten Layer helfen. Was meint Ihr, könnte das eine Möglichkeit sein? Oder habt ihr eine andere Idee?

  24. Dominik Fröhlich reporter

    Naja zuerst müsste gefixt werden, dass 2D / 3D state initial scheinbar unklar ist. Siehe https://geoportal.freiburg.de/freigis_dev
    Ich kann initial alle Layer auswählen, egal ob sie eigentlich nur 2D oder nur 3D sind. Das bedeutet, dass auch alle initial geladen werden die visible = true sind und das auch wenn sie eignentlich im falschen Modus sind…

    Sobald das geht kann ich da mit einer Group drum rumtricksen.

    Die tilematrix im 3D state (das ist ja der Sonderfall) abweichend festzulegen hilft halt nur, wenn er sich den Rest aus den capabilities ziehen kann. Sonst bräuchte man die halbe Config abweichend für 3D. Da spart man vermutlich wenig gegenüber zwei getrennten Einträgen.

    Genau genommen wäre es mir für den 3D state eigentlich egal, wenn der WMTS etwas verzerrt ist, also auch die 25832 benutzt. OpenLayers hat afaik eine Methode zur Verzerrten übergabe von WMTS in abweichender Projektion an Cesium. Die müsste man hier mitnutzen (falls die inzwischen gefixt ist. Da war afaik noch ein anderer Issue).

  25. Carina Brühl

    Layer können jetzt in der config spezifisch für 2D und 3D Modus definiert werden, so dass sie in den anderen Modi nicht angezeigt werden. Als visible=true konfigurierte Layer werden automatisch beim Wechsel ausgewählt und angezeigt.

  26. Log in to comment