• Stars
    star
    212
  • Rank 186,122 (Top 4 %)
  • Language
    JavaScript
  • License
    Apache License 2.0
  • Created almost 7 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Javascript wrapper for GDAL in the browser

A wrapper for running GDAL in the browser using gdal-js

Installation

npm install loam

Assuming you are using a build system, the main loam library should integrate into your build the same as any other library might. However, in order to correctly initialize the Emscripten environment for running GDAL, there are other assets that need to be accessible via HTTP request at runtime, but which should not be included in the main application bundle. Specifically, these are:

  • loam-worker.js: This is the "backend" of the library; it initializes the Web Worker and translates between the Loam "frontend" and GDAL.
  • gdal.js: This initializes the Emscripten runtime and loads the GDAL WebAssembly.
  • gdal.wasm: The GDAL binary, compiled to WebAssembly.
  • gdal.data: Contains configuration files that GDAL expects to find on the host filesystem.

All of these files will be included in the node_modules folder after running npm install loam, but it is up to you to integrate them into your development environment and deployment processes. Unfortunately, support for WebAssembly and Web Workers is still relatively young, so many build tools do not yet have a straightforward out-of-the-box solution that will work. However, in general, treating the four files above similarly to static assets (e.g. images, videos, or PDFs) tends to work fairly well. An example for Create React App is given below.

Create React App

When integrating Loam with a React app that was initialized using Create React App, the simplest thing to do is probably to copy the assets above into the /public folder, like so:

cp node_modules/gdal-js/gdal.* node_modules/loam/lib/loam-worker.js public/

