Skip to content

Build environment to compile MapServer with Emscripten to a WebAssembly package

License

Notifications You must be signed in to change notification settings

codeart1st/mapserver-wasm

Repository files navigation

mapserver-wasm

MapServer WFS and WMS inside Web Worker
Build environment to compile MapServer with Emscripten to a WebAssembly package

Features

  • Use MapServer inside your browser
  • Expose WFS 2.0.0 and WMS 1.3.0 services
  • Read vector and raster data from GeoPackage

ThirdParty Dependencies

Name Version Home page License Status
MapServer 8.2.2 https://mapserver.org/ MIT
GDAL/OGR 3.9.2 https://gdal.org/ MIT/X style
PROJ 9.5.0 https://proj.org/ MIT/X style
GEOS 3.13.0 https://libgeos.org/ LGPL-2.1
SQLite 3.46.1 https://www.sqlite.org/ Public Domain
Libxml2 2.13.4 http://xmlsoft.org/ MIT

✅ up-to-date | 🚧 needs-update | Last update check 24.09.2024

Getting started

Installation

To download mapserver-wasm run:

npm install mapserver-wasm
# or
yarn add mapserver-wasm

Usage

import MapServer from 'mapserver-wasm'

MapServer().then(async Module => {
  const WORKERFS = Module.FS.filesystems['WORKERFS']
  const MEMFS = Module.FS.filesystems['MEMFS']

  Module.FS.mkdir('/ms')
  Module.FS.mkdir('/proj')

  try {
    WORKERFS.node_ops.mknod = MEMFS.node_ops.mknod // GDAL needs temporary file support
    Module.FS.mount(WORKERFS, {
      blobs: [
        { name: 'test.gpkg', data: /* gpkg blob */ }
      ]
    }, '/ms')
    Module.FS.writeFile('/proj/epsg', crsDefinitions.map(({ crs, definition }) => {
      return `<${crs.replace('EPSG:', '')}>${definition}<>`
    }).join('\n'), { flags: 'w+' })
    // ...
    resolve()
  } catch (e) {
    reject(e)
  }
})

Please look into the demo project or into the test folder for further information.

Development

Required Web APIs

WebAssembly 1.0 | WebAssembly Exception Handling

Checkout

git clone --recurse-submodules [email protected]:codeart1st/mapserver-wasm.git
git clone [email protected]:codeart1st/mapserver-wasm.git
git submodule update --init --recursive

Update

git pull --recurse-submodules

Compilation

Start the build container with the following command to ensure the filesystem permissions for newly created files are correct.

docker run -it --rm -v $(pwd):/src -v /etc/passwd:/etc/passwd --user "$(id -u):$(id -g)" --name mapserver-wasm emscripten/emsdk:3.1.67 bash

And execute in a second terminal the following command to install the missing build depedencies as root user.

docker exec --user root mapserver-wasm bash -c "apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y tcl automake pkgconf libtool brotli"

After that execute all job script commands described in .github/workflows/ci.yml inside the interactive build container. It can be helpful to set the GITHUB_WORKSPACE environment variable beforehand.

GITHUB_WORKSPACE=/src

Test

Tests will be executed with Vitest framework. Test execution needs compilation of mapserver-wasm first.

npm ci && npm test

Logging

To avoid debugging in first place it can be helpful to activate file logging for MapServer and GDAL.

MAP
  DEBUG 5
  CONFIG "MS_ERRORFILE" "error.log"
  CONFIG "CPL_LOG" "error.log"
  CONFIG "CPL_DEBUG" "ON"
  CONFIG "CPL_LOG_ERRORS" "ON"
  CONFIG "CPL_TIMESTAMP" "ON"
END

Debugging

Debugging in DWARF format has initial support in Chrome.