Select to view content in your preferred language

How to create 3d surface in .net wpf using isolines or tiff data file? To get something like that 3d surface on picture but in the wpf .net application

1510
6
06-11-2020 02:44 AM
VanyaIvanov
Regular Contributor

0 Kudos
6 Replies
MichaelBranscomb
Esri Frequent Contributor
VanyaIvanov
Regular Contributor

Hi, Michael. Thank you for answer. But i didnt catch anything from this. I have a TIFF file path C:\Users\user123\Documents\ArcGIS\11062020\TopoToR_N46E11 and want to create 3d surface in wpf app using this file. Could you please show code example in my case? Thank you)

0 Kudos
VanyaIvanov
Regular Contributor

I tried this one from your link:

  1. Create a scene and assign it to a scene view.
    // create a new scene with a topographic basemapvar myScene = new Scene(Basemap.CreateTopographic()); // add the new scene to the scene viewMySceneView.Scene = myScene;

    Add an elevation surface and apply it to the scene.

    
    // create an elevation sourcevar elevationSource = new ArcGISTiledElevationSource(new System.Uri("C:\\Users\\user123\\Documents\\ArcGIS\\11062020\\TopoToR_N46E11.tiff")); //-----added my filepath to tiff file// create a surface and add the elevation surfacevar sceneSurface = new Surface(); sceneSurface.ElevationSources.Add(elevationSource); // apply the surface to the sceneMySceneView.Scene.BaseSurface = sceneSurface;
    
    And it doesn't work( 
0 Kudos
MichaelBranscomb
Esri Frequent Contributor

Hi,

Does it work if you use the RasterElevationSource Class?

The tiled elevation source should be used when you have elevation encoded tile packages (Share a tile package—ArcGIS Pro | Documentation).

Thanks

Mike

0 Kudos
VanyaIvanov
Regular Contributor

Michael, thank you for your answer. I took the program code from RasterElevationSource Constructor.  I have .tiff file. I dont have .dt2 file.  What data should i insert in GetDataFolder method?:

string packagePath = DataManager.GetDataFolder("98092369c4ae4d549bbbd45dba993ebc", "MontereyElevation.dt2");
I tried 
string packagePath = DataManager.GetDataFolder("i dont know what should be there  ", "tifffile.tiff");
and i still haven't found the way to make it works

Thank you

0 Kudos
VanyaIvanov
Regular Contributor

If somebody is interested in. There is my solution that works. it is made on mvvm like pattern

First. Class SceneViewmodel:

public class SceneViewModel : UserControl, INotifyPropertyChanged
{
     public SceneViewModel()
     {
          CreateNewScene();
      }

Scene _scene;

/// <summary>
/// Gets or sets the map
/// </summary>

public Scene Scene
{
     get { return _scene; }
     set { _scene = value; OnPropertyChanged(); }
}

/// <summary>
/// Raises the <see cref="MapViewModel.PropertyChanged" /> event
/// </summary>
/// <param name="propertyName">The name of the property that has changed</param>
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
     var propertyChangedHandler = PropertyChanged;
     if (propertyChangedHandler != null)
     propertyChangedHandler(this, new PropertyChangedEventArgs(propertyName));
}

public event PropertyChangedEventHandler PropertyChanged;

private async void CreateNewScene()
  {

     Scene newScene = new Scene(Basemap.CreateImagery());

     RasterElevationSource elevationSource = new RasterElevationSource(new[] {        @"C:\Users\user\Downloads\tif3dmap1.tif" ,@"C:\Users\user\Downloads\tif3dmap2.tif" }); 
     await elevationSource.LoadAsync();
     Surface elevationSurface = new Surface();
     elevationSurface.ElevationSources.Add(elevationSource);
     elevationSurface.ElevationExaggeration =20;//depends on how deep relief on the surface you want

     await elevationSurface.LoadAsync();

      newScene.BaseSurface = elevationSurface;
      Scene = newScene;
      Scene.InitialViewpoint = new Viewpoint(elevationSource.FullExtent);

  }

}

Second. MainWindow.xaml.cs:

public partial class MainWindow : Window
{
     public MainWindow()
     {
           InitializeComponent();
           var SceneViewModel = new SceneViewModel();
           this.DataContext = SceneViewModel;
     }

}

Third. MainWindow.xaml:

<Window x:Class="ArcGISApp5.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:esri="http://schemas.esri.com/arcgis/runtime/2013"
xmlns:local="clr-namespace:ArcGISApp5"
mc:Ignorable="d"
Title="MainWindow" Height="525" Width="790">
<Window.Resources>
<local:SceneViewModel x:Key="SceneViewModel" />
</Window.Resources>
<Grid>
<esri:SceneView x:Name ="MySceneView" Scene="{Binding Scene}" >
</esri:SceneView>
<Border Background="White" BorderBrush="Black" BorderThickness="1"
HorizontalAlignment="Right" VerticalAlignment="Top"
Margin="30" Padding="20" Width="355">
<Border.Effect>
<DropShadowEffect/>
</Border.Effect>
<StackPanel>
<TextBlock x:Name="ScreenCoordsTextBlock" Foreground="Black"
HorizontalAlignment="Left" VerticalAlignment="Center"
Text="Screen Coords: " TextWrapping="Wrap" FontWeight="Bold" />
<TextBlock x:Name="MapCoordsTextBlock" Foreground="Black"
HorizontalAlignment="Left" VerticalAlignment="Center"
Text="Map Coords: " TextWrapping="Wrap" FontWeight="Bold" />
</StackPanel>
</Border>
</Grid>

</Window>

0 Kudos