質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4901閲覧

shapeファイルを画像に変換して出力したい

nil0

総合スコア6

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2020/04/29 19:07

Python初心者です.
現在,shapeファイルを指定のピクセル数で画像化し,出力したいと考えております.
shapeファイルは,国土地理院の基盤地図情報ダウンロードサービスより入手した海岸線データですので,
点と線のみで構成されたデータとなっています.

shapeファイルを以下のようにプロットし,描画するところまではできるようになりました.

roadshape = 'filename.shp'
data = gpd.read_file(roadshape)
fig, ax = plt.subplots(figsize=(15,15))
data.plot(ax=ax)

しかし,これを画像として保存することができず,困っております.
shapeファイルに入っている座標データなども保有した状態で画像として出力したいと考えております.
なお,出力したい画像の形式はtiffを考えております.

使用可能なライブラリ等があれば,教えていただけると幸いです.
よろしくお願いいたします.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2020/05/04 07:38 編集

matplotlib の画像出力機能 fig.savefig() で保存するのではだめでしょうか?
nil0

2020/05/06 06:47 編集

返信が遅くなり申し訳ありません. 上記のコードにfig.saving("figname.tif")と追加してもtifというフォーマットはサポートされていないというエラーが出るのですが,shapeファイルに対してもこのfig.savingは使用できるのでしょうか. また,その場合,解像度(ピクセル数)等はどのように決定されるのでしょうか. 教えていただけますと幸いです. よろしくお願いいたします.
tiitoi

2020/05/06 08:21

回答に書きました。
guest

回答1

0

ベストアンサー

上記のコードにfig.saving("figname.tif")と追加してもtifというフォーマットはサポートされていないというエラーが出るのですが,shapeファイルに対してもこのfig.savingは使用できるのでしょうか.

gpd は geopandas というライブラリだと思いますが、描画は内部的には matplotlib を使っています。
なので、以下の2点のやり方を押さえれば実現できると思います。

  1. matplotlib で指定した解像度で画像化する方法
  2. tiff 形式で保存する方法

1に関しては、matplotlib は図の大きさはインチ単位で指定し、画像化する際は dpi (dot per inch、1インチあたりのピクセル数) を乗算した値が実際の解像度になります。
例えば、(500, 500) の解像度で保存したい場合、dpi が 72 (matplotlib のデフォルト) の場合、figsize=(500 / 72, 500 / 72) と指定します。

2に関しては、matplotlib は tiff 形式をサポートしていません。
なので、可逆圧縮などの png 形式で一度出力し、tiff 形式をサポートしている pillow などのライブラリで再度それを読み込み、tiff 形式で保存し直すと実現できます。

質問のコードに追記する形なら以下のようになると思います。

python

1import matplotlib.pyplot as plt 2import numpy as np 3from PIL import Image 4from io import BytesIO 5import geopandas as gpd 6 7w_px, h_px = 500, 500 # 保存する画像サイズ (px) 8 9dpi = plt.rcParams["figure.dpi"] 10w_inch, h_inch = w_px / dpi, h_px / dpi 11 12x = np.arange(100) 13y = x ** 2 14fig, ax = plt.subplots(figsize=(w_inch, h_inch)) 15fig.subplots_adjust(left=0, right=1, top=1, bottom=0) # 図の周りの余白削除 16ax.set_axis_off() # xy の目盛り軸削除 17 18roadshape = 'filename.shp' 19data = gpd.read_file(roadshape) 20data.plot(ax=ax) 21 22out = BytesIO() 23fig.savefig(out, format='png') 24img = Image.open(out) 25img.save('sample.tiff')

投稿2020/05/06 08:20

編集2020/05/08 08:16
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nil0

2020/05/08 07:53

早速のご返答ならびにコードのご提示ありがとうございます. matplotlibはtiff形式をサポートしていないため,tiff形式で出力する場合には,一度png等の別形式で出力したのち,pillow等のtiff形式をサポートしているライブラリで画像を読み込み,保存するという過程が必要とのこと理解致しました. ご提示いただいたコードを参考に,自身でコードを書いてみたところ,無事,解像度を指定した上でtiff形式の画像を出力することができました. 最後に一点だけ伺いたいのですが,画像を出力した際に,座標軸や枠も併せて描画されてしまうのですが,このような情報をなくし,画像のみを出力するためには,どのようにコーディングすればよいでしょうか. よろしくお願いいたします.
nil0

2020/05/08 09:08

教えていただいた通りにコードを付け足しましたら,問題なく座標軸や余白等を消すことができました. また,webサイトも非常に参考になりました. 今後,なにか問題が生じた際に利用させていただきます. この度は多くの質問にお答えいただきありがとうございました. 無事,すべての問題を解決することができました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問