【问题标题】:ArcGIS Runtime: Get elevation data fastArcGIS Runtime:快速获取高程数据
【发布时间】:2016-01-13 21:03:29
【问题描述】:

我正在使用 ArcGIS Runtime SDK for dotNet 10.2.6 进行开发。

我需要在一秒钟内从本地 DTM 文件(TIF 格式)中获取点的高程数据数十次。

我正在使用高程数据来计算观察者视线与地面的交点。 (例如 - 我的相机在某个点,以某个俯仰角看某个方位角,我需要计算它正在看的地面上的点)

我尝试使用识别任务来获取沿视线点的高程数据,但这很慢(每次查询需要 20-40 毫秒,总共需要几秒钟)。

我的识别任务:

IdentifyParameters identifyParams = new IdentifyParameters(mapPoint, m_MapView.Extent, 1, (int)m_MapView.ActualHeight, (int)m_MapView.ActualWidth);
identifyParams.DynamicLayerInfos = m_DynamicMapServiceLayer.DynamicLayerInfos;
identifyParams.ReturnGeometry = false;
identifyParams.SpatialReference = m_MapView.SpatialReference;
identifyParams.LayerOption = LayerOption.Top;

IdentifyResult identifyResult = await identifyTask.ExecuteAsync(identifyParams);

注意: 我尝试使用地理处理器任务来计算 LOS - 这并没有快多少。

有没有更快的方法使用本地栅格 DTM 文件从点(或线)获取高程数据?

【问题讨论】:

  • 你有没有想过实际并行运行多个请求?我的印象是您在发送下一个请求之前使用await 来获取每个请求的结果(因此“每个查询需要 20-40 毫秒,总共需要几秒钟”),而您应该能够启动一次请求多个请求,并在它们返回时查看结果。 msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx
  • 我尝试用 -await Task.WhenAll(tasks) 测量 200 个点,大约需要 6 秒(每个任务约 30 毫秒)。

标签: c# .net arcgis esri


【解决方案1】:

您可以尝试 SceneView 和 FileElevationSource。然后使用 FileElevationSource.GetElevationAsync()。使用 STRM .tif 文件,我看到大约 6 毫秒/示例:

    public MainWindow()
    {
        InitializeComponent();

        SceneView sv = new SceneView();
        FileElevationSource elv = new FileElevationSource();
        elv.Filenames.Add(@"C:\Maps\NJ\elev\n40_w075_1arc_v3.tif");
        sv.Scene.ElevationSourceLoaded += (object sender, ElevationSourceLoadedEventArgs e) =>
        {
            elevtest(elv);
        };
        sv.Scene.Surface.Add(elv);
        Content = sv;
        sv.Visibility = System.Windows.Visibility.Hidden;
    }

    async void elevtest(FileElevationSource elv)
    {
        System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
        sw.Start();
        double nSamples = 1000.0;
        double delta = 1 / nSamples;
        for (double i = 0; i < 1.0; i += delta)
        {
            double elev = await elv.GetElevationAsync(new Esri.ArcGISRuntime.Geometry.MapPoint(-75 + i, 40 + i, SpatialReferences.Wgs84));
        }
        sw.Stop();
        System.Diagnostics.Trace.WriteLine(sw.ElapsedMilliseconds / nSamples + " ms per sample" );
    }

如果仍然不够好,您可以使用GDAL 来读取和访问高程数据。那会快得多。

【讨论】:

  • 感谢您的回复。 SceneView 结果确实更快,但由于某种原因,我从IdentifyTask 中得到了同一点的不同结果......(在某些点上差异超过50)。另外,我怎样才能知道结果的单位?有没有办法使用查询来获得一个结果的多个点的高程?
猜你喜欢
  • 1970-01-01
  • 2013-05-03
  • 2018-11-24
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2022-12-16
  • 2016-02-01
相关资源
最近更新 更多