This will cause the CRA build system to copy these files into the build folder untouched, where they can then be accessed by URL (e.g. http://localhost:3000/gdal.wasm). However, this has the disadvantage that you will need to commit the copied files to source control, and they won't be updated if you update Loam. A way to work around this is to put symlinks in /public instead:

ln -s ../node_modules/loam/lib/loam-worker.js public/loam-worker.js
ln -s ../node_modules/gdal-js/gdal.wasm public/gdal.wasm
ln -s ../node_modules/gdal-js/gdal.data public/gdal.data
ln -s ../node_modules/gdal-js/gdal.js public/gdal.js

API Documentation

Basic usage

import loam from "loam";

// Load WebAssembly and data files asynchronously. Will be called automatically by loam.open()
// but it is often helpful for responsiveness to pre-initialize because these files are fairly large. Returns a promise.
loam.initialize();

// Assuming you have a `Blob` object from somewhere. `File` objects also work.
loam.open(blob).then((dataset) => {
  dataset.width()
    .then((width) => /* do stuff with width */);

Functions

loam.initialize(pathPrefix, gdalPrefix)

Manually set up web worker and initialize Emscripten runtime. This function is called automatically by other functions on loam. Returns a promise that is resolved when Loam is fully initialized.

Although this function is called automatically by other functions, such as loam.open(), it is often beneficial for user experience to manually call loam.initialize(), because it allows pre-fetching Loam's WebAssembly assets (which are several megabytes uncompressed) at a time when the latency required to download them will be least perceptible by the user. For example, loam.initialize() could be called when the user clicks a button to open a file-selection dialog, allowing the WebAssembly to load in the background while the user selects a file.

This function is safe to call multiple times.

Parameters

  • pathPrefix (optional): The path or URL that Loam should use as a prefix when fetching its Web Worker. If left undefined, Loam will make a best guess based on the source path of its own <script> element. If Loam has no <script> element (e.g. because you are using dynamic imports), then autodetecting a prefix will fail and this parameter must be provided. URLs with domains may be used to enable Loam to be loaded from CDNs like unpkg, but the file name should be left off.
  • gdalPrefix (optional): The path or URL that Loam should use as a prefix when fetching WebAssembly assets for GDAL. If left undefined, Loam will use the same value as pathPrefix. URLs with domains may be used to enable loading from CDNs like unpkg, but the file name should be left off. If Loam fails to work properly and you see requests resulting in 404s or other errors for the gdal.* assets listed above, you will need to set pathPrefix, or this parameter, or both, to the correct locations where Loam can find those assets.

Return value

A promise that resolves when Loam is initialized. All of the functions described in this document wait for this promise's resolution when executing, so paying attention to whether this promise has resolved or not is not required. However, it may be helpful to do so in some circumstances, for example, if you want to display a visual indicator that your app is ready.


loam.open(file, sidecars)

Creates a new GDAL Dataset.

Parameters

  • file: A Blob or File object that should be opened with GDAL. GDAL is compiled with TIFF, PNG, and JPEG support. If you have a Blob, you may also control the name of the file that is shown to GDAL on the virtual filesystem by passing an object with the shape {name: string, data: Blob}. This can be useful if you are relying on GDAL behavior that uses file extensions to determine formats.
  • sidecars: An array of additional files that will be made present in the virtual file system when opening file. Some data formats are composed of multiple files (for example, Shapefiles have .shp, .shx, and .prj files, among others). If you need to include multiple files in order to open a dataset, pass the "main" file as file, and pass the others to sidecars. For a Shapefile, this would mean passing the .shp file as file and the .shx, .prj, and friends to sidecars. If file is a File, then sidecars must be an Array<File>. If file is a Blob or Object (see above), then sidecars must be an Array<Object> where each element has the shape {name: string, data: Blob}.

Return value

A promise that resolves with an instance of GDALDataset.


loam.rasterize(geojson, args)

Burns vectors in GeoJSON format into rasters. This is the equivalent of the gdal_rasterize command.

Note: This returns a new GDALDataset object but does not perform any immediate calculation. Instead, calls to .rasterize() are evaluated lazily (as with convert() and warp(), below). The rasterization operation is only evaluated when necessary in order to access some property of the dataset, such as its size, bytes, or band count. Successive calls to .warp() and .convert() can be lazily chained onto datasets produced via loam.rasterize().

Parameters

  • geojson: A Javascript object (not a string) in GeoJSON format.
  • args: An array of strings, each representing a single command-line argument accepted by the gdal_rasterize command. The src_datasource and dst_filename parameters should be omitted; these are handled internally by Loam. Example (assuming you have a properly structured GeoJSON object): loam.rasterize(geojson, ['-burn', '1.0', '-of', 'GTiff', '-ts', '200', '200'])

Return value

A promise that resolves to a new GDALDataset.


loam.reproject(fromCRS, toCRS, coords)

Reproject coordinates from one coordinate system to another using PROJ.4.

Parameters

  • fromCRS: A WKT-formatted string representing the source CRS.
  • toCRS: A WKT-formatted string representing the destination CRS.
  • coords: An array of [x, y] coordinate pairs.

Return value

A promise that resolves with an array of transformed coordinate pairs.


loam.reset()

Tear down Loam's internal Web Worker. This will cause initialize() to create a new Web Worker the next time it is called.

Note: This exists primarily to enable certain types of unit testing. It should not be necessary to call this function during normal usage of Loam. If you find that you are encountering a problem that loam.reset() solves, please open an issue

Parameters

  • None

Return value

A promise that resolves when the Web Worker has been terminated. This function waits for initialize() to complete or fail before tearing down the worker.


GDALDataset.close()

This used to be required in order to avoid memory leaks in earlier versions of Loam, but is currently a no-op. It has been maintained to preserve backwards compatibility, but has no effect other than to display a console warning.

Return value

A promise that resolves immediately with an empty list (for historical reasons).


GDALDataset.count()

Get the number of raster bands in the dataset.

Return value

A promise which resolves to the number of raster bands in the dataset.


GDALDataset.layerCount()

Get the number of vector layers in the dataset.

Return value

A promise which resolves to the number of vector layers in the dataset.


GDALDataset.width()

Get the width of the dataset, in pixels.

Return value

A promise which resolves to the width of the dataset, in pixels.


GDALDataset.height()

Get the height of the dataset, in pixels.

Return value

A promise which resolves to the height of the dataset, in pixels.


GDALDataset.wkt()

Get the coordinate reference system of the dataset, as a WKT-formatted string.

Return value

A promise which resolves with a WKT-formatted string representing the dataset's coordinate reference system.


GDALDataset.transform()

Get the affine transform of the dataset, as a list of six coefficients. This allows converting between pixel coordinates and geographic coordinates. See the GDAL documentation for further details.

Return value

A promise which resolves to the affine transform.


GDALDataset.bandMinimum(bandNum)

Get the actual minimum value or the minimum possible value of a band (depending on format).

Parameters

  • bandNum: The number of the band for which to get the minimum value. Band numbering starts at 1.

Return value

A promise which resolves to a minimum value for the specified band.


GDALDataset.bandMaximum(bandNum)

Get the actual maximum value or the maximum possible value of a band (depending on format).

Parameters

  • bandNum: The number of the band for which to get the maximum value. Band numbering starts at 1.

Return value

A promise which resolves to a maximum value for the specified band.


GDALDataset.bandStatistics(bandNum)

Get statistics about the values in a band.

Parameters

  • bandNum: The number of the band for which to get statistics. Band numbering starts at 1.

Return value

A promise which resolves to an object containing statistics. The shape of the object will be:

{
  minimum: The calculated minimum value of the band
  maximum: The calculated minimum value of the band
  median: The calculated median value of the band
  stdDev: The calculated standard deviation of the band
}

GDALDataset.bandNoDataValue(bandNum)

Get the value representing "no data" within the band.

Parameters

  • bandNum: The number of the band for which to get the no-data value. Band numbering starts at 1.

Return value

A promise which resolves to the no-data value for the specified band.


GDALDataset.bandDataType(bandNum)

Get the data type of the band (Byte, UInt16, Float32, etc.)

Parameters

  • bandNum: The number of the band for which to get the data type. Band numbering starts at 1.

Return value

A promise which resolves to a string containing the name of the data type for the specified band. For example, 'Byte', 'Float32', etc.


GDALDataset.bytes()

Get the on-disk representation of the dataset, as an array of bytes.

Return value

A promise which resolves to a Uint8Array containing the bytes of the dataset.


GDALDataset.convert(args)

Converts raster data between different formats. This is the equivalent of the gdal_translate command.

Note: This returns a new GDALDataset object but does not perform any immediate calculation. Instead, calls to .convert() and .warp() are evaluated lazily. Each successive call to .convert() or .warp() is stored in a list of operations on the dataset object. These operations are only evaluated when necessary in order to access some property of the dataset, such as its size, bytes, or band count.

Parameters

  • args: An array of strings, each representing a single command-line argument accepted by the gdal_translate command. The src_dataset and dst_dataset parameters should be omitted; these are handled by GDALDataset. Example: ds.convert(['-outsize', '200%', '200%'])

Return value

A promise that resolves to a new GDALDataset.


GDALDataset.vectorConvert(args)

Converts vector data between different formats. This is the equivalent of the ogr2ogr command.

Note: This returns a new GDALDataset object but does not perform any immediate calculation. Instead, calls to .vectorConvert() are evaluated lazily. Each successive call to .vectorConvert() is stored in a list of operations on the dataset object. These operations are only evaluated when necessary in order to access some property of the dataset, such as its size, bytes, or layer count.

Parameters

  • args: An array of strings, each representing a single command-line argument accepted by the ogr2ogr command. The dst_datasource_name and src_datasource_name parameters should be omitted; these are handled by GDALDataset. Example: ds.vectorConvert(['-f', 'GeoJSON']).

Return value

A promise that resolves to a new GDALDataset.


GDALDataset.warp(args)

Image reprojection and warping utility. This is the equivalent of the gdalwarp command.

Note: This returns a new GDALDataset object but does not perform any immediate calculation. Instead, calls to .convert() and .warp() are evaluated lazily. Each successive call to .convert() or .warp() is stored in a list of operations on the dataset object. These operations are only evaluated when necessary in order to access some property of the dataset, such as its size, bytes, or band count.

Parameters

  • args: An array of strings, each representing a single command-line argument accepted by the gdalwarp command. The srcfile and dstfile parameters should be omitted; these are handled by GDALDataset. Example: ds.warp(['-s_srs', 'EPSG:3857', '-t_srs', 'EPSG:4326'])

Return value

A promise that resolves to a new GDALDataset.


GDALDataset.render(mode, args, colors)

Utility for rendering and computing DEM metrics. This is the equivalent of the gdaldem command.

Note: This returns a new GDALDataset object but does not perform any immediate calculation. Instead, calls to .render() are evaluated lazily (as with convert() and warp(), above). The render operation is only evaluated when necessary in order to access some property of the dataset, such as its size, bytes, or band count. Successive calls to .warp() and .convert() can be lazily chained onto datasets produced by .render(), and vice-versa.

Parameters

  • mode: One of ['hillshade', 'slope','aspect', 'color-relief', 'TRI', 'TPI', 'roughness']. See the gdaldem documentation for an explanation of the function of each mode.
  • args: An array of strings, each representing a single command-line argument accepted by the gdaldem command. The inputdem and output_xxx_map parameters should be omitted; these are handled by GDALDataset. Example: ds.render('hillshade', ['-of', 'PNG'])
  • colors: If (and only if) mode is equal to 'color-relief', an array of strings representing lines in the color text file. Example: ds.render('color-relief', ['-of', 'PNG'], ['993.0 255 0 0']). See the gdaldem documentation for an explanation of the text file syntax.

Return value

A promise that resolves to a new GDALDataset.

Developing

Yarn and NVM are required.

After cloning,

  1. nvm use
  2. yarn install
  3. yarn dev and in another session yarn test:watch

Built assets are placed in lib.

Demo page

There is a (very!) simple demo page available that utilizes Loam to print info about a GeoTIFF. To view it in a browser, run yarn demo, and then navigate to http://localhost:8080/ . You can use this site for things like:

  • Playing around with Loam by editing the source code in demo/index.js
  • Validating changes that are difficult to test fully in CI

Editing Loam or the source in demo/ should auto-reload.

Contributing

Contributions are welcomed! Please feel free to work on any of the open issues or open an issue describing the changes you'd like to make. All contributions will be licensed under the Apache License, as per the GitHub Terms of Service.

More Repositories

1

raster-vision

An open source library and framework for deep learning on satellite and aerial imagery.
Python
2,032
star
2

Open-Data-Catalog

Open Data Catalog is an open data catalog based on Django, Python and PostgreSQL. It was originally developed for OpenDataPhilly.org, a portal that provides access to open data sets, applications, and APIs related to the Philadelphia region. The Open Data Catalog is a generalized version of the original source code with a simple skin. It is intended to display information and links to publicly available data in an easily searchable format. The code also includes options for data owners to submit data for consideration and for registered public users to nominate a type of data they would like to see openly available to the public.
Python
238
star
3

django-queryset-csv

a CSV exporter for django querysets
Python
187
star
4

raster-vision-examples

Examples of using Raster Vision on open datasets
Jupyter Notebook
171
star
5

tilegarden

Serverless raster and vector map tile generation using Mapnik and AWS Lambda
JavaScript
97
star
6

django-amazon-ses

A Django email backend that uses Boto3 to interact with Amazon Simple Email Service (SES).
Python
84
star
7

osmesa

OSMesa is an OpenStreetMap processing stack based on GeoTrellis and Apache Spark
Scala
80
star
8

terraform-aws-ecs-cluster

A Terraform module to create an Amazon Web Services (AWS) EC2 Container Service (ECS) cluster.
HCL
78
star
9

franklin

A STAC/OGC API Features Web Service
Scala
75
star
10

ansible-spark

An Ansible role for installing Apache Spark.
Shell
58
star
11

terraform-aws-acm-certificate

A Terraform module to create an Amazon Certificate Manager (ACM) certificate with Route 53 DNS validation.
HCL
48
star
12

geowave-geomesa-comparative-analysis

This repository will host files and issues around the comparative analysis of GeoWave and GeoMesa
Jupyter Notebook
46
star
13

texturemap

Textures, patterns, and shapes that make web maps work for people with colorblindness. Built for Mapbox GL and MapLibre GL.
CSS
41
star
14

pfb-network-connectivity

PFB Bicycle Network Connectivity
Python
39
star
15

terraform-aws-emr-cluster

A Terraform module to create an Amazon Web Services (AWS) Elastic MapReduce (EMR) cluster.
HCL
39
star
16

python-omgeo

OMGeocoder - A python geocoding abstraction layer
Python
36
star
17

lambda-geotrellis-tile-server

Serve tiles serverlessly using geotrellis
Shell
34
star
18

terraform-aws-redis-elasticache

A Terraform module to create an Amazon Web Services (AWS) Redis ElastiCache cluster.
HCL
33
star
19

terraform-aws-cross-account-role

A Terraform module to create an IAM Role for Cross Account delegation.
HCL
33
star
20

raster-vision-qgis

QGIS 3 Plugin for Raster Vision (no longer maintained)
Python
32
star
21

terraform-aws-vpc

A Terraform module to create an Amazon Web Services (AWS) Virtual Private Cloud (VPC).
HCL
29
star
22

python-project-template

Azavea Data Analytics team template for Data Science projects
Dockerfile
29
star
23

docker-django

Base Docker image for Django and Gunicorn.
Shell
28
star
24

Leaflet.zoomdisplay

A plugin to show the current zoom level of a Leaflet map
JavaScript
27
star
25

terraform-aws-ecs-web-service

A Terraform module to create an Amazon Web Services (AWS) EC2 Container Service (ECS) service associated with an Application Load Balancer (ALB).
HCL
26
star
26

bus-plan

BusPlan: An open source effort to help students ride less time to get to school on time, and save our public school systems money through optimizations to their bus schedules.
Java
25
star
27

django-ecsmanage

Run any Django management command on an AWS Elastic Container Service (ECS) cluster.
Python
24
star
28

python-sld

A simple python library that enables dynamic SLD creation and manipulation.
Python
24
star
29

open-cities-ai-challenge-benchmark-model

Benchmark model for DrivenData Open Cities AI Challenge
Python
23
star
30

isprs-potsdam-viz

Viewer for Azavea's work on the ISPRS Potsdam image segmentation contest
JavaScript
21
star
31

mask-to-polygons

Routines for extracting and working with polygons from semantic segmentation masks
Python
21
star
32

ansible-papertrail

An ansible role for installing Papertrail
20
star
33

acs-alchemist

ACS Alchemist is a tool that can help you extract specific portions of the American Community Survey (ACS) in Shapefile format.
PLpgSQL
20
star
34

ansible-pip

An Ansible role for installing pip.
Python
19
star
35

raster-vision-aws

A CloudFormation template for deploying Raster Vision Batch jobs to AWS.
Makefile
17
star
36

react-leaflet-demo

Sample code to illustrate a blog post about using React and Leaflet
17
star
37

ansible-golang

An Ansible role for installing the Go programming language.
16
star
38

geo-data

This repository contains geographic data created by Azavea
HTML
15
star
39

cac-tripplanner

Clean Air Council Circuit Trip Planner and Travelshed
JavaScript
15
star
40

ansible-terraform

An Ansible role for installing Terraform.
Python
14
star
41

nyc-trees

NYC Parks Trees Count! 2015 tree census
Python
14
star
42

vagrant-cartodb

Ansible role to build a multi-machine vagrant setup for CartoDB
Ruby
13
star
43

ios-draggable-annotations-demo

Example Xcode projects showing how to build a custom, draggable MKAnnotationView
Objective-C
13
star
44

geotrellis-geomesa-template-project

Tutorial with Spark, GeoTrellis and GeoMesa examples
Shell
13
star
45

open-data-standards

A living document of existing open data standards and proposed new standards
CSS
13
star
46

grout

Formerly Ashlar. New repo rather than rename to preserve backwards compatibility
Python
13
star
47

ckanext-odp_theme

OpenDataPhilly CKAN customizations
HTML
13
star
48

geotrellis-collections-api-research

A research project to investigate using GeoTrellis as a REST service
JavaScript
13
star
49

ansible-celery

An Ansible role for installing Celery.
12
star
50

hot-osm-population

Estimate OSM building coverage completeness by comparing vs WorldPop raster
Scala
12
star
51

climate-change-risk-analysis

Weighted overlay of climate change risk factors
Jupyter Notebook
11
star
52

noaa-hydro-data

NOAA Phase 2 Hydrological Data Processing
Jupyter Notebook
11
star
53

transit-analyst

An interactive tool for exploring transit accessibility to target resources from focus areas.
JavaScript
11
star
54

docker-openjdk-gdal

Base Docker image for GDAL with Java bindings.
Shell
10
star
55

ansible-postgresql

An Ansible role for installing PostgreSQL.
10
star
56

opendataphilly-jkan

OpenDataPhilly powered by JKAN
HTML
10
star
57

ansible-kibana

An Ansible role for installing Kibana.
Ruby
9
star
58

mos-energy-benchmark

JavaScript
9
star
59

nasa-hyperspectral

An event-driven image processing pipeline for developing our foundational capability to work with HSI data sources.
Jupyter Notebook
9
star
60

onramp

Generate OSM augmented diffs from OSM change files without Overpass
Python
9
star
61

ansible-elasticsearch

An Ansible role for installing ElasticSearch.
Ruby
8
star
62

django-sld

A django library that uses python-sld to generate SLDs, based on django models.
Python
8
star
63

ansible-collectd

An Ansible role for installing Collectd.
Ruby
8
star
64

cloud-buster

Sentinel-2 L1C and L2A Imagery with Fewer Clouds
Python
8
star
65

tilejson.io

A simple way to view, share and compare map layers.
JavaScript
8
star
66

raster-vision-fastai-plugin

PyTorch/fastai backend plugin for Raster Vision
Python
8
star
67

minifier

Merges, compresses, and lints your javascript (and css) files.
JavaScript
7
star
68

iow-boundary-tool

A tool for drawing water utility service area boundaries
JavaScript
7
star
69

noaa-flood-mapping

NOAA Flood Inundation Mapping
Python
7
star
70

terraform-aws-ecr-repository

A Terraform module to create an Amazon Web Services (AWS) Elastic Container Registry (ECR) repository.
HCL
6
star
71

osmesa-stat-server

temporary home of statistics server for processed OSM data
Shell
6
star
72

Leaflet.favorDoubleClick

Leaflet plugin to favor double-click events over single-click events
JavaScript
6
star
73

simple-raster-processing

Research into creating a web request raster processing pipeline using open source python tools
Python
6
star
74

hiveless

Scala API for Hive UDFs with the GIS extension
Scala
6
star
75

tilertwo

Publish static vector tile sets to S3 from GeoJSON with a single command
Python
6
star
76

terraform-aws-memcached-elasticache

A Terraform module to create an Amazon Web Services (AWS) Memcached ElastiCache cluster.
HCL
6
star
77

docker-terraform

A base Docker image for Terraform.
Shell
6
star
78

scala-landsat-util

Scala client for Developmentseed's landsat-api
Scala
6
star
79

cloud-model

Cloud Detection Model for Sentinel-2 Imagery (see https://registry.opendata.aws/sentinel-2/)
Python
5
star
80

ansible-aws-ena

An Ansible role for installing AWS Elastic Networking Adapter (ENA) drivers.
Python
5
star
81

ansible-gunicorn

An Ansible role for installing and configuring gunicorn.
5
star
82

docker-flask

Base Docker image for Flask and Gunicorn.
Shell
5
star
83

docker-postgis

Docker image for PostGIS
Shell
5
star
84

fastdao

An object-relational mapper for the .NET framework
Shell
5
star
85

raster-vision-tile2vec

Raster Vision plugin for tile2vec (https://arxiv.org/abs/1805.02855)
Python
5
star
86

foss4g-groundwork-hitl-infra

Infrastructure configuration for the GroundWork + Raster Vision human-in-the-loop workflow for FOSS4G 2021
Jupyter Notebook
5
star
87

azavea.g8

A Giter8 template for bootstrapping Scala projects at Azavea.
Scala
5
star
88

scaliper

Scaliper is a scala microbenchmarking toolkit based on Google Caliper.
Scala
5
star
89

climate-change-components

Angular components for use with the Climate Change API
TypeScript
5
star
90

gtfs-feed-fetcher

Fetch and validate transit feeds
Python
5
star
91

osm-analytics

generating statistics for open street map
Python
5
star
92

usace-flood-geoprocessing

Related to usace flood model viewer https://github.com/azavea/usace-flood-model
Scala
5
star
93

ansible-docker

An Ansible role for installing Docker.
5
star
94

svg-to-chakra-icon

Website for quickly converting SVG icon files into Chakra UI Icon components
JavaScript
4
star
95

terraform-aws-cloudtrail

A Terraform module to create an Amazon Web Services (AWS) CloudTrail Trail.
HCL
4
star
96

blend

Merge, analyze, and optimize client-side assets for web applications and static web sites.
JavaScript
4
star
97

ansible-hdfs

An Ansible role for installing Cloudera HDFS.
Ruby
4
star
98

coffee-button

An Amazon Lambda function that publishes messages to a Slack channel when an Amazon IoT button is pressed.
Python
4
star
99

geotensorflow

Shell
4
star
100

ansible-rds-ca-bundle

An Ansible role for installing the Amazon Relational Database Service (RDS) certificate bundle.
Ruby
4
star