├── .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 |
6 |
7 |
8 | Amazonlinux Docker images and AWS Lambda layers with GDAL.
9 |
10 |
11 |
12 |
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 |
--------------------------------------------------------------------------------