1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

地物ラベルの配置とフォント・サイズ

Last updated at Posted at 2025-07-20

最初に論より証拠、実例を示します。下の図は中山間集落の地番参考図です。

labels.png

labels-2.png

これらの図においては、いわゆる「番地」で示される土地区画のポリゴンがその番地をラベルとして表示されているのですが、ラベルが見やすいように、次の点で工夫をしています。

  • ラベルをポリゴンの「見た目の中心」に配置
  • ラベルをポリゴンの「方向」に合わせて回転
  • 縮尺とポリゴンの面積にあわせてフォント・サイズを調整

どれも簡単な計算式で実現できます。

1. ラベルの配置

Q-GIS の場合の設定方法を説明します。

  • ラベル配置を「データによる定義」で制御する
    1. 点(Point)を次のように定義
      pole_of_inaccessibility(@geometry, 0.5) 
      
    2. 整列は、水平方向は 'Center'、垂直方向は 'Half'
    3. 回転を次のように定義
      main_angle(@geometry)-90
      

これだけです。

pole_of_inaccessibility() は、ポリゴン外縁部から最も遠いポリゴン内部の点を求める関数です。これによって、ポリゴンの「見た目の中心」をかなり高精度に指定することが出来ます。
第二の引数は計算の精度を指定するものですが、0.5 もあれば実用上は十分です。

場合によっては centroid() というポリゴンの重心を求める関数を使うことを検討しても良いでしょう。ただし、三日月型のポリゴンなどでは、重心がポリゴンの外に出ることがあるので要注意です。

main_angle() は、ポリゴン全体の傾きを求める関数です。90度を引くことで、ポリゴンの長さ方向に文字が表示されるようにしています。

2. ラベルのフォント・サイズ

ラベルのフォント・サイズは次の計算式によって制御しています。

clamp(最小値, 基準値 * sqrt(基準縮尺 / @map_scale * sqrt($area) / sqrt(基準面積), 最大値)

例えば、

clamp(8, 10 * sqrt(3000 / @map_scale * sqrt($area) / sqrt(1000)), 20)

この場合、縮尺 3000 で面積 1000 ㎡ のポリゴンのラベルが 10 ポイントになります。これを基準として、縮尺が大きく(縮尺の分母が小さく)なればなるほど、また、面積が大きくなればなるほどフォント・サイズが大きくなります。逆に、縮尺が小さくなればなるほど、面積が小さくなればなるほど、フォント・サイズが小さくなります。ただし、sqrt を使っているため、変化率はゆるやかなものになります。また、clamp によって、最小サイズを 8 ポイント、最大サイズを 20 ポイントに制限しています。

面積については sqrt が二重にかかっています。内側の sqrt は、二次元(面積)の増減率を一次元(長さ)の増減率に置き換えるためであり、外側の sqrt は、縮尺の増減率とあわせてフォント・サイズの変化をゆるやかにするためです。

基準値となる縮尺と面積は地図の内容によって調整が必要です。

  • 基準縮尺 : ラベル表示を開始する最小縮尺
  • 基準面積 : 地物の面積の中央値

というあたりを一応の目安にして、表示結果を確認しながら調整するのが良いでしょう。

1
1
0

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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?