面積を計算するときに

2,552 views
Skip to first unread message

QGIS初心者

unread,
Oct 9, 2020, 4:32:28 AM10/9/20
to QGIS初心者質問グループ
QGIS3.10.2を使ってます。
面積を計算するときに
$area
area($geometry)
と2種類があります。
これらを使い分けるときはどのような時なのでしょうか?

普段、こう使い分けているというアドバイスがあればぜひともお願いします。

ありた

unread,
Oct 9, 2020, 9:43:10 AM10/9/20
to QGIS初心者質問グループ
こんにちは

area($geometry) というのは、座標系情報を考慮せず、座標の値( $geometry ) の
数値をそのまま使用し計算した面積です。つまり平面直角座標系で保存されている
座標値であれば、平面直角座標系で投影した地図における面積が得られますし、
経度緯度座標系で保存されているデータであれば、経度緯度の値をそのまま
使用して計算します(単位は平方度になるでしょう)。

$area は、レイヤの座標系がどのようなものであろうと、一旦地球球面上で
どのような位置になるか計算し、地球球面の丸みを考慮した面積を計算します。



上記のように、 $area であればレイヤの座標系にかかわらず、正確な計算を行って
くれます。一方で、丸みを考慮し正確ではありますが、検算が難しく、平面直角座標系の
(0, 0), (100, 0), (100, 100), (0, 100) のポリゴンの面積は 100m2 と一致しません。
こういったケースでは、 area($geometry) のほうが、測量値と整合するため、
適している場合もあります。

QGIS初心者

unread,
Oct 11, 2020, 8:34:24 PM10/11/20
to QGIS初心者質問グループ
ありた様
ありがとうございます。

area($geometry) =CADで見ている面積
 $area=実際に地球上の円弧を考慮した面積
という感じなのでしょうか?

地物情報で見ると

のようになっている地物に対して、
$areaで計算をしてやると、面積(デカルト)と一致するため、$areaはデカルト座標系というのを参照しているということ?2次元シェープファイルであっても、面積であればデカルトのZ座標を曲率として考慮して計算しているということなのでしょうか?
また、 area($geometry) は面積(楕円体~)の方と一致するのですが。そこでの楕円体ってなぜ関与してくる感じなのでしょうか?すみません。よくわかってません。

また、$areaの説明を見ると、「プロジェクトに回転楕円体が設定されている場合、楕円体面積になり、設定されていない場合、平面上の面積になります。」とあります。
このプロジェクトに設定というのは、画面の一番右下に設定されている座標系に応じて、その系の面積として計算してくれるという認識であっていますでしょうか?

2020年10月9日金曜日 22:43:10 UTC+9 ありた:

QGIS初心者

unread,
Oct 20, 2020, 10:32:59 PM10/20/20
to QGIS初心者質問グループ
すみません。やはり面積や長さ関連で分からなくなってきています。

こちらの認識
①$areaで計算すると結果は「デカルト座標系」となるため、地球の丸みを考慮した面積や長さとなる。
②area($geometry) で計算すると、座標値そのものを使って面積を出す(CADのようなもの)ため、CADで図る面積と一致する。
上記の認識です。

で、わからない点なのですが、面積や長さを計算すると
①で地球の丸みを考慮しているにも関わらず、面積が小さくなってしまったり、長さが短くなってしまったりすることがあることです。つまり、②>①ということです。
このようになってしまうことはあるのでしょうか?あるいは作図したものと座標系や投影している座標系の影響を受けているのでしょうか?

3次メッシュ(EPSG4326で作図)されたものをEPSG4326で投影した状態で長さを計測すると
①のデカルト座標系($area)ですと、927.625m
②の回転楕円体(area($geometry))ですと、924.467m
となり、デカルト座標系の方が長くなるので、そんなものかなとは感覚的に思います。



また、同じ図形をEPSG6675に投影すると
①のデカルト座標系($area)ですと、924.377m
②の回転楕円体(area($geometry))ですと、924.467m
となり、デカルト座標系の方が長さが短くなるという事が起きてしまいます。
そのようなことが起きるのは、もともと作成したレイヤ座標系と投影座標系での変換のせいなのでしょうか?

②の回転楕円体の長さは投影座標系を変換しても同じなため、座標値で計算なされているCAD状態であるという事であってますでしょうか?





