From 7e9b59b4eba20219222ed0775d69361b7366905e Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Wed, 13 Nov 2024 09:58:00 +0100 Subject: [PATCH 01/19] [WIP] first draft --- .dockerignore | 16 +++ Dockerfile | 50 +++++++ docker/html/CityDBonDocker-big.png | Bin 0 -> 135373 bytes docker/html/TUM_Logo_blau_rgb_s.svg | 12 ++ docker/html/index.html | 106 +++++++++++++++ docker/package.json | 21 +++ docker/server.js | 203 ++++++++++++++++++++++++++++ 7 files changed, 408 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker/html/CityDBonDocker-big.png create mode 100644 docker/html/TUM_Logo_blau_rgb_s.svg create mode 100644 docker/html/index.html create mode 100644 docker/package.json create mode 100644 docker/server.js diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..c95a5540 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,16 @@ +/demos/ +/examples/ +/node_modules/ + +/.git +/.gitignore + +/build.xml +/CHANGES.md +/DEV_2.0.0.md +/LICENSE +/package-lock.json +/README.md +/RELEASES.md +/server.js +/tsconfig.json diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..f3b748f3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,50 @@ +# 3DCityDB Web Map Client Dockerfile ########################################## +# Official website https://www.3dcitydb.net +# GitHub https://github.com/3dcitydb/3dcitydb-web-map +############################################################################### + +# Base image +ARG BASEIMAGE_TAG='21-bookworm' +FROM "node:${BASEIMAGE_TAG}" + +# Setup 3DCityDB Web Map Client ############################################### +RUN set -ex \ + mkdir -p /var/www /var/www/data + +WORKDIR /var/www + +COPY /3dwebclient/ /js/ /theme /ThirdParty /ts /docker/* ./ + +RUN set -ex && \ + ls -lah && \ + npm install --production && \ + chown -R node:node . + + + +# RUN set -x \ +# && BUILD_PACKAGES='ca-certificates git' \ +# && apt-get update && apt-get install -y --no-install-recommends $BUILD_PACKAGES \ +# && git clone -b "${WEBMAPCLIENT_VERSION}" --depth 1 https://github.com/3dcitydb/3dcitydb-web-map.git /var/www \ +# && cd /var/www \ +# && rm -rf ./.git ./.gitignore ./LICENSE ./README.md ./build.xml \ +# ./node_modules ./server.js $(ls -1 --ignore=ajax-loader.gif --ignore=favicon.png \ +# --ignore=GPS_off.png --ignore=GPS_on.png --ignore=GPS_on_ori.png --ignore=GPS_on_pos_ori.png \ +# ./theme/img) \ +# && mkdir -p /var/www/data \ +# && apt-get purge -y --auto-remove $BUILD_PACKAGES \ +# && rm -rf /var/lib/apt/lists/* + +# WORKDIR /var/www/ +# COPY package.json ./ +# COPY html/* ./ +# COPY server.js ./ +# RUN set -x \ +# && npm install --production + +# RUN set -x \ +# && + +USER node +EXPOSE 8000 +CMD [ "node", "server.js", "--public"] diff --git a/docker/html/CityDBonDocker-big.png b/docker/html/CityDBonDocker-big.png new file mode 100644 index 0000000000000000000000000000000000000000..0fe19a839036e78088f63f4f602c604f2b9eb5aa GIT binary patch literal 135373 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

3DCityDB Web-Map-Client Docker

+
+ + + +
+

Welcome to the 3D City Database (3DCityDB) Web-Map-Client Docker Image!

+

To start the 3D Web-Map-Client, browse your data directory, or view the examples use the buttons below. +

+

+ Use the data directory listing to copy the required URLs for setting up a Web-Map-Client project using your Browser's "Right click""Copy link address" feature.
+ How to add data for usage within the 3DCityDB Web-Map-Client to the data directory is described here. +

+

+ If you require assistance using the 3DCityDB Web-Map-Client please take a look at the comprehensive documentation available at the official 3DCityDB Homepage or take a look at the learning material. + The documentation for the 3DCityDB Web-Map-Client Docker Image is available on GitHub. +

