使用 PDAL 从 postgresql pgPointcloud 数据库中读取点云数据

问题描述 投票:0回答:1

我想从 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 容器内时才会收到此错误消息。

c++ docker postgis pdal pgpointcloud
1个回答
0
投票

感谢 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"
    }
]
© www.soinside.com 2019 - 2024. All rights reserved.