Django-PostGIS-pgAdmin(Docker-Compose)２

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

## 実行環境構築
### フォルダ構成
######
```
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
    ports:
      - "8000:8000"
    volumes:
      - .:/code
    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
```

### 【環境：local】作業フォルダへ移動
```powershell:powershell
cd C:\[作業フォルダ]

```

### 【環境：local】Volumeの作成
```powershell:powershell
docker volume create postgres_volume
docker volume create pgadmin4_volume

```

### 【環境：local】実行する
```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,
    }
}

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'
```

### 【環境：local】実行する
```powershell:powershell
docker-compose up
```

### 【環境：local】確認する
```
http://localhost:8000/
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438214/90e0ae20-e8da-1bce-b397-62cc75db7f3e.png)


### 【環境：c_postgis】PostGISを有効化する
```powershell:powershell
psql -h 127.0.0.1 -p 5432 -U postgres
```

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

### 【環境：c_postgis】（参考）コマンド
```
# ユーザー切り替え
su postgres

# ファイル一覧
ls -al
ls -lh

# 現在のパス
pwd

# 移動
cd 移動先

# ファイルの検索
find -name "ファイル名"

# ディレクトリ作成
mkdir ディレクトリ名

# ディレクトリ削除
rm -r

```

### 【環境：c_postgis】shp2pgsqlのインストール
```
apt update
apt -y install postgis
```

### 【環境：c_postgis】unzipのインストール
```
apt-get install zip
```

### 【環境：c_postgis】vi(vim)インストール
```
apt-get install vim
```

### 【環境：c_postgis】Zip格納用ディレクトリ作成
```
cd /tmp
mkdir GIS
cd /tmp/GIS
```

### 【環境：local】GISデータのダウンロード
[国土数値情報ダウンロードサービス](http://nlftp.mlit.go.jp/ksj/index.html)

### 【環境：local】Zipをコンテナにコピー
ローカルのターミナルから実行
Zipを格納しているフォルダに移動してから実行
```
docker cp N03-20220101_13_GML.zip c_postgis:/tmp/GIS/N03-20220101_13_GML.zip
```
（参考）
ローカルのターミナルから実行
コンテナからローカルへ
```
docker cp c_postgis:/tmp/GIS/N03-20220101_13_GML.zip N03-20220101_13_GML.zip
```

### 【環境：c_postgis】作業フォルダに移動
```
cd /tmp/GIS
```

### 【環境：c_postgis】Zipの解凍
```
unzip N03-20220101_13_GML.zip
```

### 【環境：c_postgis】SQL作成
```
shp2pgsql -p ./N03-22_13_220101 gyosei_kuiki > ./create_gyosei_kuiki.sql
shp2pgsql -W cp932 -a ./N03-22_13_220101 gyosei_kuiki > ./insert_gyosei_kuiki.sql
```

### 【環境：c_postgis】SQLを修正
```
vi create_gyosei_kuiki.sql
```
```
SELECT AddGeometryColumn('','gyosei_kuiki','geom','4326','MULTIPOLYGON',2);
```
[i]:編集、[Esc]:モード変更、[ZZ]:保存

### 【環境：c_postgis】SQL実行
```
psql -U postgres postgres < ./create_gyosei_kuiki.sql
psql -U postgres postgres < ./insert_gyosei_kuiki.sql
```

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

```sql:sql
select * from gyosei_kuiki;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438214/98c26eae-1062-87a5-a7ed-4383f6618918.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)
[GISっ子/コンテナでshp2pgsql](https://www.kemasoft.net/?GIS%A4%C3%BB%D2/%A5%B3%A5%F3%A5%C6%A5%CA%A4%C7shp2pgsql#fea37848)
[PostGISで地理空間情報を管理してみた！](https://qiita.com/miyatomo1122/items/0cb67455c294943ae649)
[AddGeometryColumn](http://cse.naro.affrc.go.jp/yellow/pgisman/1.5.1/AddGeometryColumn.html)
[第4章 PostGISを使う: データ管理とクエリ](http://cse.naro.affrc.go.jp/yellow/pgisman/2.0.0/using_postgis_dbmanagement.html#Geography_Basics)