+
+ +
+ + \ No newline at end of file diff --git a/docker/package.json b/docker/package.json new file mode 100644 index 00000000..3df8156b --- /dev/null +++ b/docker/package.json @@ -0,0 +1,21 @@ +{ + "name": "3d-city-db-web-map-client-docker", + "version": "1.0.0", + "description": "Modified version of the 3DCityDB Web-Map-Client supporting directory listings.", + "homepage": "https://3dcitydb.org/", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/tum-gis/3dcitydb-web-map-docker" + }, + "dependencies": { + "express": "~4.18.x", + "compression": "1.7.x", + "request": "2.88.2", + "yargs": "17.7.2", + "serve-index": "1.9.1" + }, + "engines": { + "node": ">=21.x.x" + } +} diff --git a/docker/server.js b/docker/server.js new file mode 100644 index 00000000..bd2cb62b --- /dev/null +++ b/docker/server.js @@ -0,0 +1,203 @@ +/* + * 3DCityDB-Web-Map + * http://www.3dcitydb.org/ + * + * Copyright 2015 - 2017 + * Chair of Geoinformatics + * Technical University of Munich, Germany + * https://www.gis.bgu.tum.de/ + * + * The 3DCityDB-Web-Map is jointly developed with the following + * cooperation partners: + * + * virtualcitySYSTEMS GmbH, Berlin + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * A simple JavaScript based HTTP server forked from the cesium-starter-app project at https://github.com/pjcozzi/cesium-starter-app. + **/ + +(function() { + "use strict"; + /*global console,require,__dirname,process*/ + /*jshint es3:false*/ + + var express = require('express'); + var compression = require('compression'); + var url = require('url'); + var request = require('request'); + var serveIndex = require('serve-index'); + + var yargs = require('yargs').options({ + 'port' : { + 'default' : 8000, + 'description' : 'Port to listen on.' + }, + 'public' : { + 'type' : 'boolean', + 'description' : 'Run a public server that listens on all interfaces.' + }, + 'upstream-proxy' : { + 'description' : 'A standard proxy server that will be used to retrieve data. Specify a URL including port, e.g. "http://proxy:8000".' + }, + 'bypass-upstream-proxy-hosts' : { + 'description' : 'A comma separated list of hosts that will bypass the specified upstream_proxy, e.g. "lanhost1,lanhost2"' + }, + 'help' : { + 'alias' : 'h', + 'type' : 'boolean', + 'description' : 'Show this help.' + } + }); + var argv = yargs.argv; + + if (argv.help) { + return yargs.showHelp(); + } + + // eventually this mime type configuration will need to change + // https://github.com/visionmedia/send/commit/d2cb54658ce65948b0ed6e5fb5de69d022bef941 + var mime = express.static.mime; + mime.define({ + 'application/json' : ['czml', 'json', 'geojson', 'topojson'], + 'model/vnd.gltf+json' : ['gltf'], + 'model/vnd.gltf.binary' : ['bgltf'], + 'text/plain' : ['glsl'] + }); + + var app = express(); + app.use(compression()); + app.use(express.static(__dirname)); + app.use('/data', express.static('data'), serveIndex('data', {'icons': true, 'view': 'details'})); + + app.use('/examples', express.static('examples'), serveIndex('examples', {'icons': true, 'view': 'details'})); + + + function getRemoteUrlFromParam(req) { + var remoteUrl = req.params[0]; + if (remoteUrl) { + // add http:// to the URL if no protocol is present + if (!/^https?:\/\//.test(remoteUrl)) { + remoteUrl = 'http://' + remoteUrl; + } + remoteUrl = url.parse(remoteUrl); + // copy query string + remoteUrl.search = url.parse(req.url).search; + } + return remoteUrl; + } + + var dontProxyHeaderRegex = /^(?:Host|Proxy-Connection|Connection|Keep-Alive|Transfer-Encoding|TE|Trailer|Proxy-Authorization|Proxy-Authenticate|Upgrade)$/i; + + function filterHeaders(req, headers) { + var result = {}; + // filter out headers that are listed in the regex above + Object.keys(headers).forEach(function(name) { + if (!dontProxyHeaderRegex.test(name)) { + result[name] = headers[name]; + } + }); + return result; + } + + var upstreamProxy = argv['upstream-proxy']; + var bypassUpstreamProxyHosts = {}; + if (argv['bypass-upstream-proxy-hosts']) { + argv['bypass-upstream-proxy-hosts'].split(',').forEach(function(host) { + bypassUpstreamProxyHosts[host.toLowerCase()] = true; + }); + } + + app.get('/proxy/*', function(req, res, next) { + // look for request like http://localhost:8080/proxy/http://example.com/file?query=1 + var remoteUrl = getRemoteUrlFromParam(req); + if (!remoteUrl) { + // look for request like http://localhost:8080/proxy/?http%3A%2F%2Fexample.com%2Ffile%3Fquery%3D1 + remoteUrl = Object.keys(req.query)[0]; + if (remoteUrl) { + remoteUrl = url.parse(remoteUrl); + } + } + + if (!remoteUrl) { + return res.status(400).send('No url specified.'); + } + + if (!remoteUrl.protocol) { + remoteUrl.protocol = 'http:'; + } + + var proxy; + if (upstreamProxy && !(remoteUrl.host in bypassUpstreamProxyHosts)) { + proxy = upstreamProxy; + } + + // encoding : null means "body" passed to the callback will be raw bytes + + request.get({ + url : url.format(remoteUrl), + headers : filterHeaders(req, req.headers), + encoding : null, + proxy : proxy + }, function(error, response, body) { + var code = 500; + + if (response) { + code = response.statusCode; + res.header(filterHeaders(req, response.headers)); + } + + res.status(code).send(body); + }); + }); + + var server = app.listen(argv.port, argv.public ? undefined : 'localhost', function() { + console.log('Cesium development server running publicly. Connect to localhost:%d/', server.address().port); + }); + + server.on('error', function (e) { + if (e.code === 'EADDRINUSE') { + console.log('Error: Port %d is already in use, select a different port.', argv.port); + console.log('Example: node server.js --port %d', argv.port + 1); + } else if (e.code === 'EACCES') { + console.log('Error: This process does not have permission to listen on port %d.', argv.port); + if (argv.port < 1024) { + console.log('Try a port number higher than 1024.'); + } + } + console.log(e); + process.exit(1); + }); + + server.on('close', function() { + console.log('Cesium development server stopped.'); + }); + + var isFirstSig = true; + process.on('SIGINT', function() { + if (isFirstSig) { + console.log('Cesium development server shutting down.'); + server.close(function() { + process.exit(0); + }); + isFirstSig = false; + } else { + console.log('Cesium development server force kill.'); + process.exit(1); + } + }); + +})(); + From 27782bdc94bd9fa92cca0493299678a512a660f5 Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Wed, 13 Nov 2024 12:58:18 +0100 Subject: [PATCH 02/19] Dockerfile works --- Dockerfile | 34 ++++++---------------------------- 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/Dockerfile b/Dockerfile index f3b748f3..a31a60ca 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,38 +13,16 @@ RUN set -ex \ WORKDIR /var/www -COPY /3dwebclient/ /js/ /theme /ThirdParty /ts /docker/* ./ +COPY /3dwebclient ./3dwebclient +COPY /js ./js +COPY /theme ./theme +COPY /ThirdParty ./ThirdParty +COPY /docker/package.json /docker/server.js /docker/html/ ./ RUN set -ex && \ - ls -lah && \ - npm install --production && \ + npm install --omit=dev && \ chown -R node:node . - - -# RUN set -x \ -# && BUILD_PACKAGES='ca-certificates git' \ -# && apt-get update && apt-get install -y --no-install-recommends $BUILD_PACKAGES \ -# && git clone -b "${WEBMAPCLIENT_VERSION}" --depth 1 https://github.com/3dcitydb/3dcitydb-web-map.git /var/www \ -# && cd /var/www \ -# && rm -rf ./.git ./.gitignore ./LICENSE ./README.md ./build.xml \ -# ./node_modules ./server.js $(ls -1 --ignore=ajax-loader.gif --ignore=favicon.png \ -# --ignore=GPS_off.png --ignore=GPS_on.png --ignore=GPS_on_ori.png --ignore=GPS_on_pos_ori.png \ -# ./theme/img) \ -# && mkdir -p /var/www/data \ -# && apt-get purge -y --auto-remove $BUILD_PACKAGES \ -# && rm -rf /var/lib/apt/lists/* - -# WORKDIR /var/www/ -# COPY package.json ./ -# COPY html/* ./ -# COPY server.js ./ -# RUN set -x \ -# && npm install --production - -# RUN set -x \ -# && - USER node EXPOSE 8000 CMD [ "node", "server.js", "--public"] From d2fafeaeb1c0ce8f719d2d5ae394a4800bd6de2d Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Wed, 13 Nov 2024 12:58:31 +0100 Subject: [PATCH 03/19] Update npm deps --- docker/package.json | 4 ++-- docker/server.js | 19 +++++++++---------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/docker/package.json b/docker/package.json index 3df8156b..e9a9372c 100644 --- a/docker/package.json +++ b/docker/package.json @@ -9,11 +9,11 @@ "url": "https://github.com/tum-gis/3dcitydb-web-map-docker" }, "dependencies": { - "express": "~4.18.x", + "express": "~4.21.x", "compression": "1.7.x", "request": "2.88.2", "yargs": "17.7.2", - "serve-index": "1.9.1" + "serve-index-next": "1.10.x" }, "engines": { "node": ">=21.x.x" diff --git a/docker/server.js b/docker/server.js index bd2cb62b..a0049e72 100644 --- a/docker/server.js +++ b/docker/server.js @@ -1,23 +1,23 @@ /* * 3DCityDB-Web-Map * http://www.3dcitydb.org/ - * + * * Copyright 2015 - 2017 * Chair of Geoinformatics * Technical University of Munich, Germany * https://www.gis.bgu.tum.de/ - * + * * The 3DCityDB-Web-Map is jointly developed with the following * cooperation partners: - * + * * virtualcitySYSTEMS GmbH, Berlin - * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -38,7 +38,7 @@ var compression = require('compression'); var url = require('url'); var request = require('request'); - var serveIndex = require('serve-index'); + var serveIndex = require('serve-index-next'); var yargs = require('yargs').options({ 'port' : { @@ -75,13 +75,13 @@ 'model/vnd.gltf+json' : ['gltf'], 'model/vnd.gltf.binary' : ['bgltf'], 'text/plain' : ['glsl'] - }); + }); var app = express(); app.use(compression()); app.use(express.static(__dirname)); app.use('/data', express.static('data'), serveIndex('data', {'icons': true, 'view': 'details'})); - + app.use('/examples', express.static('examples'), serveIndex('examples', {'icons': true, 'view': 'details'})); @@ -200,4 +200,3 @@ }); })(); - From 98c1114c0b91c280f1d7ea30e4be937361c57b8e Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Wed, 13 Nov 2024 13:09:46 +0100 Subject: [PATCH 04/19] formatting --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index a31a60ca..5a9b381d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,7 +17,7 @@ COPY /3dwebclient ./3dwebclient COPY /js ./js COPY /theme ./theme COPY /ThirdParty ./ThirdParty -COPY /docker/package.json /docker/server.js /docker/html/ ./ +COPY /docker/package.json /docker/server.js /docker/html/ ./ RUN set -ex && \ npm install --omit=dev && \ From 6a78c59d3e7663d3d3ad2d0bcb1420b407d8b699 Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Wed, 13 Nov 2024 14:16:48 +0100 Subject: [PATCH 05/19] formatting --- docker/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/package.json b/docker/package.json index e9a9372c..3b922e9e 100644 --- a/docker/package.json +++ b/docker/package.json @@ -9,11 +9,11 @@ "url": "https://github.com/tum-gis/3dcitydb-web-map-docker" }, "dependencies": { - "express": "~4.21.x", "compression": "1.7.x", + "express": "~4.21.x", "request": "2.88.2", - "yargs": "17.7.2", - "serve-index-next": "1.10.x" + "serve-index-next": "1.10.x", + "yargs": "17.7.2" }, "engines": { "node": ">=21.x.x" From 0140830b50da708028c890c7ee93132934becf69 Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Wed, 13 Nov 2024 17:13:36 +0100 Subject: [PATCH 06/19] Cleanup --- Dockerfile | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5a9b381d..3c05fb07 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,6 @@ -# 3DCityDB Web Map Client Dockerfile ########################################## -# Official website https://www.3dcitydb.net -# GitHub https://github.com/3dcitydb/3dcitydb-web-map -############################################################################### - -# Base image ARG BASEIMAGE_TAG='21-bookworm' FROM "node:${BASEIMAGE_TAG}" -# Setup 3DCityDB Web Map Client ############################################### RUN set -ex \ mkdir -p /var/www /var/www/data From e4a016e94644d5b4ddc6200113a404baac552f14 Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Wed, 13 Nov 2024 17:14:09 +0100 Subject: [PATCH 07/19] minor change --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 3c05fb07..8177e3b9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ ARG BASEIMAGE_TAG='21-bookworm' FROM "node:${BASEIMAGE_TAG}" RUN set -ex \ - mkdir -p /var/www /var/www/data + mkdir -p /var/www/data WORKDIR /var/www From 56ef1eac4b930561af58d7bbb06795ed1e7ebd45 Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Wed, 13 Nov 2024 17:27:06 +0100 Subject: [PATCH 08/19] Added edge image workflow --- .github/workflows/docker-build-push-edge.yml | 93 ++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 .github/workflows/docker-build-push-edge.yml diff --git a/.github/workflows/docker-build-push-edge.yml b/.github/workflows/docker-build-push-edge.yml new file mode 100644 index 00000000..42bd3b3d --- /dev/null +++ b/.github/workflows/docker-build-push-edge.yml @@ -0,0 +1,93 @@ +name: docker-build-push-edge + +on: + workflow_dispatch: + push: + branches: + - master + pull_request: + +env: + IMAGE_NAME: 3dcitydb-web-map-client + PLATFORMS: linux/amd64,linux/arm64 + +jobs: + build-push: + runs-on: ubuntu-latest + + steps: + - + name: Parse short sha + uses: benjlevesque/short-sha@v3.0 + id: short-sha + - + name: set lower case owner name + run: | + echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV} + env: + OWNER: '${{ github.repository_owner }}' + - + name: Checkout repo + uses: actions/checkout@v4 + - + name: Docker login Dockerhub + id: docker_login + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + - + name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - + name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + platforms: ${{ env.PLATFORMS }} + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + platforms: ${{ env.PLATFORMS }} + - + name: Extract metadata (tags, labels) for docker image + id: meta + uses: docker/metadata-action@v5 + env: + DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index + with: + images: | + ${{ env.OWNER_LC }}/${{ env.IMAGE_NAME }} + ghcr.io/${{ env.OWNER_LC }}/${{ env.IMAGE_NAME }} + flavor: | + latest=false + tags: | + type=edge,branch=feature/docker + labels: | + maintainer=Bruno Willenborg + maintainer.email=b.willenborg(at)tum.de + maintainer.organization=Chair of Geoinformatics, Technical University of Munich (TUM) + org.opencontainers.image.authors=Bruno Willenborg + org.opencontainers.image.vendor=3DCityDB Steering Committee + org.opencontainers.image.title=3D City Database Web Map Client + org.opencontainers.image.description=The 3DCityDB-Web-Map-Client is a web-based front-end for high-performance 3D visualization and interactive exploration of arbitrarily large semantic 3D city models and other geospatial data. + org.opencontainers.image.url=https://github.com/3dcitydb/3dcitydb-web-map + org.opencontainers.image.documentation=https://3dcitydb-docs.readthedocs.io/en/latest/webmap/index.html + org.opencontainers.image.source=https://github.com/3dcitydb/3dcitydb-web-map + - + name: Build and publish + uses: docker/build-push-action@v6 + id: docker_build + with: + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + platforms: ${{ env.PLATFORMS }} + annotations: ${{ steps.meta.outputs.annotations }} + - + name: Image digest + run: echo ${{ steps.docker_build.outputs.digest }} From 27bf34b9e8f0f9f75efd09b08d0e4b705f8e7b82 Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Wed, 13 Nov 2024 17:35:17 +0100 Subject: [PATCH 09/19] test --- .github/workflows/docker-build-push-edge.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-build-push-edge.yml b/.github/workflows/docker-build-push-edge.yml index 42bd3b3d..6ac2597e 100644 --- a/.github/workflows/docker-build-push-edge.yml +++ b/.github/workflows/docker-build-push-edge.yml @@ -66,7 +66,7 @@ jobs: flavor: | latest=false tags: | - type=edge,branch=feature/docker + type=edge labels: | maintainer=Bruno Willenborg maintainer.email=b.willenborg(at)tum.de From ce725f5ebab8b7cfc17c84616a3cefbfbacb4306 Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Wed, 13 Nov 2024 17:36:55 +0100 Subject: [PATCH 10/19] test --- .github/workflows/docker-build-push-edge.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-build-push-edge.yml b/.github/workflows/docker-build-push-edge.yml index 6ac2597e..6e31ec99 100644 --- a/.github/workflows/docker-build-push-edge.yml +++ b/.github/workflows/docker-build-push-edge.yml @@ -4,7 +4,7 @@ on: workflow_dispatch: push: branches: - - master + - feature/docker pull_request: env: @@ -66,7 +66,7 @@ jobs: flavor: | latest=false tags: | - type=edge + type=edge,branch=feature/docker labels: | maintainer=Bruno Willenborg maintainer.email=b.willenborg(at)tum.de From 8bb5ed8ff00892e2d7df03121ea06556d189728e Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Wed, 13 Nov 2024 18:01:19 +0100 Subject: [PATCH 11/19] Use debian slim base image version --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 8177e3b9..12be9707 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -ARG BASEIMAGE_TAG='21-bookworm' +ARG BASEIMAGE_TAG='21-bookworm-slim' FROM "node:${BASEIMAGE_TAG}" RUN set -ex \ @@ -14,6 +14,7 @@ COPY /docker/package.json /docker/server.js /docker/html/ ./ RUN set -ex && \ npm install --omit=dev && \ + npm cache clean --force && \ chown -R node:node . USER node From e171aa798407ea8287db47276122be0d8d3e2b22 Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Thu, 14 Nov 2024 09:12:15 +0100 Subject: [PATCH 12/19] Disable provenance --- .github/workflows/docker-build-push-edge.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/docker-build-push-edge.yml b/.github/workflows/docker-build-push-edge.yml index 6e31ec99..69f4f1db 100644 --- a/.github/workflows/docker-build-push-edge.yml +++ b/.github/workflows/docker-build-push-edge.yml @@ -88,6 +88,8 @@ jobs: labels: ${{ steps.meta.outputs.labels }} platforms: ${{ env.PLATFORMS }} annotations: ${{ steps.meta.outputs.annotations }} + provenance: false + sbom: false - name: Image digest run: echo ${{ steps.docker_build.outputs.digest }} From f7b201218f4645335fd2eaf7f73a7d4be7be673b Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Thu, 14 Nov 2024 09:23:22 +0100 Subject: [PATCH 13/19] Update webclient landing page --- docker/html/index.html | 147 +++++++++++++++++++++++------------------ 1 file changed, 83 insertions(+), 64 deletions(-) diff --git a/docker/html/index.html b/docker/html/index.html index ef96be40..36830840 100644 --- a/docker/html/index.html +++ b/docker/html/index.html @@ -4,18 +4,18 @@ 3DCityDB Web-Map-Client Docker - - - -

3DCityDB Web-Map-Client Docker

-
- - - -
-

Welcome to the 3D City Database (3DCityDB) Web-Map-Client Docker Image!

-

To start the 3D Web-Map-Client, browse your data directory, or view the examples use the buttons below. -

-

- Use the data directory listing to copy the required URLs for setting up a Web-Map-Client project using your Browser's "Right click""Copy link address" feature.
- How to add data for usage within the 3DCityDB Web-Map-Client to the data directory is described here. -

-

- If you require assistance using the 3DCityDB Web-Map-Client please take a look at the comprehensive documentation available at the official 3DCityDB Homepage or take a look at the learning material. - The documentation for the 3DCityDB Web-Map-Client Docker Image is available on GitHub. -

-
- -
- - \ No newline at end of file + + + +

3DCityDB Web-Map-Client Docker

+
+ + + +
+

+ Welcome to the 3D City Database (3DCityDB) Web-Map-Client Docker Image! +

+

+ To start the 3D Web-Map-Client or browse you data directory use the buttons below. +

+

+ Use the data directory listing to copy the required URLs for setting up a + Web-Map-Client project using your Browser's "Right click" → + "Copy link address" feature.
+ How to add data for usage within the 3DCityDB Web-Map-Client to the data + directory is described here. +

+

+ If you require assistance using the 3DCityDB Web-Map-Client please take a + look at the comprehensive documentation available at the official + 3DCityDB Homepage or + take a look at the + learning material. The documentation for the + 3DCityDB Web-Map-Client Docker Image is available on + GitHub. +

+
+ +
+ + From a8dde33fc1cf30d213ebf9d9c3770be07853286e Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Thu, 14 Nov 2024 09:41:44 +0100 Subject: [PATCH 14/19] Fix README.md Markdown formatting --- README.md | 188 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 99 insertions(+), 89 deletions(-) diff --git a/README.md b/README.md index a3f3b267..ab76c0a1 100644 --- a/README.md +++ b/README.md @@ -1,74 +1,73 @@ -3DCityDB-Web-Map-Client -================================== +# 3DCityDB-Web-Map-Client -News -------- -#### Version [v2.0.0](https://github.com/3dcitydb/3dcitydb-web-map/releases/tag/v2.0.0) released! +## News -The 3DCityDB Web Map Client now supports the visualization of various exchange formats: **COLLADA/KML/glTF**, **CZML**, **GeoJSON**, **Cesium 3D Tiles** and **Indexed 3D Scene Layers (I3S)**. +__Version [v2.0.0](https://github.com/3dcitydb/3dcitydb-web-map/releases/tag/v2.0.0) released!__ -The latest release now supports displaying thematic data stored from data sources such as **Google Spreadsheets** (using Google Sheets API v4), **PostgreSQL** (using PostgREST API) and **OGC Feature API**. Additionally, existing thematic data **embedded** within the visualization datasets is also supported. +The 3DCityDB Web Map Client now supports the visualization of various exchange formats: __COLLADA/KML/glTF__, __CZML__, __GeoJSON__, __Cesium 3D Tiles__ and __Indexed 3D Scene Layers (I3S)__. + +The latest release now supports displaying thematic data stored from data sources such as __Google Spreadsheets__ (using Google Sheets API v4), __PostgreSQL__ (using PostgREST API) and __OGC Feature API__. Additionally, existing thematic data __embedded__ within the visualization datasets is also supported. See [release announcements](RELEASES.md) and [change logs](CHANGES.md) for the complete list of changes made in this version, as well as in previous ones. -Introduction -------- -The **3DCityDB-Web-Map-Client** is a web-based front-end for high-performance 3D visualization and interactive exploration of **arbitrarily large semantic 3D city models** and other geospatial data. The web client utilizes the [Cesium Virtual Globe](https://cesium.com/) as its 3D geo-visualization engine based on HTML5 and Web Graphics Library (WebGL) to provide hardware acceleration and cross-platform functionalities like displaying 3D graphic contents on web browsers without the needs of additional plugins. - -The key features and functionalities of the 3DCityDB-Web-Map-Client is summarized as follows: - -* Support for efficient displaying, caching, prefetching, dynamic loading and unloading of large pre-styled 3D visualization models in the form of **tiled KML/glTF datasets exported from the 3DCityDB** using the Importer/Exporter -* Intuitive user interface for adding and removing **arbitrary number of data layers** for 3D visualization (KML/glTF, GeoJSON, Cesium 3D Tiles, I3S), together with WMS/WMTS imagery layer, and Cesium digital terrain model -* Support for linking the 3D visualization models (KML/glTF, GeoJSON, Cesium 3D Tiles, I3S) with **external thematic data sources**, such as **Google Spreadsheets** and **PostgreSQL/PostgREST**, allowing for querying the thematic data of every 3D object -* Support for displaying the existing **thematic data embedded** within the visualization datasets, such as KML, GeoJSON, Cesium 3D Tiles and I3S -* Support for rich interaction with 3D visualization models, for example, **highlighting** of 3D objects on mouseover and mouseclick as well as **hiding** and **showing** of multiple selected 3D objects -* Support for exploring a 3D object of interest from **different view perspectives** using third-party mapping services like **Microsoft Bing Maps** with oblique view, **Google Streetview**, and a combined version (**DualMaps**) -* Support for on-the-fly activating and deactivating **shadow visualization** of 3D objects and Cesium digital terrain models -* Support for collaborative creation and sharing of the workspace of the 3DCityDB-Web-Map-Client by means of **generating a scene link** including information about the current camera perspective, activation status of the shadow visualization, parameters of the current loaded data layers, etc. This link can be easily shared or bookmarked, and can be reopened in a browser on different machines -* Support for **mobile devices** (smartphones, tablets, etc.) with live tracking of geolocation and orientation -* Packaged as a [**Docker image**](https://hub.docker.com/r/tumgis/3dcitydb-web-map/tags?page=1&ordering=last_updated) for fast and convenient deployment - -Architecture -------- +## Introduction + +The __3DCityDB-Web-Map-Client__ is a web-based front-end for high-performance 3D visualization and interactive exploration of __arbitrarily large semantic 3D city models__ and other geospatial data. The web client utilizes the [Cesium Virtual Globe](https://cesium.com/) as its 3D geo-visualization engine based on HTML5 and Web Graphics Library (WebGL) to provide hardware acceleration and cross-platform functionalities like displaying 3D graphic contents on web browsers without the needs of additional plugins. + +The key features and functionalities of the 3DCityDB-Web-Map-Client is summarized as follows: + +* Support for efficient displaying, caching, prefetching, dynamic loading and unloading of large pre-styled 3D visualization models in the form of __tiled KML/glTF datasets exported from the 3DCityDB__ using the Importer/Exporter +* Intuitive user interface for adding and removing __arbitrary number of data layers__ for 3D visualization (KML/glTF, GeoJSON, Cesium 3D Tiles, I3S), together with WMS/WMTS imagery layer, and Cesium digital terrain model +* Support for linking the 3D visualization models (KML/glTF, GeoJSON, Cesium 3D Tiles, I3S) with __external thematic data sources__, such as __Google Spreadsheets__ and __PostgreSQL/PostgREST__, allowing for querying the thematic data of every 3D object +* Support for displaying the existing __thematic data embedded__ within the visualization datasets, such as KML, GeoJSON, Cesium 3D Tiles and I3S +* Support for rich interaction with 3D visualization models, for example, __highlighting__ of 3D objects on mouseover and mouseclick as well as __hiding__ and __showing__ of multiple selected 3D objects +* Support for exploring a 3D object of interest from __different view perspectives__ using third-party mapping services like __Microsoft Bing Maps__ with oblique view, __Google Streetview__, and a combined version (__DualMaps__) +* Support for on-the-fly activating and deactivating __shadow visualization__ of 3D objects and Cesium digital terrain models +* Support for collaborative creation and sharing of the workspace of the 3DCityDB-Web-Map-Client by means of __generating a scene link__ including information about the current camera perspective, activation status of the shadow visualization, parameters of the current loaded data layers, etc. This link can be easily shared or bookmarked, and can be reopened in a browser on different machines +* Support for __mobile devices__ (smartphones, tablets, etc.) with live tracking of geolocation and orientation +* Packaged as a [__Docker image__](https://hub.docker.com/r/tumgis/3dcitydb-web-map/tags?page=1&ordering=last_updated) for fast and convenient deployment + +## Architecture +

-License -------- +## License + The 3DCityDb-Web-Map-Client is licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0). See the `LICENSE` file for more details. -Latest release --------------- +## Latest release + All releases are available from the [releases section](https://github.com/3dcitydb/3dcitydb-web-map/releases). -This project is also available in Docker, see [repository](https://github.com/tum-gis/3dcitydb-web-map-docker) +This project is also available in Docker, see [repository](https://github.com/tum-gis/3dcitydb-web-map-docker) and [images](https://hub.docker.com/r/tumgis/3dcitydb-web-map/tags?page=1&ordering=last_updated). -For convenient use, there is an official [web link](https://www.3dcitydb.org/3dcitydb-web-map/2.0.0/3dwebclient/index.html) available for the current version that can be called to directly run the 3DCityDb-Web-Map-Client on your web browser. **All past and future versions** of the web client are hosted on our server using their own version numbers, so that they will remain accessible and available at any given time. +For convenient use, there is an official [web link](https://www.3dcitydb.org/3dcitydb-web-map/2.0.0/3dwebclient/index.html) available for the current version that can be called to directly run the 3DCityDb-Web-Map-Client on your web browser. __All past and future versions__ of the web client are hosted on our server using their own version numbers, so that they will remain accessible and available at any given time. + +## System requirements -System requirements -------------------- -The hardware on which the 3DCityDB-Web-Map-Client will be run must have a graphics card installed that supports WebGL. In addition, the web browser in use must also provide appropriate WebGL support. +The hardware on which the 3DCityDB-Web-Map-Client will be run must have a graphics card installed that supports WebGL. In addition, the web browser in use must also provide appropriate WebGL support. You can visit the following website to check whether your web browser supports WebGL or not: [http://get.webgl.org/](http://get.webgl.org) -The 3DCityDB-Web-Map-Client has been successfully tested on (but is not limited to) the following web browsers under different desktop operating systems like Microsoft Windows, Linux, Apple Mac OS X, and even on mobile operating systems like Android and iOS. -* Apple Safari +The 3DCityDB-Web-Map-Client has been successfully tested on (but is not limited to) the following web browsers under different desktop operating systems like Microsoft Windows, Linux, Apple Mac OS X, and even on mobile operating systems like Android and iOS. + +* Apple Safari * Mozilla Firefox * Google Chrome -* Opera +* Opera For best performance, it is recommended to use Google Chrome. -Documentation -------------- +## Documentation + A complete and comprehensive documentation on the 3DCityDB-Web-Map-Client is installed with the 3DCityDB Importer/Exporter and is also available [online](https://www.3dcitydb.org/3dcitydb/documentation/). -Contributing ------------- +## Contributing The source codes of this project are available on [GitHub](https://github.com/3dcitydb/3dcitydb-web-map). All releases can be found [here](https://github.com/3dcitydb/3dcitydb-web-map/releases). @@ -78,21 +77,20 @@ The platform GitHub is also used for collaborating: * To contribute code for fixing issues, please create a pull request with the issue id. * To propose a new feature, please also create a GitHub issue and open a discussion. -Developers ------------------------------------ +## Developers -The 3DCityDB-Web-Map-Client has been developed by: +The 3DCityDB-Web-Map-Client has been developed by: * Son H. Nguyen, Kanishk Chaturvedi, and Thomas H. Kolbe
[Chair of Geoinformatics, Technical University of Munich](https://www.asg.ed.tum.de/en/gis) and with the support from the following cooperation partners: -* Zhihang Yao, Jannes Bolling, Lucas van Walstijn, and Claus Nagel +* Zhihang Yao, Jannes Bolling, Lucas van Walstijn, and Claus Nagel
[Virtual City Systems, Berlin](https://vc.systems) -Demos ------------------------------------ +## Demos + [Demo 1: Visualization of different LoD3 CityGML top-level features (TINRelief, Building, Bridge, Tunnel, WaterBody, Vegetation, CityFurniture, Transportation etc.) in glTF format](https://www.3dcitydb.org/3dcitydb-web-map/1.8.0/3dwebclient/index.html?title=Railway_Scene_LoD3_Demo&shadows=false&terrainShadows=0&latitude=52.327365948439194&longitude=13.030088863339616&height=217.81657370715422&heading=25.207012266729155&pitch=-29.116822621630785&roll=0.09098022034414832&layer_0=url%3Dhttps%253A%252F%252Fwww.3dcitydb.net%252F3dcitydb%252Ffileadmin%252Fmydata%252FRailway_Scene_LoD3%252FRailway_Scene_LoD3_collada_MasterJSON.json%26name%3DRailway_Scene_LoD3%26layerDataType%3DCOLLADA%252FKML%252FglTF%26gltfVersion%3D1.0%26active%3Dtrue%26spreadsheetUrl%3D%26cityobjectsJsonUrl%3D%26minLodPixels%3D140%26maxLodPixels%3D1.7976931348623157e%252B308%26maxSizeOfCachedTiles%3D50%26maxCountOfVisibleTiles%3D200&splashWindow=url%3Dsplash%252FSplashWindow.html%26showOnStart%3Dtrue)

@@ -123,76 +121,88 @@ Demos

-# Mobile Support Extension +## Mobile Support Extension -## New features +### New features -The current 3DCityDB-Web-Map-Client is equipped with an extension that provides better support for mobile devices. -The extension comes with a built-in mobile detector, which can automatically detect and adjust the client's behaviors accordingly to whether the 3DCityDB-Web-Map-Client is operating on a mobile device. +The current 3DCityDB-Web-Map-Client is equipped with an extension that provides better support for mobile devices. +The extension comes with a built-in mobile detector, which can automatically detect and adjust the client's behaviors accordingly to whether the 3DCityDB-Web-Map-Client is operating on a mobile device. Some of the most important mobile features enabled by this extension are listed as follows: - -* **A more lightweight graphical user interface:** -In order to make the best use of the limited screen real-estate available on mobile devices, some elements are removed or hidden from the web client, -such as credit texts and logos, as well as some of Cesium's built-in navigation controls that can easily be manipulated using touch gestures. + +* __A more lightweight graphical user interface:__ +In order to make the best use of the limited screen real-estate available on mobile devices, some elements are removed or hidden from the web client, +such as credit texts and logos, as well as some of Cesium's built-in navigation controls that can easily be manipulated using touch gestures. +

- +

-* **Visual adjustments:** - * The main toolbox now scales to fit to the screen size. In case of excess lines/length, the toolbox becomes scrollable (see picture below). -

+* __Visual adjustments:__ + + * The main toolbox now scales to fit to the screen size. In case of excess lines/length, the toolbox becomes scrollable (see picture below). + +

-

+

+ + * The infobox displayed when a city object (e.g. building) is clicked is now displayed in fullscreen with scrollable contents, as illustrated below. - * The infobox displayed when a city object (e.g. building) is clicked is now displayed in fullscreen with scrollable contents, as illustrated below. -

+

-

+

- * The loading icon is now shown as a horizontal bar at the bottom of the screen (highlighted by the green box in the picture below). -

+ * The loading icon is now shown as a horizontal bar at the bottom of the screen (highlighted by the green box in the picture below). + +

-

+

+ +* Most importantly: __The introduction of a GPS button__ (located on the top right corner in the view toolbar) providing new functionalities involving user's current location and orientation. Namely: + + * GPS "snapshot": shows the user's current position and orientation, -* Most importantly: **The introduction of a GPS button** (located on the top right corner in the view toolbar) providing new functionalities involving user's current location and orientation. Namely: - * GPS "snapshot": shows the user's current position and orientation, -

+

-

+

- * Real-time Compass Tracking: periodically shows the user's current orientation with fixed location, -

+ * Real-time Compass Tracking: periodically shows the user's current orientation with fixed location, + +

-

+

+ - * Real-time Compass Tracking + Position or the "First-person View" mode: periodically shows the user's current orientation and position. -

+ * Real-time Compass Tracking + Position or the "First-person View" mode: periodically shows the user's current orientation and position. + +

-

+

+ + * Disable real-time tracking: the camera will then ascend to a higher altitude of the current location. - * Disable real-time tracking: the camera will then ascend to a higher altitude of the current location. -

+

-

+

-## Demos +### Demos To test the mobile extension, simply click on one of the following two URLs: + * [Demo first-person view](https://www.3dcitydb.org/3dcitydb-web-map/2.0.0/3dwebclient/index.html?title=3DCityDB-Web-Map-Client&shadows=false&terrainShadows=0&latitude=48.14841421296063&longitude=11.567992899981077&height=288.04731096361564&heading=328.7476197616151&pitch=-79.22129067410182&roll=359.4611498135091&layer_0=url%3Dhttps%253A%252F%252Fwww.3dcitydb.org%252F3dcitydb%252Ffileadmin%252Fmydata%252FTUM_Buildings%252FTUM_Buildings_glTF%252FTUM_Buildings_glTF_MasterJSON.json%26name%3DMUC%26layerDataType%3DCOLLADA%252FKML%252FglTF%26gltfVersion%3D0.8%26active%3Dtrue%26spreadsheetUrl%3Dhttps%253A%252F%252Ffusiontables.google.com%252Fdata%253Fdocid%253D1KE3odY92wmpwdyUs6osYhNPgRtI9W3GOQyuyHfp3%2523rows%253Aid%253D1%26cityobjectsJsonUrl%3D%26minLodPixels%3D140%26maxLodPixels%3D1.7976931348623157e%252B308%26maxSizeOfCachedTiles%3D200%26maxCountOfVisibleTiles%3D200&splashWindow=url%3Dsplash%252FSplashWindow.html%26showOnStart%3Dtrue) + * [Demo debug-mode view](https://www.3dcitydb.org/3dcitydb-web-map/2.0.0/3dwebclient/index.html?title=3DCityDB-Web-Map-Client&shadows=false&terrainShadows=0&latitude=48.14841421296063&longitude=11.567992899981077&height=288.04731096361564&heading=328.7476197616151&pitch=-79.22129067410182&roll=359.4611498135091&layer_0=url%3Dhttps%253A%252F%252Fwww.3dcitydb.org%252F3dcitydb%252Ffileadmin%252Fmydata%252FTUM_Buildings%252FTUM_Buildings_glTF%252FTUM_Buildings_glTF_MasterJSON.json%26name%3DMUC%26layerDataType%3DCOLLADA%252FKML%252FglTF%26gltfVersion%3D0.8%26active%3Dtrue%26spreadsheetUrl%3Dhttps%253A%252F%252Ffusiontables.google.com%252Fdata%253Fdocid%253D1KE3odY92wmpwdyUs6osYhNPgRtI9W3GOQyuyHfp3%2523rows%253Aid%253D1%26cityobjectsJsonUrl%3D%26minLodPixels%3D140%26maxLodPixels%3D1.7976931348623157e%252B308%26maxSizeOfCachedTiles%3D200%26maxCountOfVisibleTiles%3D200&splashWindow=url%3Dsplash%252FSplashWindow.html%26showOnStart%3Dtrue&viewMode=debug). ## Notes -The mobile extension makes use of the Geolocation API and the DeviceOrientation API in HTML5. -The Geolocation API only functions via HTTPS since Google Chrome 50. Therefore, make sure the client is called from an HTTPS page or your own localhost. +The mobile extension makes use of the Geolocation API and the DeviceOrientation API in HTML5. +The Geolocation API only functions via HTTPS since Google Chrome 50. Therefore, make sure the client is called from an HTTPS page or your own localhost. Additional important notes: * Test the client on devices equipped with GPS. * If the Geolocation API asks for permission to retrieve your current location, select "Allow". -More information ----------------- +## More information The 3DCityDB-Web-Map-Client is a part of the [3DCityDB Software Suite](https://www.3dcitydb.org) for managing and working with large semantic 3D city models in CityGML. However, the web client can also be used as a separate stand-alone component. @@ -200,8 +210,8 @@ The 3DCityDB-Web-Map-Client is a part of the [3DCityDB Software Suite](https://w ## Acknowledgement -The development of these methods and implementations were supported -and partially funded by the company [CADFEM](https://www.cadfem.net) -within a dedicated collaboration project in the context of the -[Leonhard Obermeyer Center (LOC)](https://www.ed.tum.de/loc) +The development of these methods and implementations were supported +and partially funded by the company [CADFEM](https://www.cadfem.net) +within a dedicated collaboration project in the context of the +[Leonhard Obermeyer Center (LOC)](https://www.ed.tum.de/loc) at the [Technical University of Munich (TUM)](https://www.tum.de). From 1190a8a7cc86c015b6b0c6a64cf9b5b6a710efda Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Thu, 14 Nov 2024 09:42:10 +0100 Subject: [PATCH 15/19] fix hl level --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ab76c0a1..49caaf91 100644 --- a/README.md +++ b/README.md @@ -192,7 +192,7 @@ To test the mobile extension, simply click on one of the following two URLs: * [Demo debug-mode view](https://www.3dcitydb.org/3dcitydb-web-map/2.0.0/3dwebclient/index.html?title=3DCityDB-Web-Map-Client&shadows=false&terrainShadows=0&latitude=48.14841421296063&longitude=11.567992899981077&height=288.04731096361564&heading=328.7476197616151&pitch=-79.22129067410182&roll=359.4611498135091&layer_0=url%3Dhttps%253A%252F%252Fwww.3dcitydb.org%252F3dcitydb%252Ffileadmin%252Fmydata%252FTUM_Buildings%252FTUM_Buildings_glTF%252FTUM_Buildings_glTF_MasterJSON.json%26name%3DMUC%26layerDataType%3DCOLLADA%252FKML%252FglTF%26gltfVersion%3D0.8%26active%3Dtrue%26spreadsheetUrl%3Dhttps%253A%252F%252Ffusiontables.google.com%252Fdata%253Fdocid%253D1KE3odY92wmpwdyUs6osYhNPgRtI9W3GOQyuyHfp3%2523rows%253Aid%253D1%26cityobjectsJsonUrl%3D%26minLodPixels%3D140%26maxLodPixels%3D1.7976931348623157e%252B308%26maxSizeOfCachedTiles%3D200%26maxCountOfVisibleTiles%3D200&splashWindow=url%3Dsplash%252FSplashWindow.html%26showOnStart%3Dtrue&viewMode=debug). -## Notes +### Notes The mobile extension makes use of the Geolocation API and the DeviceOrientation API in HTML5. The Geolocation API only functions via HTTPS since Google Chrome 50. Therefore, make sure the client is called from an HTTPS page or your own localhost. From 835a98ecca70ddeb01d24c7786c2531544908129 Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Thu, 14 Nov 2024 09:44:03 +0100 Subject: [PATCH 16/19] formatting --- docker/html/index.html | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/docker/html/index.html b/docker/html/index.html index 36830840..150443c8 100644 --- a/docker/html/index.html +++ b/docker/html/index.html @@ -85,20 +85,28 @@

Welcome to the 3D City Database (3DCityDB) Web-Map-Client Docker Image!

- To start the 3D Web-Map-Client or browse you data directory use the buttons below. + To start the 3D Web-Map-Client or browse you + data directory use the buttons below.

Use the data directory listing to copy the required URLs for setting up a Web-Map-Client project using your Browser's "Right click""Copy link address" feature.
How to add data for usage within the 3DCityDB Web-Map-Client to the data - directory is described here. + directory is described + here.

If you require assistance using the 3DCityDB Web-Map-Client please take a look at the comprehensive documentation available at the official - 3DCityDB Homepage or - take a look at the + 3DCityDB Homepage + or take a look at the target="_blank" >GitHub. + Various 3DCityDB Web-Map-Client online demos are available + here.

    From 4d99eb463879d903770768cdf881276b8e4504d3 Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Thu, 14 Nov 2024 09:44:37 +0100 Subject: [PATCH 17/19] Add release workflow --- .../workflows/docker-build-push-release.yml | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 .github/workflows/docker-build-push-release.yml diff --git a/.github/workflows/docker-build-push-release.yml b/.github/workflows/docker-build-push-release.yml new file mode 100644 index 00000000..1c804fd5 --- /dev/null +++ b/.github/workflows/docker-build-push-release.yml @@ -0,0 +1,90 @@ +name: docker-build-push-release + +on: + workflow_dispatch: + release: + types: [published, edited] +env: + IMAGE_NAME: 3dcitydb-web-map-client + PLATFORMS: linux/amd64,linux/arm64 + +jobs: + build-push: + runs-on: ubuntu-latest + + steps: + - + name: Get release version without v + id: release_version + uses: battila7/get-version-action@v2 + - + name: set lower case owner name + run: | + echo "OWNER_LC=${OWNER,,}" >>${GITHUB_ENV} + env: + OWNER: '${{ github.repository_owner }}' + - + name: Checkout repo + uses: actions/checkout@v4 + - + name: Docker login Dockerhub + id: docker_login + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + - + name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - + name: Set up QEMU + uses: docker/setup-qemu-action@v3 + with: + platforms: ${{ env.PLATFORMS }} + - + name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + platforms: ${{ env.PLATFORMS }} + - + name: Extract metadata (tags, labels) for docker image + id: meta + uses: docker/metadata-action@v5 + env: + DOCKER_METADATA_ANNOTATIONS_LEVELS: manifest,index + with: + images: | + ${{ env.OWNER_LC }}/${{ env.IMAGE_NAME }} + ghcr.io/${{ env.OWNER_LC }}/${{ env.IMAGE_NAME }} + flavor: | + latest=${{ !github.event.release.prerelease }} + tags: | + type=semver,pattern={{version}} + labels: | + maintainer=Bruno Willenborg + maintainer.email=b.willenborg(at)tum.de + maintainer.organization=Chair of Geoinformatics, Technical University of Munich (TUM) + org.opencontainers.image.authors=Bruno Willenborg + org.opencontainers.image.vendor=3DCityDB Steering Committee + org.opencontainers.image.title=3D City Database Web Map Client + org.opencontainers.image.description=The 3DCityDB-Web-Map-Client is a web-based front-end for high-performance 3D visualization and interactive exploration of arbitrarily large semantic 3D city models and other geospatial data. + org.opencontainers.image.url=https://github.com/3dcitydb/3dcitydb-web-map + org.opencontainers.image.documentation=https://3dcitydb-docs.readthedocs.io/en/latest/webmap/index.html + org.opencontainers.image.source=https://github.com/3dcitydb/3dcitydb-web-map + - + name: Build and publish + uses: docker/build-push-action@v6 + id: docker_build + with: + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + platforms: ${{ env.PLATFORMS }} + annotations: ${{ steps.meta.outputs.annotations }} + - + name: Image digest + run: echo ${{ steps.docker_build.outputs.digest }} From 31f471b1b0e8eedf3c6a375104a667eec4d36c7a Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Thu, 14 Nov 2024 09:46:07 +0100 Subject: [PATCH 18/19] disable provenance --- .github/workflows/docker-build-push-release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/docker-build-push-release.yml b/.github/workflows/docker-build-push-release.yml index 1c804fd5..96614f54 100644 --- a/.github/workflows/docker-build-push-release.yml +++ b/.github/workflows/docker-build-push-release.yml @@ -85,6 +85,8 @@ jobs: labels: ${{ steps.meta.outputs.labels }} platforms: ${{ env.PLATFORMS }} annotations: ${{ steps.meta.outputs.annotations }} + provenance: false + sbom: false - name: Image digest run: echo ${{ steps.docker_build.outputs.digest }} From c0c4d04154c0160df9a48da0e709d23186a33c1b Mon Sep 17 00:00:00 2001 From: Bruno Willenborg Date: Mon, 25 Nov 2024 15:16:55 +0100 Subject: [PATCH 19/19] Add docker hl --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 49caaf91..d69db10b 100644 --- a/README.md +++ b/README.md @@ -202,6 +202,8 @@ Additional important notes: * Test the client on devices equipped with GPS. * If the Geolocation API asks for permission to retrieve your current location, select "Allow". +## Docker + ## More information The 3DCityDB-Web-Map-Client is a part of the [3DCityDB Software Suite](https://www.3dcitydb.org) for managing and working with large semantic 3D city models in CityGML. However, the web client can also be used as a separate stand-alone component.

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 + + + 2015_Logo_TUM_RGB + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/docker/html/index.html b/docker/html/index.html new file mode 100644 index 00000000..ef96be40 --- /dev/null +++ b/docker/html/index.html @@ -0,0 +1,106 @@ + + + + 3DCityDB Web-Map-Client Docker + + + + + +