コンテンツへスキップ
AI Agent
QGIS
チュートリアル

QGIS フィールド計算機の使い方: 検証済みの式 24 個と落とし穴

公開日

QGIS で列を計算するには、レイヤの属性テーブルを開き、Field Calculator(フィールド計算機)のアイコン(Ctrl+I)をクリックし、新しいフィールドか既存のフィールドを選び、式を入力して OK をクリックします。ここまではすぐです。難しいのは、式がエラーなしで実行されたのに、NULL や平方度、間違ったクラスが書き込まれる場合です。

2026 年 11 月 7 日、私はインドのベンガルールにあるインディラナガル(Indiranagar)と周辺の区の実際の OpenStreetMap レイヤ(建物 8,709 棟、道路 854 本、学校 35 校、バス停 37 か所、区 10 区)で 24 個のフィールド計算機の式を実行し、それぞれについてよくある間違った書き方も並べて実行しました。以下は、正確な出力値つきの式の一覧、楕円体の基準値と比べて測ったエラーなしの落とし穴、そして最も難しい 3 つを QGIS 内の AI エージェントに任せた結果です。

QGIS のフィールド計算機とは

QGIS のフィールド計算機は、QGIS の式を使って属性テーブルの列を作成または更新する組み込みツールです。面積、長さ、座標などのジオメトリの値を計算したり、文字列を書き換えたり、CASE WHEN で行を分類したり、プロジェクト内の別のレイヤから件数や距離を取得したりできます。

実は QGIS には同じ式を実行できる場所が 4 つあり、選び間違えることが作業を失う最初の原因になります。

  • Field Calculator ダイアログ(Ctrl+I): レイヤをその場で編集します。新しい列を作ることも、既存の列を上書きすることもでき、全地物または選択した地物だけを対象にできます。変更は編集を保存するまで編集バッファに残ります。
  • 仮想フィールド(ダイアログ内のチェックボックス): テーブルを開くたび、地図を描画するたびに式をその場で計算します。テスト用レイヤで建物 fid 27 の形状を 2 倍にしたところ、通常の面積列は 197.355 のままでしたが、仮想フィールドは 789.418 に更新されました。注意点は、仮想フィールドが GeoPackage や Shapefile ではなく .qgs プロジェクトファイルに保存されることです。新しいプロジェクトでファイルを開くと、その列は消えています。
  • Processing の "Field calculator" ツール(native:fieldcalculator): 新しい出力レイヤを書き出し、元のレイヤには手を加えません。モデルの中で使う場合や、その場で編集したくない場合に使います。@row_number に注意してください。ここでは 0 から始まり、ダイアログでは 1 から始まります。
  • 属性テーブル上部のクイック計算バー: ダイアログを開かずに既存の列を更新します。すでに編集モードのときに、短い式をさっと実行するのに便利です。

フィールドを計算する手順

Field Calculator を開く

レイヤを右クリックして Open Attribute Table を選び、属性テーブルのツールバーにあるそろばんのアイコンをクリックします。レイヤパネルでレイヤを選択した状態なら、Ctrl+I で Field Calculator を直接開けます。

選択状態とフィールド設定を確認する

地図上で地物が 1 つでも選択されていると、 Only update N selected feature(s) がデフォルトでオンになります。レイヤ全体を計算したい場合はオフにします。 Create a new field (または Update existing field )を選び、 Output field name を設定して Output field type を選びます(小数を含む面積や長さには Decimal number (real)、整数の件数には Integer、ラベルやクラスには Text (string))。

式を書いて Preview を確認する

左側のエディタに式を入力するか、中央の関数リストを検索してダブルクリックで挿入します。OK をクリックする前に、必ずエディタの下の Preview 行を確認してください。エラーや NULL、0.0000003 のような数値が表示されたら、8,000 行に書き込む前に式を直します。

OK をクリックして編集を保存する

OK をクリックします。レイヤが編集モードでなかった場合、QGIS は自動で編集モードをオンにすると警告します。計算が終わったら、属性テーブルのツールバーにあるフロッピーディスクの Save Edits アイコンをクリックし、列をディスクに書き込みます。

道路レイヤで、道路クラスを書き込む準備ができたダイアログがこちらです。

