我们正在使用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函数中而没有问题地获得高程数据。
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}”
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
发布于 2017-03-28 07:38:52
你提到过你在Unity中使用它?
GetElevationAsync API仅在active SceneView渲染中使用它。虽然这个错误听起来不太对劲,但是这个应用程序接口目前不能在SceneView之外独立工作(尽管它在我们的列表中,以便将来进行增强)。此时,它的主要用途是单击SceneView并获得该点的精确高程。这并不意味着它是独立的。我猜有一些错误处理没有正确地检查这一点,这就是为什么你会看到崩溃。但如果要修复它,您得到的将是更好的错误消息。
https://stackoverflow.com/questions/43056902
复制相似问题