- 大量の標高付きSIMA面データでの描画負荷を下げるため、AR上の点と線を軽量な板状表示に変更しました。
- 点は球体ではなく薄い板状マーカーで表示します。
- 線・柱は円柱ではなく薄い板状線分で表示します。
- 表示位置・高さ差・選択点・点名/画地名の処理は従来仕様を維持します。
- 目的はポリゴン数を減らし、標高ON時の斜め線分が多いデータでの描画負荷を下げることです。
KML / KMZ / CSV / SIMA / GeoTIFF を iPhone の AR 画面に表示する最小構成の SwiftUI / ARKit アプリです。
- 標高ON時の重さ対策として、AR表示用の点・線・ラベル座標をキャッシュするようにしました。
- 標高補完は読み込み時のままです。
- AR表示中は、標高補完の近傍検索を行いません。
- 表示用座標とラベルを毎回二重生成しないようにしました。
- RealityKit側の再描画判定を、長い文字列署名から軽量なHash署名へ変更しました。
- 大量SIMA/KMLでの不要な文字列生成負荷を抑える目的です。
- 画地名ラベルの画面上オフセットを見直しました。
- 点名は球体と重ならないよう上にずらします。
- 画地名は、標高差の上下方向が逆に見えないよう、投影位置に近い位置へ表示します。
- GeoTIFFのAR上の半透明表示を修正しました。
- 画像画素そのもののアルファ加工ではなく、RealityKit の
UnlitMaterialに対して画像テクスチャを貼り付けたうえで、マテリアル全体の透明ブレンドを明示します。 material.colorに不透明度付き tint と texture を設定します。material.blending = .transparent(opacity: ...)を追加しました。- 設定画面の「GeoTIFF不透明度」は AR 上の GeoTIFF 平面に反映されます。
- 画像画素そのもののアルファ加工ではなく、RealityKit の
- 既存方針どおり、白透過・黒透過・明るさ透過などの画素別透過処理は行いません。
- GeoTIFFはUnlit表示のままなので、暗所でも画像自体がライト推定で暗くなりにくい設定です。
- GeoTIFFの画素ごとの透過処理を廃止しました。
- 白透過・黒透過・明るさによる透過は行いません。
- 設定画面の「GeoTIFF不透明度」スライダーで画像全体の不透明度を変更します。
- 初期値は35%です。
- 読込画面、設定画面、平面図、座標指定、GeoTIFF座標系選択など、AR以外の操作画面を開いている間はARSessionを一時停止します。
- 消費電力と発熱を抑える目的です。
- 閉じるとARSessionを再開します。
- GeoTIFFのみを読み込んだ状態でも「平面図で選択」を開けるようにしました。
- GeoTIFF画像上をタップすると、その位置を「GeoTIFF選択点」としてAR側へ適用できます。
- 平面直角座標系の系番号選択をプルダウンからステッパーに変更しました。
- スクロールできない問題を避けるためです。
- GeoTIFF読込時の「平面直角座標系 / 緯度経度」の切替を、セグメントUIから明示的な2ボタン方式へ変更しました。
- v10/v11で外れていた、AR画面上のスワイプによる方位・高さ補正を復活しました。
- 横スワイプ:方位補正
- 縦スワイプ:表示基準面の高さ補正
- 斜めスワイプ時に方位と高さが同時に変わらないよう、ドラッグ開始時に横方向または縦方向のどちらか一方へロックする方式にしました。
- 点や地図データそのものをAR画面上で直接ドラッグ移動する方式は引き続き使いません。
- GeoTIFFの白抜き処理を、しきい値による白透過から、明るさに応じた不透明度処理へ変更しました。
- 白:透明
- 灰色:半透明
- 黒:不透明
- AR背景を明示的にカメラ映像へ設定しました。
ARView.Environment.Background.cameraFeed(exposureCompensation:)を使い、黒背景ではなく現実のカメラ映像を背景にします。- ARView自体も透明設定にして、黒い幕のように見える状態を避けます。
- 初心者向けの「次の操作」ガイドをAR画面上部に追加しました。
- データ未読込、現在地未設定、平面図選択未実施など、状態に応じて次に押すボタンを表示します。
- 下部ボタンを横スクロール式に変更しました。
読込、現在地取得、座標指定、点から現在地、平面図で選択、設定のように、操作名を分かりやすくしました。
- 現実背景を隠しすぎないよう、UIは透過系の表示を維持しています。
- 点名を3D文字ではなく、通常の画面上の2Dラベルとして表示する方式へ変更しました。
- 見る角度によって文字が真横になり、読めなくなる問題を避けます。
- 点名は最大30件までに制限します。多い場合は現在地に近い点名を優先します。
- 距離表示を追加しました。
- 初期状態はOFFです。
- 下部の「表示」メニューから「距離を表示」を選ぶと、点名の横に概算水平距離を表示します。
- ライトボタンを追加しました。
- 暗い場所で端末ライトをON/OFFできます。
- LiDAR補助を追加しました。
- 初期状態はOFFです。
- LiDAR対応端末で「表示」メニューからONにできます。
- 非対応端末ではONにしても有効化されません。
- 暗所でAR図形が見えにくくなる問題への対策として、点・線・柱・GeoTIFFを照明の影響を受けにくいUnlit表示に変更しました。
- 半透明壁、地表面認識、平面検出は引き続き使いません。
LiDAR補助は、GPS座標や方位の絶対精度を直接よくするものではありません。 近距離の空間把握や特徴点の少ない環境でのAR追跡の安定には効く可能性がありますが、境界点の絶対位置精度は、現在地指定・方位補正・入力座標の精度に依存します。 電池消費と発熱を考慮し、初期状態はOFFにしています。
GeoTIFF は試験実装です。
- 1 枚画像として、現在の AR 表示基準面に水平表示します。
- 読込時に、ユーザーが座標系を指定します。
- GeoTIFF 内の EPSG 情報は使わず、指定した座標系として解釈します。
- 画素ごとの白透過・黒透過・明るさ透過は行いません。
- 設定画面の「GeoTIFF不透明度」で画像全体の不透明度を調整します。初期値は35%です。
- 端末負荷を抑えるため、GeoTIFF 画像は最大辺 2048px に縮小してからテクスチャ化します。
- GeoTIFF は同時表示 1 枚に制限しています。
対応する座標系指定:
- 緯度経度
- 日本の平面直角座標系 1〜19系
対応する位置タグ:
- ModelPixelScaleTag + ModelTiepointTag
- ModelTransformationTag
未対応の例:
- BigTIFF
- ワールドファイルのみの画像
- 回転・歪みが強いラスタの厳密表示
- COG 特有の最適化処理
- 地表面認識なし
- 平面検出なし
- LiDAR補助は初期OFF
- 高さは AR 表示に使わない
- 表示基準面は初期状態で
-1.0m。AR画面の縦スワイプで上下調整できます。 - 点は球体で表示
- 柱は任意で ON/OFF
- 境界線・ポリゴン外周は線で表示
- 点名は画面上の2Dラベルで表示
- 距離表示は任意で ON/OFF
- GeoTIFF は画像として水平面に貼り付け表示(画像全体の不透明度は設定画面で変更)
- KML / KMZ / CSV / SIMA / GeoTIFF ファイル読込
- 現在地取得は手動
- 緯度経度の手入力に対応
- 平面直角座標系 1〜19 系の手入力に対応
- 読み込んだ点リストから現在地選択に対応
ARCoordinateViewer.xcodeprojを Xcode で開く。Signing & Capabilitiesで Team を自分の Apple ID または開発チームに変更する。- 実機 iPhone を選択する。
- 初回起動時にカメラと位置情報を許可する。
- 画面左上に
AR追跡中またはAR初期化中などが表示されることを確認する。
読込:KML / KMZ / CSV / SIMA / GeoTIFF を読み込む現在地取得:iOS の現在地を 1 回取得する座標指定:緯度経度または平面直角座標で現在地を指定する点から現在地:読み込んだ点を現在地として指定する平面図で選択:読み込んだ点・線を平面図で確認し、対象点を選んでARへ適用する設定:表示数、表示距離、点・線・点名、サイズ、GeoTIFF不透明度等を設定する表示:距離、柱、画像、LiDAR補助を切り替えるライト:端末ライトをON/OFFする- AR画面を横スワイプ:方位を補正する
- AR画面を縦スワイプ:表示基準面の高さを補正する
点や地図データそのものをAR画面上で直接ドラッグ移動する方式は使いません。
- 対応:A01 座標データ、D00〜D99 画地データ
- 座標は平面直角座標として扱います。
- 系番号はアプリの平面直角座標系設定を使います。
- A01 の点名・点番を、画地データ内の参照点と照合します。
- SIMA の派生仕様があるため、読み込めない画地がある場合は、A01 と画地内参照行の配列を確認してください。
Samples フォルダに以下を入れています。
sample_latlon.csvsample_plane_xy.csvsample_line.kmlsample_line.kmzsample_sima.sim
GeoTIFF のサンプルは同梱していません。手元の GeoTIFF を読み込んで確認してください。
- シミュレータでは AR カメラ確認はできません。実機で確認してください。
- カメラ権限を拒否した場合、iOS の設定アプリから許可し直してください。
- KML / KMZ / CSV / SIMA の標高や Z 値は、初期状態ではAR表示に使いません。設定で「標高で上下位置を変える」をONにした場合だけ、概略の高さ差として使います。
- GeoTIFF は試験実装です。読み込めないファイルがある場合は、そのファイルの座標系や GeoTIFF タグ構成を確認してください。
- KMZ は一般的な deflate / store 方式を対象にしています。特殊な ZIP 構造では失敗する場合があります。
- 端末ライトの制御は、端末やARKitのカメラ使用状態によって失敗する場合があります。その場合は画面上部にエラーを表示します。
端末・センサー状態・方位取得状態によって、ARWorldTrackingConfiguration.worldAlignment = .gravityAndHeading が失敗することがあります。
この版では、その場合でもカメラAR表示を続けられるように、worldAlignment = .gravity に切り替えて再起動します。
- 点や地図データをAR画面上で直接ドラッグ移動する方式を廃止しました。
- 「平面図」画面を追加しました。
- 読み込んだKML / KMZ / CSV / SIMAのポイント・ラインを平面図として確認できます。
- 点・ライン頂点をタップして選択できます。
- 「適用」でAR画面上の選択点を赤色で強調表示します。
- 「設定」画面を追加しました。
- ポイント表示ON/OFF
- ライン表示ON/OFF
- 点名表示ON/OFF
- 最大表示ポイント数
- 最大表示ライン数
- 最大点名表示数
- 表示半径
- 点名表示距離
- AR上の点サイズ・選択点サイズ・線幅
- 平面図上の点サイズ・線幅
- 遠方最小表示サイズON/OFF
- 遠方ポイント最小表示サイズ
- 遠方ライン最小表示幅
- 設定初期化
- 設定値はUserDefaultsに保存され、アプリ再起動後も保持されます。
- 表示上限を超える場合は、現在地があるときは近い要素を優先します。現在地がない場合でも停止せず、読み込み順に近い形で表示します。
- 表示制限はAR画面と平面図の両方に反映されます。
注意:このパッケージは生成環境にXcodeがないため、実機ビルド確認は未実施です。Xcodeでエラーが出た場合は、エラー画面を共有してください。
- 画面スワイプによる方位補正の向きを反転しました。
- 表示高さ補正の範囲を -100m 〜 +100m に変更しました。
- 大量KML/KMZ対策として、ライン表示上限を「線分数」として扱うように変更しました。
- 1本の巨大なLineStringに多数の頂点がある場合でも、全線分を無制限にRealityKitへ渡さないようにしています。
- 上限超過時は現在地に近い線分を優先します。現在地がない場合は読込順を優先します。
- 表示制限結果をキャッシュし、点名投影更新などで同じ制限計算を繰り返しにくくしました。
- GeoTIFFの黒透過処理はv15で廃止済みです。v15以降は画像全体の不透明度スライダーを使います。
- 平面図ビューにGeoTIFFを表示するようにしました。
- GeoTIFFは概略の矩形画像として表示し、外周をオレンジ線で表示します。
- 平面図ビューにズーム機能を追加しました。
- ピンチ操作、または右上の「+」「−」「全体」ボタンで操作できます。
AR表示では、各線分が3D円柱として描画されるため、線分数が多いKMLは重くなります。v13では最大表示線分数を設定値で制限します。重い場合は、設定画面で「最大表示線分数」「表示半径」「点名表示数」を下げてください。
- 標高ON時の重さ対策として、AR表示用の点・線・ラベル座標をキャッシュするようにしました。
- 標高補完は読み込み時のままです。
- AR表示中は、標高補完の近傍検索を行いません。
- 表示用座標とラベルを毎回二重生成しないようにしました。
- RealityKit側の再描画判定を、長い文字列署名から軽量なHash署名へ変更しました。
- 大量SIMA/KMLでの不要な文字列生成負荷を抑える目的です。
- 画地名ラベルの画面上オフセットを見直しました。
- 点名は球体と重ならないよう上にずらします。
- 画地名は、標高差の上下方向が逆に見えないよう、投影位置に近い位置へ表示します。
- GeoTIFFのAR上の半透明表示を修正しました。
- 画像画素そのもののアルファ加工ではなく、RealityKit の
UnlitMaterialに対して画像テクスチャを貼り付けたうえで、マテリアル全体の透明ブレンドを明示します。 material.colorに不透明度付き tint と texture を設定します。material.blending = .transparent(opacity: ...)を追加しました。- 設定画面の「GeoTIFF不透明度」は AR 上の GeoTIFF 平面に反映されます。
- 画像画素そのもののアルファ加工ではなく、RealityKit の
- 既存方針どおり、白透過・黒透過・明るさ透過などの画素別透過処理は行いません。
- GeoTIFFはUnlit表示のままなので、暗所でも画像自体がライト推定で暗くなりにくい設定です。
- 方位補正の表示値を -180°〜+180° に正規化しました。
- GeoTIFF不透明度はAR上のGeoTIFF表示だけに適用し、平面図では判読性優先で不透明表示にしました。
- 表示設定のGeoTIFF説明文を簡略化しました。
- 平面図で選択した点を「現在地にする」機能を追加しました。
- 説明画面の「今回の主な仕様」を「仕様」に変更しました。
UnlitMaterial.Blending.transparent(opacity:)に渡す値をDoubleではなくFloatに修正しました。- Xcode の
Cannot convert value of type 'Double' to expected argument type 'Float'エラーに対応しました。 TextureResource.generateの iOS 18 非推奨警告はビルド停止要因ではありません。必要に応じて後続版で API 置換します。
- iOS 18以上を前提に、線・柱の描画を直方体から円柱へ戻しました。
- Xcodeプロジェクトの Deployment Target を iOS 18.0 に変更しました。
- GeoTIFFの半透明処理は v18 の RealityKit 透明ブレンド設定を維持しています。
- AR上のデフォルト表示サイズを小さくしました。
- 点の球体:従来の約1/5
- 選択点の球体:従来の約1/5
- ライン・境界線の太さ:従来の約1/5
- 遠方最小表示サイズも同じ比率で縮小
- 点名の表示位置を点の中心に近づけました。
- 従来よりかなり低い位置に表示します。
- 球体の大きさに応じて、球体のすぐ上に出るよう調整しています。
- 表示する名称を整理しました。
- 点名は表示します。
- SIMA等で画地名がある場合、画地中心付近に画地名を表示します。
- KML等のライン名は表示しません。
- 設定保存キーを v20 に更新しました。
- 新しいデフォルトサイズを確実に反映するためです。
- 標高で上下位置を変える設定を追加しました。
- 初期状態では従来どおり高さを使いません。
- 表示設定で「標高で上下位置を変える」をONにすると、現在地に最も近い有効高度を基準面として、各点・線の高さ差をAR表示に反映します。
- 高度が0または未設定の点は、近くの有効高度を持つ点の高さで補完します。
- 標高差が極端に大きくなり、点が見えなくなることを避けるため、高さ差の上下限を設定できます。初期値は±100mです。
- CSV読込時に、列の割当を選べる画面を追加しました。
- 点名列
- X座標 / 緯度列
- Y座標 / 経度列
- 標高列
- CSVの座標形式を読込時に選択できます。
- 平面直角座標 X/Y
- 緯度経度
- 平面直角座標の場合は、CSV全体に対して1〜19系の系番号を指定します。
- 列ごとではなく、ファイル全体で同じ系として扱います。
- 1行目を見出しとして扱うかどうかを切り替えられます。
- 読込前に先頭数行のプレビューを表示し、列番号と内容を確認できるようにしました。
- 従来の自動CSV判定処理は残していますが、通常のCSVファイルは新しいCSV読込画面を経由します。
- 読み込んだファイルをレイヤーとして管理する機能を追加しました。
- KML / KMZ / CSV / SIMA / GeoTIFFを読み込むたびに1つのレイヤーとして追加します。
- 下部の「レイヤー」ボタンから、ファイル単位で表示/非表示を切り替えられます。
- 間違って読み込んだファイルは、レイヤー画面から削除できます。
- AR表示・平面図・表示制限は、表示中のレイヤーだけを対象にします。
- SIMA画地データの読込を修正しました。
D00,番号,画地名,...の画地名を維持します。B01行を画地名として誤読しないようにしました。A01,点番号,点名,X,Y,Z形式で、点番号・点名が数字だけの場合でもX/Yを誤認しないようにしました。
- 平面図で選択画面にパン操作を追加しました。
- ピンチまたは「+」「−」でズームできます。
- ズーム後に指でスライドして平面図を移動できます。
- 「全体」でズームと移動量を初期化します。
- レイヤー管理画面の「すべて非表示」ボタンを廃止しました。
- v25: レイヤー管理画面の「すべて表示」ボタンも廃止しました。
- AR画面の2D点名ラベルを、投影位置からさらに上方向へずらし、遠方の小さい球体が点名で隠れにくいようにしました。
- 球体・線のデフォルトサイズは変更していません。
- 標高差表示ON時の処理を軽量化しました。
- 標高0または標高なしの点を補完する処理で、全点総当たり探索を繰り返さないようにしました。
- 有効標高点を25mグリッドに分け、近傍探索とキャッシュを使うようにしました。
- 高さ差は現地確認用の概略表示として1m単位に丸めます。
- 画地名表示は、AR表示対象になっている要素から作成するようにし、大量のSIMA画地で全画地を毎回処理しないようにしました。
- 表示設定の文言を「高さを相対表示に反映」から「標高差をAR表示に使う」に変更しました。
- 標高0または標高なしの補完処理を、AR表示中ではなく読み込み時に行うようにしました。
- 読み込み時に、同一ファイル内の有効標高を25mグリッド化し、近い標高で概略補完します。
- AR表示中は近傍検索を行わず、座標に保持済みの概略標高だけを使います。
- 高さ差は引き続き1m単位に丸めます。
- 表示設定の文言を「標高で上下位置を変える」に変更しました。
- 標高0や標高なしが多いSIMA面データで、標高表示ON時の描画更新が重くなりにくいようにしました。