shpファイルを片っ端からぶっ壊して別形式に変換していきたい

# はじめに

GIS界隈の沼に足を踏み入れると、一歩目ずぶりと沈み込むのがファイル形式の多さ。

なんですが、業務を行っていると目にするのはshp、shp、shp、csv、shp、shp…

QGISとかいう万能変換ツール（？）で扱うぶんには良いですが、Webで取り扱うには面倒くせぇ…

ということで、shpをさらっと変換できるようにツール群を使いこないして目的のファイル形式にできるようにしていきましょう。

〇〇党「shpファイルを、ぶっ壊す！」

## 参考資料

### ogr2ogrコマンド

[ogr2ogr - GDAL documentation](https://gdal.org/programs/ogr2ogr.html)

### shp2pgsqlコマンド

[PostGIS 2.3.0 マニュアル](http://aginfo.cgk.affrc.go.jp/docs/pgisman/2.3.0/postgis-ja.html#shp2pgsql_usage)

### Tippecanoeコマンド

[mapbox/tippecanoe](https://github.com/mapbox/tippecanoe)

### 参考URL

[ogr2ogr 備忘録 - Qiita](https://qiita.com/tohka383/items/d3d1bf80db2cfb416330#%E5%90%84%E5%BD%A2%E5%BC%8F%E3%81%B8%E5%A4%89%E6%8F%9B)

## 変換コマンド集

- ちょろっとPythonを使いますが、こんな感じのライブラリを入れています。

### Pipenv

```yaml
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
geopandas = "*"
geojson = "*"
shapely = "*"
pyshp = "*"
mbutil = "*"

[requires]
python_version = "3.9"
```

## 早速変換

### shp → GeoJSON

#### ogr

```bash
% ogr2ogr -f GeoJSON -oo ENCODING=Shift-JIS 01_shp/geojson/after_conversion/P02-06_01-g_PublicFacility.geojson 00_org_data/shp/P02-06_01_GML/P02-06_01-g_PublicFacility.shp
```

- -f <format_name>
    - 出力ファイル形式
- -oo NAME=VALUE
    - 入力データセットのオプション
    - フォーマット毎に異なる

### shp → SQL

#### shp2pgsql

```bash
% shp2pgsql -I -s 4326 -W Shift-JIS 00_org_data/shp/P02-06_01_GML/P02-06_01-g_PublicFacility.shp P02-06_01-g_PublicFacility > 01_shp/sql/after_conversion/P02-06_01-g_PublicFacility.sql
```

- -I
    - ジオメトリカラムにGiSTインデクスを生成する
- s [<FROM_SRID>:]<SRID>
    - 指定したSRIDでジオメトリデーブルの作成とデータの読み込みを行う
    - FROM_SRIDは-Dと一緒には指定できないらしい
- -W
    - 入力データ (dbfファイル)のエンコーディングを指定する
    - 全てのdbfの属性は指定されたエンコーディングからUTF8に変換されます

### shp → tsv

#### ogr

- 拡張子は.csvから変更できなさそう

```bash
% ogr2ogr -f CSV -lco SEPARATOR=TAB -lco GEOMETRY=AS_WKT -lco CREATE_CSVT=YES -oo ENCODING=Shift-JIS 01_shp/tsv/after_conversion/P02-06_01-g_PublicFacility.csv 00_org_data/shp/P02-06_01_GML/P02-06_01-g_PublicFacility.shp
```

- -lco NAME=VALUE
    - レイヤー作成オプション
    - フォーマット毎に異なる

### shp → csv

#### ogr

```bash
% ogr2ogr -f CSV -lco GEOMETRY=AS_WKT -lco CREATE_CSVT=YES -oo ENCODING=Shift-JIS 01_shp/csv/after_conversion/P02-06_01-g_PublicFacility.csv 00_org_data/shp/P02-06_01_GML/P02-06_01-g_PublicFacility.shp
```

### shp → GeoPackage

#### ogr

```bash
% ogr2ogr -f GPKG -nln g_PublicFacility -oo ENCODING=Shift-JIS 01_shp/geopackage/after_conversion/P02-06_01-g_PublicFacility.gpkg 00_org_data/shp/P02-06_01_GML/P02-06_01-g_PublicFacility.shp
```

- -nln <name>
    - 新規レイヤ名

### shp → GeoDataFrame(geopandas)

```python
import geopandas as gpd

if __name__ == '__main__':
    shp_file = "../../00_org_data/shp/P02-06_01_GML/P02-06_01-g_PublicFacility.shp"
    gdf = gpd.read_file(shp_file)

    print(gdf.crs)
    print(gdf.head())
```

### GeoJSON → mbtiles

```bash
% tippecanoe -rg -z 14 -Z 4 --no-feature-limit --no-tile-size-limit -o 02_geojson/mbtiles/after_conversion/A16-15_01_DID.mbtiles 00_org_data/geojson/A16-15_01_GML/A16-15_01_DID.geojson
```

- -rg
    - -r：ベースズーム以下のズームレベルでドットがドロップされるレートを指定 (デフォルトは2.5)
    - -rg：最も密集したタイルに最大50,000個が維持されるレートが指定される
- -z
    - 生成されるタイルの最高ズームレベル（デフォルト14）
- -Z
    - 生成されるタイルの最小ズームレベル（デフォルト0）
- --no-feature-limit
    - 地物数を20万に制限しない
- --no-tile-size-limit
    - タイルのファイルサイズを500KBに制限しない
- -o
    - 出力するファイル名を指定

### mbtiles → MVT

#### mb-utilのインストール

```bash
% pipenv install mbutil
```

#### MTVに変換

```bash
% mb-util --image_format=pbf 02_geojson/mbtiles/after_conversion/A16-15_01_DID.mbtiles 03_mbtiles/pbf/after_conversion/A16-15_01_DID
% cd 03_mbtiles/pbf/after_conversion/A16-15_01_DID
% gzip -d -v -r -S .pbf *
% find . -type f -exec mv -v '{}' '{}'.pbf \;
```

これでshpファイルをぶっ壊してWebでも便利に取り扱えるようになりましたね！

皆さんもどんどんぶっ壊していきましょう！