ベンガルールの道路レイヤで開いた QGIS の Field Calculator ダイアログ。Only update 39 selected features がオン、road_rank という新しい Text フィールド、primary と secondary の道路を arterial に分類する CASE WHEN 式、Preview には arterial と表示。
QGIS 3.44 の Field Calculator ダイアログ。左上のチェックボックスに注目してください。キャンバス上で 39 本の道路が選択されていたため、その 39 行だけが計算されます。

関数名がわからないときは、中央の列の上にある検索ボックスを使います。関数ツリーが絞り込まれ、右側に引数の順序や例を含むドキュメントが表示されます。

区レイヤで開いた QGIS の Field Calculator の式ビルダー。関数リストで overlay_contains を検索し、右側のパネルに overlay_contains の構文と引数、プレビューには 18 と表示。
関数リストで overlay_contains を検索した画面。計算を実行する前に、下部の Preview で選択中の区に学校が 18 校あることがわかります。

検証済みの式の一覧

以下の式はすべて、2026 年 11 月 7 日に QGIS 3.44.15 で、ベンガルールの OpenStreetMap レイヤ(EPSG:4326 で保存、プロジェクトの楕円体は WGS 84)に対して実行しました。自分の地域のテストデータが必要なら、QGIS で OpenStreetMap データをダウンロードする方法のガイドで、建物、道路、ポイントをきれいに取得する手順を説明しています。

以下の建物の出力例は、住所と階数がある建物 fid 27、28、30、60、62 と、どちらもない fid 1、2、3 のものです。

面積、長さ、周長、座標

やりたいこと貼り付ける式サンプルでのテスト結果よくある間違い(とその結果)
建物の面積(m²、楕円体)$area197.35, 110.86, 141.11, 219.71, 318.83area($geometry) はエラーなしで 0.0(約 3e-7 平方度)を返す
建物の面積(m²、UTM 43N に投影)area(transform($geometry, 'EPSG:4326', 'EPSG:32643'))197.60, 110.99, 141.29, 219.98, 319.22'EPSG:3857'(Web メルカトル)に変換すると、ここでは面積が +5.95% 大きくなる
道路の長さ(m、楕円体)$length616.34, 7.99, 1104.32, 9.14, 72.24length($geometry) はエラーなしで 0.005681、0.000074(度)を返す
道路の長さ(m、UTM 43N に投影)length(transform($geometry, 'EPSG:4326', 'EPSG:32643'))616.72, 7.99, 1105.01, 9.14, 72.29'EPSG:3857' に変換すると、道路の長さが中央値で +3.03% 大きくなる
建物の周長(m)$perimeter56.72, 44.97, 48.60, 61.54, 72.69EPSG:4326 のレイヤでは perimeter($geometry) は度を返す
ポリゴンの重心 X(東距、m)x(centroid(transform($geometry, 'EPSG:4326', 'EPSG:32643')))786714.46, 786437.79, 786237.28ポリゴンに $x を使うとエラーなしで NULL を返す。x_at($geometry, 0) は中心ではなく最初の頂点(77.642744)を返す
ポリゴンの重心 Y(北距、m)y(centroid(transform($geometry, 'EPSG:4326', 'EPSG:32643')))1435359.45, 1435116.32, 1436699.32レイヤが EPSG:4326 のとき、y(centroid($geometry)) は度(12.97...)を返す
行番号または地物 ID@row_number または $id1, 2, 3, 4(ダイアログ)、fid 27 で $id は 27@row_number は GUI のダイアログでは 1 から、Processing の native:fieldcalculator では 0 から始まる

$area を Decimal number (real) ではなく Integer の出力フィールドに書き込むと(Processing の Field calculator でテスト)、QGIS は切り捨てではなく四捨五入します(197.35 は 197、110.86 は 111 になります)。

条件によるクラス分け(CASE WHEN と NULL の扱い)

