Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Prism和Esri GetElevationAsync(映射点)_C#_Wpf_Prism_Esri_Sceneview - Fatal编程技术网

C# Prism和Esri GetElevationAsync(映射点)

C# Prism和Esri GetElevationAsync(映射点),c#,wpf,prism,esri,sceneview,C#,Wpf,Prism,Esri,Sceneview,我们正在使用wpf、C#和Prism v6.1.0.0与visual Studio 2017构建一个应用程序。我们有一个三维视图,它是Esri.net运行时场景视图。我们希望使用GetElevationAsync(mapPoint)函数从DTED级别0数据获取高程数据。在仅使用Esri SceneView的独立应用程序中,如果SceneView处于活动状态,则GetElevationAsync(mapPoint)函数可用于SceneView和MapView。这也是使用FileElevationS

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


我们遇到的问题是,当我们尝试调用GetElevationAsync(映射点)时,我们会得到System.AccessViolationException。是否有其他人尝试使用ESRi的.net运行时和Prism创建使用GetElevationAsync(mapPoint)函数的SceneView应用程序

我们有一个具有多视图和主外壳的Prism应用程序。SceneView模块有一个服务,正在使用此服务器将DTED级别0数据加载到SceneView.Scene.Surface中。我已经将所有功能移到了SceneView中,但我们仍然会遇到相同的访问错误。调用线程是主应用程序线程。我已经发布了错误和一些代码片段。 Prism应用程序中的代码与简单WPF应用程序中的代码相同,该应用程序使用所有相同的控件,但不使用Prism体系结构。它工作得很好,我只需激活Sceneview并将MapPoint从Mapview传递到GetElevationAsync函数中,就可以获得EleveAction数据

  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;
  }
在CeneviewViewLoaded上的私有void(对象发送方,RoutedEventArgs e)
{
SceneViewService=UnityContainer.Resolve();
字符串elevationSourcePath=System.Environment.GetEnvironmentVariable(“SHELL”)+“\\Resources\\Terrain\\DTED\\Level0\\”;
AddElevationSources(elevationSourcePath);
mSceneView.MouseMove+=OnSceneViewMouseMove;
}
CenDeviceMouseMove上的私有void(对象发送方,MouseEventArgs e)
{
{
点屏幕点=e.GetPosition(mSceneView);
双高程=0.0;
MapPoint point=mSceneView.ScreenToLocation(screenPoint);
如果(点!=null)
{
MapPoint MapPoint=GeometryEngine.Project(point,SpatialReferences.Wgs84)作为MapPoint;
高程=获取高程(mapPoint)。结果;
如果(!Double.IsNaN(标高))
{
MELEVATIONSTATUSBERTEXTBLOCK.Text=elevation.ToString();
}
}
}
}
public void addlevationsources(字符串levationsourcepath)
{
FilenameCollection mFilenameCollection=新FilenameCollection();
列表文件=新列表();
尝试
{
files=DirSearch(elevationSourcePath);
foreach(文件中的字符串文件)
添加(文件);
mFileElevationSource.Filenames=mFilenameCollection;
mFileElevationSource.ID=“高程源”;
mSceneView.Scene.Surface.Add(mFileElevationSource);
mFileElevationSource.IsEnabled=true;
}
捕获(例外情况除外)
{
Console.WriteLine(“AddElevationSources,ElevationSourceService”+例外消息);
}
}
公共列表目录搜索(字符串源目录)
{
列表文件=新列表();
尝试
{
foreach(Directory.GetFiles(sourceDirectory,*.dt0)中的字符串文件)
{
文件。添加(文件);
}
foreach(directory.GetDirectories(sourceDirectory))中的字符串目录
{
AddRange(DirSearch(directory));
}
}
捕获(例外情况除外)
{
Console.WriteLine(“DirSearch,addlevationsources”+例外消息);
}
归还文件;
}
正在传递的地图点数据“mapPoint={mapPoint[X=4.54778361440582,Y=27.7940801510867,Z=5.58793544769287E-09,Wkid=4326]}”

  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;
  }
}
公共异步任务GetElevation(MapPoint MapPoint) { 双高程=0.0; 尝试 { 如果(!Double.IsNaN(mapPoint.X)和&!Double.IsNaN(mapPoint.Y)) { 高程=等待mFileElevationSource.GetElevationAsync(映射点); if(双IsNaN(标高)) 高程=0; } } 捕获(例外情况除外) { Console.WriteLine(“任务GetElevation,ElevationSourceModule”+excpt.Message); } 回归高程; } }
发生System.AccessViolationException异常 HResult=0x80004003 消息=尝试读取或写入受保护内存。这通常表示其他内存已损坏。 Source=Esri.ArcGISRuntime 堆栈跟踪: 运行时corenet.CoreLocalElevationRaster.LocalElevationLayerPickElevation(IntPtr pNativeElevationLayer,双x,双y,双z) 在Esri.ArcGISRuntime.Controls.FileElevationSource.GetElevationAsync(映射点)上
在\SceneViewModule\Views\SceneViewView\SceneViewView.SceneViewView.d_u19.MoveNext()中的\SceneViewModule\Views\SceneViewView\SceneViewView.xaml.cs:141行

您提到您正在Unity中使用它吗


GetElevationAsync API仅在活动的SceneView呈现中使用它。虽然这个错误听起来不正确,但在SceneView之外,这个API在这一点上无法单独工作(尽管它在我们未来的增强列表中)。这一点的主要目的是单击SceneView并获得该点的准确高程。它并不意味着是独立的。我猜有一点错误处理没有正确检查这一点,这就是为什么你看到崩溃。但是如果它被修复了,你只会得到一条更好的错误消息。

你提到你正在Unity中使用它

GetElevationAsync API仅在活动的SceneView呈现中使用它。虽然这个错误听起来不正确,但在SceneView之外,这个API在这一点上无法单独工作(尽管它在我们未来的增强列表中)。这是这个poi的主要目的