今年1月に国内リリースされたネイティブ地図アプリ開発キットの ArcGIS Runtime SDK for iOS (以下、iOS SDK)の最新バージョンでは、新たに 3D 機能が追加され色々な方法で地図データの 3D 表現ができるようになりました。
今回は、実際に動作させてみたところを踏まえて、iOS SDK で利用可能な 3D 機能について紹介します。
記事内で紹介する機能のサンプルは GitHub で公開していますので、そちらもお試しください。
※ iOS SDK の 3D 機能は、現在ベータ機能として提供されていますが、今後のバージョンアップで正式対応する予定です
標高データを参照して、地形を 3D で表現できます。といっても、標高データを自分で用意する必要はありません。クラウド サービス(ArcGIS Online)で配信されている標高サービス(ArcGIS World Elevation Image Services)を参照して、簡単に実装できます。
// ArcGIS Online の標高サービスを標高データソースに設定する
let elevationSource = AGSArcGISTiledElevationSource(url: URL(string: “https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer")!)
// 標高データソースを地図ビューに設定する
mySurface.elevationSources.append(elevationSource)
mySceneView.scene.baseSurface = mySurface
より高精度に地形を表現したい場合は、自身で標高データ(ラスター ファイル形式)を作成して利用することもできます。
// ラスター ファイルを標高データソースに設定する
let rasterElevationSource = AGSRasterElevationSource(fileURLs: [<ラスター ファイルのパス>]
実際のコードはこちら
地図上に高さの情報を設定してグラフィックを表示できます。
高さを設定するために、3D 地形の地表面上に表示、地表面からの相対値を指定して表示、高度を指定して表示などの便利なプロパティが用意されています。
// 地形表面上からの高さを指定してグラフィックを表示するようにプロパティを設定する
myGraphicsOverlay.sceneProperties?.surfacePlacement = .relative
// 表示する位置(経度、緯度、高さ)とシンボルを設定してグラフィックを作成する
let myPoint = AGSPoint(x: 138.727778, y: 35.360556, z: 4000, spatialReference: AGSSpatialReference.wgs84())
let mySymbol = AGSSimpleMarkerSceneSymbol(style: .sphere, color: UIColor.red, height: 200, width: 200, depth: 200, anchorPosition: .center)
let myGraphic = AGSGraphic(geometry: myPoint, symbol: mySymbol, attributes: nil)
// グラフィック表示用のレイヤーにグラフィックを追加する
myGraphicsOverlay.graphics.add(myGraphic)
グラフィックのシンボルには 3D モデルも使用できます。
// 3D モデル ファイルのファイル名と拡張子を指定してシンボルを作成する
let mySymbol = AGSModelSceneSymbol(name: "<ファイル名>", extension: "<ファイルの拡張子>", scale: 100)
実際のコードはこちら
自分で作成したデータを 3D の地図上で表示したい場合も特別な処理は必要ありません!
2D で作成したデータを 3D の地形上に表示すれば立体的に見せることができます。
例えば、下の図は室蘭市のオープンデータで公開されている土砂災害特別警戒区域(急傾斜地)のデータ(ArcGIS Online で配信されるフィーチャ レイヤー)を 2D と 3D 地形上で表示した結果です。実際の地形の形状とあわせて見ることで、視覚的に確認できますね。
// データソースの URL を指定して、フィーチャ レイヤーを作成する
let myFeatureTable = AGSServiceFeatureTable(url: URL(string: "https://services.arcgis.com/Jv1EECU3IM4ZRUev/arcgis/rest/services/Muroran_Doshasaigai4/FeatureServer...")!)
let myFeatureLayer = AGSFeatureLayer(featureTable: myFeatureTable)
// 作成したフィーチャ レイヤーを地図ビューに追加する
mySceneView.scene?.operationalLayers.add(myFeatureLayer)
実際のコードはこちら
続いては、属性情報を使用して主題データを立ち上げて表示してみます。
下の図では、日本の都道府県のデータを表示していますが、データに格納されている各県の人口数をもとに高さを強調し、各県の形状を立ち上げて表示しています。
2D のデータも属性情報を使用して 3D で表示することができます。
// 指定した高さの値で形状を立ち上げるようにレンダラーを設定する
myRenderer.sceneProperties?.extrusionMode = .absoluteHeight
// 高さの値が格納されているデータの属性フィールドを設定する
myRenderer.sceneProperties?.extrusionExpression = “[SUM_P_NUM]”
// グラフィック表示用のレイヤーに作成したレンダラーを設定する
myGraphicsOverlay.renderer = myRenderer
実際のコードはこちら
もちろん、3D での景観表示も行えます。
デスクトップ製品(ArcGIS Pro)で作成した 3D 形式のデータ(シーン レイヤー パッケージ)やサーバー製品(ArcGIS for Server)で配信する Web サービス(シーン サービス)を参照して、街の景観を 3D で表示できます。
// Web サービスの URL を指定して 3D モデル表示用のシーン レイヤーを作成する
mySceneLayer = AGSArcGISSceneLayer(url: URL(string: https://scenesampleserverdev.arcgis.com/arcgis/rest/services/Hosted/DevB_BuildingShell_Textured/Scen...")!)
// 作成したシーン レイヤーを地図ビューに追加する
mySceneView.scene.operationalLayers.add(mySceneLayer)
実際のコードはこちら
アプリで地図を表示する視点は、指でのタッチ操作の他、iOS SDK の API から操作することもできます。
GitHub にあるサンプルでは、端末のセンサーと連携して、端末を回転させる動きによって視点を動的に変えているので、実際に操作して試してみてください!
iOS SDK の最新バージョンで新たに追加された 3D 機能について紹介してきました。
3D といっても、色々なかたちの表現方法がありますね。
まだ、ベーター機能ですが、開発・評価目的であれば、ArcGIS for Developers の無償の開発者アカウントを作成することで、どなたでもご利用できますので、ぜひお試しください。
関連リンク
ArcGIS Runtime SDK for iOS(Esri)