我想从 postgres 数据库读取点云数据。
这是我的代码
Dockerfile
FROM ubuntu:latest
ENV TZ=UTC
ENV DEBIAN_FRONTEND=nointeractive
RUN apt-get update && apt-get install -y python3 python3-pip wget
RUN apt-get install libpcl-dev cmake libgtest-dev -y
RUN apt-get install build-essential
RUN pip config set global.trusted-host "pypi.org files.pythonhosted.org pypi.python.org"
RUN wget -P /tmp https://repo.anaconda.com/miniconda/Miniconda3-py310_23.1.0-1-Linux-x86_64.sh --no-check-certificate
RUN bash /tmp/Miniconda3-py310_23.1.0-1-Linux-x86_64.sh -b -p /home/spacesium/miniconda
ENV PATH="/home/spacesium/miniconda/bin:$PATH"
RUN conda config --set ssl_verify false
RUN conda install -c conda-forge pdal python-pdal gdal
WORKDIR /app
docker-compose.yml
services:
edge:
build: .
command: sh -c "pdal pipeline /app/pipeline.json"
volumes:
- .:/app
管道.json
[
{
"type":"readers.pgpointcloud",
"connection":"dbname='dbname' user='username' password='password' host='localhost' port=5432",
"table":"patches",
"column":"pa",
"where":"id=1"
},
{
"type":"writers.text",
"filename":"outputfile.txt"
}
]
当我使用
docker compose up
运行它时
我收到错误消息
PDAL: connection to server at "localhost" (127.0.0.1), port 5432 failed: Connection refused
Is the server running on that host and accepting TCP/IP connections?
connection to server at "localhost" (::1), port 5432 failed: Cannot assign requested address
Is the server running on that host and accepting TCP/IP connections?
有趣的是,当我在本地开发 PC 上(即:不在 docker 容器内)从 conda 环境运行 pdal 命令时,该命令运行良好。
即:
pdal pipeline pipeline.json
更新:
构建当前容器并为其添加标签
docker build . -t das-edge:latest
然后我将其添加到托管数据库的 docker compose 脚本中:
edge:
image: das-edge:latest
command: sh -c "pdal pipeline /app/pipeline.json"
depends_on:
- db
links:
- "db:hdasdb"
networks:
- "app-network"
volumes:
- .:/app
我收到此错误消息:
2023-12-11 03:53:15.148 UTC [33] LOG: Pointcloud (1.2.5) module loaded
2023-12-11 03:53:15.148 UTC [33] STATEMENT: SELECT PC_Typmod_Pcid(a.atttypmod) AS pcid FROM pg_class c, pg_attribute a WHERE c.relname = 'patches' AND a.attname = 'pa' AND a.attrelid = c.oid
(pdal pipeline readers.pgpointcloud Error) GDAL failure (1) PROJ: proj_create_from_database: Open of /home/spacesium/miniconda/share/proj failed
PDAL: Could not import coordinate system 'EPSG:32756': PROJ: proj_create_from_database: Open of /home/spacesium/miniconda/share/proj failed.
这似乎与此相关: 错误信息源代码
奇怪的是,我只有在 docker 容器内时才会收到此错误消息。
感谢 DavidMaze 给我指出第一个问题
错误消息提到了
proj_create_from_database
,PDAL 库中的许多 tickets 中都提到了。
通读这些问题,似乎表明 PDAL 库可能仍未正确安装在 docker 容器中。
我使用了以下 docker 文件:
FROM condaforge/mambaforge:latest as build
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
RUN conda config --set ssl_verify false
RUN pip config set global.trusted-host "pypi.org files.pythonhosted.org pypi.python.org"
RUN conda create -n pdal -y
ARG GITHUB_SHA
ARG GITHUB_REPOSITORY="PDAL/PDAL"
ARG GITHUB_SERVER_URL="https://github.com"
SHELL ["conda", "run", "-n", "pdal", "/bin/bash", "-c"]
RUN git config --global http.sslVerify false
RUN mamba install -c conda-forge git compilers conda-pack cmake make ninja sysroot_linux-64=2.17 && \
mamba install --yes -c conda-forge pdal --only-deps
RUN git clone "${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}" pdal && \
cd pdal ; \
git checkout ${GITHUB_SHA}
RUN mkdir -p pdal/build && \
cd pdal/build && \
CXXFLAGS="-Werror=strict-aliasing" LDFLAGS="-Wl,-rpath-link,$CONDA_PREFIX/lib" cmake -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_LIBRARY_PATH:FILEPATH="$CONDA_PREFIX/lib" \
-DCMAKE_INCLUDE_PATH:FILEPATH="$CONDA_PREFIX/include" \
-DCMAKE_INSTALL_PREFIX="$CONDA_PREFIX" \
-DBUILD_PLUGIN_CPD=OFF \
-DBUILD_PLUGIN_PGPOINTCLOUD=ON \
-DBUILD_PLUGIN_NITF=ON \
-DBUILD_PLUGIN_ICEBRIDGE=ON \
-DBUILD_PLUGIN_HDF=ON \
-DBUILD_PLUGIN_TILEDB=ON \
-DBUILD_PLUGIN_E57=ON \
-DBUILD_PGPOINTCLOUD_TESTS=OFF \
-DWITH_ZSTD=ON \
..
RUN cd pdal/build && \
ninja
#RUN cd pdal/build && \
# ctest -V
RUN cd pdal/build && \
ninja install
RUN conda-pack -n pdal --dest-prefix=/opt/conda/envs/pdal -o /tmp/env.tar && \
mkdir /venv && cd /venv && tar xf /tmp/env.tar && \
rm /tmp/env.tar
FROM condaforge/miniforge3
ENV CONDAENV "/opt/conda/envs/pdal"
COPY --from=build /venv "/opt/conda/envs/pdal"
ENV PROJ_NETWORK=TRUE
ENV PROJ_DATA="${CONDAENV}/share/proj"
ENV GDAL_DATA="${CONDAENV}/share/gdal"
ENV GEOTIFF_CSV="${CONDAENV}/share/epsg_csv"
ENV GDAL_DRIVER_PATH="${CONDAENV}/lib/gdalplugins"
ENV PATH $PATH:${CONDAENV}/bin
ENV GTIFF_REPORT_COMPD_CS=TRUE
ENV REPORT_COMPD_CS=TRUE
ENV OAMS_TRADITIONAL_GIS_ORDER=TRUE
SHELL ["conda", "run", "--no-capture-output", "-n", "pdal", "/bin/sh", "-c"]
这主要来自 PDAL Docker 脚本
构建并标记该图像:
docker build . -t das-edge:latest
Docker 撰写:
edge:
image: das-edge:latest
command: sh -c "pdal pipeline /app/pipeline.json"
depends_on:
- db
links:
- "db:hdasdb"
networks:
- "app-network"
volumes:
- .:/app
管道.json
[
{
"type":"readers.pgpointcloud",
"connection":"dbname='dbname' user='username' password='password' host='localhost' port=5432",
"table":"patches",
"column":"pa",
"where":"id=1"
},
{
"type":"writers.text",
"filename":"outputfile.txt"
}
]