やりたいこと貼り付ける式サンプルでのテスト結果よくある間違い(とその結果)
面積からサイズクラスを作るCASE WHEN $area < 100 THEN 'small' WHEN $area < 250 THEN 'medium' ELSE 'large' ENDmedium, medium, medium, medium, large未テスト
NULL の階数をデフォルトの整数に置き換えるcoalesce(to_int("building:levels"), 1)4, 4, 2, 4, 3(階数が NULL なら 1)OSM のタグは文字列として保存されているため、"building:levels" + 'a' は '4a' を返す
NULL を別扱いにした高さクラスCASE WHEN to_int("building:levels") IS NULL THEN 'unknown' WHEN to_int("building:levels") <= 2 THEN 'low' WHEN to_int("building:levels") <= 4 THEN 'mid' ELSE 'high' ENDmid, mid, low, mid, mid(fid 1 は unknown)WHEN ... IS NULL を省くと空の行がすべて ELSE に入り、階数が未入力の 7,636 棟に 'high' が付く

文字列の整形、書式、日付

やりたいこと貼り付ける式サンプルでのテスト結果よくある間違い(とその結果)
番地と通り名を安全に連結するconcat("addr:housenumber", ' ', "addr:street")'594 12th Main Road', '83/4 13th Main Road'(両方 NULL なら ' ')"addr:housenumber" || ' ' || "addr:street" はどちらかの列が NULL だと NULL を返す
道路名から接尾辞(Road、Main、Cross)を除くregexp_replace("name", '\\s+(Road|Main|Cross)$', '')'Chinmaya Mission Hospital', '13th Main', '12th Main'バックスラッシュ 1 つの \s+ は Invalid regular expression '?+(Road|Main|Cross)$' で失敗する
ID を 12 桁にゼロ埋めするlpad(to_string("osm_id"), 12, '0')'000313829229', '000313835091'未テスト
表示用に数値を書式化するformat_number($area, 1)'197,4', '110,9'(小数点がカンマのロケールの Mac で 3958.7 は '3 958,7')出力は OS のロケール(小数点のカンマと狭いノーブレークスペース)に従う文字列なので、後から計算に使えない
2 つの日付の間の日数day(age(to_date('2026-11-07'), to_date('2019-03-15')))2794age(...) だけでは QgsInterval オブジェクトを返す。to_date('07/11/2026') は第 2 引数に 'dd/MM/yyyy' を渡さないと失敗する

GeoPackage や Shapefile に文字列を書き込むときは、出力フィールドの長さにも注意してください。Processing で concat("addr:housenumber", ' ', "addr:street") を長さ 40 のテキストフィールドに書き込んだところ、1 本の道路(" 80 Feet Road(Sir C.V. Raman Hospital Road)")が 43 文字あったため、出力なしで処理全体が中断されました。

レイヤをまたいだ件数、合計、最近傍距離

これらの式を使うと、別途 QGIS で空間結合を実行しなくても、あるレイヤからプロジェクト内の別のレイヤを照会できます。

やりたいこと貼り付ける式サンプルでのテスト結果よくある間違い(とその結果)
各区に接する建物の数を数えるaggregate('buildings', 'count', "osm_id", filter:=intersects($geometry, geometry(@parent)))4, 1552, 336, 3141, 79, 402, 1179, 348, 1539, 139filter:=... を忘れると、すべての区にレイヤ全体の件数(8709)がエラーなしで入る
区ごとの建物の総面積(ha)round(aggregate('buildings', 'sum', $area, filter:=intersects($geometry, geometry(@parent))) / 10000, 3)0.565, 20.292, 5.605, 59.116, 1.037, 14.094, 16.646, 7.991, 21.39, 1.7区の境界に接する建物の形状全体を合計するため、境界上の建物は両方の区で数えられる
各区の中の学校の数を数えるarray_length(overlay_contains('schools', "osm_id"))0, 2, 3, 18, 0, 0, 7, 3, 2, 0(合計 35)第 2 引数なしの overlay_contains('schools') は件数ではなく true か false を返す
最寄りのバス停までの距離(m)distance(transform($geometry, 'EPSG:4326', 'EPSG:32643'), transform(array_first(overlay_nearest('bus_stops', $geometry)), 'EPSG:4326', 'EPSG:32643'))125.17, 49.39, 199.59, 158.39, 187.97, 74.67, 123.00, 226.61distance($geometry, array_first(overlay_nearest('bus_stops', $geometry))) は 0.001142(度)を返す
建物から 300 m 以内のバス停の数aggregate('bus_stops', 'count', "osm_id", filter:=distance(transform($geometry, 'EPSG:4326', 'EPSG:32643'), transform(geometry(@parent), 'EPSG:4326', 'EPSG:32643')) <= 300)1, 1, 4, 2, 2, 6, 7, 7array_length(overlay_nearest('bus_stops', $id, max_distance:=300, limit:=-1)) は 300 が 300 度と解釈されるため 37(全バス停)を返す

