本文共 6894 字,大约阅读时间需要 22 分钟。
import UIKitimport ArcGISclass MapPlanVc: UIViewController { func startTransportData(spoint : SpacePoint) { DispatchQueue.main.async { self.planGraphic?.geometry = spoint.point self.planGraphic?.attributes["HEADING"] = spoint.heading self.planGraphic?.attributes["ROLL"] = spoint.roll self.planGraphic?.attributes["PITCH"] = spoint.pitch } } @IBOutlet weak var startBtn: UIButton! @IBOutlet weak var scenseView: AGSSceneView! var scenseGraphicOverly:AGSGraphicsOverlay! var planModelSymbol :AGSModelSceneSymbol? var planGraphic :AGSGraphic? var frames = [Frame]() var timer:Timer! var frameIndex = 0 private var missionFileNames = ["GrandCanyon.csv", "Hawaii.csv", "Pyrenees.csv", "Snowdon.csv"] var spacePoint:SpacePoint? = SpacePoint() var dataTransport:DataTransport! override func viewDidLoad() { super.viewDidLoad() self.initDatas() // Do any additional setup after loading the view. //self.startBtn.addTarget(self, action: #selector(startAnimate), for: .touchUpInside) //模拟数据 startReceveData self.startBtn.addTarget(self, action: #selector(startReceveData), for: .touchUpInside) getFlightDatas() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) } func updatePlanSateAndPosition() { spacePoint?.showPointDetail() DispatchQueue.main.async { self.startTransportData(spoint: self.spacePoint!) } } func initDatas() { let scense = AGSScene(basemap: .imagery()) self.scenseView.scene = scense //添加底图 self.addSurface() //添加渲染器 self.addRender() //添加飞机 self.add3DPlan() //设置相机 self.setCamera() //设置动画相关// self.setAnimationAbout() self.dataTransport = DataTransport() self.dataTransport.delegate = self } @objc func startReceveData(){ print("加载数据") self.dataTransport.loadDatas() } func setAnimationAbout() { //加载路径数据 self.loadDatasFromFile(fileName: self.missionFileNames[0]) self.animate() } //开始 @objc func startAnimate() { self.timer = Timer(timeInterval: 0.1, target: self, selector: #selector(animate), userInfo: nil, repeats: true) RunLoop.main.add(self.timer, forMode: .common) } @objc func animate(){ if self.frames.count <= self.frameIndex { return } let frame = self.frames[self.frameIndex] self.planGraphic?.geometry = frame.position self.planGraphic?.attributes["HEADING"] = frame.heading self.planGraphic?.attributes["ROLL"] = frame.roll self.planGraphic?.attributes["PITCH"] = frame.pitch self.frameIndex += 1 } // func loadDatasFromFile(fileName:String) { if let path = Bundle.main.path(forResource: fileName, ofType: nil){ if let content = try? String(contentsOfFile: path){ let lines = content.components(separatedBy: CharacterSet.newlines)// print(lines) var frames1 = [Frame]() for line in lines{ let lineDetail = line.components(separatedBy: ",") let frame = Frame() frame.position = AGSPoint(x: Double(lineDetail[0])!, y: Double(lineDetail[1])!, z: Double(lineDetail[2])!, spatialReference: AGSSpatialReference.wgs84()) frame.heading = Double(lineDetail[3])! frame.pitch = Double(lineDetail[4])! frame.roll = Double(lineDetail[5])! frames1.append(frame) } self.frames = frames1 } }else{ print("source file not found please check") } } func setCamera() { let cameraController = AGSOrbitGeoElementCameraController(targetGeoElement: self.planGraphic!, distance: 1000) //通过这个几个参数调整飞机显示姿态 cameraController.isAutoRollEnabled = false cameraController.isAutoHeadingEnabled = false cameraController.isAutoPitchEnabled = false //设置视野距离// cameraController.maxCameraDistance = 18000// cameraController.minCameraDistance = 500 //相机相对于飞机的角度偏移量 cameraController.cameraHeadingOffset = 0.8 cameraController.cameraPitchOffset = 0.5 cameraController.cameraDistance = 100 self.scenseView.cameraController = cameraController } // func addLinTo3DMap() { let ranges = [AGSDistanceSymbolRange]() let scenDistanceSymbol = AGSDistanceCompositeSceneSymbol() scenDistanceSymbol.ranges = ranges } func add3DPlan(){ //Bristol,fmPlanModel let plan3dModelname = "fmplanAnimate" //加载3d模型图 self.planModelSymbol = AGSModelSceneSymbol(name: plan3dModelname, extension: "dae", scale: 1) //开始位置,默认是bottom self.planModelSymbol?.anchorPosition = .center self.planGraphic = AGSGraphic() self.planGraphic?.geometry = AGSPoint(x: 0, y: 0, z: 0, spatialReference: AGSSpatialReference.wgs84()) self.planGraphic!.symbol = self.planModelSymbol self.scenseGraphicOverly.graphics.add(self.planGraphic as Any) } func addRender() { let render = AGSSimpleRenderer() render.sceneProperties?.headingExpression = "[HEADING]" render.sceneProperties?.pitchExpression = "[PITCH]" render.sceneProperties?.rollExpression = "[ROLL]" // render.sceneProperties?.extrusionExpression self.scenseGraphicOverly.renderer = render } func addSurface() { let urlstr = "https://elevation3d.arcgis.com/arcgis/rest/services/WorldElevation3D/Terrain3D/ImageServer" let elevationSource = AGSArcGISTiledElevationSource(url: URL.init(string: urlstr)!) let surface = AGSSurface() surface.elevationSources.append(elevationSource) self.scenseView.scene?.baseSurface = surface self.scenseGraphicOverly = AGSGraphicsOverlay() self.scenseGraphicOverly.sceneProperties?.surfacePlacement = .absolute self.scenseView.graphicsOverlays.add(self.scenseGraphicOverly as Any) } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */}
转载地址:http://cenvb.baihongyu.com/