①デカルト座標($area)は投影座標系に変換した面積長さを返してくれる。
②回転楕円体( area($geometry)  )は座標に入力した値のみで計算(三平方の定理等)のCADに似た計算手法で面積長さを返してくれる。
といった認識であっていますでしょうか?

2020年10月12日月曜日 9:34:24 UTC+9 QGIS初心者:

ありた

unread,
Oct 21, 2020, 7:11:41 AM10/21/20
to QGIS初心者質問グループ
返信できておりませんで、すみません。


まず、現実の世界で 100m の距離のものが 1cm (=0.01m) で描かれた地図がある場合、
その地図は縮尺 1/10,000 の地図といいます。ここで仮想的に 1/1 スケールの紙地図を
考えた場合、現実で 100m の距離は当然地図上で 100m となります。

ただし地球表面は丸みを帯びているため、平面状の地図に正確に表現することはできず、
引き伸ばしたり縮めたり、歪めたり切断したりする必要があります。
たとえばメルカトル図法の場合、基準となる中心線から離れるほど縦横に引き伸ばし、
経緯線をまっすぐに、かつ地形の形状をできるだけ歪めないようにしています。
このため赤道において 1/1 となるスケールの地図を用意しても、赤道から離れた高緯度
地域では地球上で 50m なのに地図上で 100m ということもでてきます。(海図など広い
範囲を扱ったメルカトル図法の地図では、スケール情報と一緒にスケールの基準緯度に
ついて記載します。)

つまり、地球表面の形状をそもそも平面(紙地図化)とすること自体、距離や面積、
形状などなんらかが不正確な状態であり、スケール情報が載っていても、位置によっては
記載通りのスケールになりません。
https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%A4%E3%82%BD%E3%83%BC%E3%81%AE%E6%8C%87%E7%A4%BA%E6%A5%95%E5%86%86



それを承知のうえ、(現実の地球のことは考えず)紙地図上での座標値を使用し、中学数学の
平面幾何の知識で計算したものを QGIS では「デカルト座標」による距離や面積といいます。
これに対応するものは area($geometry) です。

GIS では地理座標系(地心直交座標系や経緯度座標系)を除き、データ(レイヤ)に
保存されている座標は、紙地図化し、紙地図上における座標値が保存されています。
そしてその紙地図上の座標値は QGIS の場合 $geometry で取得できます。この座標値は
座標系情報が抜け落ちた数字の組です。
この時点で現実の地球表面とは切り離された概念となっています。

QGIS における「デカルト座標」における距離や面積は、あくまで紙地図上での距離や
面積なので、その単位が m や m2 であってもそれは紙地図上での値であり、現実の
地球における値とは異なるものです。



一方、現実の地球に近い回転楕円体を用い、その基準とした回転楕円体における曲率を
考慮した距離や面積を QGIS では「楕円体考慮」の距離や面積といった表記をします。
これは $area で計算することができ、低緯度帯であっても高緯度帯であっても、モ
ルワイデ図法であっても、経度緯度座標系であっても、基準楕円体(プロジェクト CRS 
で採用されている楕円体)における正確な結果が得られます。



次に、測量で使用される平面直角座標系ですが種類としてはメルカトル図法の一種で、
赤道基準ではなく、ある子午線を基準に東西に展開した横メルカトルという図法になります。
通常のメルカトル図法と同様、基準線から離れると距離や面積に大きな差異が発生してしまいます。
逆に言えば基準線付近の限られた範囲内であれば、十分に平面に近似でき、距離や面積の
差異は許容できる程度しか生じません。そこで各地域ごとに異なる基準線の平面直角座標系を
定義し、その地域内においては平面に近似し、測量等で使用しています。

その平面直角座標系ですが、繰り返しになりますが基準線から離れるほど引き伸ばされます。
だいたい東西 90km 離れた地点では紙地図上の座標は 1.0001 倍となってしまいます。
そこで、基準線において「地図/現実=0.9999」となるようなスケールで紙地図化すると
いう工夫を施します。こうすることにより基準子午線での縮尺係数(率)は0.9999。
だいたい東西 90km の地点では1.0000。東西 130km の地点では1.0001となり、
許容誤差(±1/10,000)以下の範囲が広くなります。
https://www.gsi.go.jp/sokuchikijun/datum-main.html#p7

