MapServer for Windows (MS4W) README

Author:Jeff McKenna, GatewayGeo
Last Updated:2024-11-06

Introduction

Welcome to MS4W, the quick and easy installer developed by GatewayGeo for setting up MapServer For Windows and its accompanying applications (e.g. GeoMoose, Mapbender, OpenLayers, etc.). The purpose of this package is to allow novice to advanced MapServer users to quickly install a MapServer development environment on their Windows systems. The reasons for needing to do this are diverse but, in general, this package supports: developers who want to get to a stable state quickly, trainers who need an easily-installed configuration identical across multiple installs, and novices who need help just getting all the needed bits and pieces together.

Design

The MS4W package is designed to perform a full installation of Apache, PHP, MapServer CGI, MapScript (CSharp, Java, PHP, Python), and to provide the capability to install additional applications easily and quickly. The simplest way to do this on Windows is to provide a predetermined directory structure and force everything into that mold.

The directory structure, while fixed within itself, is designed to be somewhat portable. While the ms4w_xxx.zip file needs to be installed at the root of a hard drive, it doesn’t have to be the C:/ drive. Moving the package to the root of a different drive is simple - just copy it there. To move it to a subdirectory is more difficult - you’ll need to search for /ms4w in all the files and replace it with your new path.

The design also accommodates simple upgrades to the core package and to applications, without affecting the local configuration or the configuration of other installed applications.

Contents

The following are included in the base package:

  • Apache version 2.4.62
  • PHP version 8.3.11
  • Python version 3.12.6
  • MapServer 8.3.0dev CGI and MapScript
  • GDAL 3.10.0dev and bindings
  • MapCache 1.15dev
  • MapServer utilities
  • GDAL/OGR utilities
  • PROJ utilities
  • PDAL utilities
  • shp2tile utility
  • osm2pgsql utility
  • shapelib utilities
  • shpdiff utility
  • avce00 utilities
  • spatialite utilities
  • unixutils
  • OWTChart 1.2.0
  • H264 Streaming Module for Apache

Tip

If your server needs support for a specific version of PHP, Python, Apache, MapServer, GDAL, Oracle, ECW, Microsoft SQL Server, or any of MS4W’s hundreds of libraries, or a specific Windows version, or an entire MS4W package in x64 or 32bit, please contact GatewayGeo.

MapServer Version Information

MapServer version 8.3.0-dev  (MS4W 5.0.0) PROJ version 9.5 GDAL version 3.10
OUTPUT=PNG OUTPUT=JPEG OUTPUT=KML SUPPORTS=PROJ SUPPORTS=AGG
SUPPORTS=FREETYPE SUPPORTS=CAIRO SUPPORTS=SVG_SYMBOLS SUPPORTS=SVGCAIRO
SUPPORTS=ICONV SUPPORTS=FRIBIDI SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT
SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER
SUPPORTS=OGCAPI_SERVER SUPPORTS=FASTCGI SUPPORTS=THREADS SUPPORTS=GEOS
SUPPORTS=PBF INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE
INPUT=FLATGEOBUF

MapServer Build Environment

Compiled, packaged, documented, and tested by GatewayGeo. Please help support this great product that is downloaded over 6,000 times a month by organizations of all sizes - please contact us directly at info@gatewaygeomatics.com for custom builds or requests. Thank you in advance for your generous support!

Library versions used to build this version of MapServer:

apr-1.7.4
apr-iconv-1.2.2
apr-util-1.6.3
berkeley-db-18.1.40
bzip2-1.0.6
boost-1.86.0
brotli-1.2.0-dev
cairo-1.16.0
crypto++-git-master-2024-07-28
curl-8.9.0
expat-2.6.2
fcgi-2.4.0
fits-4.4.1
freetype-2.13.3
freexl-2.0.0
fribidi-1.0.15
gdal-3.10.0-dev
geos-3.12.2
gettext-runtime-0.17-source
giflib-5.2.2
harfbuzz-9.0.0
hdf4-4.3.0
hdf5-1.14.4-3
httpd-2.4.62
jansson-2.15-dev
jbigkit-1.6
json-c-0.17
kealib-1.5.3
lerc-git-2024-07-27
libdeflate-1.20
libgeotiff-1.7.3
libiconv-1.16
libjpeg-turbo-3.0.3
libkml-git-2024-07-27
libpng-1.6.43
librttopo-1.2.0-dev
libspatialite-5.1-dev
libsvg-0.5.0
libsvg-cairo-0.5.0
libtiff-4.6.0
libwebp-1.4.0
libxml2-2.13.2
lua-5.4.7
lz4-1.10.0
mapcache-1.15dev
mapserver-git-main-2024-07-30
mod_fcgid-2.3.9
mod_h264_streaming-2.2.7
mod_wsgi-5.0.0
    mono-6.12.0.206
mrsid-9.5.5
mysql-8.0.26
nghttp2-1.62.1
netcdf-c-4.9.2
ogdi-git-master-2024-07-28
openssl-3.3.1
oracle-21.14.0.0.0
pcre-git-master-2024-07-28
pixman-0.43.4
php_ogr-1.6.1
poppler-24.08.0
postgresql-16.3
proj-9.4.1
protobuf-27.2
protobuf-c-1.6.0-dev
Python-3.12.6
qhull-git-master-2024-07-28
readosm-1.1.0a
shapelib-git-master-2024-07-28
spatialite-tools-5.0.1
sqlite-3.46.0
swig-4.2.1
szip-2.1.1
uriparser-0.9.8
xerces-c-3.2.5
zlib-1.3.1
zstd-1.5.6

GDAL Vector Formats Supported

See the Vector drivers page for full driver descriptions.

Note

If you require a specific data format or an updated supported version, please contact GatewayGeo for custom build information.

Supported Formats:
      FITS -raster,vector- (rw+): Flexible Image Transport System (*.fits)
      PCIDSK -raster,vector- (rw+v): PCIDSK Database File (*.pix)
      netCDF -raster,multidimensional raster,vector- (rw+s): Network Common Data Format (*.nc)
      PDS4 -raster,vector- (rw+vs): NASA Planetary Data System 4 (*.xml)
      VICAR -raster,vector- (rw+v): MIPL VICAR file
      PDF -raster,vector- (rw+vs): Geospatial PDF (*.pdf)
      MBTiles -raster,vector- (rw+v): MBTiles (*.mbtiles)
      BAG -raster,multidimensional raster,vector- (rw+v): Bathymetry Attributed Grid (*.bag)
      EEDA -vector- (ro): Earth Engine Data API
      OGCAPI -raster,vector- (rov): OGCAPI
      ESRI Shapefile -vector- (rw+v): ESRI Shapefile (*.shp, *.dbf, *.shz, *.shp.zip)
      MapInfo File -vector- (rw+v): MapInfo File (*.tab, *.mif, *.mid)
      UK .NTF -vector- (rov): UK .NTF
      LVBAG -vector- (rov): Kadaster LV BAG Extract 2.0 (*.xml)
      OGR_SDTS -vector- (rov): SDTS
      S57 -vector- (rw+v): IHO S-57 (ENC) (*.000)
      DGN -vector- (rw+v): Microstation DGN (*.dgn)
      OGR_VRT -vector- (rov): VRT - Virtual Datasource (*.vrt)
      Memory -vector- (rw+): Memory
      CSV -vector- (rw+v): Comma Separated Value (.csv) (*.csv, *.tsv, *.psv)
      NAS -vector- (rov): NAS - ALKIS (*.xml)
      GML -vector- (rw+v): Geography Markup Language (GML) (*.gml, *.xml)
      GPX -vector- (rw+v): GPX (*.gpx)
      LIBKML -vector- (rw+v): Keyhole Markup Language (LIBKML) (*.kml, *.kmz)
      KML -vector- (rw+v): Keyhole Markup Language (KML) (*.kml)
      GeoJSON -vector- (rw+v): GeoJSON (*.json, *.geojson)
      GeoJSONSeq -vector- (rw+v): GeoJSON Sequence (*.geojsonl, *.geojsons)
      ESRIJSON -vector- (rov): ESRIJSON (*.json)
      TopoJSON -vector- (rov): TopoJSON (*.json, *.topojson)
      Interlis 1 -vector- (rw+v): Interlis 1 (*.itf, *.ili)
      Interlis 2 -vector- (rw+v): Interlis 2 (*.xtf, *.xml, *.ili)
      OGR_GMT -vector- (rw+v): GMT ASCII Vectors (.gmt) (*.gmt)
      GPKG -raster,vector- (rw+vs): GeoPackage (*.gpkg, *.gpkg.zip)
      SQLite -vector- (rw+v): SQLite / Spatialite (*.sqlite, *.db)
      ODBC -vector- (ro):  (*.mdb, *.accdb)
      WAsP -vector- (rw+v): WAsP .map format (*.map)
      PGeo -vector- (ro): ESRI Personal GeoDatabase (*.mdb)
      MSSQLSpatial -vector- (rw+): Microsoft SQL Server Spatial Database
      OGR_OGDI -vector- (ro): OGDI Vectors (VPF, VMAP, DCW)
      PostgreSQL -vector- (rw+): PostgreSQL/PostGIS
      MySQL -vector- (rw+): MySQL
      OpenFileGDB -raster,vector- (rw+v): ESRI FileGDB (*.gdb)
      DXF -vector- (rw+v): AutoCAD DXF (*.dxf)
      FlatGeobuf -vector- (rw+v): FlatGeobuf (*.fgb)
      Geoconcept -vector- (rw+v): Geoconcept (*.gxt, *.txt)
      GeoRSS -vector- (rw+v): GeoRSS
      VFK -vector- (ro): Czech Cadastral Exchange Data Format (*.vfk)
      PGDUMP -vector- (w+v): PostgreSQL SQL dump (*.sql)
      OSM -vector- (rov): OpenStreetMap XML and PBF (*.osm, *.pbf)
      GPSBabel -vector- (rw+): GPSBabel (*.mps, *.gdb, *.osm, *.tcx, *.igc)
      OGR_PDS -vector- (rov): Planetary Data Systems TABLE
      WFS -vector- (rov): OGC WFS (Web Feature Service)
      OAPIF -vector- (ro): OGC API - Features
      EDIGEO -vector- (rov): French EDIGEO exchange format (*.thf)
      SVG -vector- (rov): Scalable Vector Graphics (*.svg)
      Idrisi -vector- (rov): Idrisi Vector (.vct) (*.vct)
      XLS -vector- (ro): MS Excel format (*.xls)
      ODS -vector- (rw+v): Open Document/ LibreOffice / OpenOffice Spreadsheet (*.ods)
      XLSX -vector- (rw+v): MS Office Open XML spreadsheet (*.xlsx, *.xlsm)
      Elasticsearch -vector- (rw+): Elastic Search
      Carto -vector- (rw+): Carto
      AmigoCloud -vector- (rw+): AmigoCloud
      SXF -vector- (rov): Storage and eXchange Format (*.sxf)
      Selafin -vector- (rw+v): Selafin
      JML -vector- (rw+v): OpenJUMP JML (*.jml)
      PLSCENES -raster,vector- (ro): Planet Labs Scenes API
      CSW -vector- (ro): OGC CSW (Catalog  Service for the Web)
      VDV -vector- (rw+v): VDV-451/VDV-452/INTREST Data Format (*.txt, *.x10)
      GMLAS -vector- (rwv): Geography Markup Language (GML) driven by application schemas (*.gml, *.xml)
      MVT -vector- (rw+v): Mapbox Vector Tiles (*.mvt, *.mvt.gz, *.pbf)
      NGW -raster,vector- (rw+s): NextGIS Web
      MapML -vector- (rw+v): MapML
      GTFS -vector- (rov): General Transit Feed Specification (*.zip)
      PMTiles -vector- (rw+v): ProtoMap Tiles (*.pmtiles)
      JSONFG -vector- (rw+v): OGC Features and Geometries JSON (*.json)
      MiraMonVector -vector- (rw+v): MiraMon Vectors (.pol, .arc, .pnt) (*.pol, *.arc, *.pnt)
      TIGER -vector- (rov): U.S. Census TIGER/Line
      AVCBin -vector- (rov): Arc/Info Binary Coverage
      AVCE00 -vector- (rov): Arc/Info E00 (ASCII) Coverage (*.e00)
      HTTP -raster,vector- (ro): HTTP Fetching Wrapper

