geospacial-engineering/docs/setup/README.md

156 lines
4.7 KiB
Markdown

# Docker PostGIS and PGAdmin
In this article, I will show you how to:
1. Create a Postgis docker image `FROM postgres` and publish it to [hub.docker.com](https://hub.docker.com/).
2. Create a Geospacial Database environment in Docker Compose with PostGIS and PGAdmin4.
3. Use PGAdmin4 to create a database an enable Geospacial extensions.
## 1. Build a PostGIS Docker Image
- A `Dockerfile` contains instructions to build an image.
- Start by extending an existing PostgreSQL 10 Debian image: `FROM postgres:10`.
- Use `apt-get` to install required PostGIS extensions.
- Use `docker build` to create the image, then push it to docker hub.
### Creating the `Dockerfile`
```docker
# Extend exiting PostreSQL 10 Debian image: https://hub.docker.com/_/postgres/
FROM postgres:10
MAINTAINER Mihai Criveti
# Install PostGIS packages
RUN apt-get update
RUN apt-get install --no-install-recommends --yes \
postgresql-10-postgis-2.4 postgresql-10-postgis-2.4-scripts postgresql-contrib
```
### Building the image
- Turn the `Dockerfile` into a usable image using `docker build`.
- Tag the image with a namespace (the one used on Docker Hub): `cmihai`
```bash
docker build --tag cmihai/postgis .
```
### Uploading the image to Docker Hub
1. Push the Dockerfile, README and docker-compose.yaml examples to github
2. Test the image end to end
3. Push the image to docker hub
```bash
export DOCKER_ID_USER="username"
docker login
docker push
docker tag cmihai/postgis $DOCKER_ID_USER/my_image
docker push $DOCKER_ID_USER/my_image
```
## 2. Composing multiple images with docker compose
- PGAdmin4 is a web based PostgreSQL Administration and SQL Development environment.
- Docker Compose can link an existing [dpage/pgadmin4](https://hub.docker.com/r/dpage/pgadmin4/) image from Docker Hub to `cmihai/postgis`
- Login to [http://localhost:5050](http://localhost:5050) `admin`:`admin` after running `docker-compose up`
### Create `docker-compose.yaml`
```yaml
version: '3.1'
services:
postgis:
image: cmihai/postgis
container_name: postgis
ports:
- '5432:5432'
environment:
POSTGRES_PASSWORD: postgres
volumes:
- pgdata:/var/lib/postgresql/data
pgadmin4:
image: dpage/pgadmin4
container_name: pgadmin4
ports:
- '5050:80'
environment:
PGADMIN_DEFAULT_EMAIL: admin
PGADMIN_DEFAULT_PASSWORD: admin
links:
- postgis
volumes:
pgdata:
```
### Starting the services
Use `docker-compose up` to start the services:
```
docker-compose up
```
## 3. Create a database and enable PostGIS with PGAdmin4
1. Login to pgadmin4: [http://localhost:5050](http://localhost:5005) with admin:admin
2. Add a connection to postgis with user/pass `postgres`:`postgres` ![create-server.png](create-server.png)
3. Create a new database and call it `gis` ![create-database.png](create-database.png)
4. Open the SQL Query Tool on the newly created `gis` database:
In the Browser window, select *Servers > postgis > Databases > gis*, the run *Tools > Query Tool* from the *Menu*.
5. Run the following SQL code to enable postgis database extensions:
```sql
-- Enable PostGIS (includes raster)
CREATE EXTENSION postgis;
-- Enable Topology
CREATE EXTENSION postgis_topology;
-- Enable PostGIS Advanced 3D and other geoprocessing algorithms
CREATE EXTENSION postgis_sfcgal;
-- Fuzzy matching needed for Tiger
CREATE EXTENSION fuzzystrmatch;
-- Rule based standardizer
CREATE EXTENSION address_standardizer;
-- Example rule data set
CREATE EXTENSION address_standardizer_data_us;
-- Enable US Tiger Geocoder
CREATE EXTENSION postgis_tiger_geocoder;
```
### Expected Outcome: `gis` database with geospacial extensions
- `Query returned successfully`:
![enable-postgis.png](enable-postgis.png)
- *gis > Extensions* now lists a number of GIS extensions: `postgis, postgis_sfgal, postgis_tiger_geocoder, postgis_topology, fuzzystrmatch, address_standardizer and address_standardizer_data_us`.
- *gis > Schema > public > Functions* has been populated with a high number (1000+) of GIS specific functions.
- A new table called `spacial_ref_sys` is now available under *gis > Schemas > public > Tables*.
- New schemas: `tiger`, `tiger_data` and `topology` have been created.
### Next Steps:
- Load Geospacial data from shapefile, KML, GeoJSON, etc.
- Connect GIS Desktop clients such as QGIS.
- Connect to PostGIS using Python (ex: geopandas).
- Perform geospacial queries and analysis on the data.
## Links and Reference:
- Github Repository with Dockerfile and docker-compose.yaml: [https://github.com/crivetimihai/geospacial-engineering](https://github.com/crivetimihai/geospacial-engineering)
- Docker Image: [https://hub.docker/com](https://hub.docker.com)