このように楕円体考慮の面積に対して、平面直角座標系の座標値を用いたデカルト座標上の
面積が小さいケース(基準子午線に近い)もあれば大きいケース(遠い)も出てきます。



またプロジェクト CRS が経緯度座標系( EPSG:4326 など)のとき、「地図単位」で
計測ツールを使用すると単位は度や平方度になりますが、「メートル」で表示する際は、
緯度を考慮せずに一律で 1度 = 111319.49079327358 m として単位変換が行われている
だけなので、メートルで表示させて得られた値も不正確です。

距離だけですが国土地理院の計算サイト(No. 2, 3)も示しておきます。ここで計算される
距離は測地線長(いわゆる楕円体考慮の距離)です。
https://vldb.gsi.go.jp/sokuchi/surveycalc/main.html

ありた

unread,
Oct 21, 2020, 8:11:36 AM10/21/20
to QGIS初心者質問グループ
具体的な計算をしてみます。

たとえば、平面直角座標系9系において p1 (0, 0) と p2 (0, 10000) の2点を考えます。
ただし議論を平易にするため、 GIS でよく使われる軸のとり方である東方向が X 、
北方向が Y として記述します。(規則上は北方向が X 、東方向が Y で、地理院の
計算サイトはそれに準じているので注意が必要)

JGD2011 平面直角座標系9系では
p1 (       0.000000000,        0.000000000)
p2 (       0.000000000,    10000.000000000)
デカルト座標における距離は 10000.000 m です。

JGD2011 (経緯度座標系)だと以下となります。
p1 (     139.833333333,       36.000000000)
p2 (     139.833333333,       36.090131713)
デカルト座標における距離は 0.090131713 度です。
換算係数を使ってメートルに変換すると 10033.416 m となります。

疑似メルカトル図法 (EPSG:3857) だと以下です。
p1 (15566175.462592747,  4300621.372044271)
p2 (15566175.462592747,  4313030.45449092 )
デカルト座標における距離は 12409.082 m です。

無理やり平面直角座標系12系で計算すると
p1 ( -217893.928201544,  -885488.917383524)
p2 ( -217645.522128312,  -875486.158731605)
デカルト座標における距離は 10005.843 m です。


ですが、楕円体を考慮した測地線長は 10001.000 m となります。
この値は基準とする楕円体が変化しない限り、変わりません。

正しい系の平面直角座標系であれば、相対誤差 1/10,000 以下であり、地図上の
座標値( GIS データの座標値)から距離などを計算しても実用上問題ないと
されています。

sakuya_izayoi

unread,
Oct 21, 2020, 8:35:06 PM10/21/20
to QGIS初心者質問グループ
QGIS初心者さま
こちらizayoiです。

ありたさまの方からかなり詳しい説明があり、私も勉強となりました。
さて、QGIS初心者さまが勘違いしている点として
area($geometry)と$areaの部分があげられます。

面積(デカルト)=CAD(紙)=area($geometry)
面積(楕円体)=地球の丸み考慮=$area
です。ここをちょっと取り違えて計算結果を見てしまったので、分かりにくくなっているのかなと思います。

CADの話がよく出てきていますので、CAD図添付の方がわかりやすいかなと思い
1000m×1000mの四角形を書いたCAD図を添付しています。お手持ちのCADで開いてみてください。(DXFの古い形式にしてあるためたいてい読めると思います)

QGISに座標系は平面直角(例えばEPSG6675)及びUTM、メルカトル(EPSG3857)のどれでもよいので好きな座標系として読み込みます。(緯度経度のはやめてください)
この図はQGISではライン地物として扱われるため、

ベクタ⇒ジオメトリツール⇒線をポリゴンに変換します。

その後に、area($geometry)と$areaで計算してみてください。
area($geometry)=1000000
$area=1000200
と出ます。
つまり、
CAD(紙)=area($geometry)
地球の丸み考慮=$area
と直感的に分かるかなと思います。

ここまでくれば、最初に楕円体考慮がなんでかわからないという部分も理解できるかなと。
一度、この操作をやってもらってから
ありたさまの文面を読むとより分かるようになると思います。

以上、蛇足でした。
1000×1000.dxf

QGIS初心者