Oracle - see the GDAL Plugins section of this document to enable

Tip

"ro" means read-only
"rw" means read and one-time creation only
"rw+" means read, create and update
"w+" means write-only
"v" means that it supports virtual files

GDAL Raster Formats Supported

See the GDAL Raster drivers page for full driver descriptions.

Note

If you require a specific data format or an updated supported version, please contact GatewayGeo for custom build information.

Supported Formats:
      VRT -raster,multidimensional raster- (rw+v): Virtual Raster (*.vrt)
      GTI -raster- (rov): GDAL Raster Tile Index (*.gti.gpkg, *.gti.fgb, *.gti)
      DERIVED -raster- (ro): Derived datasets using VRT pixel functions
      GTiff -raster- (rw+vs): GeoTIFF (*.tif, *.tiff)
      COG -raster- (wv): Cloud optimized GeoTIFF generator (*.tif, *.tiff)
      NITF -raster- (rw+vs): National Imagery Transmission Format (*.ntf)
      RPFTOC -raster- (rovs): Raster Product Format TOC format (*.toc)
      ECRGTOC -raster- (rovs): ECRG TOC format (*.xml)
      HFA -raster- (rw+v): Erdas Imagine Images (.img) (*.img)
      SAR_CEOS -raster- (rov): CEOS SAR Image
      CEOS -raster- (rov): CEOS Image
      JAXAPALSAR -raster- (rov): JAXA PALSAR Product Reader (Level 1.1/1.5)
      GFF -raster- (rov): Ground-based SAR Applications Testbed File Format (.gff) (*.gff)
      ELAS -raster- (rw+v): ELAS
      ESRIC -raster- (rov): Esri Compact Cache (*.json, *.tpkx)
      AIG -raster- (rov): Arc/Info Binary Grid
      AAIGrid -raster- (rwv): Arc/Info ASCII Grid (*.asc)
      GRASSASCIIGrid -raster- (rov): GRASS ASCII Grid
      ISG -raster- (rov): International Service for the Geoid (*.isg)
      SDTS -raster- (rov): SDTS Raster (*.ddf)
      DTED -raster- (rwv): DTED Elevation Raster (*.dt0, *.dt1, *.dt2)
      PNG -raster- (rwv): Portable Network Graphics (*.png)
      JPEG -raster- (rwv): JPEG JFIF (*.jpg, *.jpeg)
      MEM -raster,multidimensional raster- (rw+): In Memory Raster
      JDEM -raster- (rov): Japanese DEM (.mem) (*.mem)
      GIF -raster- (rwv): Graphics Interchange Format (.gif) (*.gif)
      BIGGIF -raster- (rov): Graphics Interchange Format (.gif) (*.gif)
      ESAT -raster- (rov): Envisat Image Format (*.n1)
      FITS -raster,vector- (rw+): Flexible Image Transport System (*.fits)
      BSB -raster- (rov): Maptech BSB Nautical Charts (*.kap)
      XPM -raster- (rwv): X11 PixMap Format (*.xpm)
      BMP -raster- (rw+v): MS Windows Device Independent Bitmap (*.bmp)
      DIMAP -raster- (rovs): SPOT DIMAP
      AirSAR -raster- (rov): AirSAR Polarimetric Image
      RS2 -raster- (rovs): RadarSat 2 XML Product
      SAFE -raster- (rov): Sentinel-1 SAR SAFE Product
      PCIDSK -raster,vector- (rw+v): PCIDSK Database File (*.pix)
      PCRaster -raster- (rw+): PCRaster Raster File (*.map)
      ILWIS -raster- (rw+v): ILWIS Raster Map (*.mpr, *.mpl)
      SGI -raster- (rw+v): SGI Image File Format 1.0 (*.rgb)
      SRTMHGT -raster- (rwv): SRTMHGT File Format (*.hgt)
      Leveller -raster- (rw+v): Leveller heightfield (*.ter)
      Terragen -raster- (rw+v): Terragen heightfield (*.ter)
      netCDF -raster,multidimensional raster,vector- (rw+s): Network Common Data Format (*.nc)
      HDF4 -raster,multidimensional raster- (ros): Hierarchical Data Format Release 4 (*.hdf)
      HDF4Image -raster- (rw+): HDF4 Dataset
      ISIS3 -raster- (rw+v): USGS Astrogeology ISIS cube (Version 3) (*.lbl, *.cub)
      ISIS2 -raster- (rw+v): USGS Astrogeology ISIS cube (Version 2)
      PDS -raster- (rov): NASA Planetary Data System
      PDS4 -raster,vector- (rw+vs): NASA Planetary Data System 4 (*.xml)
      VICAR -raster,vector- (rw+v): MIPL VICAR file
      TIL -raster- (rov): EarthWatch .TIL
      ERS -raster- (rw+v): ERMapper .ers Labelled (*.ers)
      L1B -raster- (rovs): NOAA Polar Orbiter Level 1b Data Set
      FIT -raster- (rwv): FIT Image
      GRIB -raster,multidimensional raster- (rwv): GRIdded Binary (.grb, .grb2) (*.grb, *.grb2, *.grib2)
      MrSID -raster- (rov): Multi-resolution Seamless Image Database (MrSID) (*.sid)
      JP2MrSID -raster- (rov): MrSID JPEG2000 (*.jp2)
      RMF -raster- (rw+v): Raster Matrix Format (*.rsw)
      WCS -raster- (rovs): OGC Web Coverage Service
      WMS -raster- (rwvs): OGC Web Map Service
      MSGN -raster- (rov): EUMETSAT Archive native (.nat) (*.nat)
      RST -raster- (rw+v): Idrisi Raster A.1 (*.rst)
      GSAG -raster- (rwv): Golden Software ASCII Grid (.grd) (*.grd)
      GSBG -raster- (rw+v): Golden Software Binary Grid (.grd) (*.grd)
      GS7BG -raster- (rw+v): Golden Software 7 Binary Grid (.grd) (*.grd)
      COSAR -raster- (rov): COSAR Annotated Binary Matrix (TerraSAR-X)
      TSX -raster- (rov): TerraSAR-X Product
      COASP -raster- (ro): DRDC COASP SAR Processor Raster (*.hdr)
      R -raster- (rwv): R Object Data Store (*.rda)
      MAP -raster- (rov): OziExplorer .MAP
      KMLSUPEROVERLAY -raster- (rwv): Kml Super Overlay (*.kml, *.kmz)
      WEBP -raster- (rwv): WEBP (*.webp)
      PDF -raster,vector- (rw+vs): Geospatial PDF (*.pdf)
      Rasterlite -raster- (rwvs): Rasterlite (*.sqlite)
      MBTiles -raster,vector- (rw+v): MBTiles (*.mbtiles)
      PLMOSAIC -raster- (ro): Planet Labs Mosaics API
      CALS -raster- (rwv): CALS (Type 1) (*.cal, *.ct1)
      WMTS -raster- (rwv): OGC Web Map Tile Service
      SENTINEL2 -raster- (rovs): Sentinel 2
      MRF -raster- (rw+v): Meta Raster Format (*.mrf)
      PNM -raster- (rw+v): Portable Pixmap Format (netpbm) (*.pgm, *.ppm, *.pnm)
      DOQ1 -raster- (rov): USGS DOQ (Old Style)
      DOQ2 -raster- (rov): USGS DOQ (New Style)
      PAux -raster- (rw+v): PCI .aux Labelled
      MFF -raster- (rw+v): Vexcel MFF Raster (*.hdr)
      MFF2 -raster- (rw+): Vexcel MFF2 (HKV) Raster
      GSC -raster- (rov): GSC Geogrid
      FAST -raster- (rov): EOSAT FAST Format
      BT -raster- (rw+v): VTP .bt (Binary Terrain) 1.3 Format (*.bt)
      LAN -raster- (rw+v): Erdas .LAN/.GIS
      CPG -raster- (rov): Convair PolGASP
      NDF -raster- (rov): NLAPS Data Format
      EIR -raster- (rov): Erdas Imagine Raw
      DIPEx -raster- (rov): DIPEx
      LCP -raster- (rwv): FARSITE v.4 Landscape File (.lcp) (*.lcp)
      GTX -raster- (rw+v): NOAA Vertical Datum .GTX (*.gtx)
      LOSLAS -raster- (rov): NADCON .los/.las Datum Grid Shift
      NTv2 -raster- (rw+vs): NTv2 Datum Grid Shift (*.gsb, *.gvb)
      CTable2 -raster- (rw+v): CTable2 Datum Grid Shift
      ACE2 -raster- (rov): ACE2 (*.ACE2)
      SNODAS -raster- (rov): Snow Data Assimilation System (*.hdr)
      KRO -raster- (rw+v): KOLOR Raw (*.kro)
      ROI_PAC -raster- (rw+v): ROI_PAC raster
      RRASTER -raster- (rw+v): R Raster (*.grd)
      BYN -raster- (rw+v): Natural Resources Canada's Geoid (*.byn, *.err)
      NOAA_B -raster- (rov): NOAA GEOCON/NADCON5 .b format (*.b)
      NSIDCbin -raster- (rov): NSIDC Sea Ice Concentrations binary (.bin) (*.bin)
      RIK -raster- (rov): Swedish Grid RIK (.rik) (*.rik)
      USGSDEM -raster- (rwv): USGS Optional ASCII DEM (and CDED) (*.dem)
      GXF -raster- (rov): GeoSoft Grid Exchange Format (*.gxf)
      KEA -raster- (rw+v): KEA Image Format (.kea) (*.kea)
      BAG -raster,multidimensional raster,vector- (rw+v): Bathymetry Attributed Grid (*.bag)
      S102 -raster,multidimensional raster- (rovs): S-102 Bathymetric Surface Product (*.h5)
      S104 -raster,multidimensional raster- (rov): S-104 Water Level Information for Surface Navigation Product (*.h5)
      S111 -raster,multidimensional raster- (rov): Surface Currents Product (*.h5)
      HDF5 -raster,multidimensional raster- (rovs): Hierarchical Data Format Release 5 (*.h5, *.hdf5)
      HDF5Image -raster- (rov): HDF5 Dataset
      NWT_GRD -raster- (rw+v): Northwood Numeric Grid Format .grd/.tab (*.grd)
      NWT_GRC -raster- (rov): Northwood Classified Grid Format .grc/.tab (*.grc)
      ADRG -raster- (rw+vs): ARC Digitized Raster Graphics (*.gen)
      SRP -raster- (rovs): Standard Raster Product (ASRP/USRP) (*.img)
      BLX -raster- (rwv): Magellan topo (.blx) (*.blx)
      PostGISRaster -raster- (rws): PostGIS Raster driver
      SAGA -raster- (rw+v): SAGA GIS Binary Grid (.sdat, .sg-grd-z) (*.sdat, *.sg-grd-z)
      XYZ -raster- (rwv): ASCII Gridded XYZ (*.xyz)
      HF2 -raster- (rwv): HF2/HFZ heightfield raster (*.hf2)
      OZI -raster- (rov): OziExplorer Image File
      CTG -raster- (rov): USGS LULC Composite Theme Grid
      ZMap -raster- (rwv): ZMap Plus Grid (*.dat)
      NGSGEOID -raster- (rov): NOAA NGS Geoid Height Grids (*.bin)
      IRIS -raster- (rov): IRIS data (.PPI, .CAPPi etc) (*.ppi)
      PRF -raster- (rov): Racurs PHOTOMOD PRF (*.prf)
      EEDAI -raster- (ros): Earth Engine Data API Image
      DAAS -raster- (ro): Airbus DS Intelligence Data As A Service driver
      SIGDEM -raster- (rwv): Scaled Integer Gridded DEM .sigdem (*.sigdem)
      TGA -raster- (rov): TGA/TARGA Image File Format (*.tga)
      OGCAPI -raster,vector- (rov): OGCAPI
      STACTA -raster- (rovs): Spatio-Temporal Asset Catalog Tiled Assets (*.json)
      STACIT -raster- (rovs): Spatio-Temporal Asset Catalog Items
      GPKG -raster,vector- (rw+vs): GeoPackage (*.gpkg, *.gpkg.zip)
      OpenFileGDB -raster,vector- (rw+v): ESRI FileGDB (*.gdb)
      PLSCENES -raster,vector- (ro): Planet Labs Scenes API
      NGW -raster,vector- (rw+s): NextGIS Web
      GenBin -raster- (rov): Generic Binary (.hdr Labelled)
      ENVI -raster- (rw+v): ENVI .hdr Labelled
      EHdr -raster- (rw+v): ESRI .hdr Labelled (*.bil)
      ISCE -raster- (rw+v): ISCE raster
      Zarr -raster,multidimensional raster- (rw+vs): Zarr
      HTTP -raster,vector- (ro): HTTP Fetching Wrapper

