C# Prism和Esri GetElevationAsync(映射点)
我们正在使用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中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
我们遇到的问题是,当我们尝试调用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的主要目的