unread,
Oct 22, 2020, 12:36:57 AM10/22/20
to QGIS初心者質問グループ
ありた様
ものすごく詳しい説明をありがとうございます。
しっかり読み込んで理解します。

sakuya_izayoi様
CAD図の添付、ありがとうございます。なるほど、CAD図もQGISで読み込めるのですね。試しにD&Dしたら読み込んでくれて試すことできました。
直感的に意味合いが理解できました。このイメージのままありた様のを読めばわかりやすそうです。
また、どこがで私がareaコマンドについて勘違いで覚えちゃったみたいで、ご指摘ありがとうございました。
・・・FOSS4G東海の講師の方でしょうか?(違ったらすみません。会場でその名前を拝見しました)


2020年10月22日木曜日 9:35:06 UTC+9 sakuya_izayoi:

ありた

unread,
Oct 22, 2020, 9:17:27 AM10/22/20
to QGIS初心者質問グループ
こんにちは

混乱するか、異なる観点からの説明で理解のきっかけとなるかわかりませんが、
3つの別の例を示します。

フィールド計算機で次の計算をしてみてください。
レイヤやプロジェクトにどんな CRS を設定したとしても結果は 10000 になります。

area(
  make_polygon(
    make_line(
      make_point(  0,   0),
      make_point(100,   0),
      make_point(100, 100),
      make_point(  0, 100),
      make_point(  0,   0)
    )
  )
)

area 関数に与える引数のジオメトリは座標系情報を持たず座標値しか持ちません。また
レイヤ CRS 情報は考慮されず、座標値が地球上でどのような位置にあるか計算しません。
make_polygon 関数で作成したジオメトリデータを見てもらっても座標系情報を持たない
座標値のみのデータであることがわかります。
このことからも area 関数は自然と平面上(地図上)における面積算出とわかるかと思います。

一方、 $area はレイヤの CRS をもとに、プロジェクト CRS で採用されている楕円体上
(地球上)のどの位置にあるか具体的に計算し、楕円体上での面積であるか計算し結果を
返します。(ただしプロジェクト CRS が「 CRS なし」など楕円体が規定されていない場合、
やむを得ず、 area() と同様に平面とみなし座標値のみで計算されます。)
このため、引数としてジオメトリを指定したりすることはできません。



下図は WGS84 を使用したモルワイデ図法( ESRI:54009 )で示したものに、その座標系に
おける 1000km グリッドを表示したものです。(原点は緯度0度、経度0度の点)

moll.png


四国沖の地点に、この地図上において (12000000, 4000000) の点があります。この点から
原点までの「デカルト座標」における距離は三平方の定理より12649110.640674 m となります。
(ただし、そもそもこの地図上で二点を直線で引いた最短経路は、地球上(楕円体上)に
 おける最短経路と一致しません。)

なお、この点は経緯度に変換すると (133.58679704 33.06103686) となる点なので、
楕円体を考慮した測地線長を計算すると 13944375.895 m となります。



平面直角座標系9系で 10km 四方のグリッドを生成しました。そのレイヤに属性を追加し、
初期値式はそれぞれ以下のとおりとしました。
area 属性 (楕円体考慮の正確な値。単位は km2 )
    $area / 1000 / 1000
geom_area 属性 (座標値の数値のみで計算した値。単位は km2 )
    area($geometry) / 1000 / 1000
k 属性 (簡易的に計算した縮尺係数)
    sqrt(area_geom / area)

area($geometry) で計算した area_geom 属性はどのグリッドも 100km2 ですが、
楕円体を考慮した $area で計算した area 属性は位置によってまちまちです。

縮尺係数 k で色分けを行うと下図のようになります。

grids.png


東西 90km までは k < 0 であり、実際の楕円体考慮の面積の方が大きいことを意味して
います。これは、平面直角座標系は基準子午線における縮尺係数が 0.9999 となるように
調整する処理が行われているからです。
東西 90km より遠い範囲では k > 0 となり、実際の楕円体考慮の面積よりも、当該
座標系上の座標値によるデカルト座標による計算の方が大きいことを意味しています。
これは、横メルカトル図法であるため基準子午線から東西に離れるほど地図が引き伸ば
されているからです。またそれは距離が離れるほど急激に増えていきます。
(真球の場合、基準子午線との角距離を θ とおくと 1/cosθ となる。)

grids.gpkg
Reply all
Reply to author
Forward
0 new messages