概要
- OpenStreetMap の著作権フリーの地図画像を取得したい
- Python 用ライブラリの staticmap を使って OpenStreetMap の画像を取得する
- 右下に著作権表示を入れる
- 中心にピン画像を表示
- ピンの上に地名を表示
- これらを一度に行なって、PNG画像で保存する
環境
- macOS Monterey + Python 3.9
パッケージのインストール
pip install staticmap
ピン画像の用意
- 著作権フリーのピン画像を用意してください。
- ファイル名を map_pin.png にして、プロジェクトルートに設置しておく
- 私が Affinity Designer でサクッと作ったピン画像を載せておきます。ご自由にお使いください。
地図作成プログラム
地図サイズ、フォント、テキストの位置の微調整など、お好みで行なってください。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()
実行結果
参考
Python + staticmap で OpenStreetMap や地理院地図の画像を取得する