エラーなしで失敗するフィールド計算機の落とし穴 5 つ

YouTube の QGIS チュートリアルについた質問コメント 70 件を読みました。48 件は式の書き方に関する本物の質問で、そのうち 8 件は式が無効になる、NULL を返す、何も選択されないというものでした。もっと悪いのは誰も質問しないケースです。式が実行され、もっともらしい数値が書き込まれるからです。ベンガルールのデータで測った 5 つの落とし穴を紹介します。

1. $area と area($geometry) の違い、そしてプロジェクトの楕円体の役割

$area と area($geometry) は同じ計算ではありません。また、2026 年のあるチュートリアルは、地理座標系では $area が平方度を返すと書いています。私たちがテストしたどちらのプロジェクト設定でも、そうはなりませんでした。2026 年 11 月 7 日、EPSG:4326 のベンガルールのレイヤにある最初の建物 200 棟と道路 200 本で、両方と transform() を、楕円体 WGS 84 の基準値(QgsDistanceArea)と比べて測りました。

  • $area と $length はプロジェクトの楕円体を使います (Project > Properties > General > Measurements で設定)。楕円体が WGS 84 なら、レイヤとプロジェクトが度(EPSG:4326)でも、$area は正確な平方メートルを返します。
  • プロジェクトの楕円体を None / Planimetric にした場合も、EPSG:4326 のレイヤで $area は平方度を返しませんでした。QGIS 3.44.15 では、200 棟の建物で +3.24% 大きすぎる 平方メートルを返しました。
  • area($geometry) と length($geometry) は常にレイヤ自身の CRS での平面計算です。 EPSG:4326 のレイヤでは area($geometry) は平方度(住宅 1 棟で約 0.0000003)を返し、通常の小数の列では 0.0 に丸められます。
  • area() の前に Web メルカトル(EPSG:3857)へ変換すると、すべての建物が +5.95% 大きくなります。 ベンガルールの緯度(北緯 13°)でもそうなり、道路の長さは +3.03% 大きくなります。現地の UTM ゾーン(EPSG:32643)に変換すると、楕円体の面積との差は +0.12% 以内に収まります。
EPSG:4326 レイヤでの式(n = 建物 200 棟、道路 200 本)WGS 84 楕円体との誤差の中央値最大誤差
$area(プロジェクトの楕円体 WGS 84)0.00%0.00%
$area(プロジェクトの楕円体 None)+3.24%+3.25%
$perimeter(プロジェクトの楕円体 None)+1.72%+2.25%
道路の $length(プロジェクトの楕円体 None)+1.31%+2.61%
area($geometry)-100.00%(平方度)-100.00%
道路の length($geometry)-100.00%(度)-100.00%
area(transform($geometry, 'EPSG:4326', 'EPSG:32643'))+0.12%+0.12%
道路の length(transform($geometry, 'EPSG:4326', 'EPSG:32643'))+0.06%+0.06%
area(transform($geometry, 'EPSG:4326', 'EPSG:3857'))+5.95%+5.96%
道路の length(transform($geometry, 'EPSG:4326', 'EPSG:3857'))+3.03%+3.26%

EPSG:4326、EPSG:3857、UTM ゾーンでなぜこれほど結果が違うのかわからない場合は、QGIS の CRS とはの解説を読んでください。

2. overlay_nearest は max_distance をメートルではなくレイヤの単位で読む

overlay_nearest 関数は空間インデックスを使うので速く、便利な max_distance 引数もあります。ただし max_distance は常にレイヤの座標単位で測られます。

建物とバス停が EPSG:4326(度)のときに array_length(overlay_nearest('bus_stops', $id, max_distance:=300, limit:=-1)) と書くと、QGIS は 300 度以内のバス停を探します。これは地球全体を覆うので、すべての建物が 37(レイヤ内の 37 か所すべてのバス停)になります。300 メートルのつもりで max_distance:=0.003 と見当をつけても、うまくいきません。経度 1 度と緯度 1 度はメートルでの長さが違うからです。建物 fid 62 では、0.003 は正しい 7 ではなく 8 か所を返しました。先に両方のレイヤを UTM に再投影するか、上の空間的な表の最後の行にある aggregate(..., filter:=distance(transform(...))) のパターンを使ってください。