ECW & Oracle GeoRaster - see the GDAL Plugins section of this document to enable

Directory Structure

  • ms4w/
    • the main directory, assumed to be at the root of a drive, normally C:
  • ms4w/Apache
    • the Apache installation
  • ms4w/Apache/bin
    • the Apache binaries
  • ms4w/Apache/cgi-bin
    • the location of mapserv.exe and its supporting libraries, and php.ini, php.exe.
  • ms4w/Apache/cgi-bin/zooplugins
    • location of ZOO-Project files to enable additional support (see the ZOO-Project section of this document)
  • ms4w/Apache/conf
    • the Apache configuration files. These should not be modified. Place all application-specific and local httpd.conf files in /ms4w/httpd.d (see the README.txt in that directory)
  • ms4w/Apache/error
    • error files for Apache to use
  • ms4w/Apache/htdocs
    • the Apache Web root directory, you shouldn’t install much in here except perhaps for testing.
  • ms4w/Apache/icons
    • icons used by Apache
  • ms4w/Apache/include
    • include directory for compiling against Apache
  • ms4w/Apache/lib
    • lib files for building against Apache
  • ms4w/Apache/logs
    • log files for Apache are stored here, this should be archived or cleaned every so often.
  • ms4w/Apache/manual
    • the Apache manual pages.
  • ms4w/Apache/modules
    • modules for Apache (see the Apache Modules section of this document)
  • ms4w/Apache/php
    • the PHP installation
  • ms4w/Apache/php/ext
    • location of phpmapscript dll
  • ms4w/apps
    • put all applications in subdirectories here.
  • ms4w/apps/etc
    • sample fonts and symbols for use in MapServer mapfiles
  • ms4w/apps/includes
    • sample OUTPUTFORMATS for use in MapServer mapfiles
  • ms4w/gdalbindings
    • contain GDAL bindings for CSharp, Java, and Python (see the GDAL Bindings section of this document)
  • ms4w/gdaldata
    • supporting files for GDAL data formats
  • ms4w/gdalplugins
    • move dlls to this folder that are required for GDAL plugins e.g. ‘oci_OCI.dll’ (see the GDAL Plugins section of this document)
  • ms4w/httpd.d
    • put all application-specific and local httpd.conf files here (see the README.txt in that directory)
  • ms4w/msplugins
    • location of the plugin dlls for MapServer (see the MapServer Plugins section of this document)
  • ms4w/msplugins/mapscript
  • ms4w/Python
    • an embedded installation of Python
    • must execute setenv.bat before use
  • ms4w/share
    • an installation of PROJ (formerly referred to as “PROJ.4”)
      • EPSG projections are stored in the proj.db SQLite database
      • grid files will be stored in this proj folder
    • location of OGCAPI template files
    • osm2pgsql style files
  • ms4w/tmp
    • temporary files go here. This should be cleaned regularly
  • ms4w/tmp/ms_tmp
    • temporary files that need to be Web-accessible go here (i.e. image files created by mapserver). This is available as /ms_tmp/ via URL. Normally this means that your MAP files would have an IMAGEPATH of /ms4w/tmp/ms_tmp/ and a IMAGEURL of /ms_tmp/
  • ms4w/tools
    • contains useful tools such as the gdal/ogr utilities and mapserv utilities (note that before running these you must execute the /ms4w/setenv.bat script in your command window)

How to Install MS4W

Upgrading from an older version of MS4W

If you already have MS4W installed please do the following:

  • open a DOS command window and execute the file ‘/ms4w/apache-uninstall.bat’ at the commandline. This file will stop and uninstall your Apache service. You should see the following message flash in the command window:
The "Apache MS4W Web Server" service is stopping.
The "Apache MS4W Web Server" service has stopped.

Removing the "Apache MS4W Web Server" service
The "Apache MS4W Web Server" service has been removed
successfully.
  • your old apache service has now been removed
  • make sure no files or other services point the your ms4w folder. If your browser is currently open and you are a viewing an ms4w page you will not be able to rename the ms4w folder. Therefore you must close all ms4w documents, all ms4w browser windows…make sure no running files point to the ms4w folder.
  • rename the old ms4w folder to something like ‘ms4w-old’
  • extract the ms4w_xx.zip file to the root of a drive on your machine
  • if successful, you should have a new directory named ‘ms4w’ at the root of the drive you chose (e.g. C:/ms4w or D:/ms4w ).
  • follow the rest of the install instructions in /ms4w/README_INSTALL.txt to start apache…

Extracting MS4W for the first time

