はじめに
GIS界隈の沼に足を踏み入れると、一歩目ずぶりと沈み込むのがファイル形式の多さ。
なんですが、業務を行っていると目にするのはshp、shp、shp、csv、shp、shp…
QGISとかいう万能変換ツール(?)で扱うぶんには良いですが、Webで取り扱うには面倒くせぇ…
ということで、shpをさらっと変換できるようにツール群を使いこないして目的のファイル形式にできるようにしていきましょう。
〇〇党「shpファイルを、ぶっ壊す!」
参考資料
ogr2ogrコマンド
shp2pgsqlコマンド
Tippecanoeコマンド
参考URL
変換コマンド集
- ちょろっとPythonを使いますが、こんな感じのライブラリを入れています。
Pipenv
[[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
% 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
- 出力ファイル形式
- -oo NAME=VALUE
- 入力データセットのオプション
- フォーマット毎に異なる
shp → SQL
shp2pgsql
% 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 [:]
- 指定したSRIDでジオメトリデーブルの作成とデータの読み込みを行う
- FROM_SRIDは-Dと一緒には指定できないらしい
- -W
- 入力データ (dbfファイル)のエンコーディングを指定する
- 全てのdbfの属性は指定されたエンコーディングからUTF8に変換されます
shp → tsv
ogr
- 拡張子は.csvから変更できなさそう
% 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
% 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
% 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
- 新規レイヤ名
shp → GeoDataFrame(geopandas)
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
% 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のインストール
% pipenv install mbutil
MTVに変換
% 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でも便利に取り扱えるようになりましたね!
皆さんもどんどんぶっ壊していきましょう!