1FROM debian:10.1
2
3LABEL authors="Carmen Tawalika,Markus Neteler,Anika Bettge"
4LABEL maintainer="tawalika@mundialis.de,neteler@mundialis.de,bettge@mundialis.de"
5
6ENV DEBIAN_FRONTEND noninteractive
7
8# define versions to be used
9ARG PDAL_VERSION=1.8.0
10ARG PROJ_VERSION=5.2.0
11ARG PROJ_DATUMGRID_VERSION=1.8
12ARG LAZ_PERF_VERSION=1.3.0
13
14SHELL ["/bin/bash", "-c"]
15
16WORKDIR /tmp
17
18RUN apt-get update && apt-get upgrade -y && \
19    apt-get install -y --no-install-recommends --no-install-suggests \
20    build-essential \
21    bison \
22    bzip2 \
23    cmake \
24    curl \
25    flex \
26    g++ \
27    gcc \
28    gdal-bin \
29    git \
30    libbz2-dev \
31    libcairo2 \
32    libcairo2-dev \
33    libcurl4-gnutls-dev \
34    libfftw3-bin \
35    libfftw3-dev \
36    libfreetype6-dev \
37    libgdal-dev \
38    libgeos-dev \
39    libgsl0-dev \
40    libjpeg-dev \
41    libjsoncpp-dev \
42    libopenblas-base \
43    libopenblas-dev \
44    libnetcdf-dev \
45    libncurses5-dev \
46    libopenjp2-7 \
47    libopenjp2-7-dev \
48    libpnglite-dev \
49    libpq-dev \
50    libpython3-all-dev \
51    libsqlite3-dev \
52    libtiff-dev \
53    libzstd-dev \
54    locales \
55    make \
56    mesa-common-dev \
57    moreutils \
58    ncurses-bin \
59    netcdf-bin \
60    python3 \
61    python3-dateutil \
62    python3-dev \
63    python3-magic \
64    python3-numpy \
65    python3-pil \
66    python3-pip \
67    python3-ply \
68    python3-setuptools \
69    python3-venv \
70    software-properties-common \
71    sqlite3 \
72    subversion \
73    unzip \
74    vim \
75    wget \
76    zip \
77    zlib1g-dev
78
79RUN echo LANG="en_US.UTF-8" > /etc/default/locale
80RUN echo en_US.UTF-8 UTF-8 >> /etc/locale.gen && locale-gen
81
82## install the latest projection library for GRASS GIS
83WORKDIR /src
84RUN wget -q http://download.osgeo.org/proj/proj-${PROJ_VERSION}.tar.gz && \
85    tar xzf proj-${PROJ_VERSION}.tar.gz && \
86    cd /src/proj-${PROJ_VERSION}/ && \
87    wget -q http://download.osgeo.org/proj/proj-datumgrid-${PROJ_DATUMGRID_VERSION}.zip && \
88    cd nad && \
89    unzip ../proj-datumgrid-${PROJ_DATUMGRID_VERSION}.zip && \
90    cd .. && \
91    ./configure --prefix=/usr/ && \
92    make && \
93    make install
94
95## install laz-perf
96RUN apt-get install cmake
97WORKDIR /src
98RUN wget -q https://github.com/hobu/laz-perf/archive/${LAZ_PERF_VERSION}.tar.gz -O laz-perf-${LAZ_PERF_VERSION}.tar.gz && \
99    tar -zxf laz-perf-${LAZ_PERF_VERSION}.tar.gz && \
100    cd laz-perf-${LAZ_PERF_VERSION} && \
101    mkdir build && \
102    cd build && \
103    cmake .. && \
104    make && \
105    make install
106
107## fetch vertical datums and store into PROJ dir
108WORKDIR /src
109RUN mkdir vdatum && \
110    cd vdatum && \
111    wget -q http://download.osgeo.org/proj/vdatum/usa_geoid2012.zip && unzip -j -u usa_geoid2012.zip -d /usr/share/proj; \
112    wget -q http://download.osgeo.org/proj/vdatum/usa_geoid2009.zip && unzip -j -u usa_geoid2009.zip -d /usr/share/proj; \
113    wget -q http://download.osgeo.org/proj/vdatum/usa_geoid2003.zip && unzip -j -u usa_geoid2003.zip -d /usr/share/proj; \
114    wget -q http://download.osgeo.org/proj/vdatum/usa_geoid1999.zip && unzip -j -u usa_geoid1999.zip -d /usr/share/proj; \
115    wget -q http://download.osgeo.org/proj/vdatum/vertcon/vertconc.gtx && mv vertconc.gtx /usr/share/proj; \
116    wget -q http://download.osgeo.org/proj/vdatum/vertcon/vertcone.gtx && mv vertcone.gtx /usr/share/proj; \
117    wget -q http://download.osgeo.org/proj/vdatum/vertcon/vertconw.gtx && mv vertconw.gtx /usr/share/proj; \
118    wget -q http://download.osgeo.org/proj/vdatum/egm96_15/egm96_15.gtx && mv egm96_15.gtx /usr/share/proj; \
119    wget -q http://download.osgeo.org/proj/vdatum/egm08_25/egm08_25.gtx && mv egm08_25.gtx /usr/share/proj; \
120    cd .. && \
121    rm -rf vdatum
122
123## install pdal
124ENV NUMTHREADS=4
125WORKDIR /src
126RUN wget -q \
127 https://github.com/PDAL/PDAL/releases/download/${PDAL_VERSION}/PDAL-${PDAL_VERSION}-src.tar.gz && \
128    tar xfz PDAL-${PDAL_VERSION}-src.tar.gz && \
129    cd /src/PDAL-${PDAL_VERSION}-src && \
130    mkdir build && \
131    cd build && \
132    cmake .. \
133      -G "Unix Makefiles" \
134      -DCMAKE_BUILD_TYPE=Release \
135      -DCMAKE_INSTALL_PREFIX=/usr \
136      -DCMAKE_C_COMPILER=gcc \
137      -DCMAKE_CXX_COMPILER=g++ \
138      -DCMAKE_MAKE_PROGRAM=make \
139      -DBUILD_PLUGIN_PYTHON=ON \
140      -DBUILD_PLUGIN_CPD=OFF \
141      -DBUILD_PLUGIN_GREYHOUND=ON \
142      -DBUILD_PLUGIN_HEXBIN=ON \
143      -DHEXER_INCLUDE_DIR=/usr/include/ \
144      -DBUILD_PLUGIN_NITF=OFF \
145      -DBUILD_PLUGIN_ICEBRIDGE=ON \
146      -DBUILD_PLUGIN_PGPOINTCLOUD=ON \
147      -DBUILD_PGPOINTCLOUD_TESTS=OFF \
148      -DBUILD_PLUGIN_SQLITE=ON \
149      -DWITH_LASZIP=ON \
150      -DWITH_LAZPERF=ON \
151      -DWITH_TESTS=ON && \
152    make -j $NUMTHREADS && \
153    make install
154
155# copy grass gis source
156WORKDIR /src
157COPY . /src/grass_build/
158WORKDIR /src/grass_build
159
160# Set environmental variables for GRASS GIS compilation, without debug symbols
161# Set gcc/g++ environmental variables for GRASS GIS compilation, without debug symbols
162ENV MYCFLAGS "-O2 -std=gnu99 -m64"
163ENV MYLDFLAGS "-s"
164# CXX stuff:
165ENV LD_LIBRARY_PATH "/usr/local/lib"
166ENV LDFLAGS "$MYLDFLAGS"
167ENV CFLAGS "$MYCFLAGS"
168ENV CXXFLAGS "$MYCXXFLAGS"
169
170# Configure compile and install GRASS GIS
171ENV GRASS_PYTHON=/usr/bin/python3
172ENV NUMTHREADS=4
173RUN make distclean || echo "nothing to clean"
174RUN /src/grass_build/configure \
175  --with-cxx \
176  --enable-largefile \
177  --with-proj-share=/usr/share/proj \
178  --with-gdal=/usr/bin/gdal-config \
179  --with-geos \
180  --with-sqlite \
181  --with-cairo --with-cairo-ldflags=-lfontconfig \
182  --with-freetype --with-freetype-includes="/usr/include/freetype2/" \
183  --with-fftw \
184  --with-postgres --with-postgres-includes="/usr/include/postgresql" \
185  --with-netcdf \
186  --with-zstd \
187  --with-bzlib \
188  --with-pdal \
189  --without-mysql \
190  --without-odbc \
191  --without-openmp \
192  --without-opengl \
193    && make -j $NUMTHREADS \
194    && make install && ldconfig
195
196# Unset environmental variables to avoid later compilation issues
197ENV INTEL ""
198ENV MYCFLAGS ""
199ENV MYLDFLAGS ""
200ENV MYCXXFLAGS ""
201ENV LD_LIBRARY_PATH ""
202ENV LDFLAGS ""
203ENV CFLAGS ""
204ENV CXXFLAGS ""
205
206# set SHELL var to avoid /bin/sh fallback in interactive GRASS GIS sessions
207ENV SHELL /bin/bash
208ENV LC_ALL "en_US.UTF-8"
209ENV GRASS_SKIP_MAPSET_OWNER_CHECK 1
210
211# Create generic GRASS GIS binary name regardless of version number
212RUN ln -sf `find /usr/local/bin -name "grass??" | sort | tail -n 1` /usr/local/bin/grass
213# Create generic GRASS GIS lib name regardless of version number
214RUN ln -sf `grass --config path` /usr/local/grass
215
216# show GRASS GIS, PROJ, GDAL etc versions
217RUN grass --tmp-location EPSG:4326 --exec g.version -rge && \
218    pdal --version && \
219    python3 --version
220
221# Reduce the image size
222RUN apt-get autoremove -y
223RUN apt-get clean -y
224RUN rm -r /src/grass_build/.git
225
226WORKDIR /scripts
227
228# install external GRASS GIS session Python API
229RUN pip3 install grass-session
230
231# install GRASS GIS extensions
232RUN grass --tmp-location EPSG:4326 --exec g.extension extension=r.in.pdal
233
234# add GRASS GIS envs for python usage
235ENV GISBASE "/usr/local/grass/"
236ENV GRASSBIN "/usr/local/bin/grass"
237ENV PYTHONPATH "${PYTHONPATH}:$GISBASE/etc/python/"
238ENV LD_LIBRARY_PATH "$LD_LIBRARY_PATH:$GISBASE/lib"
239
240WORKDIR /tmp
241COPY docker/testdata/simple.laz .
242WORKDIR /scripts
243COPY docker/testdata/test_grass_session.py .
244## just scan the LAZ file
245RUN /usr/bin/python3 /scripts/test_grass_session.py
246
247WORKDIR /grassdb
248VOLUME /grassdb
249