Microsoft Fabric向けのArcGIS GeoAnalyticsのパブリックプレビュー開始を記念して、GeoAnalytics for Fabricの機能を探る一連のブログ投稿を行います。 この投稿では、バッファー、空間ビン、最短経路などの新しいジオメトリの計算/構築の基本を探ります。また、これら新しいジオメトリの長さや面積などのプロパティ計算についても見ていきます。
GeoAnalytics for Fabricのインポート
まずはGeoAnalytics for Fabricをインポートして使い始める方法のおさらいから始めましょう。GeoAnalytics for Fabricをインポートするには、ノートブックのセルに import geoanalytics_fabric と追加するだけです。ライブラリの有効化について詳しくは、 入門ドキュメントをご覧ください。
利便性のために、 地理空間関数 も直接インポートし、参照しやすいエイリアスを付けることをお勧めします。以下の例では、ライブラリと関数を STというエイリアスでインポートしています。各関数はST.<function_name>という名前なので、参照が簡単でSpatial Type (ST)関数であることが識別できます。これはArcGIS GeoAnalyticsドキュメント全体の例の構造とも一致します。セルは次のようになります:
# ArcGIS GeoAnalyticsをインポート
import geoanalytics_fabric
import geoanalytics_fabric.sql.functions as ST
例えば、インポート後は、 ST_Buffer 関数を ST.buffer として参照でき、 geoanalytics_fabric.sql.functions.bufferと書く必要がありません。
新しいジオメトリの計算
GeoAnalytics for Fabricには入力に基づいて新しいジオメトリを生成する多くの空間演算があります。例えば、この投稿ではいくつかの一般的な関数を探ります:
ここではいくつかの関数を詳しく見ますが、GeoAnalytics for Fabricライブラリには分析プロジェクトに役立つ多くの関数があります。 SQL関数ドキュメントで関数群をご覧いただけます。
それではバッファーから始めましょう!
ST_Buffer と ST_GeodesicBuffer
ST_Buffer と ST_GeodesicBuffer は入力ジオメトリ周辺で指定距離以下の領域を表すポリゴンを作成します(例:点の周囲10マイル以内)。これらはジオメトリ列内のすべてのエンティティに対してバッファーを作成します。
動作を見るために、まずボストン地域内のいくつかの学校位置で新しいDataFrameを作成します。それらにバッファーを作成して各学校周辺領域を視覚的に確認します。以下は複数ポイント位置で新しいDataFrameを作成する例です:
# 複数学校位置(緯度・経度)でDataFrame作成
df_schools = spark.createDataFrame([
(-71.0777, 42.3388, "Hurley K-8"),
(-71.0919,42.3176, "Higginson Elementary School"),
(-71.1016, 42.3164, "Mendell Elementary School")], ["longitude", "latitude", "name"])
# 緯度・経度値からポイントジオメトリ列("geometry")作成
df_schools = df_schools\
.withColumn("geometry", ST.point("longitude", "latitude", sr=4326))
結果はこちらです:

これでこれら学校周辺にバッファーが作成できます。
バッファー距離単位は入力ジオメトリと同じ単位です。例えばデータがWeb Mercator座標系なら単位はメートル、地理座標系なら単位は10進度となります。
また、 ST_GeodesicBuffer はメートル単位で測地線距離によるバッファー作成に使えます。いくつかバッファーを作成して比較し、平面バッファーと測地線バッファーがどう違うか見てみましょう。
# ST_Buffer と ST_GeodesicBuffer を使った例示的なバッファー作成
# この例では0.5 _10進度_ のバッファー(入力データ単位は緯度・経度)
# さらに500メートルの測地線バッファーも作成
df_schools = df_schools\
.withColumn("geometry_buffer", ST.buffer("geometry", 0.5))\
.withColumn("geometry_geodesic_buffer", ST.geodesic_buffer("geometry", 500))
まず平面バッファーから見てみましょう。これは入力ジオメトリ単位(10進度)で計算されています。三校周辺に0.5度分のバッファーです:

軸ラベルは残しているので、このマップが10進度ベースマップ上にプロットされていることがわかります。
次に学校周辺の測地線バッファーです。こちらも10進度ベースマップ上にプロットされています。バッファーはずっと小さく(各学校周囲500m)、円形ではありません。その理由を探ってみましょう…