3. NULL の行は CASE WHEN の ELSE にそのまま入る

ベンガルールのデータでは、8,709 棟のうち building:levels タグがあるのは 1,073 棟(12.3%)だけです。残りの 7,636 棟は NULL です。

CASE WHEN to_int("building:levels") <= 2 THEN 'low' WHEN to_int("building:levels") <= 4 THEN 'mid' ELSE 'high' END と書くと、NULL の行では 2 つの <= の比較がどちらも不明と評価され、その行は ELSE に入ります。階数が未入力の 7,636 棟が、警告ひとつなく高層ビルに分類されてしまいます。データに欠けがあるときは、必ず最初の分岐に WHEN "field" IS NULL THEN 'unknown' を置いてください(または ELSE を省いて、どれにも当てはまらない行を NULL のままにします)。

4. "Only update selected features" は列の残りを NULL のままにする

地図キャンバス上で地物が 1 つでも選択されていると、Field Calculator は自動的に Only update N selected feature(s) をオンにします。

ベンガルールの primary の道路 39 本を選択して、CASE WHEN "highway" IN ('primary', 'secondary') THEN 'arterial' ELSE 'local' END を新しいフィールド road_rank に書き込んだところ、QGIS はその 39 行に 'arterial' を書き込み、残りの 815 本の道路(式で明示した secondary の道路 28 本をすべて含む)を NULL のままにしました。

primary の道路 39 本を選択した状態で Field Calculator を実行した後の、道路レイヤの QGIS 属性テーブル。primary の行は road_rank が arterial、secondary と residential の行は NULL、row_n には @row_number による 1、2、3 が表示。
ダイアログを開いたときに primary の道路 39 本が選択されていたため、CASE 式で扱っていたにもかかわらず、secondary の道路 28 本と local の道路 787 本は NULL になりました。

5. ダブルクォートとシングルクォート("building" = "yes" が NULL を返す理由)

QGIS の式では、 ダブルクォート " " はフィールド名 を、 シングルクォート ' ' は文字列の値 を表します。

"building" = "yes" と入力すると、QGIS は building という列を探し、yes という別の列と比較します。yes という列はないので、式は NULL と評価されます(内部の QgsExpression パーサーは Field 'yes' not found を報告します)。同じように、OpenStreetMap の building:levels のように列名にコロンが含まれる場合、ダブルクォートを付け忘れると syntax error, unexpected Unknown_CHARACTER で失敗します。 Fields and Values リストでフィールド名をダブルクリックすれば、毎回正しいクォートが入ります。

構文を書かずに済ませる: 同じ計算を AI エージェントで行う

$area を手で書くのはすぐです。2 つの transform() 呼び出し、@parent のジオメトリ参照、距離のフィルタを含む入れ子の aggregate() を書くとなると、Stack Exchange に行き着くことになります。

私たちは QGIS の中にドッキングするチャットパネル AI Agent を開発しているので、この節は自社ツールの話です。開いている QGIS プロジェクトの中で動くため、Field Calculator や Processing ツールを代わりに実行する前に、レイヤ名、フィールドの型、CRS、一意の値を調べます。

2026 年 11 月 7 日、私は AI Agent(v1.9.4、Medium effort、Balanced permissions)に、テスト計画にあった複数ステップの計算 3 つを、1 チャットにつき 1 文で、EPSG:4326 のまったく同じベンガルールの 5 レイヤに対して頼みました。

タスク送ったプロンプトそのものエージェントの所要時間私たちの独立した検証との比較
A. 近接件数"Add a field called bus_stops_300m to the buildings layer with the number of bus stops within 300 metres of each building."39 秒合格。 整数フィールドを作成し、8,709 棟すべてに値が入り、EPSG:32643 での形状からバス停までの私たちの件数と不一致は 0(範囲 0 から 8)。
B. 分類とスタイル設定"Class the buildings into low (1 or 2 levels), mid (3 or 4) and high (5 or more) from the building:levels field, store the class in a new field called height_class, and style the buildings by that class."18 秒合格。 low 563、mid 442、high 68(1,073 棟すべてが私たちのルールと一致)。階数のない 7,636 行は NULL のまま残され、4 つ目の灰色のカテゴリ "Unknown levels" としてスタイル設定された。
C. 区ごとの学校数と建物面積"For each ward, add the number of schools and the total building area in hectares."37 秒合格(手法の違いあり)。 school_count は 10 区中 10 区で一致(合計 35)。building_ha は 10 区中 10 区で区境界で切り取った形状の面積と一致(合計 148.25 ha)。

