Django-PostGIS-pgAdmin(Docker-Compose)

# Django-PostGIS-pgAdmin(Docker-Compose)
## 自分の勉強用備忘メモです。
## （注意）利用しているツールについて、古いものがあります。
######
自分用 : Docker folder 13

## 実行環境構築
### フォルダ構成
######
```
C:.
│  docker-compose.yml
│  Dockerfile
└─ requirements.txt
```

### docker-compose.yml
######
```yaml:docker-compose.yml
version: "3.9"
services:
  s_database:
      image: postgis/postgis:14-3.3
      container_name: c_postgis
      ports: 
        - 5432:5432
      volumes:
        - postgres_volume:/var/lib/postgresql/data
      environment:
        POSTGRES_DB: postgres
        POSTGRES_USER: postgres
        POSTGRES_PASSWORD: postgres
        POSTGRES_INITDB_ARGS: "--encoding=UTF-8"
      hostname: postgres
      restart: always
      user: root
  s_pgadmin:
      image: dpage/pgadmin4:5.0
      container_name: c_pgadmin4
      ports:
          - 8001:80
      volumes:
          - pgadmin4_volume:/var/lib/pgadmin
      environment:
          PGADMIN_DEFAULT_EMAIL: root
          PGADMIN_DEFAULT_PASSWORD: root
      hostname: pgadmin4
      depends_on:
        - s_database
      restart: always
  s_web:
    build: .
    container_name: c_django
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    links:
      - s_database
volumes:
  postgres_volume:
    external: true
  pgadmin4_volume:
    external: true
```

```dockerfile:dockerfile
FROM python:2.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
```

```text:requirements.txt
Django
psycopg2
```

### Volumeの作成
```powershell:powershell
docker volume create postgres_volume
docker volume create pgadmin4_volume

```

### 実行する
```powershell:powershell
docker-compose run s_web django-admin.py startproject composeexample .
```

### フォルダ構成
######
```
C:.
│  docker-compose.yml
│  Dockerfile
│  manage.py
│  requirements.txt
│  
└─composeexample
        settings.py
        settings.pyc
        urls.py
        urls.pyc
        wsgi.py
        wsgi.pyc
        __init__.py
        __init__.pyc
```

### 設定を修正する
```py:\composeexample\settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 's_database',
        'PORT': 5432,
    }
}
```

### 実行する
```powershell:powershell
docker-compose up
```

### 確認する
```
http://localhost:8000/
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438214/25dbbd4e-f65b-e982-a667-a9a237afa400.png)


### PostGISを有効化する
Databaseのコンテナに接続する
```powershell:powershell
psql -h 127.0.0.1 -p 5432 -U postgres
```

```sql:sql
CREATE EXTENSION postgis;
```

### テスト用のデータ作成
```sql:sql
CREATE TABLE test_gis (id serial primary key, name varchar(20), geom geometry(LINESTRING));

INSERT INTO test_gis (id, name, geom)
VALUES (
  1,
  'name1',
  ST_GeomFromText('LINESTRING(2 3,4 5,6 5,7 8)')
);

SELECT id, name, geom AS geom FROM test_gis;
```
引用元（一部加工編集）：[[docker] postgreSQL12 + PostGIS3 環境を作成する](https://www.hinomaruc.com/create-postgres12-postgis3-envionment-using-docker/)

### pgAdminで確認
```
http://localhost:8001/
```
ターミナルで出力されているIPアドレスでデータベースに接続する。
pgadmin4  | ::ffff:XXX.XXX.XXX.XXX

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438214/4035a291-ca40-0a4d-e081-7c330a555ff8.png)


######
参考＆引用：
[クイックスタート・ガイド：Compose と Django](https://docs.docker.jp/v1.9/compose/django.html)
[[docker] postgreSQL12 + PostGIS3 環境を作成する](https://www.hinomaruc.com/create-postgres12-postgis3-envionment-using-docker/)
[postgreSQLへのshp fileのimport](https://avinton.com/academy/importing-shp-files-to-postgresql/)
[Docker for WindowsでPostgres+pgAdminのコンテナをたてる](https://www.souya.biz/blog2/pinevillage/2021/03/07/post-0/)
[pgAdmin4 v3.3＋PostGISがすごい！](https://qiita.com/U_ikki/items/f64815da23dc3771ba18)
[国土交通省にあるGISデータをPostGISへインポート(2022年版)](https://end0tknr.hateblo.jp/entry/20220110/1641796663)