├── .github └── workflows │ └── ci.yml ├── .gitignore ├── CHANGES.md ├── LICENSE ├── README.md ├── archived_layers.json ├── dockerfiles ├── Dockerfile └── runtimes │ ├── nodejs │ └── python ├── layer.json ├── scripts ├── build.sh ├── create-layer.sh ├── deploy.py └── list.py └── tests ├── fixtures ├── MSK_CLOUDS_B00.gfs ├── MSK_CLOUDS_B00.gml ├── POLYGON.dbf ├── POLYGON.prj ├── POLYGON.shp ├── POLYGON.shx ├── cog.tif ├── cog_jpeg.tif ├── cog_lerc.tif ├── cog_webp.tif ├── cog_zstd.tif ├── map.geojson └── square.dxf └── tests.sh /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | paths: 6 | - 'dockerfiles/**' 7 | - 'scripts/deploy.py' 8 | - 'scripts/create-layer.sh' 9 | - 'tests/*' 10 | - '.github/workflows/ci.yml' 11 | branches: 12 | - master 13 | tags: 14 | - '*' 15 | pull_request: 16 | 17 | env: 18 | GDAL_VERSION: 3.8.3 19 | GDAL_VERSION_TAG: 3.8 20 | 21 | jobs: 22 | build: 23 | runs-on: ubuntu-latest 24 | if: "!contains(github.event.head_commit.message, '[skip ci]')" 25 | steps: 26 | - uses: actions/checkout@v4 27 | 28 | - name: Set up Python 29 | uses: actions/setup-python@v5 30 | with: 31 | python-version: '3.13' 32 | 33 | - name: Install dependencies 34 | run: | 35 | python -m pip install --upgrade pip 36 | python -m pip install boto3 click 37 | 38 | - name: Set up Docker Buildx 39 | uses: docker/setup-buildx-action@v3 40 | 41 | - name: Login to Github 42 | uses: docker/login-action@v3 43 | with: 44 | registry: ghcr.io 45 | username: ${{ github.repository_owner }} 46 | password: ${{ secrets.GITHUB_TOKEN }} 47 | 48 | - name: Build 49 | uses: docker/build-push-action@v6 50 | with: 51 | platforms: linux/amd64 52 | context: . 53 | load: true 54 | file: dockerfiles/Dockerfile 55 | build-args: | 56 | GDAL_VERSION=${{ env.GDAL_VERSION }} 57 | tags: ghcr.io/${{ github.repository_owner }}/lambda-gdal:${{ env.GDAL_VERSION_TAG }} 58 | cache-from: type=gha 59 | cache-to: type=gha,mode=max 60 | 61 | - name: Test 62 | run: | 63 | docker run \ 64 | --platform=linux/amd64 \ 65 | --entrypoint bash \ 66 | -v ${{ github.workspace }}:/local \ 67 | --rm ghcr.io/${{ github.repository_owner }}/lambda-gdal:${{ env.GDAL_VERSION_TAG }} \ 68 | /local/tests/tests.sh 69 | 70 | deploy: 71 | needs: [build] 72 | runs-on: ubuntu-latest 73 | if: contains(github.ref, 'tags') && github.event_name == 'push' 74 | steps: 75 | - uses: actions/checkout@v4 76 | 77 | - name: Set up Python 78 | uses: actions/setup-python@v5 79 | with: 80 | python-version: '3.13' 81 | 82 | - name: Set up Docker Buildx 83 | uses: docker/setup-buildx-action@v3 84 | 85 | - name: Login to Github 86 | uses: docker/login-action@v3 87 | with: 88 | registry: ghcr.io 89 | username: ${{ github.repository_owner }} 90 | password: ${{ secrets.GITHUB_TOKEN }} 91 | 92 | - name: Configure AWS Credentials 93 | uses: aws-actions/configure-aws-credentials@v4 94 | with: 95 | aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} 96 | aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} 97 | aws-region: us-east-1 98 | 99 | - name: Publish docker image 100 | uses: docker/build-push-action@v6 101 | with: 102 | platforms: linux/amd64 103 | context: . 104 | file: dockerfiles/Dockerfile 105 | build-args: | 106 | GDAL_VERSION=${{ env.GDAL_VERSION }} 107 | push: true 108 | cache-from: type=gha 109 | tags: ghcr.io/${{ github.repository_owner }}/lambda-gdal:${{ env.GDAL_VERSION_TAG }} 110 | 111 | - name: Build and Deploy layers 112 | run: | 113 | python -m pip install boto3 click 114 | docker run \ 115 | --platform=linux/amd64 \ 116 | --entrypoint bash \ 117 | -v ${{ github.workspace }}:/local \ 118 | --rm ghcr.io/${{ github.repository_owner }}/lambda-gdal:${{ env.GDAL_VERSION_TAG }} \ 119 | /local/scripts/create-layer.sh 120 | python scripts/deploy.py ${{ env.GDAL_VERSION_TAG }} --deploy 121 | 122 | - name: Build Runtime and Push Python <=3.11 with yum 123 | run: | 124 | runtimes='3.9 3.10 3.11' 125 | for runtime in ${runtimes}; do 126 | docker build \ 127 | --platform=linux/amd64 \ 128 | --build-arg GDAL_VERSION_TAG=${{ env.GDAL_VERSION_TAG }} \ 129 | --build-arg RUNTIME_VERSION=${runtime} \ 130 | --build-arg NUMPY_VERSION=1.25 \ 131 | --build-arg PKG_INSTALLER=yum \ 132 | -f dockerfiles/runtimes/python \ 133 | -t ghcr.io/${{ github.repository_owner }}/lambda-gdal:${{ env.GDAL_VERSION_TAG }}-python${runtime} . 134 | docker push ghcr.io/${{ github.repository_owner }}/lambda-gdal:${{ env.GDAL_VERSION_TAG }}-python${runtime} 135 | done 136 | 137 | - name: Build Runtime and Push Python >= 3.12 with dnf 138 | run: | 139 | runtimes='3.12 3.13' 140 | for runtime in ${runtimes}; do 141 | docker build \ 142 | --platform=linux/amd64 \ 143 | --build-arg GDAL_VERSION_TAG=${{ env.GDAL_VERSION_TAG }} \ 144 | --build-arg RUNTIME_VERSION=${runtime} \ 145 | --build-arg NUMPY_VERSION=1.26 \ 146 | --build-arg PKG_INSTALLER=dnf \ 147 | -f dockerfiles/runtimes/python \ 148 | -t ghcr.io/${{ github.repository_owner }}/lambda-gdal:${{ env.GDAL_VERSION_TAG }}-python${runtime} . 149 | docker push ghcr.io/${{ github.repository_owner }}/lambda-gdal:${{ env.GDAL_VERSION_TAG }}-python${runtime} 150 | done 151 | 152 | update-layer: 153 | needs: [deploy] 154 | runs-on: ubuntu-latest 155 | steps: 156 | - uses: actions/checkout@v4 157 | 158 | - name: Set up Python 159 | uses: actions/setup-python@v5 160 | with: 161 | python-version: '3.10' 162 | 163 | - uses: actions/setup-node@v4 164 | 165 | - name: Configure AWS Credentials 166 | uses: aws-actions/configure-aws-credentials@v4 167 | with: 168 | aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} 169 | aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} 170 | aws-region: us-east-1 171 | 172 | - name: List layers 173 | run: | 174 | python -m pip install boto3 175 | python scripts/list.py | jq > layer.json 176 | 177 | - name: Update resources 178 | uses: test-room-7/action-update-file@v2.0.0 179 | with: 180 | file-path: layer.json 181 | commit-msg: Update layer [skip ci] 182 | github-token: ${{ secrets.GITHUB_TOKEN }} 183 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.zip 2 | __pycache__/ 3 | -------------------------------------------------------------------------------- /CHANGES.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## Unreleased 4 | 5 | - Add support for Python 3.12 and 3.13 6 | - Update deploy.py script compatible runtimes list to currently-available runtimes 7 | 8 | ## 2024-02-02.patch1 9 | 10 | - no change (fixing CI) 11 | 12 | ## 2024-02-02 13 | 14 | - update versions (author @philvarner, https://github.com/lambgeo/docker-lambda/pull/76): 15 | - GDAL: 3.8.3 16 | - GEOS: 3.12.1 17 | - PROJ: 9.3.1 18 | 19 | - fix `libsqlite3` lib links (author @jasongi, https://github.com/lambgeo/docker-lambda/pull/75) 20 | 21 | ## 2023-12-20 22 | 23 | - update to GDAL 3.8.2 24 | 25 | ## 2023-11-28 26 | 27 | - add `yum update` and `yum clean all` to base image (author @philvarner, https://github.com/lambgeo/docker-lambda/pull/64) 28 | - update to GDAL 3.8.0 (author @philvarner, https://github.com/lambgeo/docker-lambda/pull/65) 29 | 30 | ## 2023-10-23 31 | 32 | - update Python 3.11 base image (author @philvarner, https://github.com/lambgeo/docker-lambda/pull/60) 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 LambGeo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |

5 | docker-lambda 6 |

7 |

8 | Amazonlinux Docker images and AWS Lambda layers with GDAL. 9 |

10 |

11 | 12 | Test 13 | 14 |