タスク A では、エージェントは 300 度の overlay_nearest の落とし穴にはまりませんでした。ツールログを見ると、両方のレイヤを調べ、CRS を確認し、建物の形状から(重心ではなく。重心だと 667 棟で答えが変わっていました)メートル単位で計算し、回答の前に最小値と最大値を検証していました。

ベンガルールの建物 8,709 棟に bus_stops_300m フィールドを追加した後の QGIS の AI Agent パネル。件数は 0 から 8 で欠損値なしと報告し、各建物の形状から 37 か所のバス停までの直線距離であることを注記。
AI Agent でのタスク A: EPSG:4326 のプロジェクトで、度の落とし穴にはまらずに 8,709 棟の 300 m 以内のバス停数を 39 秒で計算しました。

タスク B では、まず building:levels の一意の値を確認し、8,709 棟のうち 7,636 棟に階数がないことを見つけ、それらの行を high に入れずに height_class で NULL のままにし、地図に 4 クラスの分類スタイルを適用しました。

AI Agent パネルと QGIS のレイヤパネル。height_class フィールドが low、mid、high、Unknown levels に分類され、回答には low 563 棟、mid 442 棟、high 68 棟、unknown 7,636 棟と記載。
タスク B: エージェントは先に列を確認し、階数が未入力の 7,636 棟を ELSE の分岐に入れず、4 つのグループすべてにスタイルを設定しました。

描画した地図を見ると、OpenStreetMap のデータで NULL の確認がなぜ大切かがよくわかります。灰色の建物は、building:levels タグが記録されていない 87.7% です。

ベンガルールのインディラナガル中心部を描画した QGIS の地図。建物は low が淡い黄色、mid がオレンジ、high が濃い赤、階数不明が灰色で、道路とバス停を示す黒い点を重ねている。
height_class でスタイル設定したインディラナガル中心部: low 563 棟(黄)、mid 442 棟(オレンジ)、high 68 棟(赤)、OSM に階数タグのない 7,636 棟(灰)。

タスク C では、エージェントの building_ha の数値は、式の一覧にある区ごとのヘクタールの行と少し違いました。New Thippasandra は 20.292 ha ではなく 20.151 ha(-0.69%)、Jeevan Bhimanagar は -0.14%、Indiranagar は -0.06% でした。理由を調べると、エージェントは私の intersects() フィルタより厳密なジオメトリの手法を使っていました。面積を合計する前に区の境界で建物ポリゴンを切り取ったので、境界をまたぐ建物が 2 つの区で重複して数えられず、回答でもそのことに触れていました。一方で、区レイヤは未確定の編集が残った編集モードのままで、回答の中で編集がまだ保存されていないと伝えていました。

ベンガルールの 10 区それぞれの school_count と building_ha を報告する QGIS の AI Agent パネル。形状を区の境界で切り取ったこと、編集がまだ保存されていないことを注記。
タスク C: エージェントはヘクタールを合計する前に境界をまたぐ建物を区の境界で切り取り、レイヤの編集がまだ未確定であることを伝えました。

編集を確定した後の区レイヤの属性テーブルがこちらです。

ベンガルールの 10 区の QGIS 属性テーブル。Domlur、Indiranagar、New Thippasandra、Ulsoor などの区名と並んで、新しい整数列 school_count と小数列 building_ha が表示。
school_count(合計 35)と building_ha(合計 148.25 ha)を追加した 10 区。

3 タスクは小さなサンプル(n = 3)で、フィールド名とクラスの境界を明示した明確なプロンプトを渡したので、ベンチマークではなくデモとして見てください。$area や concat() のような単純な式なら、チャットにメッセージを打つより Field Calculator ダイアログのほうが速いです。エージェントが役に立つのは、レイヤをまたいだ集計、CRS の変換、複数ステップの Processing の連鎖が必要なとき、あるいは本来なら PyQGIS スクリプトを書くようなときです。ほかのアシスタントとの比較は、QGIS AI ハブでもできます。

