首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >棱镜和Esri GetElevationAsync(mapPoint)

棱镜和Esri GetElevationAsync(mapPoint)
EN

Stack Overflow用户
提问于 2017-03-28 05:37:59
回答 1查看 229关注 0票数 1

我们正在使用wpf、C#和Prism v6.1.0.0构建一个带有visual studios 2017的应用程序。我们有一个3d视图,它是Esri .net运行时SceneView。我们希望使用GetElevationAsync(mapPoint)函数从DTED0级数据中获取高程数据。在仅使用Esri SceneView的独立应用程序中,如果SceneView处于活动状态,则GetElevationAsync(mapPoint)函数同时适用于SceneView和MapView。这也是使用FileElevationSource并将DTED0级加载到FileElevationSource中,然后将其添加到SceneView.Scene.Surface中。

我们遇到的问题是,当我们尝试调用GetElevationAsync(mapPoint)时,会得到一个System.AccessViolationException。是否有人尝试过使用ESRi的.net运行时和棱镜来创建使用GetElevationAsync(mapPoint)函数的SceneView应用程序?

我们所拥有是一个具有多个视图和一个主外壳的棱镜应用程序。SceneView模块有一项服务,并使用此服务器将DTED0级数据加载到SceneView.Scene.Surface中。我已经将所有的功能都移到了SceneViewView中,但是我们仍然得到了相同的访问错误。调用线程是主应用程序线程。我已经发布了错误和一些代码片段。我在Prism应用程序中使用的代码与我在一个简单的WPF应用程序中使用的代码相同,该应用程序使用所有相同的控件,但不使用Prism体系结构。它工作得很好,我可以通过激活场景视图并将mapoint从Mapview传递到GetElevationAsync函数中而没有问题地获得高程数据。

代码语言:javascript
复制
  private void OnSceneViewViewLoaded(object sender, RoutedEventArgs e)
  {
     SceneViewService = UnityContainer.Resolve<ISceneViewService>();

     string elevationSourcePath = System.Environment.GetEnvironmentVariable("SHELL") + "\\Resources\\Terrain\\DTED\\Level0\\";
     AddElevationSources(elevationSourcePath);
     mSceneView.MouseMove += OnSceneViewMouseMove;
  }
  private void OnSceneViewMouseMove(object sender, MouseEventArgs e)
  {
     {
        Point screenPoint = e.GetPosition(mSceneView);
        double elevation = 0.0;
        MapPoint point = mSceneView.ScreenToLocation(screenPoint);
        if (point != null)
        {
           MapPoint mapPoint = GeometryEngine.Project(point, SpatialReferences.Wgs84) as MapPoint;

           elevation = GetElevation(mapPoint).Result;

           if (!Double.IsNaN(elevation))
           {
              mElevationStatusBarTextBlock.Text = elevation.ToString();
           }
        }
     }
  }
  public void AddElevationSources(string elevationSourcePath)
  {
     FilenameCollection mFilenameCollection = new FilenameCollection();
     List<String> files = new List<String>();

     try
     {
        files = DirSearch(elevationSourcePath);

        foreach (String file in files)
           mFilenameCollection.Add(file);

        mFileElevationSource.Filenames = mFilenameCollection;
        mFileElevationSource.ID = "Elevation Source";
        mSceneView.Scene.Surface.Add(mFileElevationSource);
        mFileElevationSource.IsEnabled = true;
     }
     catch (Exception excpt)
     {
        Console.WriteLine("AddElevationSources, ElevationSourceService " + excpt.Message);
     }
  }
  public List<String> DirSearch(string sourceDirectory)
  {
     List<String> files = new List<String>();
     try
     {
        foreach (string file in Directory.GetFiles(sourceDirectory, "*.dt0"))
        {
           files.Add(file);
        }
        foreach (string directory in Directory.GetDirectories(sourceDirectory))
        {
           files.AddRange(DirSearch(directory));
        }

     }
     catch (Exception excpt)
     {
        Console.WriteLine("DirSearch, AddElevationSources " + excpt.Message);
     }
     return files;
  }

正在传递的地图点数据“mapPoint= {MapPointX=4.54778361440582,Y=27.7940801510867,Z=5.58793544769287E-09,Wkid=4326}”

代码语言:javascript
复制
  public async Task<double> GetElevation(MapPoint mapPoint)
  {
     double elevation = 0.0;

     try
     {
        if (!Double.IsNaN(mapPoint.X) && !Double.IsNaN(mapPoint.Y))
        {
           elevation = await mFileElevationSource.GetElevationAsync(mapPoint);
           if (Double.IsNaN(elevation))
              elevation = 0;
        }
     }
     catch (Exception excpt)
     {
        Console.WriteLine("Task<double> GetElevation, ElevationSourceModule " + excpt.Message);
     }

     return elevation;
  }
}

读取或写入受保护的内存时发生System.AccessViolationException HResult=0x80004003 Message=Attempted。这通常表示其他内存已损坏。在runtimeCoreNet.CoreLocalElevationRaster.LocalElevationLayerPickElevation(IntPtr点,双x,双y,双& z)在Esri.ArcGISRuntime.Controls.FileElevationSource.GetElevationAsync(MapPoint点),在SceneViewModule.Views.SceneViewView.SceneViewView.d__19.MoveNext() in \SceneViewModule\Views\SceneViewView\SceneViewView.xaml.cs:line 141,Source=Esri.ArcGISRuntime StackTrace: at runtimeCoreNet.CoreLocalElevationRaster.LocalElevationLayerPickElevation(IntPtr StackTrace,Double x,Double y,Double& z) at runtimeCoreNet.CoreLocalElevationRaster.LocalElevationLayerPickElevation(IntPtr point,Double x,Double y,Double&z) at Esri.ArcGISRuntime.Controls.FileElevationSource.GetElevationAsync(MapPoint StackTrace in\SceneViewModule\Views\SceneViewView\SceneViewView.xaml.cs:line 141

EN

回答 1

Stack Overflow用户

发布于 2017-03-28 07:38:52

你提到过你在Unity中使用它?

GetElevationAsync API仅在active SceneView渲染中使用它。虽然这个错误听起来不太对劲,但是这个应用程序接口目前不能在SceneView之外独立工作(尽管它在我们的列表中,以便将来进行增强)。此时,它的主要用途是单击SceneView并获得该点的精确高程。这并不意味着它是独立的。我猜有一些错误处理没有正确地检查这一点,这就是为什么你会看到崩溃。但如果要修复它,您得到的将是更好的错误消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43056902

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档