これらバッファー描画時に注目すべきポイントはいくつかあります:
- 最初の図ではバッファーが非常に大きく見えますが、二番目ではずっと小さいです。「geometry_buffer」は0.5度、「geometry_geodesic_buffer」は500メートルです。一度(10進度)は500メートルよりかなり長い距離です。赤道付近では緯度・経度1度は約111マイルにもなります!
- 最初の図(「geometry_buffer」)ではバッファーが円形ですが、二番目(「geometry_geodesic_buffer」)では楕円形に見えます。なぜでしょう?両方ともこのマップは生成されています 緯度と経度の座標に基づいて地図上にプロットします。これらのプロットでは、緯度1度の長さは経度1度の長さと等しくなります。地球上では、緯度1度と経度1度の長さは異なり、極に近づくにつれて経度1度の長さは短くなっていきます。詳細については、 <\/SPAN>Longitude<\/A> <\/SPAN>のWikipediaの項目が詳しく説明しています。この特定の地図投影法で測地線バッファをプロットすると、楕円形に引き伸ばされたように見えますが、地球の表面では円形になります。<\/LI><\/UL>ローカルのBoston座標系(SRID 2249)で測地線バッファをプロットすると、期待通りの円形のバッファが表示されます。<\/P>地図をプロットする際に <\/SPAN>sr<\/FONT> <\/SPAN>(空間参照)パラメータを追加して更新できます。以下のサンプルコードでこれを示します。 <\/SPAN>st.plot<\/FONT> <\/SPAN>のパラメータについては、 <\/SPAN>APIリファレンス<\/A>をご覧ください。<\/P>
<\/P>
# 空間参照2249でgeometry_geodesic_bufferを地図にプロットする
df_schools\\
.st.plot(basemap="streets", geometry="geometry_geodesic_buffer", alpha=0.5, edgecolor="black", sr=2249);<\/code><\/pre><P> <\/P><P>一般的に、バッファは測地線座標ではなく平面座標を使用して計算されるため、<SPAN> <\/SPAN><A href="https:\/\/developers.arcgis.com\/geoanalytics-fabric\/sql-functions\/st_buffer\/"><span>ST_Buffer<\/span><\/A><SPAN> <\/SPAN>は<SPAN> <\/SPAN><A href="https:\/\/developers.arcgis.com\/geoanalytics-fabric\/sql-functions\/st_geodesic_buffer\/"><span>ST_GeodesicBuffer<\/span><\/A><SPAN> <\/SPAN>よりも高速です。ただし、そのためには適切なローカル座標系を選択してから<SPAN> <\/SPAN><A href="https:\/\/developers.arcgis.com\/geoanalytics-fabric\/sql-functions\/st_buffer\/"><span>ST_Buffer<\/span><\/A>を使用する必要があります。<\/P><P>例えば、緯度・経度ベースのポイントをマサチューセッツ州平面座標系(SRID: 2249)のようなローカル座標系に変換してからバッファを作成できます。これはバッファ作成時に<SPAN> <\/SPAN><A href="https:\/\/developers.arcgis.com\/geoanalytics-fabric\/sql-functions\/st_transform\/"><span>ST_Transform<\/span><\/A><SPAN> <\/SPAN>関数を使って行います。以下に例を示します:<\/P><P> <\/P><pre class="lia-code-sample language-python"><code># ローカル座標系を使って学校座標の周りに500フィートのバッファを作成
df_schools = df_schools\\
.withColumn("geometry_buffer_2249", ST.buffer(ST.transform("geometry", 2249), 500))<\/code><\/pre><P> <\/P><P>座標系間でデータを変換する際には使用される単位を知ることが重要です。この場合、単位はフィートです。これは<SPAN> <\/SPAN><A href="https:\/\/spatialreference.org\/"><span>SpatialReference.org<\/span><\/A>などのウェブサイトで調べることができます。こちらが<SCRIPTED_LINK start_tag="<A href=\"https:\/\/spatialreference.org\ref\epsg\2249\" target=\"_blank\" rel=\"noopener nofollow noreferrer\">SRID 2249<\/_a>">SRID 2249</SCRIPTED_LINK>のエントリです。<\/P><P>その後、それらのバッファをプロットして地図上で違いを見ることができます。軸の単位が異なることに注意してください - データがマサチューセッツ州平面座標系(SRID: 2249)になったためです。<\/P><P> <\/P><pre class="lia-code-sample language-python"><code># フィート単位で計算されたバッファをプロット
df_schools.st.plot(basemap="streets", geometry="geometry_buffer_2249", alpha=0.5, edgecolor="black");<\/code><\/pre><P> <\/P><P><span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SBattersby_4-1741106542832.png" style="width: 400px;"><img src="https:\/\/us.v-cdn.net\/6038851\uploads\images\126900iA0731B9871062349\SBattersby_4-1741106542832.png" role="button" title="SBattersby_4-1741106542832.png" alt="SBattersby_4-1741106542832.png" \/></span><\/P><P>きれいなバッファができたので、他の興味深いジオメトリ計算に進む前に少し寄り道しましょう。このバッファを分析にどう使うか簡単に見てみます。<\/P><P>このバッファを使って、それぞれの学校近くにあるボストン市からの311公共サービスリクエストを特定します。そのために、以前の記事で見た<SCRIPTED_LINK start_tag="<A href=\"https:\/\/learn.microsoft.com/en-us/azure/open-datasets/dataset-boston-safety\" target=\"_blank\" rel=\"noopener nofollow noreferrer\">ボストン市MAからの公共安全データセット<\/_a>">公共安全データセット</SCRIPTED_LINK>と<SCRIPTED_LINK start_tag="<A href=\"https:\/\/azure.microsoft.com/en-us/products/open-datasets\" target=\"_blank\" rel=\"noopener nofollow noreferrer\">Azureオープンデータセット<\/_a>">Azureオープンデータセット</SCRIPTED_LINK>を使います。<br \/> <br \/> <br \/> <br \/> <br \/> <br \/> <br \/>
<P>念のため、このデータをDataFrameにインポートする方法はこちらです:<br \/>
<br \/>
<br \/>
<br \/>
<br \/>
<br \/>
<br \/>
<br \/>
<br \/>
<br \/>
<br \/>
<br \/>
<br \/>
<br \/>
<br \/>
<br \/>
<br \/>
<br \/>
<br \/>
<br \/>
<br \/>
# https:\/learn.microsoft.com/en-us/azure/open-datasets/dataset-boston-safety?tabs=pyspark
# Azure storage access info
blob_account_name = "azureopendatastorage"
blob_container_name = "citydatacontainer"
blob_relative_path = "Safety\\Release\\city=Boston"
blob_sas_token = r""
# SPARKがBlobからリモート読み込み可能にする
wasbs_path = 'wasbs:\/\\/%s@%s.blob.core.windows.net\\/%s' % (blob_container_name, blob_account_name, blob_relative_path)
spark.conf.set(
'fs.azure.sas.%s.%s.blob.core.windows.net' % (blob_container_name, blob_account_name),
blob_sas_token)
print('Remote blob path: ' + wasbs_path)
# SPARKでparquet読み込み
df = spark.read.parquet(wasbs_path)<br \/>
<br \/>
次に、作成したバッファを使って各学校近くのサービスリクエストすべてを見つけましょう。同じコード内で結果をプロットしますが、この種の結果を分析で使う場合は、新しいDataFrameを作成したり結果列を追加したりする方が良いでしょう。<br \/>
この例では<A href="https:\/developers.arcgis.com/geoanalytics-fabric/sql-functions/st_contains/" target="_self" rel="nofollow noopener noreferrer">ST_Contains</A>による空間結合(spatial join)を使います。これにより学校周辺バッファ内に含まれるすべてのサービスコールリクエストが見つかります。これは単純な例ですが、空間結合については今後の記事でさらに詳しく説明します...<br \/>
<br \/>
# 結果をプロットし、どの学校近くかによってサービスリクエストを色分け
df.join(df_schools.drop("geometry"), ST.contains("geometry_geodesic_buffer", "geometry"))\\
.st.plot(basemap="streets", geometry="geometry", marker_size=5, cmap_values="name");<br \/>
<br \/>
<span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="SBattersby_7-1741106898823.png" style="width: 400px;"><img src="https:\/us.v-cdn.net/6038851/uploads/images/126905i413438CE374B3622/SBattersby_7-1741106898823.png" role="button" title="SBattersby_7-1741106898823.png" alt="SBattersby_7-1741106898823.png" /><br \/></span></p>
<p> </p>
<p>この例では、それぞれの学校周辺のサービスリクエストが近い学校ごとに色分けされています。つまりジオメトリ(バッファ)を作成し、それを使って関心地点(学校近く)を特定しました。この種の分析には複数方法がありますが、これはバッファポリゴンによる簡単な例です。</p>
<p>次に進み、GeoAnalytics for Fabricで生成できる他の興味深いジオメトリについて見てみましょう。</p>
<p> </p>
<h4 id="toc-hId--1719932902">Bin関数による集約</h4>
<p>多くの特徴点が重なる大規模ポイントデータセットでは、多角形ビン(例:正方形、六角形、または国勢調査区画など行政区画)に特徴点群と属性集約(例:ビン内特徴点数や属性平均値など)としてグループ化するとパターン把握や可視化が容易になります。</p>
<p>GeoAnalyticsには空間ビニング用に3つの方法があります:</p>
<ul>
<li><a href="https://developers.arcgis.com/geoanalytics-fabric/sql-functions/st_hex_bin/" target="_blank" rel="noopener nofollow noreferrer">ST_HexBin</a></li>
<li><a href="https://developers.arcgis.com/geoanalytics-fabric/sql-functions/st_h3_bin/" target="_blank" rel="noopener nofollow noreferrer">ST_H3Bin</a>- <a href="https://h3geo.org/" target="_blank" rel="noopener nofollow noreferrer">H3 bins</a></li>
<li><a href="https://developers.arcgis.com/geoanalytics-fabric/sql-functions/st_square_bin/" target="_blank" rel="noopener nofollow noreferrer">ST_SquareBin</a></li>
</ul>
<p>この記事では一例のみ紹介しますが、GeoAnalytics for Fabricによる空間ビニング機能全般については<SCRIPTED_LINK start_tag='<A href= target="_blank" rel="noopener nofollow noreferrer">ST_H3Bin</A><SPAN> </SPAN>関数は、各サービスリクエストポイントがどの<A href="https://h3geo.org/" target="_blank" rel="noopener nofollow noreferrer">H3 bin</A><SPAN> </SPAN>内にあるかを特定します。次に、PySPark<SPAN> </SPAN><A href="https://spark.apache.org/docs/latest/api/python/reference/pyspark.sql/api/pyspark.sql.DataFrame.groupBy.html" target="_blank" rel="noopener nofollow noreferrer">GroupBy</A><SPAN> </SPAN>関数を使用して、各bin内のポイント数をリストした簡略化されたDataFrameを作成します。</P><P>H3 binのサイズは解像度値に基づいています。この例では、解像度8を使用します。これは平均的な六角形のbinサイズが0.73平方キロメートルに相当します。<SPAN> </SPAN><A href="https://h3geo.org/docs/core-library/restable" target="_blank" rel="noopener nofollow noreferrer">H3 binの解像度に関する詳細はこちら</A>をご覧ください。</P><P>binのIDを追加するのは、新しい列をデータに作成し、目的のジオメトリタイプ(六角形、正方形、またはH3)用のbin関数を使用するだけで簡単です:</P><P> </P><pre class="lia-code-sample language-python"><code># 各ポイントが属するH3 binの_id_を含む列を追加
df = df\
.withColumn("h3_bin", ST.h3_bin("geometry", 8))
この
ST_H3Bin 関数は各レコードにbin id を追加します。ジオメトリ自体は特に追加しません。なぜなら、ジオメトリは多くの重複(bin内の各ポイントごと)になるためであり、分析や可視化でジオメトリが必要になるまでIDで処理する方が効率的だからです。以下の表でこれらの新しいbin IDを見ることができます:
h3_bin ID フィールドを使って、テーブル内の値をグループ化し、各bin内のレコード数をカウントできます。 # h3 bin IDでサービスリクエストDataFrameをグループ化し、すべてのレコードをカウント
df_by_bin = df.groupBy("h3_bin").count() グループ化後、各bin IDにはその中にあるポイント数のカウントがあります。この後、bin IDをジオメトリに変換して結果を可視化できます。
以下はST_BinGeometry関数を使ってテーブルにbinジオメトリを追加する方法です: # ST_BinGeometryを使ってbin IDに基づくbinジオメトリを追加
df_by_bin = df_by_bin\
.withColumn("geometry_bin", ST.bin_geometry("h3_bin")) 結果をプロットすると、サービスリクエストが最も集中している場所がわかります:
次に、場所間の線や距離計算について見ていきましょう!ST_ShortestLine と ST_GeodesicLineST_ShortestLine は平面距離計算を用いて2つのジオメトリに接する最短線(linestring列)を返します。この関数は複数最短線が計算可能でも1つだけ返します。測地線距離計算で最短線を作成するには ST_GeodesicShortestLineを使用します。例として、先ほど作成したschools DataFrameと近隣のサービスリクエスト間の最短線を見ます。最短線は2つのジオメトリ列を入力とするため、それらは 同じ DataFrame内になければなりません。上記バッファ例では ST_Containsを使いバッファポリゴン内の全ポイントを見つけました。この例では別の空間計算である ST_DWithin(指定距離内) を使い学校ポイントから指定距離内にある全ポイントを探します。実質的には同じ結果ですが、DWithinはバッファ作成と空間結合よりパフォーマンスが良いことが多いです。DWithinはデフォルトで平面計算なので、ジオメトリを局所座標系に変換するかパラメータで測地線計算設定すべきです。ここでは ST_Transformで座標系変換し、この計算用に更新します。学校とサービスリクエスト結合し結果新DataFrame作成まで一括で行います: # 各学校から500フィート以内の全ポイント検索
# 指定距離内にあるポイントと空間結合
# 元データセットは緯度経度座標なので局所座標系へ変換してから実行
df_schools_requests = df.join(df_schools.select("name", F.col("geometry").alias("geometry_school")),
ST.dwithin(ST.transform("geometry", 2249), ST.transform("geometry_school", 2249), 500)) これで各学校には学校ジオメトリと近隣ポイントが揃ったので、その2つのジオメトリから各サービスリクエストポイントと学校間の最短線が計算できます。 # 各ポイントから各学校への最短線計算
df_schools_requests = df_schools_requests\
.withColumn("geometry_line", ST.shortest_line("geometry", "geometry_school")) 1校分の結果を見てみましょう: # 1校とその周囲500フィート以内全ポイント間コネクターライン描画
df_schools_requests.filter(F.col("name") == "Hurley K-8").st.plot(basemap="streets", geometry="geometry_line", linewidth=0.5, alpha=0.7);
短距離の場合は ST_ShortestLine が適していますが、長距離の場合は球面上で最短経路となるよう ST_GeodesicShortestLine も検討してください。「shortest line」(平面計算)と測地線との違いとして、ロサンゼルスとロンドン間の線分例があります。この例では測地線(オレンジ色)は曲線で長く見えますが実際には最短線です! # 測地線(geodesic)(オレンジ) vs 「shortest line」(平面)(青)
# 測地線はこの投影では曲線かつ長く見えますが実際には最短です!
# 2地点用ポイント作成
データ = [
("POINT (-118.2426 34.0549 )", "Los Angeles",
"POINT (0.1276 51.5072 )", "London")
]
# 2つの場所でDataFrameを作成
# 場所をwell-known textからジオメトリに変換
df_lines = spark.createDataFrame(data, ["wkt-origin", "city-origin", "wkt-dest", "city-dest"])\
.select("city-origin",
"city-dest",
ST.geom_from_text("wkt-origin", 4326).alias("geometry-origin"),
ST.geom_from_text("wkt-dest", 4326).alias("geometry-dest"))
# 生成された2つの線(測地線と最短線)を比較するためにプロット
myplt = df_lines.select(ST.geodesic_shortest_line("geometry-origin", "geometry-dest")).st.plot(basemap="light", figsize=(10,10), color="orange")
df_lines.select(ST.shortest_line("geometry-origin", "geometry-dest")).st.plot(ax=myplt);
距離と長さの計算これらの線の距離と長さを見てみましょう...ST_Distance と ST_GeodesicDistance は、2つの入力地点間の距離を計算します。ST_Distanceの単位は入力ジオメトリと同じです。ST_GeodesicDistanceでは距離はメートル単位で計算されます。 - ST_Length と ST_GeodesicLength は、入力フィーチャの長さを計算します。ST_Lengthの単位は入力ジオメトリと同じです。ST_GeodesicLengthでは長さはメートル単位で計算されます。
先ほど生成した学校の場所と近くのサービスリクエストを結ぶ線を使って、これらの計算を見ていきます。
距離計算では、GeoAnalyticsライブラリの特に便利な機能 - オンザフライ投影も見ることができます。異なる座標系にある2つのジオメトリでプロパティや関係性を計算したい場合、このライブラリはデータ変換なしでその違いを調整してくれることが多いです。
- ジオメトリ(サービスリクエスト)列はマサチューセッツ州平面座標系(SRID 2249)です
- ジオメトリ_school(学校の場所)列はWGS84緯度経度(SRID 4326)です
これら2つのジオメトリを使って様々な距離計算を行い、GeoAnalyticsが異なる座標系のジオメトリをどのように扱うか見てみましょう!以下のセルでは以下を計算しています:
- 座標変換なしで2つのジオメトリ間の距離
- ジオメトリ_school をマサチューセッツ州平面座標系(2249)に変換してから距離計算
- 変換なしで2つのジオメトリ間の測地線距離
また、先ほど作成した2点間を結ぶ線 geometry_line の長さも計算します。これらの計算を実行し、結果を例として表示します:
display(
df_schools_requests.select("geometry",
"geometry_school",
F.round(ST.distance("geometry", "geometry_school"), 2).alias("Distance (no transform)"),
F.round(ST.distance("geometry", ST.transform("geometry_school", 2249)),2).alias("Distance (transform)"),
F.round(ST.geodesic_distance("geometry", "geometry_school"),2).alias("GeodesicDistance (meters)"),
"geometry_line",
F.round(ST.length("geometry_line"),2).alias("Length (feet)"),
F.round(ST.geodesic_length("geometry_line"),2).alias("GeodesicLength (meters)")
)
)