15 | 16 | 17 | # Docker Images 18 | 19 | Based on `public.ecr.aws/lambda/provided:al2` (AmazonLinux 2) 20 | 21 | - GDAL 3.8.3 22 | - **ghcr.io/lambgeo/lambda-gdal:3.8** (Fev 2024) 23 | 24 | Runtimes images: 25 | 26 | - Python (based on `public.ecr.aws/lambda/python:{version}`) 27 | - **ghcr.io/lambgeo/lambda-gdal:3.8-python3.9** 28 | - **ghcr.io/lambgeo/lambda-gdal:3.8-python3.10** 29 | - **ghcr.io/lambgeo/lambda-gdal:3.8-python3.11** 30 | 31 | **archived** 32 | - **ghcr.io/lambgeo/lambda-gdal:3.6** 33 | - **ghcr.io/lambgeo/lambda-gdal:3.6-python3.9** 34 | - **ghcr.io/lambgeo/lambda-gdal:3.6-python3.10** 35 | - **ghcr.io/lambgeo/lambda-gdal:3.6-python3.11** 36 | 37 | see: 38 | 39 | ### Creating Lambda packages 40 | 41 | ### Using 42 | 43 | #### 1. Create Dockerfile 44 | 45 | ```Dockerfile 46 | FROM ghcr.io/lambgeo/lambda-gdal:3.8 AS gdal 47 | 48 | # We use the official AWS Lambda image 49 | FROM public.ecr.aws/lambda/{RUNTIME: python|node|go...}:{RUNTIME version} 50 | 51 | ENV PACKAGE_PREFIX=/var/task 52 | 53 | # Bring C libs from lambgeo/lambda-gdal image 54 | COPY --from=gdal /opt/lib/ ${PACKAGE_PREFIX}/lib/ 55 | COPY --from=gdal /opt/include/ ${PACKAGE_PREFIX}/include/ 56 | COPY --from=gdal /opt/share/ ${PACKAGE_PREFIX}/share/ 57 | COPY --from=gdal /opt/bin/ ${PACKAGE_PREFIX}/bin/ 58 | 59 | ENV \ 60 | GDAL_DATA=${PACKAGE_PREFIX}/share/gdal \ 61 | PROJ_LIB=${PACKAGE_PREFIX}/share/proj \ 62 | GDAL_CONFIG=${PACKAGE_PREFIX}/bin/gdal-config \ 63 | GEOS_CONFIG=${PACKAGE_PREFIX}/bin/geos-config \ 64 | PATH=${PACKAGE_PREFIX}/bin:$PATH 65 | 66 | # Copy local files or install modules 67 | 68 | # Create package.zip (we zip the whole content of $PACKAGE_PREFIX because we moved the gdal libs over) 69 | RUN cd $PACKAGE_PREFIX && zip -r9q /tmp/package.zip * 70 | ``` 71 | 72 | If you are working with **python3.9|3.10|3.11|3.12|3.13**, you can use lambgeo pre-build docker images: 73 | 74 | ```Dockerfile 75 | FROM ghcr.io/lambgeo/lambda-gdal:3.8-python3.10 76 | 77 | ENV PACKAGE_PREFIX=/var/task 78 | 79 | # Copy any local files to the package 80 | COPY handler.py ${PACKAGE_PREFIX}/handler.py 81 | 82 | # Install some requirements to `/var/task` (using `-t` otpion) 83 | RUN pip install numpy rasterio mercantile --no-binary :all: -t ${PACKAGE_PREFIX}/ 84 | 85 | # Reduce size of the C libs 86 | RUN cd $PREFIX && find lib -name \*.so\* -exec strip {} \; 87 | 88 | # Create package.zip 89 | # Archive python code (installed in $PACKAGE_PREFIX/) 90 | RUN cd $PACKAGE_PREFIX && zip -r9q /tmp/package.zip * 91 | 92 | # Archive GDAL libs (in $PREFIX/lib $PREFIX/bin $PREFIX/share) 93 | RUN cd $PREFIX && zip -r9q --symlinks /tmp/package.zip lib/*.so* share 94 | RUN cd $PREFIX && zip -r9q --symlinks /tmp/package.zip bin/gdal* bin/ogr* bin/geos* bin/nearblack 95 | ``` 96 | 97 | #### 2. Build and create package.zip 98 | 99 | ```bash 100 | docker build --tag package:latest . 101 | docker run --name lambda -w /var/task --volume $(shell pwd)/:/local -itd package:latest bash 102 | docker cp lambda:/tmp/package.zip package.zip 103 | docker stop lambda 104 | docker rm lambda 105 | ``` 106 | 107 | Package content should be like: 108 | 109 | ```text 110 | package.zip 111 | | 112 | |___ bin/ # GDAL binaries 113 | |___ lib/ # Shared libraries (GDAL, PROJ, GEOS...) 114 | |___ share/ # GDAL/PROJ data directories 115 | |___ rasterio/ 116 | .... 117 | |___ handler.py 118 | |___ other python module 119 | ``` 120 | 121 | #### 3. Deploy and Set Environment variables 122 | 123 | Libraries might need to be aware of GDAL/PROJ C libraries so you **HAVE TO** to set up those 2 envs: 124 | 125 | - **GDAL_DATA:** /var/task/share/gdal 126 | - **PROJ_LIB:** /var/task/share/proj 127 | 128 | Other variables: 129 | 130 | Starting with gdal3.1 (PROJ 7.1), you can set `PROJ_NETWORK=ON` to use [remote grids](https://proj.org/usage/network.html). 131 | 132 | 133 | # AWS Lambda Layers 134 | 135 | | gdal | amazonlinux version | size (Mb) | unzipped size (Mb) | arn | 136 | | ---- | ------------------- | --------- | ------------------ | ----------------------------------------------------------- | 137 | | 3.8 | 4 | TBD | TBD | arn:aws:lambda:{REGION}:524387336408:layer:gdal38:{VERSION} | 138 | 139 | see [/layer.json](/layer.json) for the list of arns 140 | 141 | ### Find the arn version 142 | 143 | ```bash 144 | cat layer.json| jq '.[] | select(.region == "us-west-2")' 145 | { 146 | "region": "us-west-2", 147 | "layers": [ 148 | { 149 | "name": "gdal36", 150 | "arn": "arn:aws:lambda:us-west-2:524387336408:layer:gdal38:2", 151 | "version": 2 152 | } 153 | ] 154 | } 155 | ``` 156 | 157 | ### archived layers 158 | 159 | | gdal | amazonlinux version | size (Mb) | unzipped size (Mb) | arn | 160 | | ---- | ------------------- | --------- | ------------------ | --------------------------------------------------------------- | 161 | | 3.6 | 2 | 26.8 | 76.1 | arn:aws:lambda:{REGION}:524387336408:layer:gdal36:{VERSION} | 162 | | 3.5 | 2 | 30.5 | 73.4 | arn:aws:lambda:{REGION}:524387336408:layer:gdal35:{VERSION} | 163 | | 3.3 | 2 | 27.7 | 67.3 | arn:aws:lambda:{REGION}:524387336408:layer:gdal33-al2:{VERSION} | 164 | | 3.2 | 2 | 26.7 | 64.6 | arn:aws:lambda:{REGION}:524387336408:layer:gdal32-al2:{VERSION} | 165 | | 3.1 | 2 | 25.8 | 61 | arn:aws:lambda:{REGION}:524387336408:layer:gdal31-al2:{VERSION} | 166 | | 2.4 | 2 | 19.5 | 63.6 | arn:aws:lambda:{REGION}:524387336408:layer:gdal24-al2:{VERSION} | 167 | 168 | see [/archived_layer.json](/archived_layer.json) for the list of arns 169 | 170 | **Layer content:** 171 | 172 | ```text 173 | layer.zip 174 | | 175 | |___ bin/ # Binaries 176 | |___ lib/ # Shared libraries (GDAL, PROJ, GEOS...) 177 | |___ share/ # GDAL/PROJ data directories 178 | ``` 179 | 180 | At Lambda runtime, the layer content will be unzipped in the `/opt` directory. To be able to use the C libraries you **HAVE TO** make sure to set 2 important environment variables: 181 | 182 | - **GDAL_DATA:** /opt/share/gdal 183 | - **PROJ_LIB:** /opt/share/proj 184 | 185 | ### How To Use (Create a Lambda Package) 186 | 187 | There are 2 ways to use the layers: 188 | 189 | #### 1. Simple (No dependencies) 190 | 191 | If you don't need to add more runtime dependencies, you can just create a lambda package (zip file) with your lambda handler. 192 | 193 | Note: This is unlikely, except if you are using GDAL bin (e.g `gdal_translate`) from a python script. 194 | 195 | ```bash 196 | zip -r9q package.zip handler.py 197 | ``` 198 | 199 | **Content:** 200 | 201 | ```text 202 | package.zip 203 | |___ handler.py # aws lambda python handler 204 | ``` 205 | 206 | **AWS Lambda Config:** 207 | 208 | - arn: `arn:aws:lambda:us-east-1:524387336408:layer:gdal38:1` (example) 209 | - env: 210 | - **GDAL_DATA:** /opt/share/gdal 211 | - **PROJ_LIB:** /opt/share/proj 212 | - lambda handler: `handler.handler` 213 | 214 | #### 2. Advanced (need other dependencies) 215 | 216 | If your lambda handler needs more dependencies you'll have to use the exact same environment to create the package. 217 | 218 | ##### Create a Dockerfile 219 | 220 | ```dockerfile 221 | FROM ghcr.io/lambgeo/lambda-gdal:3.8 AS gdal 222 | 223 | # This example assume that you are creating a lambda package for python 3.10 224 | FROM public.ecr.aws/lambda/python:3.10 225 | 226 | # Bring C libs from lambgeo/lambda-gdal image 227 | COPY --from=gdal /opt/lib/ /opt/lib/ 228 | COPY --from=gdal /opt/include/ /opt/include/ 229 | COPY --from=gdal /opt/share/ /opt/share/ 230 | COPY --from=gdal /opt/bin/ /opt/bin/ 231 | 232 | ENV \ 233 | GDAL_DATA=/opt/share/gdal \ 234 | PROJ_LIB=/opt/share/proj \ 235 | GDAL_CONFIG=/opt/bin/gdal-config \ 236 | GEOS_CONFIG=/opt/bin/geos-config \ 237 | PATH=/opt/bin:$PATH 238 | 239 | ENV PACKAGE_PREFIX=/var/task 240 | 241 | # Copy local files 242 | COPY handler.py ${PACKAGE_PREFIX}/handler.py 243 | 244 | # install package 245 | # This example shows how to install GDAL python bindings for gdal 3.6 246 | # The GDAL version should be the same as the one provided by the `lambgeo/lambda-gdal` image 247 | RUN python -m pip install GDAL==$(gdal-config --version) -t $PACKAGE_PREFIX 248 | 249 | # Create package.zip 250 | RUN cd $PACKAGE_PREFIX && zip -r9q /tmp/package.zip * 251 | ``` 252 | 253 | - create package 254 | 255 | ```bash 256 | docker build --tag package:latest . 257 | docker run --name lambda -w /var/task -itd package:latest bash 258 | docker cp lambda:/tmp/package.zip package.zip 259 | docker stop lambda 260 | docker rm lambda 261 | ``` 262 | 263 | **Content:** 264 | 265 | ```text 266 | package.zip 267 | |___ handler.py # aws lambda python handler 268 | |___ module1/ # dependencies 269 | |___ module2/ 270 | |___ module3/ 271 | |___ ... 272 | ``` 273 | 274 | **AWS Lambda Config:** 275 | 276 | - arn: `arn:aws:lambda:us-east-1:524387336408:layer:gdal38:1` (example) 277 | - env: 278 | - **GDAL_DATA:** /opt/share/gdal 279 | - **PROJ_LIB:** /opt/share/proj 280 | - lambda handler: `handler.handler` 281 | -------------------------------------------------------------------------------- /archived_layers.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "region": "ap-northeast-1", 4 | "layers": [ 5 | { 6 | "name": "gdal24", 7 | "arn": "arn:aws:lambda:ap-northeast-1:524387336408:layer:gdal24:4", 8 | "version": 4 9 | }, 10 | { 11 | "name": "gdal31", 12 | "arn": "arn:aws:lambda:ap-northeast-1:524387336408:layer:gdal31:4", 13 | "version": 4 14 | }, 15 | { 16 | "name": "gdal32", 17 | "arn": "arn:aws:lambda:ap-northeast-1:524387336408:layer:gdal32:4", 18 | "version": 4 19 | }, 20 | { 21 | "name": "gdal24-al2", 22 | "arn": "arn:aws:lambda:ap-northeast-1:524387336408:layer:gdal24-al2:3", 23 | "version": 3 24 | }, 25 | { 26 | "name": "gdal31-al2", 27 | "arn": "arn:aws:lambda:ap-northeast-1:524387336408:layer:gdal31-al2:3", 28 | "version": 3 29 | }, 30 | { 31 | "name": "gdal32-al2", 32 | "arn": "arn:aws:lambda:ap-northeast-1:524387336408:layer:gdal32-al2:6", 33 | "version": 6 34 | }, 35 | { 36 | "name": "gdal33-al2", 37 | "arn": "arn:aws:lambda:ap-northeast-1:524387336408:layer:gdal33-al2:2", 38 | "version": 2 39 | }, 40 | { 41 | "name": "gdal35", 42 | "arn": "arn:aws:lambda:ap-northeast-1:524387336408:layer:gdal35:3", 43 | "version": 3 44 | }, 45 | { 46 | "name": "gdal36", 47 | "arn": "arn:aws:lambda:ap-northeast-1:524387336408:layer:gdal36:2", 48 | "version": 2 49 | } 50 | ] 51 | }, 52 | { 53 | "region": "ap-northeast-2", 54 | "layers": [ 55 | { 56 | "name": "gdal24", 57 | "arn": "arn:aws:lambda:ap-northeast-2:524387336408:layer:gdal24:4", 58 | "version": 4 59 | }, 60 | { 61 | "name": "gdal31", 62 | "arn": "arn:aws:lambda:ap-northeast-2:524387336408:layer:gdal31:4", 63 | "version": 4 64 | }, 65 | { 66 | "name": "gdal32", 67 | "arn": "arn:aws:lambda:ap-northeast-2:524387336408:layer:gdal32:4", 68 | "version": 4 69 | }, 70 | { 71 | "name": "gdal24-al2", 72 | "arn": "arn:aws:lambda:ap-northeast-2:524387336408:layer:gdal24-al2:3", 73 | "version": 3 74 | }, 75 | { 76 | "name": "gdal31-al2", 77 | "arn": "arn:aws:lambda:ap-northeast-2:524387336408:layer:gdal31-al2:3", 78 | "version": 3 79 | }, 80 | { 81 | "name": "gdal32-al2", 82 | "arn": "arn:aws:lambda:ap-northeast-2:524387336408:layer:gdal32-al2:6", 83 | "version": 6 84 | }, 85 | { 86 | "name": "gdal33-al2", 87 | "arn": "arn:aws:lambda:ap-northeast-2:524387336408:layer:gdal33-al2:2", 88 | "version": 2 89 | }, 90 | { 91 | "name": "gdal35", 92 | "arn": "arn:aws:lambda:ap-northeast-2:524387336408:layer:gdal35:3", 93 | "version": 3 94 | }, 95 | { 96 | "name": "gdal36", 97 | "arn": "arn:aws:lambda:ap-northeast-2:524387336408:layer:gdal36:2", 98 | "version": 2 99 | } 100 | ] 101 | }, 102 | { 103 | "region": "ap-south-1", 104 | "layers": [ 105 | { 106 | "name": "gdal24", 107 | "arn": "arn:aws:lambda:ap-south-1:524387336408:layer:gdal24:4", 108 | "version": 4 109 | }, 110 | { 111 | "name": "gdal31", 112 | "arn": "arn:aws:lambda:ap-south-1:524387336408:layer:gdal31:4", 113 | "version": 4 114 | }, 115 | { 116 | "name": "gdal32", 117 | "arn": "arn:aws:lambda:ap-south-1:524387336408:layer:gdal32:4", 118 | "version": 4 119 | }, 120 | { 121 | "name": "gdal24-al2", 122 | "arn": "arn:aws:lambda:ap-south-1:524387336408:layer:gdal24-al2:3", 123 | "version": 3 124 | }, 125 | { 126 | "name": "gdal31-al2", 127 | "arn": "arn:aws:lambda:ap-south-1:524387336408:layer:gdal31-al2:3", 128 | "version": 3 129 | }, 130 | { 131 | "name": "gdal32-al2", 132 | "arn": "arn:aws:lambda:ap-south-1:524387336408:layer:gdal32-al2:6", 133 | "version": 6 134 | }, 135 | { 136 | "name": "gdal33-al2", 137 | "arn": "arn:aws:lambda:ap-south-1:524387336408:layer:gdal33-al2:2", 138 | "version": 2 139 | }, 140 | { 141 | "name": "gdal35", 142 | "arn": "arn:aws:lambda:ap-south-1:524387336408:layer:gdal35:3", 143 | "version": 3 144 | }, 145 | { 146 | "name": "gdal36", 147 | "arn": "arn:aws:lambda:ap-south-1:524387336408:layer:gdal36:2", 148 | "version": 2 149 | } 150 | ] 151 | }, 152 | { 153 | "region": "ap-southeast-1", 154 | "layers": [ 155 | { 156 | "name": "gdal24", 157 | "arn": "arn:aws:lambda:ap-southeast-1:524387336408:layer:gdal24:4", 158 | "version": 4 159 | }, 160 | { 161 | "name": "gdal31", 162 | "arn": "arn:aws:lambda:ap-southeast-1:524387336408:layer:gdal31:4", 163 | "version": 4 164 | }, 165 | { 166 | "name": "gdal32", 167 | "arn": "arn:aws:lambda:ap-southeast-1:524387336408:layer:gdal32:4", 168 | "version": 4 169 | }, 170 | { 171 | "name": "gdal24-al2", 172 | "arn": "arn:aws:lambda:ap-southeast-1:524387336408:layer:gdal24-al2:3", 173 | "version": 3 174 | }, 175 | { 176 | "name": "gdal31-al2", 177 | "arn": "arn:aws:lambda:ap-southeast-1:524387336408:layer:gdal31-al2:3", 178 | "version": 3 179 | }, 180 | { 181 | "name": "gdal32-al2", 182 | "arn": "arn:aws:lambda:ap-southeast-1:524387336408:layer:gdal32-al2:6", 183 | "version": 6 184 | }, 185 | { 186 | "name": "gdal33-al2", 187 | "arn": "arn:aws:lambda:ap-southeast-1:524387336408:layer:gdal33-al2:2", 188 | "version": 2 189 | }, 190 | { 191 | "name": "gdal35", 192 | "arn": "arn:aws:lambda:ap-southeast-1:524387336408:layer:gdal35:3", 193 | "version": 3 194 | }, 195 | { 196 | "name": "gdal36", 197 | "arn": "arn:aws:lambda:ap-southeast-1:524387336408:layer:gdal36:2", 198 | "version": 2 199 | } 200 | ] 201 | }, 202 | { 203 | "region": "ap-southeast-2", 204 | "layers": [ 205 | { 206 | "name": "gdal24", 207 | "arn": "arn:aws:lambda:ap-southeast-2:524387336408:layer:gdal24:4", 208 | "version": 4 209 | }, 210 | { 211 | "name": "gdal31", 212 | "arn": "arn:aws:lambda:ap-southeast-2:524387336408:layer:gdal31:4", 213 | "version": 4 214 | }, 215 | { 216 | "name": "gdal32", 217 | "arn": "arn:aws:lambda:ap-southeast-2:524387336408:layer:gdal32:4", 218 | "version": 4 219 | }, 220 | { 221 | "name": "gdal24-al2", 222 | "arn": "arn:aws:lambda:ap-southeast-2:524387336408:layer:gdal24-al2:3", 223 | "version": 3 224 | }, 225 | { 226 | "name": "gdal31-al2", 227 | "arn": "arn:aws:lambda:ap-southeast-2:524387336408:layer:gdal31-al2:3", 228 | "version": 3 229 | }, 230 | { 231 | "name": "gdal32-al2", 232 | "arn": "arn:aws:lambda:ap-southeast-2:524387336408:layer:gdal32-al2:6", 233 | "version": 6 234 | }, 235 | { 236 | "name": "gdal33-al2", 237 | "arn": "arn:aws:lambda:ap-southeast-2:524387336408:layer:gdal33-al2:2", 238 | "version": 2 239 | }, 240 | { 241 | "name": "gdal35", 242 | "arn": "arn:aws:lambda:ap-southeast-2:524387336408:layer:gdal35:3", 243 | "version": 3 244 | }, 245 | { 246 | "name": "gdal36", 247 | "arn": "arn:aws:lambda:ap-southeast-2:524387336408:layer:gdal36:2", 248 | "version": 2 249 | } 250 | ] 251 | }, 252 | { 253 | "region": "ca-central-1", 254 | "layers": [ 255 | { 256 | "name": "gdal24", 257 | "arn": "arn:aws:lambda:ca-central-1:524387336408:layer:gdal24:4", 258 | "version": 4 259 | }, 260 | { 261 | "name": "gdal31", 262 | "arn": "arn:aws:lambda:ca-central-1:524387336408:layer:gdal31:4", 263 | "version": 4 264 | }, 265 | { 266 | "name": "gdal32", 267 | "arn": "arn:aws:lambda:ca-central-1:524387336408:layer:gdal32:4", 268 | "version": 4 269 | }, 270 | { 271 | "name": "gdal24-al2", 272 | "arn": "arn:aws:lambda:ca-central-1:524387336408:layer:gdal24-al2:3", 273 | "version": 3 274 | }, 275 | { 276 | "name": "gdal31-al2", 277 | "arn": "arn:aws:lambda:ca-central-1:524387336408:layer:gdal31-al2:3", 278 | "version": 3 279 | }, 280 | { 281 | "name": "gdal32-al2", 282 | "arn": "arn:aws:lambda:ca-central-1:524387336408:layer:gdal32-al2:6", 283 | "version": 6 284 | }, 285 | { 286 | "name": "gdal33-al2", 287 | "arn": "arn:aws:lambda:ca-central-1:524387336408:layer:gdal33-al2:2", 288 | "version": 2 289 | }, 290 | { 291 | "name": "gdal35", 292 | "arn": "arn:aws:lambda:ca-central-1:524387336408:layer:gdal35:3", 293 | "version": 3 294 | }, 295 | { 296 | "name": "gdal36", 297 | "arn": "arn:aws:lambda:ca-central-1:524387336408:layer:gdal36:2", 298 | "version": 2 299 | } 300 | ] 301 | }, 302 | { 303 | "region": "eu-central-1", 304 | "layers": [ 305 | { 306 | "name": "gdal24", 307 | "arn": "arn:aws:lambda:eu-central-1:524387336408:layer:gdal24:4", 308 | "version": 4 309 | }, 310 | { 311 | "name": "gdal31", 312 | "arn": "arn:aws:lambda:eu-central-1:524387336408:layer:gdal31:4", 313 | "version": 4 314 | }, 315 | { 316 | "name": "gdal32", 317 | "arn": "arn:aws:lambda:eu-central-1:524387336408:layer:gdal32:4", 318 | "version": 4 319 | }, 320 | { 321 | "name": "gdal24-al2", 322 | "arn": "arn:aws:lambda:eu-central-1:524387336408:layer:gdal24-al2:3", 323 | "version": 3 324 | }, 325 | { 326 | "name": "gdal31-al2", 327 | "arn": "arn:aws:lambda:eu-central-1:524387336408:layer:gdal31-al2:3", 328 | "version": 3 329 | }, 330 | { 331 | "name": "gdal32-al2", 332 | "arn": "arn:aws:lambda:eu-central-1:524387336408:layer:gdal32-al2:6", 333 | "version": 6 334 | }, 335 | { 336 | "name": "gdal33-al2", 337 | "arn": "arn:aws:lambda:eu-central-1:524387336408:layer:gdal33-al2:2", 338 | "version": 2 339 | }, 340 | { 341 | "name": "gdal35", 342 | "arn": "arn:aws:lambda:eu-central-1:524387336408:layer:gdal35:3", 343 | "version": 3 344 | }, 345 | { 346 | "name": "gdal36", 347 | "arn": "arn:aws:lambda:eu-central-1:524387336408:layer:gdal36:2", 348 | "version": 2 349 | } 350 | ] 351 | }, 352 | { 353 | "region": "eu-north-1", 354 | "layers": [ 355 | { 356 | "name": "gdal24", 357 | "arn": "arn:aws:lambda:eu-north-1:524387336408:layer:gdal24:4", 358 | "version": 4 359 | }, 360 | { 361 | "name": "gdal31", 362 | "arn": "arn:aws:lambda:eu-north-1:524387336408:layer:gdal31:4", 363 | "version": 4 364 | }, 365 | { 366 | "name": "gdal32", 367 | "arn": "arn:aws:lambda:eu-north-1:524387336408:layer:gdal32:4", 368 | "version": 4 369 | }, 370 | { 371 | "name": "gdal24-al2", 372 | "arn": "arn:aws:lambda:eu-north-1:524387336408:layer:gdal24-al2:3", 373 | "version": 3 374 | }, 375 | { 376 | "name": "gdal31-al2", 377 | "arn": "arn:aws:lambda:eu-north-1:524387336408:layer:gdal31-al2:3", 378 | "version": 3 379 | }, 380 | { 381 | "name": "gdal32-al2", 382 | "arn": "arn:aws:lambda:eu-north-1:524387336408:layer:gdal32-al2:6", 383 | "version": 6 384 | }, 385 | { 386 | "name": "gdal33-al2", 387 | "arn": "arn:aws:lambda:eu-north-1:524387336408:layer:gdal33-al2:2", 388 | "version": 2 389 | }, 390 | { 391 | "name": "gdal35", 392 | "arn": "arn:aws:lambda:eu-north-1:524387336408:layer:gdal35:3", 393 | "version": 3 394 | }, 395 | { 396 | "name": "gdal36", 397 | "arn": "arn:aws:lambda:eu-north-1:524387336408:layer:gdal36:2", 398 | "version": 2 399 | } 400 | ] 401 | }, 402 | { 403 | "region": "eu-west-1", 404 | "layers": [ 405 | { 406 | "name": "gdal24", 407 | "arn": "arn:aws:lambda:eu-west-1:524387336408:layer:gdal24:4", 408 | "version": 4 409 | }, 410 | { 411 | "name": "gdal31", 412 | "arn": "arn:aws:lambda:eu-west-1:524387336408:layer:gdal31:4", 413 | "version": 4 414 | }, 415 | { 416 | "name": "gdal32", 417 | "arn": "arn:aws:lambda:eu-west-1:524387336408:layer:gdal32:4", 418 | "version": 4 419 | }, 420 | { 421 | "name": "gdal24-al2", 422 | "arn": "arn:aws:lambda:eu-west-1:524387336408:layer:gdal24-al2:3", 423 | "version": 3 424 | }, 425 | { 426 | "name": "gdal31-al2", 427 | "arn": "arn:aws:lambda:eu-west-1:524387336408:layer:gdal31-al2:3", 428 | "version": 3 429 | }, 430 | { 431 | "name": "gdal32-al2", 432 | "arn": "arn:aws:lambda:eu-west-1:524387336408:layer:gdal32-al2:6", 433 | "version": 6 434 | }, 435 | { 436 | "name": "gdal33-al2", 437 | "arn": "arn:aws:lambda:eu-west-1:524387336408:layer:gdal33-al2:2", 438 | "version": 2 439 | }, 440 | { 441 | "name": "gdal35", 442 | "arn": "arn:aws:lambda:eu-west-1:524387336408:layer:gdal35:3", 443 | "version": 3 444 | }, 445 | { 446 | "name": "gdal36", 447 | "arn": "arn:aws:lambda:eu-west-1:524387336408:layer:gdal36:2", 448 | "version": 2 449 | } 450 | ] 451 | }, 452 | { 453 | "region": "eu-west-2", 454 | "layers": [ 455 | { 456 | "name": "gdal24", 457 | "arn": "arn:aws:lambda:eu-west-2:524387336408:layer:gdal24:4", 458 | "version": 4 459 | }, 460 | { 461 | "name": "gdal31", 462 | "arn": "arn:aws:lambda:eu-west-2:524387336408:layer:gdal31:4", 463 | "version": 4 464 | }, 465 | { 466 | "name": "gdal32", 467 | "arn": "arn:aws:lambda:eu-west-2:524387336408:layer:gdal32:4", 468 | "version": 4 469 | }, 470 | { 471 | "name": "gdal24-al2", 472 | "arn": "arn:aws:lambda:eu-west-2:524387336408:layer:gdal24-al2:3", 473 | "version": 3 474 | }, 475 | { 476 | "name": "gdal31-al2", 477 | "arn": "arn:aws:lambda:eu-west-2:524387336408:layer:gdal31-al2:3", 478 | "version": 3 479 | }, 480 | { 481 | "name": "gdal32-al2", 482 | "arn": "arn:aws:lambda:eu-west-2:524387336408:layer:gdal32-al2:6", 483 | "version": 6 484 | }, 485 | { 486 | "name": "gdal33-al2", 487 | "arn": "arn:aws:lambda:eu-west-2:524387336408:layer:gdal33-al2:2", 488 | "version": 2 489 | }, 490 | { 491 | "name": "gdal35", 492 | "arn": "arn:aws:lambda:eu-west-2:524387336408:layer:gdal35:3", 493 | "version": 3 494 | }, 495 | { 496 | "name": "gdal36", 497 | "arn": "arn:aws:lambda:eu-west-2:524387336408:layer:gdal36:2", 498 | "version": 2 499 | } 500 | ] 501 | }, 502 | { 503 | "region": "eu-west-3", 504 | "layers": [ 505 | { 506 | "name": "gdal24", 507 | "arn": "arn:aws:lambda:eu-west-3:524387336408:layer:gdal24:4", 508 | "version": 4 509 | }, 510 | { 511 | "name": "gdal31", 512 | "arn": "arn:aws:lambda:eu-west-3:524387336408:layer:gdal31:4", 513 | "version": 4 514 | }, 515 | { 516 | "name": "gdal32", 517 | "arn": "arn:aws:lambda:eu-west-3:524387336408:layer:gdal32:4", 518 | "version": 4 519 | }, 520 | { 521 | "name": "gdal24-al2", 522 | "arn": "arn:aws:lambda:eu-west-3:524387336408:layer:gdal24-al2:3", 523 | "version": 3 524 | }, 525 | { 526 | "name": "gdal31-al2", 527 | "arn": "arn:aws:lambda:eu-west-3:524387336408:layer:gdal31-al2:3", 528 | "version": 3 529 | }, 530 | { 531 | "name": "gdal32-al2", 532 | "arn": "arn:aws:lambda:eu-west-3:524387336408:layer:gdal32-al2:6", 533 | "version": 6 534 | }, 535 | { 536 | "name": "gdal33-al2", 537 | "arn": "arn:aws:lambda:eu-west-3:524387336408:layer:gdal33-al2:2", 538 | "version": 2 539 | }, 540 | { 541 | "name": "gdal35", 542 | "arn": "arn:aws:lambda:eu-west-3:524387336408:layer:gdal35:3", 543 | "version": 3 544 | }, 545 | { 546 | "name": "gdal36", 547 | "arn": "arn:aws:lambda:eu-west-3:524387336408:layer:gdal36:2", 548 | "version": 2 549 | } 550 | ] 551 | }, 552 | { 553 | "region": "sa-east-1", 554 | "layers": [ 555 | { 556 | "name": "gdal24", 557 | "arn": "arn:aws:lambda:sa-east-1:524387336408:layer:gdal24:4", 558 | "version": 4 559 | }, 560 | { 561 | "name": "gdal31", 562 | "arn": "arn:aws:lambda:sa-east-1:524387336408:layer:gdal31:4", 563 | "version": 4 564 | }, 565 | { 566 | "name": "gdal32", 567 | "arn": "arn:aws:lambda:sa-east-1:524387336408:layer:gdal32:4", 568 | "version": 4 569 | }, 570 | { 571 | "name": "gdal24-al2", 572 | "arn": "arn:aws:lambda:sa-east-1:524387336408:layer:gdal24-al2:3", 573 | "version": 3 574 | }, 575 | { 576 | "name": "gdal31-al2", 577 | "arn": "arn:aws:lambda:sa-east-1:524387336408:layer:gdal31-al2:3", 578 | "version": 3 579 | }, 580 | { 581 | "name": "gdal32-al2", 582 | "arn": "arn:aws:lambda:sa-east-1:524387336408:layer:gdal32-al2:6", 583 | "version": 6 584 | }, 585 | { 586 | "name": "gdal33-al2", 587 | "arn": "arn:aws:lambda:sa-east-1:524387336408:layer:gdal33-al2:2", 588 | "version": 2 589 | }, 590 | { 591 | "name": "gdal35", 592 | "arn": "arn:aws:lambda:sa-east-1:524387336408:layer:gdal35:3", 593 | "version": 3 594 | }, 595 | { 596 | "name": "gdal36", 597 | "arn": "arn:aws:lambda:sa-east-1:524387336408:layer:gdal36:2", 598 | "version": 2 599 | } 600 | ] 601 | }, 602 | { 603 | "region": "us-east-1", 604 | "layers": [ 605 | { 606 | "name": "gdal24", 607 | "arn": "arn:aws:lambda:us-east-1:524387336408:layer:gdal24:4", 608 | "version": 4 609 | }, 610 | { 611 | "name": "gdal31", 612 | "arn": "arn:aws:lambda:us-east-1:524387336408:layer:gdal31:4", 613 | "version": 4 614 | }, 615 | { 616 | "name": "gdal32", 617 | "arn": "arn:aws:lambda:us-east-1:524387336408:layer:gdal32:4", 618 | "version": 4 619 | }, 620 | { 621 | "name": "gdal24-al2", 622 | "arn": "arn:aws:lambda:us-east-1:524387336408:layer:gdal24-al2:3", 623 | "version": 3 624 | }, 625 | { 626 | "name": "gdal31-al2", 627 | "arn": "arn:aws:lambda:us-east-1:524387336408:layer:gdal31-al2:3", 628 | "version": 3 629 | }, 630 | { 631 | "name": "gdal32-al2", 632 | "arn": "arn:aws:lambda:us-east-1:524387336408:layer:gdal32-al2:6", 633 | "version": 6 634 | }, 635 | { 636 | "name": "gdal33-al2", 637 | "arn": "arn:aws:lambda:us-east-1:524387336408:layer:gdal33-al2:2", 638 | "version": 2 639 | }, 640 | { 641 | "name": "gdal35", 642 | "arn": "arn:aws:lambda:us-east-1:524387336408:layer:gdal35:3", 643 | "version": 3 644 | }, 645 | { 646 | "name": "gdal36", 647 | "arn": "arn:aws:lambda:us-east-1:524387336408:layer:gdal36:2", 648 | "version": 2 649 | } 650 | ] 651 | }, 652 | { 653 | "region": "us-east-2", 654 | "layers": [ 655 | { 656 | "name": "gdal24", 657 | "arn": "arn:aws:lambda:us-east-2:524387336408:layer:gdal24:4", 658 | "version": 4 659 | }, 660 | { 661 | "name": "gdal31", 662 | "arn": "arn:aws:lambda:us-east-2:524387336408:layer:gdal31:4", 663 | "version": 4 664 | }, 665 | { 666 | "name": "gdal32", 667 | "arn": "arn:aws:lambda:us-east-2:524387336408:layer:gdal32:4", 668 | "version": 4 669 | }, 670 | { 671 | "name": "gdal24-al2", 672 | "arn": "arn:aws:lambda:us-east-2:524387336408:layer:gdal24-al2:3", 673 | "version": 3 674 | }, 675 | { 676 | "name": "gdal31-al2", 677 | "arn": "arn:aws:lambda:us-east-2:524387336408:layer:gdal31-al2:3", 678 | "version": 3 679 | }, 680 | { 681 | "name": "gdal32-al2", 682 | "arn": "arn:aws:lambda:us-east-2:524387336408:layer:gdal32-al2:6", 683 | "version": 6 684 | }, 685 | { 686 | "name": "gdal33-al2", 687 | "arn": "arn:aws:lambda:us-east-2:524387336408:layer:gdal33-al2:2", 688 | "version": 2 689 | }, 690 | { 691 | "name": "gdal35", 692 | "arn": "arn:aws:lambda:us-east-2:524387336408:layer:gdal35:3", 693 | "version": 3 694 | }, 695 | { 696 | "name": "gdal36", 697 | "arn": "arn:aws:lambda:us-east-2:524387336408:layer:gdal36:2", 698 | "version": 2 699 | } 700 | ] 701 | }, 702 | { 703 | "region": "us-west-1", 704 | "layers": [ 705 | { 706 | "name": "gdal24", 707 | "arn": "arn:aws:lambda:us-west-1:524387336408:layer:gdal24:4", 708 | "version": 4 709 | }, 710 | { 711 | "name": "gdal31", 712 | "arn": "arn:aws:lambda:us-west-1:524387336408:layer:gdal31:4", 713 | "version": 4 714 | }, 715 | { 716 | "name": "gdal32", 717 | "arn": "arn:aws:lambda:us-west-1:524387336408:layer:gdal32:4", 718 | "version": 4 719 | }, 720 | { 721 | "name": "gdal24-al2", 722 | "arn": "arn:aws:lambda:us-west-1:524387336408:layer:gdal24-al2:3", 723 | "version": 3 724 | }, 725 | { 726 | "name": "gdal31-al2", 727 | "arn": "arn:aws:lambda:us-west-1:524387336408:layer:gdal31-al2:3", 728 | "version": 3 729 | }, 730 | { 731 | "name": "gdal32-al2", 732 | "arn": "arn:aws:lambda:us-west-1:524387336408:layer:gdal32-al2:6", 733 | "version": 6 734 | }, 735 | { 736 | "name": "gdal33-al2", 737 | "arn": "arn:aws:lambda:us-west-1:524387336408:layer:gdal33-al2:2", 738 | "version": 2 739 | }, 740 | { 741 | "name": "gdal35", 742 | "arn": "arn:aws:lambda:us-west-1:524387336408:layer:gdal35:3", 743 | "version": 3 744 | }, 745 | { 746 | "name": "gdal36", 747 | "arn": "arn:aws:lambda:us-west-1:524387336408:layer:gdal36:2", 748 | "version": 2 749 | } 750 | ] 751 | }, 752 | { 753 | "region": "us-west-2", 754 | "layers": [ 755 | { 756 | "name": "gdal24", 757 | "arn": "arn:aws:lambda:us-west-2:524387336408:layer:gdal24:4", 758 | "version": 4 759 | }, 760 | { 761 | "name": "gdal31", 762 | "arn": "arn:aws:lambda:us-west-2:524387336408:layer:gdal31:4", 763 | "version": 4 764 | }, 765 | { 766 | "name": "gdal32", 767 | "arn": "arn:aws:lambda:us-west-2:524387336408:layer:gdal32:4", 768 | "version": 4 769 | }, 770 | { 771 | "name": "gdal24-al2", 772 | "arn": "arn:aws:lambda:us-west-2:524387336408:layer:gdal24-al2:3", 773 | "version": 3 774 | }, 775 | { 776 | "name": "gdal31-al2", 777 | "arn": "arn:aws:lambda:us-west-2:524387336408:layer:gdal31-al2:3", 778 | "version": 3 779 | }, 780 | { 781 | "name": "gdal32-al2", 782 | "arn": "arn:aws:lambda:us-west-2:524387336408:layer:gdal32-al2:6", 783 | "version": 6 784 | }, 785 | { 786 | "name": "gdal33-al2", 787 | "arn": "arn:aws:lambda:us-west-2:524387336408:layer:gdal33-al2:2", 788 | "version": 2 789 | }, 790 | { 791 | "name": "gdal35", 792 | "arn": "arn:aws:lambda:us-west-2:524387336408:layer:gdal35:3", 793 | "version": 3 794 | }, 795 | { 796 | "name": "gdal36", 797 | "arn": "arn:aws:lambda:us-west-2:524387336408:layer:gdal36:2", 798 | "version": 2 799 | } 800 | ] 801 | } 802 | ] 803 | -------------------------------------------------------------------------------- /dockerfiles/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM public.ecr.aws/lambda/provided:al2 AS builder 2 | 3 | LABEL maintainer="lambgeo " 4 | 5 | RUN yum update -y && \ 6 | yum install -y git autoconf libtool flex bison cmake make \ 7 | tar gzip gcc gcc-c++ automake16 libpng-devel nasm \ 8 | libxml2-devel readline-devel openssl-devel curl-devel \ 9 | cmake3 && \ 10 | yum clean all && \ 11 | rm -rf /var/cache/yum /var/lib/yum/history 12 | 13 | ENV PREFIX /opt 14 | 15 | WORKDIR /opt 16 | 17 | ENV LD_LIBRARY_PATH $PREFIX/lib:$LD_LIBRARY_PATH 18 | 19 | # pkg-config 20 | ENV PKGCONFIG_VERSION=0.29.2 21 | RUN mkdir /tmp/pkg-config \ 22 | && curl -sfL https://pkg-config.freedesktop.org/releases/pkg-config-${PKGCONFIG_VERSION}.tar.gz | tar zxf - -C /tmp/pkg-config --strip-components=1 \ 23 | && cd /tmp/pkg-config \ 24 | && CFLAGS="-O2 -Wl,-S" ./configure --prefix=$PREFIX --with-internal-glib \ 25 | && make -j $(nproc) --silent && make install && make clean \ 26 | && rm -rf /tmp/pkg-config 27 | 28 | ENV PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ 29 | 30 | # sqlite 31 | RUN mkdir /tmp/sqlite \ 32 | && curl -sfL https://www.sqlite.org/2020/sqlite-autoconf-3330000.tar.gz | tar zxf - -C /tmp/sqlite --strip-components=1 \ 33 | && cd /tmp/sqlite \ 34 | && CFLAGS="-O2 -Wl,-S" CXXFLAGS="-O2 -Wl,-S" ./configure --prefix=$PREFIX --disable-static \ 35 | && make -j $(nproc) --silent && make install && make clean \ 36 | && rm -rf /tmp/sqlite 37 | 38 | # libexpat 39 | RUN mkdir /tmp/libexpat \ 40 | && curl -sfL https://github.com/libexpat/libexpat/releases/download/R_2_2_10/expat-2.2.10.tar.gz | tar zxf - -C /tmp/libexpat --strip-components=1 \ 41 | && cd /tmp/libexpat \ 42 | && CFLAGS="-O2 -Wl,-S" CXXFLAGS="-O2 -Wl,-S" ./configure --prefix=$PREFIX --disable-static \ 43 | && make -j $(nproc) --silent && make install && make clean \ 44 | && rm -rf /tmp/libexpat 45 | 46 | ENV \ 47 | SQLITE3_LIBS="-L${PREFIX}/lib -lsqlite3" \ 48 | SQLITE3_INCLUDE_DIR="${PREFIX}/include" \ 49 | SQLITE3_CFLAGS="$CFLAGS -I${PREFIX}/include" \ 50 | PATH=${PREFIX}/bin/:$PATH 51 | 52 | # libxml2 53 | RUN mkdir /tmp/libxml2 \ 54 | && curl -sfL https://gitlab.gnome.org/GNOME/libxml2/-/archive/v2.9.10/libxml2-v2.9.10.tar.gz | tar zxf - -C /tmp/libxml2 --strip-components=1 \ 55 | && cd /tmp/libxml2 \ 56 | && ./autogen.sh --prefix=$PREFIX --with-ftp=no --with-http=no --with-python=no \ 57 | && make -j $(nproc) --silent && make install \ 58 | && rm -rf /tmp/libxml2 59 | 60 | # nghttp2 61 | ENV NGHTTP2_VERSION=1.42.0 62 | RUN mkdir /tmp/nghttp2 \ 63 | && curl -sfL https://github.com/nghttp2/nghttp2/releases/download/v${NGHTTP2_VERSION}/nghttp2-${NGHTTP2_VERSION}.tar.gz | tar zxf - -C /tmp/nghttp2 --strip-components=1 \ 64 | && cd /tmp/nghttp2 \ 65 | && ./configure --enable-lib-only --prefix=$PREFIX \ 66 | && make -j $(nproc) --silent && make install \ 67 | && rm -rf /tmp/nghttp2 68 | 69 | # libcurl 70 | ENV CURL_VERSION=7.73.0 71 | RUN mkdir /tmp/libcurl \ 72 | && curl -sfL https://curl.haxx.se/download/curl-${CURL_VERSION}.tar.gz | tar zxf - -C /tmp/libcurl --strip-components=1 \ 73 | && cd /tmp/libcurl \ 74 | && ./configure --disable-manual --disable-cookies --with-nghttp2=$PREFIX --prefix=$PREFIX \ 75 | && make -j $(nproc) --silent && make install \ 76 | && rm -rf /tmp/libcurl 77 | 78 | # libdeflate 79 | RUN mkdir /tmp/libdeflate \ 80 | && curl -sfL https://github.com/ebiggers/libdeflate/archive/v1.10.tar.gz | tar zxf - -C /tmp/libdeflate --strip-components=1 \ 81 | && cd /tmp/libdeflate \ 82 | && make -j $(nproc) --silent PREFIX=$PREFIX && make install \ 83 | && rm -rf /tmp/libdeflate 84 | 85 | # libpng 86 | ENV LIBPNG_VERSION=1.6.37 87 | RUN mkdir /tmp/png \ 88 | && curl -sfL https://github.com/glennrp/libpng/archive/v${LIBPNG_VERSION}.tar.gz | tar zxf - -C /tmp/png --strip-components=1 \ 89 | && cd /tmp/png \ 90 | && CFLAGS="-O2 -Wl,-S" CXXFLAGS="-O2 -Wl,-S" ./configure --prefix=$PREFIX \ 91 | && make -j $(nproc) --silent && make install \ 92 | && rm -rf /tmp/png 93 | 94 | # libjpeg_turbo 95 | ENV LIBJPEG_TURBO_VERSION=2.1.3 96 | RUN mkdir /tmp/jpeg \ 97 | && curl -sfL https://github.com/libjpeg-turbo/libjpeg-turbo/archive/${LIBJPEG_TURBO_VERSION}.tar.gz | tar zxf - -C /tmp/jpeg --strip-components=1 \ 98 | && cd /tmp/jpeg \ 99 | && mkdir build && cd build \ 100 | && cmake3 .. \ 101 | -DCMAKE_BUILD_TYPE=Release \ 102 | -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX \ 103 | -DCMAKE_INSTALL_LIBDIR:PATH=lib \ 104 | -DCMAKE_C_FLAGS="-O2 -Wl,-S" \ 105 | -DCMAKE_CXX_FLAGS="-O2 -Wl,-S" \ 106 | && make -j $(nproc) --silent && make install \ 107 | && rm -rf /tmp/jpeg 108 | 109 | # webp 110 | ENV WEBP_VERSION=1.1.0 111 | RUN mkdir /tmp/webp \ 112 | && curl -sfL https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-${WEBP_VERSION}.tar.gz | tar zxf - -C /tmp/webp --strip-components=1 \ 113 | && cd /tmp/webp \ 114 | && CFLAGS="-O2 -Wl,-S" ./configure --prefix=$PREFIX \ 115 | && make -j $(nproc) --silent && make install \ 116 | && rm -rf /tmp/webp 117 | 118 | # zstd 119 | ENV ZSTD_VERSION=1.4.5 120 | RUN mkdir /tmp/zstd \ 121 | && curl -sfL https://github.com/facebook/zstd/archive/v${ZSTD_VERSION}.tar.gz | tar zxf - -C /tmp/zstd --strip-components=1 \ 122 | && cd /tmp/zstd \ 123 | && make -j $(nproc) PREFIX=$PREFIX ZSTD_LEGACY_SUPPORT=0 CFLAGS=-O1 --silent && make install PREFIX=$PREFIX ZSTD_LEGACY_SUPPORT=0 CFLAGS=-O1 \ 124 | && rm -rf /tmp/zstd 125 | 126 | # lerc 127 | ENV LERC_VERSION=2.2.1 128 | RUN mkdir /tmp/lerc \ 129 | && curl -sfL https://github.com/Esri/lerc/archive/v${LERC_VERSION}.tar.gz | tar zxf - -C /tmp/lerc --strip-components=1 \ 130 | && cd /tmp/lerc \ 131 | && cmake3 . \ 132 | -DCMAKE_BUILD_TYPE=Release \ 133 | -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX \ 134 | -DCMAKE_INSTALL_LIBDIR:PATH=lib \ 135 | -DCMAKE_C_FLAGS="-O2 -Wl,-S" \ 136 | -DCMAKE_CXX_FLAGS="-O2 -Wl,-S" \ 137 | && make -j $(nproc) --silent && make install \ 138 | && rm -rf /tmp/lerc 139 | 140 | # libtiff 141 | ENV LIBTIFF_VERSION=4.5.0 142 | RUN mkdir /tmp/libtiff \ 143 | && curl -sfL https://download.osgeo.org/libtiff/tiff-${LIBTIFF_VERSION}.tar.gz | tar zxf - -C /tmp/libtiff --strip-components=1 \ 144 | && cd /tmp/libtiff \ 145 | && LDFLAGS="-Wl,-rpath,'\$\$ORIGIN'" CFLAGS="-O2 -Wl,-S" CXXFLAGS="-O2 -Wl,-S" ./configure \ 146 | --prefix=$PREFIX \ 147 | --disable-static \ 148 | --enable-rpath \ 149 | --with-lerc-lib-dir=$PREFIX/lib \ 150 | --with-lerc-include-dir=$PREFIX/include \ 151 | --with-libdeflate-lib-dir=$PREFIX/lib \ 152 | --with-libdeflate-include-dir=$PREFIX/include \ 153 | --with-jpeg-lib-dir=$PREFIX/lib \ 154 | --with-jpeg-include-dir=$PREFIX/include \ 155 | && make -j $(nproc) --silent && make install \ 156 | && rm -rf /tmp/libtiff 157 | 158 | # postgres 159 | ENV PG_VERSION=15.2 160 | RUN mkdir /tmp/postgres \ 161 | && curl -sfL https://ftp.postgresql.org/pub/source/v${PG_VERSION}/postgresql-${PG_VERSION}.tar.gz | tar zxf - -C /tmp/postgres --strip-components=1 \ 162 | && cd /tmp/postgres \ 163 | && CFLAGS="-O2 -Wl,-S" CXXFLAGS="-O2 -Wl,-S" ./configure --prefix=$PREFIX --with-openssl \ 164 | && make -j $(nproc) --silent && make install \ 165 | && rm -rf /tmp/postgres 166 | 167 | # openjpeg 168 | ENV OPENJPEG_VERSION=2.5.0 169 | RUN mkdir /tmp/openjpeg \ 170 | && curl -sfL https://github.com/uclouvain/openjpeg/archive/v${OPENJPEG_VERSION}.tar.gz | tar zxf - -C /tmp/openjpeg --strip-components=1 \ 171 | && cd /tmp/openjpeg \ 172 | && mkdir build && cd build \ 173 | && cmake3 .. \ 174 | -DBUILD_THIRDPARTY:BOOL=ON \ 175 | -DCMAKE_BUILD_TYPE=Release \ 176 | -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX \ 177 | -DCMAKE_INSTALL_LIBDIR:PATH=lib \ 178 | -DCMAKE_C_FLAGS="-O2 -Wl,-S" \ 179 | -DCMAKE_CXX_FLAGS="-O2 -Wl,-S" \ 180 | && make -j $(nproc) --silent && make install \ 181 | && rm -rf /tmp/openjpeg 182 | 183 | # geos 184 | ENV GEOS_VERSION=3.12.1 185 | RUN mkdir /tmp/geos \ 186 | && curl -sfL https://github.com/libgeos/geos/archive/refs/tags/${GEOS_VERSION}.tar.gz | tar zxf - -C /tmp/geos --strip-components=1 \ 187 | && cd /tmp/geos \ 188 | && mkdir build && cd build \ 189 | && cmake3 .. \ 190 | -DCMAKE_BUILD_TYPE=Release \ 191 | -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX \ 192 | -DCMAKE_INSTALL_LIBDIR:PATH=lib \ 193 | -DCMAKE_C_FLAGS="-O2 -Wl,-S" \ 194 | -DCMAKE_CXX_FLAGS="-O2 -Wl,-S" \ 195 | && make -j $(nproc) --silent && make install \ 196 | && rm -rf /tmp/geos 197 | 198 | # proj 199 | # We still provide proj-datumgrid but the user can choose to set `PROJ_NETWORK=ON` to use network grids 200 | # ENV PROJ_VERSION=9.2.0 201 | # RUN mkdir /tmp/proj && mkdir /tmp/proj/data \ 202 | # && curl -sfL https://github.com/OSGeo/proj/archive/${PROJ_VERSION}.tar.gz | tar zxf - -C /tmp/proj --strip-components=1 \ 203 | # && curl -sfL http://download.osgeo.org/proj/proj-datumgrid-latest.tar.gz | tar zxf - -C /tmp/proj/data \ 204 | # && cd /tmp/proj \ 205 | # && aclocal && autoheader && libtoolize --force --copy && automake --add-missing --copy && autoconf \ 206 | # && LDFLAGS="-Wl,-rpath,'\$\$ORIGIN'" CFLAGS="-O2 -Wl,-S" CXXFLAGS="-O2 -Wl,-S" ./configure --prefix=$PREFIX --disable-static --enable-lto \ 207 | # && make -j $(nproc) --silent && make install \ 208 | # && rm -rf /tmp/proj 209 | 210 | ENV PROJ_VERSION=9.3.1 211 | RUN mkdir /tmp/proj && mkdir /tmp/proj/data \ 212 | && curl -sfL https://github.com/OSGeo/proj/archive/${PROJ_VERSION}.tar.gz | tar zxf - -C /tmp/proj --strip-components=1 \ 213 | && cd /tmp/proj \ 214 | && mkdir build && cd build \ 215 | && cmake3 .. \ 216 | -DCMAKE_BUILD_TYPE=Release \ 217 | -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX \ 218 | -DCMAKE_INSTALL_LIBDIR:PATH=lib \ 219 | -DCMAKE_INSTALL_INCLUDEDIR:PATH=include \ 220 | -DBUILD_TESTING=OFF \ 221 | -DCMAKE_C_FLAGS="-O2 -Wl,-S" \ 222 | -DCMAKE_CXX_FLAGS="-O2 -Wl,-S" \ 223 | && make -j $(nproc) --silent && make install \ 224 | && rm -rf /tmp/proj 225 | 226 | # GeoTIFF 227 | ENV LIBGEOTIFF_VERSION=1.7.1 228 | RUN mkdir /tmp/libgeotiff \ 229 | && curl -sfL https://github.com/OSGeo/libgeotiff/releases/download/${LIBGEOTIFF_VERSION}/libgeotiff-${LIBGEOTIFF_VERSION}.tar.gz | tar zxf - -C /tmp/libgeotiff --strip-components=1 \ 230 | && cd /tmp/libgeotiff \ 231 | && LDFLAGS="-Wl,-rpath,'\$\$ORIGIN'" CFLAGS="-O2 -Wl,-S" CXXFLAGS="-O2 -Wl,-S" ./configure \ 232 | --prefix=$PREFIX \ 233 | --with-proj=$PREFIX \ 234 | --with-jpeg=$PREFIX \ 235 | --with-zip=yes \ 236 | --with-zlib \ 237 | --with-libtiff=$PREFIX \ 238 | && make -j $(nproc) --silent && make install \ 239 | && rm -rf /tmp/libgeotiff 240 | 241 | # Build blosc (needed for ZARR) 242 | ENV BLOSC_VERSION=1.21.0 243 | RUN mkdir /tmp/blosc \ 244 | && curl -sfL https://github.com/Blosc/c-blosc/archive/refs/tags/v${BLOSC_VERSION}.tar.gz | tar zxf - -C /tmp/blosc --strip-components=1 \ 245 | && cd /tmp/blosc \ 246 | && cmake3 -G"Unix Makefiles" \ 247 | -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX \ 248 | -DCMAKE_INSTALL_LIBDIR:PATH=lib \ 249 | -DCMAKE_INSTALL_RPATH="$ORIGIN" \ 250 | -DCMAKE_BUILD_TYPE=Release \ 251 | -DCMAKE_C_FLAGS="-O2 -Wl,-S" \ 252 | -DCMAKE_CXX_FLAGS="-O2 -Wl,-S" \ 253 | -DBUILD_SHARED=ON \ 254 | -DBUILD_STATIC=OFF \ 255 | -DBUILD_BENCHMARKS=OFF \ 256 | -DBUILD_FUZZERS=OFF \ 257 | -DBUILD_TESTS=OFF \ 258 | -DPREFER_EXTERNAL_LZ4=ON \ 259 | -DPREFER_EXTERNAL_ZLIB=ON \ 260 | -DPREFER_EXTERNAL_ZSTD=ON \ 261 | -DDEACTIVATE_SNAPPY=OFF . \ 262 | && make -j $(nproc) --silent && make install && make clean \ 263 | && rm -rf /tmp/blosc 264 | 265 | # libcrypto (for GPC access) 266 | RUN mkdir /tmp/cryptopp \ 267 | && curl -sfL https://github.com/weidai11/cryptopp/archive/refs/tags/CRYPTOPP_8_6_0.tar.gz | tar zxf - -C /tmp/cryptopp --strip-components=1 \ 268 | && cd /tmp/cryptopp \ 269 | && make -j $(nproc) --silent && make install PREFIX=$PREFIX \ 270 | && rm -rf /tmp/cryptopp 271 | 272 | # szip (for hdf) 273 | ENV SZIP_VERSION=2.1.1 274 | RUN mkdir /tmp/szip \ 275 | && curl -sfL https://support.hdfgroup.org/ftp/lib-external/szip/${SZIP_VERSION}/src/szip-${SZIP_VERSION}.tar.gz | tar zxf - -C /tmp/szip --strip-components=1 \ 276 | && cd /tmp/szip \ 277 | && CFLAGS="-O2 -Wl,-S" CXXFLAGS="-O2 -Wl,-S" ./configure --prefix=$PREFIX --disable-static \ 278 | && make -j $(nproc) --silent && make install && make clean \ 279 | && rm -rf /tmp/szip 280 | 281 | # libhdf4 282 | ENV HDF4_VERSION=4.2.15 283 | RUN mkdir /tmp/hdf4 \ 284 | && curl -sfL https://support.hdfgroup.org/ftp/HDF/releases/HDF${HDF4_VERSION}/src/hdf-${HDF4_VERSION}.tar | tar xvf - -C /tmp/hdf4 --strip-components=1 \ 285 | && cd /tmp/hdf4 \ 286 | && CFLAGS="-O2 -Wl,-S" CXXFLAGS="-O2 -Wl,-S" ./configure \ 287 | --prefix=$PREFIX \ 288 | --with-szlib=$PREFIX \ 289 | --with-jpeg=$PREFIX \ 290 | --enable-shared \ 291 | --disable-static \ 292 | --disable-netcdf \ 293 | --disable-fortran \ 294 | && make -j $(nproc) --silent && make install && make clean \ 295 | && rm -rf /tmp/hdf4 296 | 297 | # libhdf5 298 | ENV HDF5_VERSION=1.12.0 299 | RUN mkdir /tmp/hdf5 \ 300 | && curl -sfL https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-${HDF5_VERSION%.*}/hdf5-${HDF5_VERSION}/src/hdf5-$HDF5_VERSION.tar.gz | tar zxf - -C /tmp/hdf5 --strip-components=1 \ 301 | && cd /tmp/hdf5 \ 302 | && CFLAGS="-O2 -Wl,-S" CXXFLAGS="-O2 -Wl,-S" ./configure \ 303 | --prefix=$PREFIX \ 304 | --with-szlib=$PREFIX \ 305 | --enable-cxx \ 306 | --enable-thread-safe \ 307 | --disable-static \ 308 | && make -j $(nproc) --silent && make install && make clean \ 309 | && rm -rf /tmp/hdf5 310 | 311 | # NetCDF 312 | ENV NETCDF_VERSION=4.7.4 313 | RUN mkdir /tmp/netcdf \ 314 | && curl -sfL https://github.com/Unidata/netcdf-c/archive/v${NETCDF_VERSION}.tar.gz | tar zxf - -C /tmp/netcdf --strip-components=1 \ 315 | && cd /tmp/netcdf \ 316 | && CFLAGS="-O2 -Wl,-S" CXXFLAGS="-O2 -Wl,-S" CPPFLAGS="-I${PREFIX}/include" LDFLAGS="-L${PREFIX}/lib" ./configure \ 317 | --with-default-chunk-size=67108864 \ 318 | --with-chunk-cache-size=67108864 \ 319 | --prefix=$PREFIX \ 320 | --disable-static \ 321 | --enable-netcdf4 \ 322 | --enable-dap \ 323 | --with-pic \ 324 | && make -j $(nproc) --silent && make install && make clean \ 325 | && rm -rf /tmp/netcdf 326 | 327 | # # JPEG-XL 328 | # # libhwy 329 | # RUN mkdir /tmp/libhwy \ 330 | # && curl -sfL https://github.com/google/highway/archive/refs/tags/0.16.0.tar.gz | tar zxf - -C /tmp/libhwy --strip-components=1 \ 331 | # && cd /tmp/libhwy \ 332 | # && mkdir build && cd build \ 333 | # && cmake3 .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_INSTALL_PREFIX=$PREFIX \ 334 | # && make -j $(nproc) install && make clean \ 335 | # && rm -rf /tmp/libhwy 336 | 337 | # # brotli 338 | # ENV BROTLI_VERSION=1.0.9 339 | # RUN mkdir /tmp/brotli \ 340 | # && curl -sfL https://github.com/google/brotli/archive/refs/tags/v${BROTLI_VERSION}.tar.gz | tar zxf - -C /tmp/brotli --strip-components=1 \ 341 | # && cd /tmp/brotli \ 342 | # && mkdir build && cd build \ 343 | # && CFLAGS="-O2 -Wl,-S" CXXFLAGS="-O2 -Wl,-S" ../configure-cmake --prefix=$PREFIX \ 344 | # && make -j $(nproc) --silent && make install && make clean \ 345 | # && rm -rf /tmp/brotli 346 | 347 | # # # JpegXL 348 | # ENV JXL_VERSION=0.8.1 349 | # RUN mkdir /tmp/jxl \ 350 | # && curl -sfL https://github.com/libjxl/libjxl/archive/refs/tags/v${JXL_VERSION}.tar.gz | tar zxf - -C /tmp/jxl --strip-components=1 \ 351 | # && cd /tmp/jxl \ 352 | # && mkdir build && cd build \ 353 | # && cmake3 .. -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF -DCMAKE_INSTALL_LIBDIR=lib -DCMAKE_INSTALL_PREFIX=$PREFIX \ 354 | # && make -j $(nproc) install && make clean \ 355 | # && rm -rf /tmp/jxl 356 | 357 | # We use commit sha to make sure we are not using `cache` when building the docker image 358 | # "7ca88116f5a46d429251361634eb24629f315076" is the latest commit on release/3.6 branch 359 | 360 | 361 | # GDAL 362 | ARG GDAL_VERSION 363 | RUN mkdir /tmp/gdal \ 364 | && curl -sfL https://github.com/OSGeo/gdal/archive/refs/tags/v${GDAL_VERSION}.tar.gz | tar zxf - -C /tmp/gdal --strip-components=1 \ 365 | && cd /tmp/gdal \ 366 | && mkdir build && cd build \ 367 | && cmake3 .. \ 368 | -DGDAL_USE_EXTERNAL_LIBS=ON \ 369 | -DCMAKE_BUILD_TYPE=Release \ 370 | -DCMAKE_INSTALL_PREFIX:PATH=$PREFIX \ 371 | -DCMAKE_INSTALL_LIBDIR:PATH=lib \ 372 | -DCMAKE_C_FLAGS="-O2 -Wl,-S" \ 373 | -DCMAKE_CXX_FLAGS="-O2 -Wl,-S" \ 374 | -DGDAL_SET_INSTALL_RELATIVE_RPATH=ON \ 375 | -DGDAL_USE_TIFF_INTERNAL=OFF \ 376 | -DGDAL_USE_GEOTIFF_INTERNAL=OFF \ 377 | -DGDAL_USE_LERC_INTERNAL=OFF \ 378 | -DLERC_INCLUDE_DIR=$PREFIX/include \ 379 | -DLERC_LIBRARY=$PREFIX/lib/libLercLib.so \ 380 | -DPNG_PNG_INCLUDE_DIR=$PREFIX/include \ 381 | -DPNG_LIBRARY_RELEASE=$PREFIX/lib/libpng.so \ 382 | -DBUILD_PYTHON_BINDINGS=OFF \ 383 | && make -j $(nproc) --silent && make install \ 384 | && rm -rf /tmp/gdal 385 | 386 | # from https://github.com/pypa/manylinux/blob/d8ef5d47433ba771fa4403fd48f352c586e06e43/docker/build_scripts/build.sh#L133-L138 387 | # Install patchelf (latest with unreleased bug fixes) 388 | ENV PATCHELF_VERSION=0.10 389 | RUN mkdir /tmp/patchelf \ 390 | && curl -sfL https://github.com/NixOS/patchelf/archive/${PATCHELF_VERSION}.tar.gz | tar zxf - -C /tmp/patchelf --strip-components=1 \ 391 | && cd /tmp/patchelf && ./bootstrap.sh && ./configure \ 392 | && make -j $(nproc) --silent && make install \ 393 | && cd / && rm -rf /tmp/patchelf 394 | 395 | # # libturbojpeg.so is not used by GDAL. Only libjpeg.so* 396 | RUN rm -f $PREFIX/lib/libturbojpeg.so* \ 397 | # Only libwebp.so is used by GDAL 398 | && rm -f $PREFIX/lib/libwebpmux.so* $PREFIX/lib/libwebpdemux.so* $PREFIX/lib/libwebpdecoder.so* 399 | 400 | # FIX 401 | RUN for i in $PREFIX/bin/*; do patchelf --force-rpath --set-rpath '$ORIGIN/../lib' $i; done 402 | RUN for i in $PREFIX/lib/*.so; do patchelf --force-rpath --set-rpath '$ORIGIN' $i; done 403 | 404 | # Build final image 405 | FROM public.ecr.aws/lambda/provided:al2 AS runner 406 | 407 | ENV PREFIX /opt 408 | COPY --from=builder /opt/lib/ $PREFIX/lib/ 409 | COPY --from=builder /opt/include/ $PREFIX/include/ 410 | COPY --from=builder /opt/share/ $PREFIX/share/ 411 | COPY --from=builder /opt/bin/ $PREFIX/bin/ 412 | 413 | RUN export GDAL_VERSION=$(gdal-config --version) 414 | 415 | ENV \ 416 | GDAL_DATA=$PREFIX/share/gdal \ 417 | PROJ_LIB=$PREFIX/share/proj \ 418 | GDAL_CONFIG=$PREFIX/bin/gdal-config \ 419 | GEOS_CONFIG=$PREFIX/bin/geos-config \ 420 | PATH=$PREFIX/bin:$PATH 421 | 422 | ENTRYPOINT bash 423 | -------------------------------------------------------------------------------- /dockerfiles/runtimes/nodejs: -------------------------------------------------------------------------------- 1 | ARG GDAL_VERSION_TAG 2 | ARG RUNTIME_VERSION 3 | 4 | FROM ghcr.io/lambgeo/lambda-gdal:${GDAL_VERSION_TAG} as gdal 5 | 6 | FROM public.ecr.aws/lambda/nodejs:${RUNTIME_VERSION} 7 | 8 | LABEL maintainer="lambgeo " 9 | 10 | ENV \ 11 | LANG=en_US.UTF-8 \ 12 | LC_ALL=en_US.UTF-8 \ 13 | CFLAGS="--std=c99" 14 | 15 | # The PREFIX should be the same as in gdal{version}:latest 16 | # When building rasterio, setup.py will get libs directoy from gdal-config 17 | # $ gdal-config --libs 18 | # -L/opt/lib -lgdal 19 | ENV PREFIX /opt 20 | 21 | COPY --from=gdal /opt/lib/ $PREFIX/lib/ 22 | COPY --from=gdal /opt/include/ $PREFIX/include/ 23 | COPY --from=gdal /opt/share/ $PREFIX/share/ 24 | COPY --from=gdal /opt/bin/ $PREFIX/bin/ 25 | 26 | ENV \ 27 | GDAL_DATA=$PREFIX/share/gdal \ 28 | PROJ_LIB=$PREFIX/share/proj \ 29 | GDAL_CONFIG=$PREFIX/bin/gdal-config \ 30 | GEOS_CONFIG=$PREFIX/bin/geos-config \ 31 | PATH=$PREFIX/bin:$PATH 32 | 33 | RUN export GDAL_VERSION=$(gdal-config --version) 34 | 35 | RUN mkdir ${PREFIX}/nodejs 36 | RUN mkdir ${PREFIX}/nodejs/node_modules 37 | 38 | ENTRYPOINT bash 39 | -------------------------------------------------------------------------------- /dockerfiles/runtimes/python: -------------------------------------------------------------------------------- 1 | ARG GDAL_VERSION_TAG=x 2 | ARG RUNTIME_VERSION=x 3 | 4 | FROM ghcr.io/lambgeo/lambda-gdal:${GDAL_VERSION_TAG} AS gdal 5 | 6 | FROM public.ecr.aws/lambda/python:${RUNTIME_VERSION} 7 | ARG PKG_INSTALLER 8 | ARG NUMPY_VERSION 9 | 10 | LABEL maintainer="lambgeo " 11 | 12 | ENV \ 13 | LANG=en_US.UTF-8 \ 14 | LC_ALL=en_US.UTF-8 \ 15 | CFLAGS="--std=c99" 16 | 17 | RUN ${PKG_INSTALLER} install -y gcc gcc-c++ && \ 18 | ${PKG_INSTALLER} clean all 19 | 20 | RUN \ 21 | python -m pip install pip -U \ 22 | && python -m pip install --upgrade setuptools \ 23 | && python -m pip install cython numpy==${NUMPY_VERSION} wheel --no-binary numpy 24 | 25 | # The PREFIX should be the same as in gdal{version}:latest 26 | # When building rasterio, setup.py will get libs directoy from gdal-config 27 | # $ gdal-config --libs 28 | # -L/opt/lib -lgdal 29 | ENV PREFIX=/opt 30 | 31 | COPY --from=gdal /opt/lib/ $PREFIX/lib/ 32 | COPY --from=gdal /opt/include/ $PREFIX/include/ 33 | COPY --from=gdal /opt/share/ $PREFIX/share/ 34 | COPY --from=gdal /opt/bin/ $PREFIX/bin/ 35 | 36 | ENV \ 37 | GDAL_DATA=$PREFIX/share/gdal \ 38 | PROJ_LIB=$PREFIX/share/proj \ 39 | GDAL_CONFIG=$PREFIX/bin/gdal-config \ 40 | GEOS_CONFIG=$PREFIX/bin/geos-config \ 41 | PATH=$PREFIX/bin:$PATH 42 | 43 | RUN export GDAL_VERSION=$(gdal-config --version) 44 | 45 | RUN mkdir ${PREFIX}/python 46 | 47 | ENTRYPOINT [ "bash" ] 48 | -------------------------------------------------------------------------------- /layer.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "region": "ap-northeast-1", 4 | "layers": [ 5 | { 6 | "name": "gdal38", 7 | "arn": "arn:aws:lambda:ap-northeast-1:524387336408:layer:gdal38:4", 8 | "version": 4 9 | } 10 | ] 11 | }, 12 | { 13 | "region": "ap-northeast-2", 14 | "layers": [ 15 | { 16 | "name": "gdal38", 17 | "arn": "arn:aws:lambda:ap-northeast-2:524387336408:layer:gdal38:4", 18 | "version": 4 19 | } 20 | ] 21 | }, 22 | { 23 | "region": "ap-south-1", 24 | "layers": [ 25 | { 26 | "name": "gdal38", 27 | "arn": "arn:aws:lambda:ap-south-1:524387336408:layer:gdal38:4", 28 | "version": 4 29 | } 30 | ] 31 | }, 32 | { 33 | "region": "ap-southeast-1", 34 | "layers": [ 35 | { 36 | "name": "gdal38", 37 | "arn": "arn:aws:lambda:ap-southeast-1:524387336408:layer:gdal38:4", 38 | "version": 4 39 | } 40 | ] 41 | }, 42 | { 43 | "region": "ap-southeast-2", 44 | "layers": [ 45 | { 46 | "name": "gdal38", 47 | "arn": "arn:aws:lambda:ap-southeast-2:524387336408:layer:gdal38:4", 48 | "version": 4 49 | } 50 | ] 51 | }, 52 | { 53 | "region": "ca-central-1", 54 | "layers": [ 55 | { 56 | "name": "gdal38", 57 | "arn": "arn:aws:lambda:ca-central-1:524387336408:layer:gdal38:4", 58 | "version": 4 59 | } 60 | ] 61 | }, 62 | { 63 | "region": "eu-central-1", 64 | "layers": [ 65 | { 66 | "name": "gdal38", 67 | "arn": "arn:aws:lambda:eu-central-1:524387336408:layer:gdal38:4", 68 | "version": 4 69 | } 70 | ] 71 | }, 72 | { 73 | "region": "eu-north-1", 74 | "layers": [ 75 | { 76 | "name": "gdal38", 77 | "arn": "arn:aws:lambda:eu-north-1:524387336408:layer:gdal38:4", 78 | "version": 4 79 | } 80 | ] 81 | }, 82 | { 83 | "region": "eu-west-1", 84 | "layers": [ 85 | { 86 | "name": "gdal38", 87 | "arn": "arn:aws:lambda:eu-west-1:524387336408:layer:gdal38:4", 88 | "version": 4 89 | } 90 | ] 91 | }, 92 | { 93 | "region": "eu-west-2", 94 | "layers": [ 95 | { 96 | "name": "gdal38", 97 | "arn": "arn:aws:lambda:eu-west-2:524387336408:layer:gdal38:4", 98 | "version": 4 99 | } 100 | ] 101 | }, 102 | { 103 | "region": "eu-west-3", 104 | "layers": [ 105 | { 106 | "name": "gdal38", 107 | "arn": "arn:aws:lambda:eu-west-3:524387336408:layer:gdal38:4", 108 | "version": 4 109 | } 110 | ] 111 | }, 112 | { 113 | "region": "sa-east-1", 114 | "layers": [ 115 | { 116 | "name": "gdal38", 117 | "arn": "arn:aws:lambda:sa-east-1:524387336408:layer:gdal38:4", 118 | "version": 4 119 | } 120 | ] 121 | }, 122 | { 123 | "region": "us-east-1", 124 | "layers": [ 125 | { 126 | "name": "gdal38", 127 | "arn": "arn:aws:lambda:us-east-1:524387336408:layer:gdal38:4", 128 | "version": 4 129 | } 130 | ] 131 | }, 132 | { 133 | "region": "us-east-2", 134 | "layers": [ 135 | { 136 | "name": "gdal38", 137 | "arn": "arn:aws:lambda:us-east-2:524387336408:layer:gdal38:4", 138 | "version": 4 139 | } 140 | ] 141 | }, 142 | { 143 | "region": "us-west-1", 144 | "layers": [ 145 | { 146 | "name": "gdal38", 147 | "arn": "arn:aws:lambda:us-west-1:524387336408:layer:gdal38:4", 148 | "version": 4 149 | } 150 | ] 151 | }, 152 | { 153 | "region": "us-west-2", 154 | "layers": [ 155 | { 156 | "name": "gdal38", 157 | "arn": "arn:aws:lambda:us-west-2:524387336408:layer:gdal38:4", 158 | "version": 4 159 | } 160 | ] 161 | } 162 | ] 163 | -------------------------------------------------------------------------------- /scripts/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | GDAL_VERSION=$1 4 | GDAL_VERSION_TAG=${GDAL_VERSION%.*} 5 | RUNTIME=$2 6 | RUNTIME_VERSION=$3 7 | 8 | echo "Building image for AWS Lambda | GDAL: ${GDAL_VERSION} | Runtime: ${RUNTIME}:${RUNTIME_VERSION}" 9 | 10 | docker buildx build \ 11 | --platform=linux/amd64 \ 12 | --build-arg GDAL_VERSION=${GDAL_VERSION} \ 13 | -f dockerfiles/Dockerfile \ 14 | -t ghcr.io/lambgeo/lambda-gdal:${GDAL_VERSION_TAG} . 15 | 16 | docker buildx build \ 17 | --platform=linux/amd64 \ 18 | --build-arg GDAL_VERSION_TAG=${GDAL_VERSION_TAG} \ 19 | --build-arg RUNTIME_VERSION=${RUNTIME_VERSION} \ 20 | -f dockerfiles/runtimes/${RUNTIME} \ 21 | -t ghcr.io/lambgeo/lambda-gdal:${GDAL_VERSION_TAG}-${RUNTIME}${RUNTIME_VERSION} . 22 | -------------------------------------------------------------------------------- /scripts/create-layer.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "-----------------------" 3 | echo "Creating lambda layer" 4 | echo "-----------------------" 5 | 6 | yum install -y zip binutils 7 | 8 | echo "Remove useless files" 9 | rm -rdf $PREFIX/share/doc \ 10 | && rm -rdf $PREFIX/share/man \ 11 | && rm -rdf $PREFIX/share/cryptopp \ 12 | && rm -rdf $PREFIX/share/hdf* 13 | 14 | echo "Strip shared libraries" 15 | cd $PREFIX && find lib/ -type f -name \*.so\* -exec strip {} \; 16 | 17 | echo "Create archives" 18 | cd $PREFIX && zip -r9q --symlinks /tmp/package.zip lib/*.so* 19 | cd $PREFIX && zip -r9q --symlinks /tmp/package.zip share 20 | cd $PREFIX && zip -r9q --symlinks /tmp/package.zip bin/gdal* bin/ogr* bin/geos* bin/nearblack bin/postgres bin/pg_* bin/proj* 21 | 22 | cp /tmp/package.zip /local/package.zip 23 | -------------------------------------------------------------------------------- /scripts/deploy.py: -------------------------------------------------------------------------------- 1 | """Deploy aws lambda layer.""" 2 | 3 | import click 4 | 5 | from boto3.session import Session as boto3_session 6 | from botocore.client import Config 7 | 8 | AWS_REGIONS = [ 9 | "ap-northeast-1", 10 | "ap-northeast-2", 11 | "ap-south-1", 12 | "ap-southeast-1", 13 | "ap-southeast-2", 14 | "ca-central-1", 15 | "eu-central-1", 16 | "eu-north-1", 17 | "eu-west-1", 18 | "eu-west-2", 19 | "eu-west-3", 20 | "sa-east-1", 21 | "us-east-1", 22 | "us-east-2", 23 | "us-west-1", 24 | "us-west-2", 25 | ] 26 | 27 | 28 | CompatibleRuntimes_al2 = [ 29 | "nodejs22.x", 30 | "nodejs20.x", 31 | "nodejs18.x", 32 | "python3.13", 33 | "python3.12", 34 | "python3.11", 35 | "python3.10", 36 | "python3.9", 37 | "java21", 38 | "java17", 39 | "java11", 40 | "java8.al2", 41 | "dotnet8", 42 | "dotnet6", 43 | "ruby3.3", 44 | "ruby3.2", 45 | "provided.al2023", 46 | "provided.al2", 47 | ] 48 | 49 | 50 | @click.command() 51 | @click.argument('gdalversion', type=str) 52 | @click.option('--deploy', is_flag=True) 53 | def main(gdalversion, deploy): 54 | """Build and Deploy Layers.""" 55 | gdalversion_nodot = gdalversion.replace(".", "") 56 | layer_name = f"gdal{gdalversion_nodot}" 57 | description = f"Lambda Layer with GDAL{gdalversion} for amazonlinux2" 58 | 59 | if deploy: 60 | session = boto3_session() 61 | 62 | # Increase connection timeout to work around timeout errors 63 | config = Config(connect_timeout=6000, retries={'max_attempts': 5}) 64 | 65 | click.echo(f"Deploying {layer_name}", err=True) 66 | for region in AWS_REGIONS: 67 | click.echo(f"AWS Region: {region}", err=True) 68 | client = session.client("lambda", region_name=region, config=config) 69 | 70 | click.echo("Publishing new version", err=True) 71 | with open("package.zip", 'rb') as zf: 72 | res = client.publish_layer_version( 73 | LayerName=layer_name, 74 | Content={"ZipFile": zf.read()}, 75 | CompatibleRuntimes=CompatibleRuntimes_al2, 76 | Description=description, 77 | LicenseInfo="MIT" 78 | ) 79 | 80 | click.echo("Adding permission", err=True) 81 | client.add_layer_version_permission( 82 | LayerName=layer_name, 83 | VersionNumber=res["Version"], 84 | StatementId='make_public', 85 | Action='lambda:GetLayerVersion', 86 | Principal='*', 87 | ) 88 | 89 | 90 | if __name__ == '__main__': 91 | main() 92 | -------------------------------------------------------------------------------- /scripts/list.py: -------------------------------------------------------------------------------- 1 | 2 | import json 3 | from boto3.session import Session as boto3_session 4 | 5 | AWS_REGIONS = [ 6 | "ap-northeast-1", 7 | "ap-northeast-2", 8 | "ap-south-1", 9 | "ap-southeast-1", 10 | "ap-southeast-2", 11 | "ca-central-1", 12 | "eu-central-1", 13 | "eu-north-1", 14 | "eu-west-1", 15 | "eu-west-2", 16 | "eu-west-3", 17 | "sa-east-1", 18 | "us-east-1", 19 | "us-east-2", 20 | "us-west-1", 21 | "us-west-2", 22 | ] 23 | layers = [ 24 | # "gdal24", # archive 25 | # "gdal31", # archive 26 | # "gdal32", # archive 27 | # "gdal24-al2", # archive 28 | # "gdal31-al2", # archive 29 | # "gdal32-al2", # archive 30 | # "gdal33-al2", # archive 31 | # "gdal35", # archive 32 | # "gdal36", # archive 33 | "gdal38", 34 | ] 35 | 36 | 37 | def main(): 38 | results = [] 39 | for region in AWS_REGIONS: 40 | res = {"region": region, "layers": []} 41 | 42 | session = boto3_session(region_name=region) 43 | client = session.client("lambda") 44 | for layer in layers: 45 | response = client.list_layer_versions(LayerName=layer) 46 | latest = response["LayerVersions"][0] 47 | res["layers"].append(dict( 48 | name=layer, 49 | arn=latest["LayerVersionArn"], 50 | version=latest["Version"] 51 | )) 52 | results.append(res) 53 | 54 | print(json.dumps(results)) 55 | 56 | 57 | if __name__ == '__main__': 58 | main() 59 | -------------------------------------------------------------------------------- /tests/fixtures/MSK_CLOUDS_B00.gfs: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /tests/fixtures/MSK_CLOUDS_B00.gml: -------------------------------------------------------------------------------- 1 | 2 | 3 | MSK_CLOUDS pixels mask from data-strip S2B_OPER_MSK_CLOUDS_MPS__20181019T065257_A008434_T09XXA_B00_MSIL1C 4 | 5 | 6 | -------------------------------------------------------------------------------- /tests/fixtures/POLYGON.dbf: -------------------------------------------------------------------------------- 1 | w 2 | ! -------------------------------------------------------------------------------- /tests/fixtures/POLYGON.prj: -------------------------------------------------------------------------------- 1 | GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] -------------------------------------------------------------------------------- /tests/fixtures/POLYGON.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lambgeo/docker-lambda/83c3559cc5960cf7d44d195e699a83c252e975ec/tests/fixtures/POLYGON.shp -------------------------------------------------------------------------------- /tests/fixtures/POLYGON.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lambgeo/docker-lambda/83c3559cc5960cf7d44d195e699a83c252e975ec/tests/fixtures/POLYGON.shx -------------------------------------------------------------------------------- /tests/fixtures/cog.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lambgeo/docker-lambda/83c3559cc5960cf7d44d195e699a83c252e975ec/tests/fixtures/cog.tif -------------------------------------------------------------------------------- /tests/fixtures/cog_jpeg.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lambgeo/docker-lambda/83c3559cc5960cf7d44d195e699a83c252e975ec/tests/fixtures/cog_jpeg.tif -------------------------------------------------------------------------------- /tests/fixtures/cog_lerc.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lambgeo/docker-lambda/83c3559cc5960cf7d44d195e699a83c252e975ec/tests/fixtures/cog_lerc.tif -------------------------------------------------------------------------------- /tests/fixtures/cog_webp.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lambgeo/docker-lambda/83c3559cc5960cf7d44d195e699a83c252e975ec/tests/fixtures/cog_webp.tif -------------------------------------------------------------------------------- /tests/fixtures/cog_zstd.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lambgeo/docker-lambda/83c3559cc5960cf7d44d195e699a83c252e975ec/tests/fixtures/cog_zstd.tif -------------------------------------------------------------------------------- /tests/fixtures/map.geojson: -------------------------------------------------------------------------------- 1 | {"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-79.716796875,44.715513732021336],[-54.755859375,44.715513732021336],[-54.755859375,63.03503931552975],[-79.716796875,63.03503931552975],[-79.716796875,44.715513732021336]]]}}]} -------------------------------------------------------------------------------- /tests/tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | version=$(gdal-config --version) 4 | echo Running tests for GDAL ${version} 5 | 6 | echo "Checking formats" 7 | if [[ ! "$(gdal-config --prefix | grep $PREFIX)" ]]; then echo "NOK" && exit 1; fi 8 | if [[ ! "$(gdal-config --formats | grep 'JP2OpenJPEG')" ]]; then echo "JP2OpenJPEG NOK" && exit 1; fi 9 | if [[ ! "$(gdal-config --formats | grep 'GTIFF')" ]]; then echo "GTIFF NOK" && exit 1; fi 10 | if [[ ! "$(gdal-config --formats | grep 'MBTiles')" ]]; then echo "MBTiles NOK" && exit 1; fi 11 | if [[ ! "$(gdal-config --formats | grep 'WEBP')" ]]; then echo "WEBP NOK" && exit 1; fi 12 | if [[ ! "$(gdal-config --formats | grep 'JPEG')" ]]; then echo "JPEG NOK" && exit 1; fi 13 | if [[ ! "$(gdal-config --formats | grep 'PNG')" ]]; then echo "PNG NOK" && exit 1; fi 14 | if [[ ! "$(gdal-config --formats | grep 'netCDF')" ]]; then echo "netCDF NOK" && exit 1; fi 15 | if [[ ! "$(gdal-config --formats | grep 'Zarr')" ]]; then echo "Zarr NOK" && exit 1; fi 16 | if [[ ! "$(gdal-config --formats | grep 'HDF5')" ]]; then echo "HDF5 NOK" && exit 1; fi 17 | if [[ ! "$(gdal-config --formats | grep 'HDF4')" ]]; then echo "HDF4 NOK" && exit 1; fi 18 | if [[ ! "$(ogrinfo --formats | grep 'GML')" ]]; then echo "GLM NOK" && exit 1; fi 19 | if [[ ! "$(ogrinfo --formats | grep 'PostgreSQL')" ]]; then echo "PostgreSQL NOK" && exit 1; fi 20 | if [[ ! "$(ogrinfo --formats | grep 'DXF')" ]]; then echo "DXF NOK" && exit 1; fi 21 | echo "OK" 22 | 23 | echo "Checking sqlite build" 24 | if [[ ! "$(ldd $PREFIX/bin/gdalwarp | grep '/opt/bin/../lib/libsqlite3')" ]]; then echo "gdalwarp libsql NOK" && exit 1; fi 25 | if [[ ! "$(ldd $PREFIX/lib/libgdal.so | grep '/opt/lib/libsqlite3')" ]]; then echo "libgdal libsql NOK" && exit 1; fi 26 | if [[ ! "$(ldd $PREFIX/lib/libproj.so | grep '/opt/lib/libsqlite3')" ]]; then echo "libproj libsql NOK" && exit 1; fi 27 | if [[ ! "$(ldd $PREFIX/lib/libgeotiff.so | grep '/opt/lib/libsqlite3')" ]]; then echo "libgeotiff libsql NOK" && exit 1; fi 28 | echo "OK" 29 | 30 | echo "Checking OGR" 31 | if [[ ! "$(ogrinfo /local/tests/fixtures/map.geojson | grep 'successful')" ]]; then echo "NOK" && exit 1; fi 32 | if [[ ! "$(ogrinfo /local/tests/fixtures/POLYGON.shp | grep 'successful')" ]]; then echo "NOK" && exit 1; fi 33 | if [[ ! "$(ogrinfo /local/tests/fixtures/MSK_CLOUDS_B00.gml | grep 'successful')" ]]; then echo "NOK" && exit 1; fi 34 | if [[ ! "$(ogrinfo /local/tests/fixtures/square.dxf | grep 'successful')" ]]; then echo "NOK" && exit 1; fi 35 | echo "OK" 36 | 37 | if [ "${version}" != "2.4.4" ]; then 38 | # for GDAL >=3.1 39 | echo "Checking PROJ_NETWORK:" 40 | if [[ ! "$(PROJ_NETWORK=ON projinfo --remote-data | grep 'Status: enabled')" ]]; then echo "NOK" && exit 1; fi 41 | if [[ ! "$(projinfo --remote-data | grep 'Status: disabled')" ]]; then echo "NOK" && exit 1; fi 42 | echo "OK" 43 | fi 44 | 45 | echo "Checking Reading COG" 46 | if [[ ! "$(gdal_translate /local/tests/fixtures/cog.tif /tmp/tmp.tif | grep "done.")" ]]; then echo "NOK" && exit 1; fi 47 | if [[ ! "$(gdal_translate /local/tests/fixtures/cog_webp.tif /tmp/tmp.tif | grep "done.")" ]]; then echo "NOK" && exit 1; fi 48 | if [[ ! "$(gdal_translate /local/tests/fixtures/cog_jpeg.tif /tmp/tmp.tif | grep "done.")" ]]; then echo "NOK" && exit 1; fi 49 | if [[ ! "$(gdal_translate /local/tests/fixtures/cog_zstd.tif /tmp/tmp.tif | grep "done.")" ]]; then echo "NOK" && exit 1; fi 50 | if [[ ! "$(gdal_translate /local/tests/fixtures/cog_lerc.tif /tmp/tmp.tif | grep "done.")" ]]; then echo "NOK" && exit 1; fi 51 | echo "OK" 52 | 53 | exit 0 54 | --------------------------------------------------------------------------------