Please read through the following instructions before starting your installation.

  1. To install the MS4W .zip file, use a compression program (e.g. 7zip) to extract the package at the root of a drive, e.g., drive C:/. If successful, you should have a new directory named ‘ms4w’ at the root of the drive you chose (e.g. C:/ms4w).

    Warning

    If you are using the setup.exe installer: Some applications may have a problem if you install MS4W in a path containing spaces. It is therefore not recommended to install MS4W in a path that contains spaces. It is always best to install MS4W at the root of a drive, such as C:/ or D:/

  2. Be sure to follow the instructions in the local file /ms4w/REQUIREMENTS.txt to install the C++ Redistributable on your system before proceeding.

  3. Start your MS4W Apache Web Server by running /ms4w/apache-install.bat (open a Command Prompt window and execute it at the command line - it is not recommended to just double-click the file). This file installs Apache as a Windows service (called “Apache Web Server”) so that it starts whenever your machine is restarted. When executed, the following message should be displayed in the command window:

    Installing the Apache MS4W Web Server service
    The Apache MS4W Web Server service is successfully installed.
    Testing httpd.conf....
    Errors reported here must be corrected before the service
    can be started.
    The Apache MS4W Web Server service is starting.
    The Apache MS4W Web Server service was started successfully.
    

    This means that Apache is running and installed as a service.

    Note for Windows 11, 10, 8, 7 Users:

    In order to run the apache-install.bat file, you must do the following:

    1. In Windows Explorer, goto the location of your cmd.exe file (C:/Windows/System32)
    2. Right-click the cmd.exe executable and choose Run as Administrator
    3. Navigate to your ms4w folder in the command prompt window and run apache-install.bat
  4. To test that Apache is running properly, open your Web browser and find your local host Web service by entering one of the following URLs:

    http://localhost/
    
    or
    
    http://127.0.0.1/
    

    You should now see the main MS4W page in your Web browser. This gives you general information about your install along with configuration information. If this is your first time using MS4W it is very important that you review the listed “Features” installed within MS4W, and test them by selecting each link found on this page.

  5. Technically, at this point, MS4W is installed! However, as you may have noticed from the MS4W main index.html page, there are no applications running. What this means is that there are no Web applications like GeoMoose or OpenLayers found within MS4W’s Web-accessible directory, /ms4w/apps/. The MS4W-configured Web applications can be found on https://ms4w.com/release/apps/ as separate zip files.

  6. To install these Web application into /ms4w/apps/ all that is required is to unzip the Web application compressed file at the same root directory as MS4W (e.g., C:/).

    Two things should happen when uncompressing this file. First, the Web application directory should appear within /ms4w/apps/. Second, a new httpd_*.conf file should be added to /ms4w/httpd.d/httpd_*.conf. (The /httpd.d/ directory contains Apache configuration files that define which files on your computer/server are Web-accessible. For each Web application that you install, a new configuration file will be found.)

  7. The definitions of these Web-accessible directories are called Web Aliases. In order to activate a Web Alias you must restart Apache. To test your latest installed application, go to the MS4W main index.html page (i.e., http://localhost/). In the applications section you should now find a link to the application you just installed. Select the link to the recently installed application to see if it is configured correctly. Another option is to find the Web Alias for your application and call it from your Web browser directly. For example, if you have installed the latest MS4W version of GeoMoose, the Web Alias is “geomoose2”. To go to the GeoMoose index page, simply enter http://localhost/geomoose2/.

    Note: Applications with configuration files (e.g., GeoMoose and OpenLayers) generally do not require any editing of their files in order to work. Just unzip to the appropriate driver root and restart Apache.

    WARNING: It is very possible that you may wish (but not encouraged!) to run multiple versions of the same product. For example, GeoMoose 2.8.0 vs. GeoMoose 2.8.1. When installing these ms4w GeoMoose application packages, you will notice when unzipping GeoMoose that the httpd_geomoose2_ms4w.conf file found under ./ms4w/httpd.d/ will be overwritten by the GeoMoose you are currently installing. The reason for this is that the GeoMoose Alias stays the same from version to new version of GeoMoose. So, if you overwrite the httpd_geomoose2_ms4w.conf when unzipping and then restart Apache, you will get the latest version of GeoMoose that you just installed. To run both GeoMoose versions simply follow the instructions in Step 7.

  8. You also can create new Web Alias(es). To configure your own personal Web Alias(es), follow the instructions in /ms4w/httpd.d/README_HTTPD.txt

MapServer Plugins

Oracle Database

Steps to Enable Oracle Support in MS4W

Oracle Spatial support in MapServer is handled by two methods: 1) natively in MapServer, or 2) through the GDAL library.

  1. Make sure you have the Oracle client software installed on your machine (the same machine that you are running MS4W on).

    Warning

    Since the default MS4W package is 32-bit, you must install the Oracle 32-bit client, in order to allow MapServer and its tools to communicate with Oracle (even if the Oracle server is x64). If you need a full x64 custom MS4W build please contact GatewayGeo.

  2. For direct access to Oracle Spatial, replace the existing libmap.dll in /ms4w/Apache/cgi-bin/ with the one in the /ms4w/msplugins/oracle/ folder.

    If this is successful, executing the following at the commandline (after setting /ms4w/setenv.bat) “mapserv -v” should return a string that contains “INPUT=ORACLESPATIAL”.

    Note

    It is possible that MapServer/Apache may have trouble locating your Oracle client dll (oci.dll). If you are having trouble connecting, try copying your oci.dll (possibly from a path such as /oracle/product/12.1.0/client/BIN) into the cgi-bin directory (/ms4w/Apache/cgi-bin/)

    Tip

    Setting the Windows environment variables ORACLE_HOME and TNS_ADMIN will help MapServer/GDAL connect to your Oracle instance.

  3. For access to Oracle Spatial through the GDAL library, move the ogr_OCI.dll plugin file up from /ms4w/gdalplugins/oracle/ into /ms4w/gdalplugins/

    If this is successful, executing the following at the commandline (after setting /ms4w/setenv.bat) “ogrinfo –formats” should list the OCI driver.

  4. Restart Apache to be safe.

  5. For mapfile configuration see https://mapserver.org/input/vector/oracle.html (note that the LAYER syntax differs depending if you use native access or through GDAL). Here are some examples:

    ## Connect through OGR

    LAYER
      NAME "park-ogr"
      TYPE POLYGON
      STATUS ON
      CONNECTION "OCI:user/pass@SID"
      CONNECTIONTYPE OGR
      DATA "PARK"
      CLASS
        NAME "Parks"
        STYLE
          COLOR 255 0 0
          OUTLINECOLOR 120 120 120
        END
      END
    END # Layer
    

    Tip

    In the CONNECTION parameter you can specify a different HOST or PORT with the syntax: “OCI:username/password@host:port/SID”

    ## Connect through MapServer’s OracleSpatial type

    LAYER
      NAME "park-native"
      TYPE POLYGON
      STATUS ON
      CONNECTIONTYPE oraclespatial
      CONNECTION "user/pass@SID"
      DATA "ORA_GEOMETRY FROM (SELECT ORA_GEOMETRY FROM PARK)"
      CLASS
        NAME "Parks"
        STYLE
          COLOR 255 255 0
          OUTLINECOLOR 120 120 120
        END
      END
    END # Layer
    

Microsoft SQL Server 2008

A read-only, native MapServer driver that connects to Microsoft SQL Server 2008’s spatial capabilities is available in MS4W as of version 2.3.0.

Steps to Enable SQL Server 2008 Support in MS4W’s MapServer
  1. The plugin exists in /ms4w/msplugins/mssql/msplugin_mssql2008.dll

  2. Modify your SQL Server 2008 layer in your mapfile to use the CONNECTIONTYPE PLUGIN parameter and point to the appropriate plugin using the PLUGIN parameter. Use the CONNECTION parameter to specify the required connection parameters to access SQL Server, and use the DATA parameter to specify the table that holds the spatial information:

    LAYER
      ...
      CONNECTIONTYPE PLUGIN
      PLUGIN "C:/ms4w/msplugins/mssql/msplugin_mssql2008.dll"
      CONNECTION "server=mysqlserver2008.com;uid=dbusername;
                   pwd=dbpassword;database=Roads Database;
                     Integrated Security=false"
      DATA "the_geom from roads"
      TYPE LINE
      STATUS ON
      CLASS
         ...
      END
    END
    
  3. Test your layer, possibly by using the shp2img commandline utility with the ‘-all_debug 5’ switch

    The associated RFC document with the original notes on this support is RFC 38

MapScript configuration

MS4W >= 1.5.0 includes pre-built support files for CSharp, Java, PHP, and Python mapscript. In order to make use of these, however, they must be installed and configured in the appropriate locations on your system.

CSharp

  1. Files are located in /ms4w/msplugins/mapscript/csharp
  2. See https://mapserver.org/installation/dotnet.html for installation notes.
  3. Learn about the SWIG MapScript API at https://mapserver.org/mapscript/mapscript.html

Java

  1. Files are located in /ms4w/msplugins/mapscript/java
  2. Learn about the SWIG MapScript API at https://mapserver.org/mapscript/mapscript.html

PHP

Warning