これは異なる座標系にあるジオメトリでもこのように計算できることを示しています!GeoAnalytics for Fabricは可能な限り座標系の違いを軽減することに優れています。
最後に、計算可能なプロパティの一部と面積について見てみましょう。
ST_Area と ST_GeodesicArea
ST_Area - 各ジオメトリの平面面積を計算します。面積の単位は入力ジオメトリと同じです。地理座標系データセットで面積を計算すると、単位は平方十進度になりますが、これは推奨されません。ST_Area関数を使用する場合は投影座標系を使うことが最適です。詳細は座標系と変換コアコンセプトドキュメントをご覧ください。
ST_GeodesicArea は各ジオメトリの面積を平方メートルで計算し、入力ジオメトリ列に空間参照が設定されている必要があります。
この例では、ArcGISフィーチャサービスから読み込んだ米国州ごとの面積を計算します。
# Esri Living Atlas of the World の米国州フィーチャサービス
# このデータセットについて詳しくはこちら:https://www.arcgis.com/home/item.html?id=774019f31f8549c39b5c72f149bbe74e
fs_url = "https://services.arcgis.com/P3ePLMYs2RVChkJx/arcgis/rest/services/USA_Census_States/FeatureServer/0"
df_states = spark.read.format('feature-service').load(fs_url)
面積計算前に、データの座標系を確認して単位について理解し、ST_Area または ST_GeodesicArea のどちらを使うか決めるべきです。get_spatial_reference() 関数で確認できます。
df_states.st.get_spatial_reference()
返される情報によると、このデータはSRID 4326(WGS84座標系)です。
SpatialReference(srid=4326, is_projected=False, unit='Degree', wkt='GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]')
このデータセットでは、ST_Area と ST_GeodesicArea の値を見てみましょう。
以下の例では州名と平方マイルの元データ、およびPySpark の Round() を使って読みやすく小数点以下2桁に丸めた3つの新しい計算フィールドを表示しています:
- ST_Area を使った面積 - 空間参照が4326で単位がDegreeなので結果は平方十進度となり実用的な値ではありません
- USA Contiguous Albers Equal Area 投影(102003) に変換したジオメトリで ST_Area を使った面積。この計算結果は平方メートルなので下記例では平方マイルに変換しています
- 元ジオメトリで ST_GeodesicArea を使った面積。この計算結果も平方メートルなので平方マイルに変換しています
以下の例です。<\/LI><\/UL>
返される値はすべて非常に近い値ですが、完全に同じではありません。これらのずれは、大きな領域の面積計算における歪み( <\/SPAN>Coordinate Systems and Transformations core concept document<\/A> <\/SPAN>で投影の歪みについて詳しく説明されています)や、投影および変換プロセスで導入される可能性のあるわずかな精度の違いによるものです。<\/P> <\/P> <\/P> <\/P># フィーチャ サービスを読み込むとき、ジオメトリは通常 "Shape" という名前の列にあります。これは上記の表示されたテーブルを見れば確認できます
display(
df_states.select("STATE_NAME",
"SQMI",
F.round(ST.area("Shape"), 2).alias("Area (sq decimal degrees"),
F.round(ST.area(ST.transform("Shape", 102003))\/2.59e+6, 2).alias("Area (sqmi)"),
F.round(ST.geodesic_area("Shape")\/2.59e+6, 2).alias("GeodesicArea (sqmi)")
)
)<\/code><\/pre> <\/P> <\/P> <\/P>
<\/span><\/P>
結論<\/H3>新しいジオメトリを作成し、そのプロパティを計算するためのこの簡単な入門が役立ったことを願っています。 今後も開始に役立つ追加コンテンツを投稿していきますので、コミュニティをチェックしてください! また、どのようなことをもっと学びたいかぜひ教えてください!<\/SPAN><\/P> <\/P>