測定方法。 すべてのテストは 2026 年 11 月 7 日に、macOS 上の QGIS 3.44.15-Solothurn で、ベンガルールのインディラナガルの OpenStreetMap データ(範囲 12.968, 77.634, 12.986, 77.656、ODbL)を使い、プロジェクトの CRS EPSG:4326 で行いました。式の一覧の各式は、同じ地物 ID に対する独立した Python または QgsDistanceArea の計算で検証しました。面積と長さの誤差は、fid 順で最初の建物 200 棟と道路 200 本について、楕円体 WGS 84(EPSG:7030)の QgsDistanceArea と比べて測りました。AI Agent 1.9.4 は Medium effort、Balanced permissions で、タスクごとに新しいチャットで動かしました。YouTube の質問数は、25,276 件のコメントのコーパスから絞り込んだ 59 本の動画の質問コメント 70 件に基づきます。

よくある質問

QGIS で $area の計算が間違っている、または 0 になるのはなぜですか?

まず、$area ではなく area($geometry) と入力していないか確認してください。度で保存されたレイヤ(EPSG:4326)では、area($geometry) は平方度(住宅 1 棟で約 0.0000003)を返し、小数のフィールドでは 0.0 に丸められます。Project > Properties > General > Measurements でプロジェクトの楕円体を WGS 84 にして $area を使うか、area(transform($geometry, 'EPSG:4326', 'EPSG:32643')) のように式の中で現地の UTM ゾーンにジオメトリを再投影します。EPSG:3857(Web メルカトル)は避けてください。私たちのテストでは北緯 13° でも建物の面積が +5.95% 大きくなりました。

QGIS のフィールド計算機で IF 文や CASE 文はどう書きますか?

結果が 2 つなら if(condition, value_if_true, value_if_false) を使います。例えば if($area < 100, 'small', 'large') です。3 クラス以上なら CASE WHEN ... THEN ... ELSE ... END を使います。

CASE WHEN to_int("building:levels") IS NULL THEN 'unknown' WHEN to_int("building:levels") <= 2 THEN 'low' WHEN to_int("building:levels") <= 4 THEN 'mid' ELSE 'high' END

IS NULL の確認を最初に置いてください。そうしないと、空の値を持つ行がすべて ELSE に入ります。

フィールド計算機がすべて、またはほとんどの行で NULL を返したのはなぜですか?

よくある原因は 4 つです。

  1. 地図上で地物が選択されていた ため、 Only update N selected feature(s) がオンになり、選択されていない行がすべて NULL のままになった。
  2. || で文字列を連結した ("addr:housenumber" || ' ' || "addr:street" など)。入力が 1 つでも NULL だと結果全体が NULL になります。代わりに concat() を使います。
  3. 文字列の値をダブルクォートで囲んだ ("building" = "yes")。これは QGIS に yes という列を探させます。値にはシングルクォートを使います("building" = 'yes')。
  4. ポリゴンやラインのレイヤで $x や $y を使った。 $x はポイントでしか使えません。ポリゴンには x(centroid($geometry)) を使います。

QGIS のフィールド計算機でヘクタール単位の面積を計算するには?

Output field type を Decimal number (real) にし、 Precision を 2 か 3 にして、$area / 10000 と入力します(プロジェクトの面積単位が平方メートルで、プロジェクトの楕円体が Project > Properties > General で設定されている前提です)。保存する値そのものを小数第 3 位で丸めるには、round($area / 10000, 3) を使います。

フィールド計算機で選択した地物だけを更新するには?

先に地図キャンバスか属性テーブルで地物を選択してから、Field Calculator(Ctrl+I)を開きます。左上の Only update N selected feature(s) チェックボックスが自動的にオンになります。 Update existing field を選び、ドロップダウンから列を選んで式を入力し、 OK をクリックします。

AI Agent を無料で試す

QGISでの作業は、頼むだけで完了

AI Agentが、あなたのQGISプロジェクト上で、指示したタスクを実行します。無料、カード不要。

AI Agentを無料で試す
作成者Yvann Barbot
·10 min read