LoginSignup
1
3

More than 1 year has passed since last update.

著作権フリーの地図画像(著作権表示、中心ピン、地名入り)を一気に作成する [Python + staticmap + OpenStreetMap]

Last updated at Posted at 2022-12-28

概要

  • OpenStreetMap の著作権フリーの地図画像を取得したい
  • Python 用ライブラリの staticmap を使って OpenStreetMap の画像を取得する
  • 右下に著作権表示を入れる
  • 中心にピン画像を表示
  • ピンの上に地名を表示
  • これらを一度に行なって、PNG画像で保存する

環境

  • macOS Monterey + Python 3.9

パッケージのインストール

pip install staticmap

ピン画像の用意

  • 著作権フリーのピン画像を用意してください。
  • ファイル名を map_pin.png にして、プロジェクトルートに設置しておく
  • 私が Affinity Designer でサクッと作ったピン画像を載せておきます。ご自由にお使いください。

map_pin.png

地図作成プログラム

地図サイズ、フォント、テキストの位置の微調整など、お好みで行なってください。matplotlib で画像を表示させて、地図画像の確認を行なっています。

  • コメントいただきましたので、COPYRIGHT_TEXT を修正しました。
make_map_with_text_and_pin.py
from staticmap import StaticMap
from PIL import Image, ImageDraw, ImageFont
import matplotlib.pyplot as plt

WIDTH, HEIGHT = 1000, 800
PIN_IMAGE_SIZE = (50, 50)
FONT_SIZE = 20
FONT = 'ヒラギノ丸ゴ ProN W4.ttc'  # Mac
# FONT = 'meiryo.ttc'  # Windows
COPYRIGHT_TEXT = '©OpenStreetMap(openstreetmap.org/copyright) contributors'
OUTPUT_IMAGE_NAME = 'nagoya_station'
PIN_TEXT = '名古屋駅'
MAP_CENTER = [136.882090, 35.170560]
# OUTPUT_IMAGE_NAME = 'tokyo_station'
# PIN_TEXT = '東京駅'
# MAP_CENTER = [139.76713552739628, 35.68145404891474]


def simple_map():
    # 地図オブジェクトを生成
    # 画像の横幅と縦幅と OpenStreetMap 標準タイルレイヤーのタイルURLを指定
    static_map = StaticMap(WIDTH, HEIGHT, url_template='https://tile.openstreetmap.jp/{z}/{x}/{y}.png')

    # 地図を描画した Pillow の PIL.Image オブジェクトを取得
    # ズームレベルと経度・緯度を指定
    image = static_map.render(zoom=17, center=MAP_CENTER).convert('RGBA')
    pin_image = Image.open('map_pin.png').convert('RGBA').resize(PIN_IMAGE_SIZE)

    # 背景と同サイズの透明な画像を生成
    img_clear = Image.new("RGBA", image.size, (255, 255, 255, 0))

    # 透明画像の上にペースト
    img_clear.paste(pin_image, (WIDTH // 2 - PIN_IMAGE_SIZE[0], HEIGHT // 2 - PIN_IMAGE_SIZE[1]))

    # 重ね合わせる
    image = Image.alpha_composite(image, img_clear)

    # Imageオブジェクトを引数に指定してDrawオブジェクトを生成。
    draw = ImageDraw.Draw(image)

    # テキストを描画。フォントを指定して使う。
    font = ImageFont.truetype(FONT, FONT_SIZE)
    draw.multiline_text((WIDTH - 10, HEIGHT - 10), COPYRIGHT_TEXT, fill=(0, 0, 0), font=font, anchor='rs')
    draw.multiline_text(
        (WIDTH / 2 - PIN_IMAGE_SIZE[0] / 2, HEIGHT / 2 - PIN_IMAGE_SIZE[1]),
        PIN_TEXT, fill=(0, 0, 0), font=font, anchor='ms')

    # 表示
    plt.imshow(image)
    plt.show()

    # 地図画像を保存
    image.save(f'output_images/{OUTPUT_IMAGE_NAME}.png')


if __name__ == "__main__":
    simple_map()

実行結果

nagoya_station.png

参考

Python + staticmap で OpenStreetMap や地理院地図の画像を取得する

Pillowで透過画像を合成したら背景画像の一部も透明になってしまうときの対処法

Pythonの画像処理ライブラリPillow(PIL)の使い方

1
3
2

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
  3. You can use dark theme
What you can do with signing up
1
3