建設業界において、各作業現場に配備された高額な設備を効率的に管理することは、共通の課題です。これに対応する形で、多くの建設機器メーカーがIoT(モノのインターネット)によって設備を接続し、プロジェクトライフサイクル全体の効率化を支える新たなデジタルソリューションの可能性を切り拓いています。マッキンゼーの2017年のレポートによると、テクノロジーを活用したソリューションによって業界全体の生産性は最大60%向上する可能性があるとされています。設備のリアルタイムな配置状況を把握することで、フリートマネージャー(設備管理者)はダウンタイムを削減し、稼働率を最大化することができます。GPSトラッキングや地理空間分析を活用することで、企業は設備の配備、メンテナンススケジューリング、リソース配分に関して、データドリブンな意思決定が可能になります。しかし、地理空間データをリアルタイムで活用するには、複雑なデータ処理が必要となるため、実現は容易ではありません。よくある課題の一つが、ある設備が特定の作業現場内で稼働しているかどうかを正確に判断することです。Databricksでは、Delta Live Tablesを使って、数千の現場にわたる「点がポリゴン内にあるか(Point-in-Polygon)」の判定をストリーミングで処理するために、さまざまな地理空間機能を組み合わせることが可能です。Databricks製品が提供するH3地理空間インデックスのAPIや、現在プレビュー中のSpatial Temporal(ST)関数を活用することで、「点とポリゴンの地理空間ハイブリッド結合」パターンを実装でき、設備の位置を高精度かつスケーラブルに現場へマッピングすることができます。設備やフリートの管理者が各機器の位置情報を把握できるようになれば、メンテナンス計画の最適化、移動・待機時間の削減、リソース不足な現場への即時派遣など、さまざまな場面で統計情報やレポートを活用した判断が可能になります。H3とは?H3は、地球全体を均一な六角形のセルに分割し、それぞれに一意の識別子を割り当てるオープンソースの地理空間インデックスシステムです。高い精度とスケーラビリティを兼ね備えており、地理空間データの分析に最適です。H3の主な特徴:六角形グリッドシステム:四角形の代わりに六角形を使用し、より良い空間関係、最小の歪み、一貫したエリアカバレッジを確保します。階層構造:16の解像度(0-15)をサポートし、各レベルでヘキサゴンを約7つの小さなものに細分化し、精度を変えることができます。効率的な空間操作:セルIDを使用して空間結合、最近傍検索、ポイントインポリゴンの計算を簡素化します。DLTパイプラインの例を見る前に、設備の位置と運用サイトの境界を視覚化してみましょう。ポイントは私たちの機器を表し、ポリゴンは作業現場、メンテナンスサイトは円です。Delta Live Tables パイプラインの概要このDLTパイプラインは、全資産のうちどれだけが作業現場、メンテナンス拠点、または拠点間を移動中であるかを示す割合を、毎時ストリーミングで計算します。これにより、設備フリート全体の稼働状況を可視化・モニタリングすることが可能になります。表1:直近1時間の設備位置情報最初のストリーミングテーブルでは、GPSトラッキングデータを1時間ごとのウィンドウでグルーピングし、各設備の最新の緯度・経度情報を抽出します。@dlt.table(name='hourly_locations') def hourly_locations(): return ( spark.readStream.table('ssa_mfg.demo.tracking_events') .withWatermark('event_ts', '1 hour') .groupBy('asset_id', window('event_ts', '1 hour')) .agg(max_by(struct('lat', 'lon'), 'event_ts').alias('coords')) .selectExpr('asset_id', 'window', 'coords.lon as lon', 'coords.lat as lat') )表2:H3とSpatial Temporal関数を用いたPoint-in-Polygon結合各資産の1時間ごとの最新位置情報が得られたので、H3の地理空間インデックスを活用して、資産を作業現場にマッピングする「Point-in-Polygon(点とポリゴンの包含判定)」の結合処理を実装します。加えて、Databricksが提供するSpatial Temporal(ST)関数群も併用しています。h3_res = 10 # Each cell has an edge length of 216.3ft and an area of about ~ 161,980 ft^2 @dlt.table(name='assets_in_jobsites') def hourly_locations_with_jobsite(): # Read the GPS tracking data from a Delta table: tracking_df = ( dlt.read_stream('hourly_locations') .selectExpr('*', f'h3_longlatash3(lon, lat, {h3_res}) as cellid') # Returns the H3 cell for the asset's reported GPS coordinates ) # Read the jobsite locations from a Delta table: colorado_operations_sites_df = ( spark.read.table('operations_sites') .selectExpr('*', f'inline(h3_tessellateaswkb(geometry, {h3_res}))') # Tesselates the jobsite with a set of H3 cells ) # Join the GPS tracking data with the jobsite locations using the H3 cell ID: tracking_telematics_at_operations_sites_df = ( tracking_df.alias('a') .join(colorado_operations_sites_df.alias('b'), 'cellid', 'left') .where('b.core IS NULL OR b.core OR st_contains(st_geomfromwkb(b.chip), st_point(a.lon, a.lat))') ) return tracking_telematics_at_operations_sites_dfコードの仕組みについてH3インデックス付与:地理空間結合のためのデータ準備最初のステップは、設備のGPS座標と作業現場を表すポリゴン境界の両方にH3インデックスを割り当てることです。解像度の選定:解像度が低い(セルが大きい)場合は計算コストが抑えられる一方で、解像度が高い(セルが小さい)と精度が向上します。今回の例では、解析に必要な粒度に合った解像度11(約2,150平方メートル)を選択しました。GPSポイントのインデックス化:各設備の位置情報(緯度・経度)を h3_longlatash3 関数でH3セルIDに変換します。作業現場の境界のインデックス化各現場のポリゴン形状を、そのポリゴンをカバーするH3セルの集合に分割(テセレーション)するために、h3_tessellateaswkb 関数を使用します。この関数は、以下の3つの情報を含む配列を返します:「cellid」:H3セルの識別子「core」:セルが境界内にどのように含まれるかを分類します - Core = true:セルが現場境界の完全に内部に含まれている - Core = false(= 境界セル):セルが境界と部分的に重なっている「chip」:ポリゴンの作業現場とH3セルとの交差領域または重なりを表すジオメトリ情報 結合処理:設備を現場に効率的にマッピング次のステップでは、H3セルIDをもとに設備と現場の結合処理を行います:Left Join:H3セルIDを使って設備の位置情報と現場を突き合わせます。 - 作業現場にいる設備 - メンテナンス拠点にいる設備 - 移動中の設備(site_type = null)Where句:cellid がコアセル(core = true)の場合、そのセルは現場の境界内に完全に含まれているため、追加の処理は不要です。H3セルIDによる結合により、各レコードに対して計算負荷の高い地理空間処理を実行する必要がなくなります。境界セルに対する精密なジオメトリチェック ― ハイブリッドアプローチcore = false(境界セル)と分類されたセルについては、そのH3セルが現場ジオメトリに完全には含まれていないため、精密なジオメトリチェックが必要です。この場合、st_contains を使って「点がポリゴン内にあるか(Point-in-Polygon)」の判定を行います。これにより、解像度の粗さによる誤検出を防ぎ、現場の境界内に真に存在するポイントのみを結合結果に含めることができます。表3:サイト別の設備分布状況 DLTパイプラインの最後のストリーミングテーブルでは、設備が各サイト種別(site_type)にどのように分布しているかを集計します。SELECT 式を使って、以下を計算しています:各時間ウィンドウごとの全設備数各サイト種別に存在する設備数テレメトリデータを報告している設備の割合(全設備に対する割合)これにより、設備の利用状況を時間軸で継続的に把握することができます。@dlt.table(name='distribution_assets_hourly') def hourly_asset_distribution(): return ( # Count the assets in each location type by hour to determine the distribution: dlt.read_stream('assets_in_jobsites') .groupBy('window') .agg( count('asset_id').alias('total_assets'), count(when(expr('site_type = "maintenance"'), col('asset_id'))).alias('assets_in_maintenance_sites'), count(when(expr('site_type = "resource_extraction"'), col('asset_id'))).alias('assets_in_mining_sites'), count(when(expr('site_id IS NULL'), col('asset_id'))).alias('assets_in_transit')) .selectExpr( 'window.start as window_start_ts', 'window.end as window_end_ts', 'total_assets', 'round((assets_in_maintenance_sites / total_assets), 2) as percent_in_jobsite', 'round((assets_in_mining_sites / total_assets), 2) as percent_in_maintenance_site', 'round((assets_in_transit / total_assets), 2) as percent_in_transit') )Delta Live Tables と H3地理空間インデックス、Spatial Temporal関数、そして「ハイブリッド型」Point-in-Polygon結合パターンを組み合わせることで、設備の位置を作業現場へ効率的にマッピングし、フリートの分布指標を算出することができます。このアプローチは、空間演算をシンプルにしながらも精度を維持できるため、建設業界のようにリアルタイムかつ大規模な地理空間分析が求められる分野に最適です。今後公開予定のブログシリーズでは、状態を保持するストリーミング処理によるランドマークの入退出のリアルタイム監視や、「地理空間エージェント」として Mosaic AI Agent フレームワークに地理空間インテリジェンスを組み込んだ配達追跡の仕組みなども紹介予定です。H3 を用いた Databricks 上での地理空間分析のはじまりについて詳しく知りたい方は、H3とPhotonを用いた任意のスケールでの空間分析 をご覧ください。また、今後のアップデートとして、Databricks における ST関数やジオメトリ・地理型データの対応拡張にもご期待ください。