我正在使用ArcGIS Runtime SDK开发dotNet 10.2.6。
我需要在几秒钟内从本地DTM文件(TIF格式)中获取点数的高程数据。
我正在使用高程数据来计算观察者的视线与地面的交点。 (例如 - 我的相机在某个时刻,用一些音高看一些方位角,我需要计算它正在看的地面上的点)
我尝试使用IdentifyTask来获取沿着视线的点的高程数据,但这很慢(每个查询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文件从点(或线)获取高程数据?
答案 0 :(得分:0)
您可以尝试使用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来读取和访问高程数据。那会更快。