search
LoginSignup
11

More than 1 year has passed since last update.

posted at

updated at

Organization

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

はじめに

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

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

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

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

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

参考資料

ogr2ogrコマンド

ogr2ogr - GDAL documentation

shp2pgsqlコマンド

PostGIS 2.3.0 マニュアル

Tippecanoeコマンド

mapbox/tippecanoe

参考URL

ogr2ogr 備忘録 - Qiita

変換コマンド集

  • ちょろっと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でも便利に取り扱えるようになりましたね!

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
11