GIS奮闘記

現役GISエンジニアの技術紹介ブログ。主にPythonを使用。

【Pythonで画像処理】Pillowを使用してシンボル一覧を作成する

本日は「【Pythonで画像処理】Pillowを使用してシンボル一覧を作成する」です。Pillowとは、Pythonの画像処理ライブラリで、Python Imaging Library (PIL)のforkプロジェクトです。PILは開発が停滞しPython2.7までの対応にとどまっていますが、PillowはPython3.3に対応しています。これからはPILではなくPillowを使用した方がいいと思います。

さて、GISといえば様々なマップ表現を行うことができますが、その中でもシンボルというのはかなり重要な要素です。通常、マップにポイントを配置した場合、このようになります。

f:id:sanvarie:20151225134248p:plain

ただのポイントですね。しかし、このポイントが一体何なのかよくわかりませんね。シンボルファイルを使用してこれを一目でどの目標物か識別できるようにすることができます。

f:id:sanvarie:20151225134341p:plain

ポイントを蛇のマークにしてみました。例えば、コンビニのシンボルはこれ、ガソリンスタンドのシンボルはこれ、といったように定義しておくと直感的にマップがわかりやすくなりますね。実際に業務を行っていると、何十、何百ものシンボルを使用することになりますが、その一覧を作成するのはなかなか難儀な話です(一つ一つが画像になっている場合などは特に)。そこで、対象のシンボルファイルを一覧にした画像を作成してみます。

※今回、元ファイルの拡張子はemfにしますが、通常の画像ファイルなら何でも大丈夫です。

ディレクトリ構成は以下のようなものを前提としています。

f:id:sanvarie:20151225135023p:plain

各フォルダにこのような画像を配置しています。

f:id:sanvarie:20151225164410p:plain

まずは以下サイトでPillowをダウロードしてインストールを行います。
https://pypi.python.org/pypi/Pillow/2.7.0

ソースは以下です。

# -*- coding: utf-8 -*-
from PIL import Image,ImageDraw,ImageFont
import glob

#対象ディレクトリ
dir = 'D:\python\Symbol'

canvas = Image.new('RGB', (1600, 1600), (255, 255, 255))

x = 0
y = 0

#対象ディレクトリをループ
for name in glob.glob('D:\python\Symbol/*'):
    #対象画像でループ
    for n in glob.glob(name+'/*.emf'):
        #キャンバスの高さの限界に達したらスライド
        #対象画像(300×300),テキスト画像(400,100)
        if y != 0 and y % 1600 == 0:
            y = 0
            x += 400

        #対象画像をサムネイルにする
        a_jpg = Image.open(n, 'r')
        canvas.paste(a_jpg, (x, y))
        y += 300

        #対象画像挿し込むテキストの設定
        imgTxt = Image.new('RGB', (400,100),(255, 255, 255))
        draw = ImageDraw.Draw(imgTxt)

        #フォントの設定
        font = ImageFont.truetype('C:\Windows\Fonts\msgothic.ttc', 48)

        #ディレクトリ名からファイル名を取得する
        f = n[n.rfind("\\"):]
        f = f[1:]

        #対象画像のファイル名をサムネイルに挿し込む
        draw.text((0, 0), f.decode('cp932'), font = font, fill='#000000')
        canvas.paste(imgTxt, (x, y))
        y += 100

canvas.save('D:\python\Symbol\sample.jpg', 'JPEG', quality=100, optimize=True)

結果を見てみます。

f:id:sanvarie:20151225141949p:plain

シンボルファイルが一覧になりました。また、おまけでファイル名も画像として挿し込みました。こんな簡単に画像処理ができるなんて、なんて日だ!

以上、本日は「【Pythonで画像処理】Pillowを使用してシンボル一覧を作成する」でした。