As of the MS4W 4.0 release, PHPMapScript uses the SWIG MapScript API.

  1. PHPMapScript dll is located in /ms4w/Apache/php/ext

  2. PHP’s configuration file “php.ini” is located in /ms4w/Apache/cgi-bin

  3. PHPMapScript is loaded by default

  4. As of the MS4W 4.0 release, the PHPMapScript extension uses the SWIG MapScript API (see SWIG MapScript API docs at https://mapserver.org/mapscript/mapscript.html)

  5. As of the MS4W 5.0 release, your PHP scripts no longer require an external mapscript.php file containing MapServer constants (the constants and objects are wrapped in the dll through SWIG now instead)

  6. Test in your browser with the provided quickmap.php file at /ms4w/Apache/htdocs/quickmap.php (see usage instructions in the top of that file)

  7. Test at the commandline that the MapScript extension loads, with the commands:

    cd ms4w
    setenv.bat
    php -dextension=C:/ms4w/Apache/php/ext/php_mapscript.dll -r "echo msGetVersion();"
    

    MS4W version details should be displayed.

    Tip

    The following should also work (where you first specify the location of php.ini, such as:

    php -c Apache\cgi-bin -r "echo msGetVersion();"
    
  8. Test at the commandline with the provided quickmap.php file at /ms4w/Apache/htdocs/quickmap.php with the commands:

    cd ms4w
    setenv.bat
    cd Apache/htdocs
    php -dextension=C:/ms4w/Apache/php/ext/php_mapscript.dll quickmap.php > test.png
    
  9. You can also use a phpinfo() call to view the loaded PHP extensions, including MapScript, by doing the following:

    • move the file /ms4w/tmp/phpinfo.php into /ms4w/Apache/htdocs
    • in your browser goto: http://127.0.0.1/phpinfo.php
    • look for a “mapscript” section

    Warning

    Be sure to delete the file phpinfo.php from your htdocs folder after using it, as it could expose vulnerable information on the server.

Python

Using the packaged Python Installation

As of MS4W 4.0, Python is distributed as part of the base MS4W install. To call Python, open a Command Prompt window and cd to /ms4w/ and then execute setenv.bat. You should see a message displayed such as:

mapserv, GDAL, Python, PHP, and commandline MS4W tools path set

Next, in the same window, execute python --version. You should see a response such as:

Python 3.12.6

You can then upgrade pip (Python’s package management system tool) as:

python -m pip install --upgrade pip

And install specific packages and versions through pip such as:

python -m pip install Sphinx==7.0.1

Tip

As of MS4W 4.0, Python MapScript is already installed for you, (you can see the mapscript files inside /ms4w/Python/Lib/site-packages). You can jump to the “Testing the Configuration” steps below.

Installing the Python Mapscript Support Files

Warning

The Python mapscript support files included in this distribution are built for Python 3.12.x; they will not work with 2.7 Python versions. It is strongly recommended that you use the Python instance that is distributed inside MS4W (at /ms4w/Python/).

Quick and dirty (for use with ms4w only)
  1. Unpack /ms4w/msplugins/mapscript/python/mapscript*win32.zip in a safe location
  2. You should find 3 files there:
    • _mapscript.cp312-win32.pyd
    • mapscript.py
    • mapscript-<version>-py3.12.egg-info
  3. Copy the 3 files into the /ms4w/Apache/cgi-bin directory.
  4. Place any python cgi scripts that you want to run under ms4w in the /ms4w/Apache/cgi-bin directory, and add a “shebang” line at the top of each script. See the section on Configuring Apache to run Python scripts below for shebang-line details.
More robust (for system-wide access)
  1. Unpack /ms4w/msplugins/mapscript/python/mapscript*win32.zip in a safe location
  2. You should find three files there:
    • _mapscript.cp312-win32.pyd
    • mapscript.py
    • mapscript-<version>-py3.12.egg-info
  3. Copy the three files into the site-packages directory of your Python 3.12.x installation (eg., C:/ms4w/Python/Lib/site-packages)
  4. Add <drive_letter>:/ms4w/Apache/cgi-bin to your system’s PYTHONPATH environment variable.
Configuring Apache to Run Python Scripts

Tip

As of MS4W 4.0, mod_wsgi is installed for you. (you can see the mod_wsgi files inside /ms4w/Python/Lib/site-packages). For configuring the module, edit /ms4w/Apache/conf/httpd.conf and look for the section “mod_wsgi settings” around line# 620

You have a couple of additional options here:

via shebang lines

This may be the preferred approach if you have multiple Python installations on your machine.

Add a “shebang line” to the top of each python cgi script in /ms4w/apache/cgi-bin. This line must be the first line in the script, and it must begin with #! followed by the path to your systems python executable. For example:

#!C:\ms4w\Python\python.exe -u

The -u option shown above causes the script to use unbuffered output, which is generally what you need in web-serving contexts.

via Apache directives

This approach obviates the need to edit every python script in your cgi-bin directory; however, it may be problematic if you have multiple Python installations.

Add the following line to the end of ms4w/Apache/conf/httpd.conf:

ScriptInterpreterSource Registry

You may also want to add these:

SetEnv PYTHONUNBUFFERED 1
PassEnv PYTHONPATH

The first of the above lines causes your python scripts to use unbuffered output (which you probably want), while the second passes the value of your system’s PYTHONPATH environment variable through to Apache’s environment (if set).

Testing the Configuration

Follow these steps to test your Python MapScript installation:

  1. Commandline:

    • Open a Command prompt window, and cd into /ms4w/ and execute setenv.bat

    • Execute the following command in that same window:

      python -c "import mapscript; print (mapscript.msGetVersion())"
      

      MS4W version details should be displayed.

  2. Browser:

    • Move the file /ms4w/msplugins/mapscript/python/test-cgi-mapscript.py into the /ms4w/Apache/cgi-bin/ folder.

    • Open the file in a text editor.

    • Edit the first line of that script to point to your proper Python path.

    • In your web browser goto:

      http://127.0.0.1/cgi-bin/test-cgi-mapscript.py

    • The script tests that the Python CGI is working, and that the mapscript module can be successfully imported.

      If successful you will see an HTML page listing several environment settings on your machine, as well as the installed MapServer version, and a list of the Python MapScript module attributes at the bottom of the page.

  3. Quickmap.py :

    • Move the file /ms4w/msplugins/mapscript/python/quickmap.py into the /ms4w/Apache/cgi-bin/ folder.

    • Open the file in a text editor.

    • Follow the instructions at the top of the file, to edit the necessary paths.

    • In your web browser goto:

      http://127.0.0.1/cgi-bin/quickmap.py

    • The local demo map should be displayed in your browser.

Python Troubleshooting:

  • If you get an Internal Server Error check the Apache logs for info.
  • Make sure your script points to a valid Python installation path.
  • Make sure you are using a recent Python version (containing the cgitb module).
Python MapScript Documentation

Python MapScript is handled through the SWIG API for MapServer: https://mapserver.org/mapscript/mapscript.html

GDAL Plugins

Oracle

See the previous section to configure GDAL for Oracle connections: Steps to Enable Oracle Support in MS4W

ECW

As of MS4W 5.0.0, a plugin is provided to read & display ECW files through version 5 of the SDK in MS4W; however you must first verify that your use meets the requirements of the ECW license, in /gdalplugins/ecw/ecw-license.pdf. If you require functionality from a different SDK, please contact GatewayGeo for a custom build quote.

Steps to Enable ECW Support in MS4W
  1. For access to ECW files through the GDAL library, move the gdal_ECW_JP2ECW.dll plugin file up from /ms4w/gdalplugins/ecw/ into /ms4w/gdalplugins/

    If this is successful, executing the following at the commandline (after setting /ms4w/setenv.bat) “gdalinfo –formats” should list the “ECW” and “JP2ECW” drivers.

    ECW -raster- (rw): ERDAS Compressed Wavelets (SDK 5.5)
    JP2ECW -raster,vector- (rw+v): ERDAS JPEG2000 (SDK 5.5)
    
  2. In the same Command window, use gdalinfo to verify that your specific ECW file can be read:

    cd ms4w
    setenv.bat
    cd your/data/folder/
    gdalinfo 00203065F09.ecw
    

    should return something like:

    Driver: ECW/ERDAS Compressed Wavelets (SDK 5.5)
    Files: 00203065F09.ecw
    Size is 1029, 1022
    Coordinate System is:
    PROJCS["NUTM11",
       GEOGCS["NAD83",
         DATUM["North_American_Datum_1983",
           SPHEROID["GRS 1980",6378137,298.257222101,
             AUTHORITY["EPSG","7019"]],
           TOWGS84[0,0,0,0,0,0,0],
           AUTHORITY["EPSG","6269"]],
         PRIMEM["Greenwich",0,
           AUTHORITY["EPSG","8901"]],
         UNIT["degree",0.0174532925199433,
           AUTHORITY["EPSG","9108"]],
        ...
    
  3. For display in MapServer, after moving the plugin, follow the regular Raster Data document. Here is an example mapfile configuration:

    LAYER
      NAME "ecw"
      TYPE RASTER
      STATUS ON
      DATA "00203065F09.ecw"
      CLASS
        NAME "ECW test"
      END
    END
    

GDAL Bindings

MS4W contains GDAL bindings for CSharp, Java, and Python, and are located at /ms4w/gdalbindings

Using the Python GDAL Module

Note

Since the MS4W 4.0 release, Python is included in the base MS4W (after you run setenv.bat you can call Python). If you have your own Python instance instead: Python 3.12 is required for the Python GDAL module in MS4W, and you must have C:/python-3.12.x in your PATH to use the utilities.

The Python GDAL module and its utilities are installed in /ms4w/gdalbindings/python/gdal/. To run the utilities:

  1. Open a Command Prompt window
  2. cd ms4w
  3. setenv.bat
  4. excute the GDAL/Python utility (without a file extension), such as:
gdal_calc -h
gdal_edit -h
gdal_fillnodata -h
gdal_merge -h
gdal_pansharpen -h
gdal_polygonize -h
gdal_proximity -h
gdal_retile -h
gdal_sieve -h
gdal2tiles -h
gdal2xyz -h
gdalattachpct -h
gdalcompare -h
gdalmove -h
ogr_layer_algebra -h
ogrmerge -h
pct2rgb -h
rgb2pct -h

gdal_merge notes:

  • -n (nodata_value) switch requires the NumPy module (the embedded Python instance in MS4W already includes NumPy)
  • raster_copy_with_nodata() also requires the NumPy module (the embedded Python instance in MS4W already includes NumPy)
  • see https://gdal.org/programs/gdal_merge.html

gdal2tiles notes:

PROJ Networking

Since MS4W 5.0, the included projections library PROJ allows leveraging associated grid files for increased accuracy. These grid files can be loaded on-demand, however this is not recommended for online mapping; instead MS4W contains a script to execute to download all grid files, before you begin mapping:

  1. Open a Command Prompt window
  2. cd ms4w
  3. setenv.bat
  4. execute: proj-install-grids.bat
  5. the grids will be stored in the folder /ms4w/share/proj/
  6. For more PROJ network settings, see the included proj.ini file at /ms4w/share/proj/ and the related documentation: https://proj.org/usage/network.html

FastCGI

In order to use FastCGI you must do the following:

  1. Open /ms4w/Apache/conf/httpd.conf in a text editor

  2. Uncomment line#182, such as:

    LoadModule fcgid_module modules/mod_fcgid.so
    
  3. At the bottom of the file you will see a commented “<IfModule fcgid_module>” section. If you want to use FastCGI directives (listed on the mod_fcgid page) you can uncomment the section and add your directives, such as:

    <IfModule fcgid_module>
       FcgidMinProcessesPerClass 0
       FcgidIdleScanInterval 1
       FcgidProcessLifeTime 10
       FcgidInitialEnv MAPSERVER_CONFIG_FILE "/ms4w/ms4w.conf"
    </IfModule>
    
  1. If you are connecting to an Oracle database using FastCGI, you must also add your Oracle Bin directory (where the ‘oci.dll’ file exists) to the PATH variable above, such as:

    <IfModule fcgid_module>
        ...
        FcgidInitialEnv PATH "c:/oracle/product/10.2.0/client/BIN"
        ...
    </IfModule>
    
  2. Save the file and restart apache (execute /ms4w/apache-restart.bat)

  3. Change your CGI application to point to “/fcgi-bin/mapserv.exe” instead of the usual “/cgi-bin/mapserv.exe”

  4. Add the following parameter to your layer for which you want this FastCGI connection:

    PROCESSING "CLOSE_CONNECTION=DEFER"
    
  5. Try the application. If successful you should see the “mapserv.exe” process in the Windows Task Manager remain open while the user interacts with your application.

Notes:

  • in testing this was successful with PostgreSQL 9.0.4 / PostGIS 1.5.2, and with Oracle 10.2.0.1.0.
  • general MapServer and FastCGI notes can be found in the FastCGI Howto.

Apache Modules

MapCache Apache Module

The MapCache Apache module and the MapCache commandline utilities (as of MS4W 3.1.0) are included. In order to use the MapCache Apache module you must do the following:

Note

For information about MS4W’s included HTTPS certificate bundle, and specific tips for MapCache, see the later section Certificates for HTTPS of this document.

  1. Open /ms4w/Apache/conf/httpd.conf in a text editor

  2. Uncomment line#184, and change to your correct path, such as:

    LoadModule mapcache_module "C:/ms4w/Apache/cgi-bin/mod_mapcache.dll"
    
  3. Around line#412 of your httpd.conf file you will see a “<IfModule mapcache_module>” section. Modify the path to the included MapCache configuration (XML) file, such as:

    <IfModule mapcache_module>
       <Directory "/ms4w/apps/mapcache/">
          AllowOverride None
          Options None
          Require all granted
       </Directory>
       MapCacheAlias /mapcache "C:/ms4w/apps/mapcache/mapcache.xml"
    </IfModule>
    
  4. Modify the mapcache.xml file. Please see the associated MapCache docs for assistance.

  1. Save your httpd.conf file and restart apache (execute /ms4w/apache-restart.bat)

  2. If the module was successfully loaded your /ms4w/Apache/logs/error_log.txt file should contain a message similar to:

    [notice] Apache/2.4.62 (Win32) mod-mapcache/1.15dev configured
    -- resuming normal operations
    
  3. Test your MapCache configuration by following steps in the associated MapCache testing docs

  4. The MapCache seeding utility is also included. To run the mapcache_seed.exe file be sure to first execute the /ms4w/setenv.bat file in your command window.

  1. The MapCache detail utility is also included. To run the mapcache_detail.exe file be sure to first execute the /ms4w/setenv.bat file in your command window.

Notes:

  • this module was tested with the cache types: disk, sqlite, tiff, and berkeleyDB (PostgreSQL is also available as a dimension backend). You should follow the MapCache Cache Types docs for assistance, or contact GatewayGeo for assistance/custom builds/configurations.

  • the module was tested on Windows 11; if you are using an older version of Windows and require this module you should consider upgrading, or contact GatewayGeo for assistance/custom builds/configurations. .

  • as this module is in constant development, feedback is more than encouraged, it is required. Please send your MapCache questions to the MapServer-users mailing list. You are also encouraged to contact GatewayGeo directly for custom builds and to help fund the development and maintenance of MS4W.

mod_wsgi Apache Module

The mod_wsgi Apache module is included, as of the MS4W 4.0 release. The following steps explain how to configure the mod_wsgi Apache module:

  1. Open /ms4w/Apache/conf/httpd.conf in a text editor

  2. Around line#648, make sure the paths are correct, and comment those 3 lines, such as:

    # mod_wsgi settings
    LoadFile "/ms4w/Python/python312.dll"
    LoadModule wsgi_module "C:/ms4w/Python/Lib/site-packages/mod_wsgi/server/mod_wsgi.cp312-win32.pyd"
    WSGIPythonHome "/ms4w/Python"
    
  3. Save your httpd.conf file and restart Apache (execute /ms4w/apache-restart.bat)

  4. If the module was successfully loaded your /ms4w/Apache/logs/error_log.txt file should contain a message similar to:

    [notice] Apache/2.4.62 (Win32) mod_fcgid/2.3.9 mod_wsgi/5.0.0 Python/3.12 configured
    -- resuming normal operations
    
  5. To test that Apache has loaded the module, at your Command prompt, cd into the /ms4w/Apache/bin/ directory. Then execute the following:

    httpd -t -D DUMP_MODULES
    

    You should see a list of loaded modules, and mod_wsgi should be listed near the end, such as:

    setenvif_module (shared)
    version_module (shared)
    fcgid_module (shared)
    mapcache_module (shared)
    wsgi_module (shared)
    
  6. You can use your file explorer and see the mod_wsgi files inside the folder: /ms4w/Python/Lib/site-packages

  7. To test Python MapScript through mod_wsgi, you can use the script /ms4w/msplugins/mapscript/python/test-wsgi-mapscript.py and follow the steps listed at the top of that file.

H264 Streaming Module for Apache

The H264 Streaming Module is included for Apache (as of MS4W 3.1.0). One of the features of this module is enabling your viewers to immediately jump to any part of the video regardless of the length of the video or whether it has all been downloaded yet. In order to use the H264 Streaming Module you must do the following:

  1. Open /ms4w/Apache/conf/httpd.conf in a text editor

  2. Uncomment line#183, such as:

    LoadModule h264_streaming_module modules/mod_h264_streaming.so
    
  3. Around line#608 of your httpd.conf file you will see a “<IfModule h264_streaming_module>” section. You can leave this section as-is (no changes are needed):

    <IfModule h264_streaming_module>
      AddHandler h264-streaming.extensions .mp4
    </IfModule>
    
  4. Save your httpd.conf file and restart Apache (execute /ms4w/apache-restart.bat)

  5. To test that Apache has loaded the module, at your Command prompt, cd into the /ms4w/Apache/bin/ directory. Then execute the following:

    httpd -t -D DUMP_MODULES
    

    You should see a list of loaded modules, and the H264 Streaming Module should be listed near the end, such as:

    log_config_module (shared)
    mime_module (shared)
    negotiation_module (shared)
    setenvif_module (shared)
    h264_streaming_module (shared)
    
  6. To test the module on an actual video file:

    • Download this mp4 file locally (right-click and Save Link As): https://gatewaygeomatics.com/dl/mapserver-8-0-visualization.mp4

    • Copy the file into the folder /ms4w/Apache/htdocs/

    • Open a Command prompt window, and cd into /ms4w/ and execute setenv.bat

    • Execute the following command in that same window:

      wget -S -O mapserver-8-0-visualization.mp4 "http://127.0.0.1/mapserver-8-0-visualization.mp4?start=0&end=10"
      

      You should see a response as follows (notice the mention of the “X-Mod-H264-Streaming” and also that the size of the video is very small (click on the saved file now in /ms4w/mapserver-8-0-visualization.mp4 and view it, only the first 10 seconds of the video should be loaded):

       1 HTTP/1.1 200 OK
       2 Date: Mon, 31 Jul 2023 18:25:53 GMT
       3 Server: Apache/2.4.62 (Win32) mod_fcgid/2.3.9 mod-mapcache/1.15dev
       4 X-Mod-H264-Streaming: version=2.2.7
       5 Content-Length: 2138552
       6 Last-Modified: Mon, 12 Sep 2022 15:59:58 GMT
       7 ETag: "2c4d430-5e87cfcc9a756;2138552
       8 Accept-Ranges: bytes
       9 Keep-Alive: timeout=5, max=100
      10 Connection: Keep-Alive
      11 Content-Type: video/mp4
      
       0% [ ] 0  --.--K/s    100%[==>] 2,138,552      1.99G/s    ETA 00:00
      
      15:25:53 (1.99 GB/s) - `mapserver-8-0-visualization.mp4' saved [2138552/2138552]
      
    • Now test the module in your Web browser, by going to: http://127.0.0.1/mapserver-8-0-visualization.mp4?start=0&end=10

      • the streamed video should be only 10 seconds long (if the whole video is shown, then there is a problem with the configuration of the module)
      • experiment with the “start” and “end” parameters of the URL
  7. Read more about the module’s parameters: https://github.com/code-shop-com/h264

Apache mod_rewrite & mod_alias Usage

As described earlier, MS4W is designed so you can easily include your application’s Apache settings in the /ms4w/httpd.d/ folder (see the README_HTTPD.txt inside that folder for more information). The following examples will use the existing MS4W “MapServer CGI Viewer” application; the CGI viewer’s Apache settings are stored in the file “httpd_cgi_viewer.conf” inside the /ms4w/httpd.d/ folder. The contents of the file is:

Alias /cgi/ "/ms4w/apps/cgi-viewer/htdocs/"

<Directory "/ms4w/apps/cgi-viewer/htdocs/">
  AllowOverride None
  Options Indexes FollowSymLinks Multiviews
  Order allow,deny
  Allow from all
</Directory>

Note

If you would prefer to make your application changes directly in the /ms4w/Apache/conf/httpd.conf file you can, or also include them in an .htaccess file inside your application’s folder.

Let’s say one of the filenames has changed (from “viewer-index.html” to “ttt.html”), but we want to make sure the old url works. MS4W loads the mod_rewrite module by default (more about mod_rewrite: https://httpd.apache.org/docs/2.4/rewrite/), so we can add a few lines into our “httpd_cgi_viewer.conf” to call this rewrite, such as:

Alias /cgi/ "/ms4w/apps/cgi-viewer/htdocs/"

<Directory "/ms4w/apps/cgi-viewer/htdocs/">
  AllowOverride None
  Options Indexes FollowSymLinks Multiviews
  Order allow,deny
  Allow from all

  RewriteEngine On
  RewriteBase "/cgi/"
  RewriteRule "^viewer-index.html$"  "ttt.html"

</Directory>

We can alternatively use the Redirect directive through the mod_alias module, which is loaded by MS4W by default (read more about mod_alias at https://httpd.apache.org/docs/2.4/mod/mod_alias.html) such as:

Alias /cgi/ "/ms4w/apps/cgi-viewer/htdocs/"

<Directory "/ms4w/apps/cgi-viewer/htdocs/">
  AllowOverride None
  Options Indexes FollowSymLinks Multiviews
  Order allow,deny
  Allow from all
</Directory>

Redirect 301 "/cgi/viewer-index.html" "/cgi/ttt.html"

Tip

Be sure to always restart the Apache service after any changes made to conf files (execute apache-restart.bat at the commandline, after executing setenv.bat in the same window)

TinyOWS

TinyOWS and demo data are included (as of MS4W 3.1.0), giving you full WFS-Transaction support (making data changes in an MS4W map that is then saved to the underlying database). In order to use TinyOWS you must do the following:

  1. Make sure that you have PostgreSQL and PostGIS installed locally, or have connection details for accessing it remotely. This has been tested with PostgreSQL 16.3 and PostGIS 3.4.2

  2. First we must create a database and load some sample data:

    • Open /ms4w/apps/tinyows/demo/install-demo-data.bat in a text editor

    • If necessary, modify the PG-PORT, PG-SUPERUSER-NAME, and PG-SUPERUSER-PASSWORD for your installation (lines ~16-20). Save your changes.

    • Open a Command prompt window, and cd into /ms4w/ and execute setenv.bat

    • cd into /ms4w/apps/tinyows/demo/ and execute the following in that same window:

      install-demo-data.bat
      
    • Verify that a new database was created (“tinyows”), and that there is a spatial table (“frida”). You can use the psql.exe utility to list the tables, such as:

      psql -U postgres -p 5432 -d tinyows -c "\d"
      

Tip

You can use QGIS to view your new “frida” PostGIS layer (through Layer/Add Layer /Add PostGIS Layers)

  1. Next we must configure TinyOWS:

    • Open /ms4w/apps/tinyows/config.xml in a text editor

    • If necessary, modify the online_resource and pg connection parameters, for your installation. Refer to the TinyOWS documentation for parameter descriptions. Save your changes.

    • to test this configuration, in the same Command prompt window, execute the following (change the drive path if necessary):

      set TINYOWS_CONFIG_FILE=C:/ms4w/apps/tinyows/config.xml
      
    • once that is set, execute the following in the same Command prompt window to see details about your TinyOWS configuration:

      tinyows.exe --check
      

      the response should be something like:

      TinyOWS version:   1.2.2
      FCGI support:      Yes
      Config File Path:  C:/ms4w/apps/tinyows/config.xml (TinyOWS XML)
      PostGIS Version:   3.4.2
      PostGIS dsn:       host=localhost user=postgres password=postgres dbname=tinyows port=5432
      Output Encoding:   UTF-8
      Database Encoding: UTF8
      Schema dir:        /ms4w/apps/tinyows/schema/
      Display bbox:      Yes
      Estimated extent:  No
      Check schema:      No
      Check valid geoms: Yes
      Available layers:
      
        public.frida (31467) -> tows:frida [RW]
      
    • Note that Apache sets this same environment variable TINYOWS_CONFIG_FILE in the file /ms4w/httpd.d/httpd_tinyows.conf

  2. Next we should configure the demo HTML application:

    • Open /ms4w/apps/tinyows/demo/tinyows.js in a text editor
    • Verify that urls (such as http://127.0.0.1) used there are correct: see lines 65 & 69
  3. Finally we are ready to test a WFS-T transaction to your database:

    • in a Web browser, goto http://127.0.0.1/tinyows/demo/tinyows.html (or modify that address if need be)

    • click on the “Draw Feature” icon on the top-right of the map, and click anywhere on the map to generate a polygon (to close the polygon double-click).

    • now click on the “Save Changes” icon, you should see a message in the right panel of that page as:

      Transaction successfully completed
      
    • Changes to the “frida” layer should be saved to the database.

      Tip

      If you have the PostGIS layer already loaded in QGIS, if you pan the map, you should see your new feature displayed.

pycsw

pycsw catalogue server is included in the base MS4W installer, as of the MS4W 4.0 release, giving you a lightweight metadata publisher, that runs through MS4W’s embedded Python instance. Through pycsw you can not only serve your metadata catalogue, but also harvest other remote OGC services (WMS, WFS, WCS, WPS, etc.), as well as remotely edit your metadata repository (through CSW-T transactions). Here are some important notes on this pycsw instance:

  1. pycsw can through the mod_wsgi Apache Module (see around line#648 of the file /ms4w/Apache/conf/httpd.conf). Please see that section for mod_wsgi configure instructions.

  2. pycsw can alternatively be configured to run through CGI, instead of through mod_wsgi:

    • comment the mod_wsgi section around line#654 of the file /ms4w/Apache/conf/httpd.conf as:

      # run pycsw through mod_wsgi
      # WSGIApplicationGroup %{GLOBAL}
      # WSGIScriptAlias /pycsw "/ms4w/apps/pycsw-xxx/pycsw/wsgi.py"
      # SetEnvIf Request_URI "/pycsw$" "PYCSW_CONFIG=/ms4w/apps/pycsw-xxx/ms4w.yml"
      # <Directory "/ms4w/apps/pycsw-xxx/pycsw">
        # Order deny,allow
        # Allow from all
      # </Directory>
      
    • uncomment the CGI section around line#663 of the file /ms4w/Apache/conf/httpd.conf as:

      # run pycsw as CGI
      ScriptAlias /pycsw "/ms4w/apps/pycsw-xxx/csw.py"
      SetEnvIf Request_URI "/pycsw$" "PYCSW_CONFIG=/ms4w/apps/pycsw-xxx/ms4w.yml"
      <Directory "/ms4w/apps/pycsw-xxx">
        Options +FollowSymLinks +ExecCGI
        Allow from all
        AddHandler cgi-script .py
      </Directory>
      
    • restart the Apache service (execute /ms4w/apache-restart.bat)

  3. You can configure this sample service, in the file “ms4w.yml”, and you can find the path to it on line#665 of the file: /ms4w/Apache/conf/httpd.conf (look for the “PYCSW_CONFIG” setting there). For definitions of the parameters see pycsw’s configuration guide.

  4. You must restart the Apache service after each change to that .yml file. (execute /ms4w/apache-restart.bat)

  5. A sample CSW service is pre-configured for you, and the GetCapabilities request is: http://127.0.0.1/pycsw?service=CSW&version=3.0.0&request=GetCapabilities

Tip

You can use the QGIS “MetaSearch” plugin to access your local MS4W catalogue (through the menu Web/MetaSearch/MetaSearch). Create a new “Service” entry there with the URL: http://127.0.0.1/pycsw

  1. To use the “pycsw-admin” utility:

    • open a Command window
    • cd ms4w
    • setenv.bat
    • pycsw-admin –help

    For usage parameters of the admin utility see pycsw’s administration guide.

ZOO-Project

ZOO-Project Web Processing Server is included as an add-on package, as of the MS4W 4.0 release, giving you a full WPS server, that runs through MS4W’s Apache instance. Here are some important notes on this ZOO-Project WPS instance and its many compiled services:

  1. Please see your local MS4W homepage (http://127.0.0.1) for a working list of GetCapabilities, DescribeProcess, and Execute requests for the various WPS services.

Important

Since 2020-01-30 a local demo is included, leveraging ZOO-Project’s vector-based spatial analysis, through OGR services. You can find the demo linked on your local MS4W homepage (as “local OGR Services demo”).

  1. The following support has been compiled into the ZOO-Project kernel, as part of MS4W:

    • MapServer support (official docs)
    • PHP support (official docs)
    • Python support (official docs)
    • C# Mono support (official docs) see note below to enable
    • Java support (official docs) see note below to enable
    • GDAL and OGR support (official docs)
    • Status service support (official docs)

Tip

If you require a specific WPS service support, or a specific version support, that is not part of the base MS4W, please contact GatewayGeo.

  1. The ZOO kernel configuration file main.cfg can be found in /ms4w/Apache/cgi-bin/ . For definitions of the parameters see the configuration guide.

  2. Individual ZOO service configuration files (.zcfg) can also be found in /ms4w/Apache/cgi-bin/ . For definitions of the parameters see the services configuration guide.

  3. To enable C# Mono support you are required to do the following:

    • move the zoo_loader.cgi plugin file up from /ms4w/Apache/cgi-bin/zooplugins/mono/ into /ms4w/Apache/cgi-bin/

    • add the following to your main.cfg file, pointing to your local installation of Mono:

      [mono]
      lib=C:\Program Files (x86)\Mono\lib
      etc=C:\Program Files (x86)\Mono\etc
      
  4. To enable Java support you are required to do the following:

    • move the zoo_loader.cgi plugin file up from /ms4w/Apache/cgi-bin/zooplugins/java/ into /ms4w/Apache/cgi-bin/

    • add the following to your main.cfg file, pointing to your local installation of JDK:

      [java]
      java.library.path=C:\Program Files (x86)\Java\jdk1.8.0_77\jre\bin\client HelloJava.class
      
    • You may have to move your local jvm.dll file into /ms4w/Apache/cgi-bin/ as well

Certificates for HTTPS

As of MapServer 5.4.1, MapServer can connect through HTTPS connections to WMS/WFS servers. MS4W 3.0 (and newer) includes the necessary configuration as follows:

  1. Certificate authority bundle is included in /ms4w/Apache/conf/ca-bundle/cacert.pem

    Source: http://curl.haxx.se/ca/cacert.pem

  2. Apache’s httpd.conf points to the ca-bundle:

    SetEnv CURL_CA_BUNDLE "/ms4w/Apache/conf/ca-bundle/cacert.pem"
    

Tip

MS4W’s MapCache module will check for this CURL_CA_BUNDLE value set in Apache’s httpd.conf, and in the instances that it cannot find the value (which occurs on some x64 systems) it will check for the following hardcoded paths, in this order:

"D:/ms4w/Apache/conf/ca-bundle/cacert.pem"

  or

"C:/ms4w/Apache/conf/ca-bundle/cacert.pem"
  1. MS4W’s setenv.bat points to the ca-bundle:

    set CURL_CA_BUNDLE=\ms4w\Apache\conf\ca-bundle\cacert.pem
    set SSL_CERT_FILE=\ms4w\Apache\conf\ca-bundle\cacert.pem
    set OPENSSL_CONF=\ms4w\tools\openssl\openssl.cnf
    
  2. MS4W’s php.ini points to the ca-bundle:

    curl.cainfo="/ms4w/Apache/conf/ca-bundle/cacert.pem"
    openssl.cafile="/ms4w/Apache/conf/ca-bundle/cacert.pem"
    
  3. For more information on SSL certificates, see: https://curl.se/docs/sslcerts.html

  4. To setup MapServer as a client to access a remote WMS/WFS server through HTTPS see: https://mapserver.org/ogc/wxs_secure.html

  5. To enable HTTPS for your server host (to serve its own certificate, for your domain such as https://mydomain.com), you can use “win-acme” at https://www.win-acme.com/ Here are some important tips specifically related to win-acme:

    • follow the steps for Apache at https://www.win-acme.com/manual/advanced-use/examples/apache

    • be sure to set the SavePrivateKeyPem option in win-acme’s settings.config to True

    • edit your httpd.conf and around line#176 be sure to uncomment the line:

      LoadModule ssl_module modules/mod_ssl.so
      
    • change the ServerName parameter in httpd.conf around line#226 to your domain such as:

      ServerName mydomain.com
      
    • add the following to the bottom of your httpd.conf (edit the paths to your generated certificate files):

      <IfModule mod_ssl.c>
          Listen 443
      </IfModule>
      
      <VirtualHost *:443>
          DocumentRoot "/ms4w/Apache/htdocs"
          ServerName mydomain.com
          ErrorLog "logs/https_error_log.txt"
          CustomLog "logs/https_error_access.txt" common
          SSLEngine on
          SSLCertificateFile "C:/ProgramData/win-acme/acme-v02.api.letsencrypt.org/Certificates/ca-umz9yz4SYUGQm-esziIA9A-chain.pem"
          SSLCertificateKeyFile "C:/ProgramData/win-acme/acme-v02.api.letsencrypt.org/Certificates/umz9yz4SYUGQm-esziIA9A-key.pem"
      </VirtualHost>
      
    • restart Apache (execute /ms4w/apache-restart.bat)

    • use a tool to verify your certificate such as https://www.ssllabs.com/ssltest/

Troubleshooting

Warning: dl(): Unable to load dynamic library ‘/ms4w/Apache/php/ext/php_mapscript.dll’

  1. Verify that the dll in question exists in the specified location (/ms4w/Apache/php/ext/).

  2. This php_mapscript dll requires several other dlls, and the problem may be that one is missing on your system. In order to hopefully get more information on what dll is missing, go to a command prompt, and do the following:

    cd ms4w
    setenv.bat
    cd Apache/htdocs
    php -dextension=C:/ms4w/Apache/php/ext/php_mapscript.dll quickmap.php
    

    A windows error window should open with a message like:

    The dynamic link library ***** could not be found in
    the specified path...
    

    Locate this missing dll and copy it either to /ms4w/Apache/cgi-bin/ or your system32 folder.

  3. If you are still unsure what dll is causing this unable to load dynamic library error, a useful utility to find what associated dlls are missing on your system is Dependency Walker. Download the utility, execute the exe, and open your php_mapscript dll.

The Program can’t start because MSVCRxxx.dll is missing from your computer

Please follow the instructions included locally inside the document /ms4w/REQUIREMENTS.txt to install the C++ Redistributable.

Clicking on apache-install.bat flashes a DOS window and does not install the service

To see the exact error message, open a Command window, and execute the ‘apache-install.bat’ file from a DOS prompt.

cd ms4w

apache-install.bat

Only one usage of each socket address (protocol/network address/port) is normally permitted. : make_sock: could not bind to address 0.0.0.0:80 no listening sockets available, shutting down

Apache with MS4W is configured to use port 80. Your system might be already using this port (IIS could cause this for example). If you want to change the port that Apache uses modify the following file:

/ms4w/Apache/conf/httpd.conf

line 120: Listen 80

TCPView is an example of shareware that lets you see how the ports on your machine are being used.

The procedure entry point xxxx could not be located in the dynamic link library xxx.dll

Make sure that MapServer (or the utility that you are trying to use) is actually using the ‘xxx.dll’ file that is part of the MS4W package. You could be experiencing ‘dll hell’ (https://en.wikipedia.org/wiki/DLL_hell) where MS4W is actually finding an older dll on your system. Try renaming the other dll(s) of the same name, keeping the one in MS4W as is, and retrying your application/command.

Other Problems…

  1. Search the mailing list archives to see if someone has encountered/solved your same issue.
  1. If your issue has not been brought up on the mailing list and dealt with, submit a question to the MS4W mailing list. Include the steps to reproduce your problem, and state your exact error message. Also specify which version of MS4W you are using.

Modifying MS4W for an Installation not at the Drive Root

Do the following steps in a text editor:

  1. Open /ms4w/Apache/conf/httpd.conf and search for “/ms4w/” and replace with your new path from your drive root (such as “/Temp/ms4w/”)
  2. Open /ms4w/Apache/cgi-bin/php.ini and search for “/ms4w/” and replace with your new path from your drive root (such as “/Temp/ms4w/”)
  3. Open all files in /ms4w/httpd.d and search for “/ms4w/” and replace with your new path from your drive root (such as “/Temp/ms4w/”)
  4. Open /ms4w/setenv.bat and search for “/ms4w/” and replace with your new path from your drive root (such as “/Temp/ms4w/”)
  5. Configure your add-on packages, typically installed at /ms4w/apps/

Recommendation: avoid installing MS4W in a path that contains spaces

Installing the MS4W MapServer Binaries in Other Environments

The following instructions will help non-MS4W users who want to only use the MapServer binaries included in MS4W:

  1. Download and extract the MS4W base package locally from ms4w.com
  2. Do not install the Apache service (apache-install.bat)
  3. Copy the .dll files from the /ms4w/apache/cgi-bin/ directory into your desired cgi-bin directory:
  4. For PHP/Mapscript, goto /ms4w/Apache/php/ext/ and copy the php_mapscript.dll file into your own PHP extensions directory. CSharp, Java, and Python mapscript files can be found in /ms4w/msplugins/mapscript/
  5. For the commandline utilities that come with MS4W (mapserv, gdal, etc.) copy all of the .exe files from /ms4w/tools/ to a desired location, but be aware that these utilities use dlls that were installed in the cgi-bin directory. Therefore you must add your cgi-bin directory into your Windows PATH environment variable before running the utilities.
  6. Microsoft IIS users should refer to the IIS Howto for MapServer.

Using Custom EPSG Projections

Custom EPSG projections can be added to the bottom of your epsg file at /ms4w/proj/nad/epsg/.

As of MS4W 3.0-beta11, previously included custom projections for Canada have been removed. Here is some of the history:

  • GatewayGeo officially applied to have the custom Canadian projection EPSG:42304 (common in Ontario and in the Atlas of Canada) included in the EPSG geodetic registry in 2009
  • the projection was accepted as EPSG:3978 in the EPSG geodetic registry on 2009-06-02
  • this new EPSG code is included in PROJ 4.7.0 release (2009-09)

For reference, here are the old custom Canadian EPSG codes:

##
## Custom projection codes for Canada
##
## WGS84 / LCC Canada
<42101> +proj=lcc +ellps=WGS84 +lat_0=0 +lon_0=-95 +lat_1=49
        +lat_2=77 +x_0=0 +y_0=-8000000.0 +datum=WGS84
        +units=m no_defs <>
## NAD83 / BC Albers
<42102> +proj=aea +ellps=GRS80 +lat_0=45 +lon_0=-126.0
        +lat_1=50.0
        +lat_2=58.5 +x_0=1000000.0 +y_0=0 +datum=NAD83
        +units=m no_defs <>
#
## NAD83 LCC for Canada
<42304> +proj=lcc +ellps=GRS80 +lat_0=49 +lon_0=-95
        +lat_1=49 +lat_2=77
        +datum=NAD83 +units=m no_defs <>
##

Securing your MS4W Installation

MapServer requests often contain the MAP= parameter with a directory path to a mapfile, that can be used to execute malicious code, or possibly traverse through the server’s filesystem. If you have installed MS4W on a publicly visible server, you must pay attention to preventing these malicious attacks.

Note

Since MS4W 5.0, all installations must configure the included ms4w.conf file, that exists at /ms4w/ms4w.conf. All MapServer installations since the MapServer 8.0 release are required to include this conf file, that contains sections to set the various environment variables, for added security, mentioned below.

Here are the recommended security steps to implement on your MS4W server:

Security Steps to Enable

  1. (Required) Configure the file /ms4w/ms4w.conf

    1. Set MS_MAP_PATTERN in your /ms4w/ms4w.conf, to disallow common malicious manipulation of the MAP= parameter:

      Verify that the drive stated around line# 16 of ms4w.conf is correct. For example, if you installed MS4W at C:/ms4w/, then that line should look like:

      MS_MAP_PATTERN "^(C:)?\/ms4w\/apps\/((?!\.{2})[_A-Za-z0-9\-\.]+\/{1})*([_A-Za-z0-9\-\.]+\.(map))$"
      

      The above regular expression will limit paths to the common C:/ms4w/apps/ directory (where all MS4W mapfiles and applications live), allow encoded urls, allow “.” or “_” or “-” in MAP= paths but disallow “..” directory traversing.

      If you installed MS4W at E:/ms4w/, then you would have to replace the (C:) text with (E:) such as:

      MS_MAP_PATTERN "^(E:)?\/ms4w\/apps\/((?!\.{2})[_A-Za-z0-9\-\.]+\/{1})*([_A-Za-z0-9\-\.]+\.(map))$"
      

      Note

      MS4W’s setup.exe installer tries to modify the patterns in ms4w.conf for you, according to your installation directory.

      Tip

      You can build and test your regular expression with the online tool RegExr. Follow these steps to test there:

      1. Click on “Javascript” in the top-right and select “PCRE” (which is the actual regex library used by MS4W).

      2. Click on “Flags” in the top-right and click to disable “global” and disable any other that are enabled.

      3. In the “Expression” panel at the top, paste your draft regular expression:

        SetEnv MS_MAP_PATTERN "^(C:)?\/ms4w\/apps\/((?!\.{2})[_A-Za-z0-9\-\.]+\/{1})*([_A-Za-z0-9\-\.]+\.(map))$"
        
      4. Move your mouse over parts of the expression, and a helpful popup will appear explaining what that section is (in regular expression language, which helps you learn the terms and/or search for more specific help online). For example, below you can see that I clicked inside the first character set: [_A-Za-z0-9-.] that specifies what characters (including numbers, underscore, dash, or period) are allowed in the path:

        _images/regexr-expression-panel.png
      5. Now begin to add tests, by clicking on the “Tests” button below the expression, and click the “Add Test” link. Here, paste in your first test, which can be one that must work/be valid, such as C:/ms4w/apps/ogc-demos/demo.map. You can even give it a name “Valid path”. A green checkmark should instantly appear, telling you that the path is valid, according to your expression.

        _images/regexr-valid-path.png
      6. Add a test for malicious directory traversing, as: ../../../Users/All/Users/Microsoft/Settings/xxx.map Your result there should give a red X, showing that this is not allowed with your expression.

        _images/regexr-directory-traverse.png
      7. Add a test for a malicious filetype, as: xxx.js Your result there should give a red X, showing that this is not allowed with your expression.

        _images/regexr-malicious-file-extension.png
      8. Repeat after me, say this out loud 10 times:

        Regular expressions are fun, I love regex.
        Regular expressions are fun, I love regex.
        Regular expressions are fun, I love regex.
        Regular expressions are fun, I love regex.
        Regular expressions are fun, I love regex.
        Regular expressions are fun, I love regex.
        Regular expressions are fun, I love regex.
        Regular expressions are fun, I love regex.
        Regular expressions are fun, I love regex.
        Regular expressions are fun, I love regex.
        
      9. Sleep easily as you have helped secure your MS4W server.

      The above MS_MAP_PATTERN expression has now been implemented on the MS4W official demo server. MS4W is installed there on the default (and recommended) path of C:/ms4w/, and all applications and mapfiles live in the recommended C:/ms4w/apps/ sub-directories. You can now try yourself some example tests against that server, with that secure MS_MAP_PATTERN set through Apache:

    2. (Recommended) Set MS_MAPFILE in ms4w.conf, to hide the MAP= path from MapServer requests, on your public MapServer services.

    3. (Optional) Set MS_MAP_NO_PATH in ms4w.conf, to forbid all MAP= requests in your visible MapServer calls.

  2. You can optionally set the above environment variables through Apache (in /ms4w/Apache/conf/httpd.conf) but using ms4w.conf is recommended instead.

  3. Test your local mapfile in your browser (update the map= path), with a url such as:

    http://127.0.0.1/cgi-bin/mapserv.exe?map=C:/ms4w/apps/local-demo/local.map&MODE=browse&TEMPLATE=openlayers&LAYERS=all
    

Password Protection Configuration for Applications

The following section explains how to add password authentication to your MS4W application. However there are many other possible settings in Apache for this, so please consult the Apache HTTP Server documentation.

Here are the minimal steps for password protection:

  1. Modify your application’s httpd_xxx.conf file, so that “AllowOverride None” is replaced with “AllowOverride AuthConfig”, such as:

    Alias /gmap/ "/ms4w/apps/gmap/htdocs/"
    
    <Directory "/ms4w/apps/gmap/htdocs/">
      AllowOverride AuthConfig
      Options Indexes FollowSymLinks Multiviews
      Order allow,deny
      Allow from all
    </Directory>
    
  2. Create a password file.

    • open a DOS command window, and go to Apache’s bin directory

    • enter the following (replace “jeff” with the username you want to create, press ENTER and you will be prompted for a password to create):

      C:/ms4w/Apache/bin> htpasswd -c htpasswd.txt jeff
      
  3. Create the htaccess file.

    • create a file in your application directory (/ms4w/apps/gmap/htdocs/ in this example) named ‘.htaccess’

    • the file should contain (you can modify it however you wish though):

      AuthType Basic
      AuthUserFile C:/ms4w/Apache/bin/htpasswd.txt
      AuthName "Password Required"
      
      require valid-user
      
  4. Restart Apache

    • run /ms4w/apache-restart.bat
  5. Access your application in a web browser.

Troubleshooting:

  • some Windows versions may have difficulty with the ‘.htaccess’ filename, so you might try naming it something else, but you would have to modify Apache’s httpd.conf file (/ms4w/Apache/conf/httpd.conf) and add your filename, such as:

    AccessFileName .htaccess yourfilename
    

    ‘htaccess.acl’ is recommended, such as:

    AccessFileName .htaccess htaccess.acl
    
  • for more information please see the Apache documentation

MS4W Applications

The following applications come with a pre-configured install package for MS4W. Go to https://ms4w.com/release/apps/ to find the desired package, and extract the packages to the MS4W root (e.g. if you installed in C:/ then extract at C:/, and if you installed the base in D:/ then extract the packages to D:/).

  1. GeoMoose
  2. Mapbender
  3. MapServer CGI Viewer
  4. MapServer Itasca Demo Application
  5. MapServer OGC Workshop
  6. Matomo Analytics
  7. OpenLayers
  8. pycsw
  9. ZOO-Project WPS Server

Warning

Some applications may have a problem if you install MS4W in a path containing spaces. It is therefore not recommended to install MS4W in a path that contains spaces.

Color Syntax file for Notepad++

To add nice coloring to your MapServer .map files, follow the instructions at https://ms4w.com/trac/wiki/Notepad++MapServerStyle

Additional Support

General questions and comments should be sent to the MS4W mailing list, which you can join at: https://ms4w.com/forum/

Requests for changes and enhancements to MS4W should be filed in the MS4W tracker.

Custom support is also available from GatewayGeo.

About this Document

Component Licensing

MS4W contains several component packages that are provided under their own licensing terms.

MapServer

Copyright (c) 2008-2024 Open Source Geospatial Foundation. Copyright (c) 1996-2008 Regents of the University of Minnesota.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies of this Software or works derived from this Software.

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

GDAL

Refer to the GDAL license found at /ms4w/gdaldata/LICENSE.TXT

MrSID

Portions of this computer program are copyright (c) 1995-2024 LizardTech, Inc. All rights reserved. MrSID is protected by U.S. Patent No. 5,710,835. Foreign Patents Pending.

FreeType

Portions of this software are copyright (c) 2024 The FreeType Project (www.freetype.org). All rights reserved.

Apache

Refer to the Apache license found at /ms4w/Apache/LICENSE-APACHE.txt

PHP

Refer to the PHP license found at /ms4w/Apache/php/LICENSE_PHP.txt