I'm attempting to load a KMZ file which has been stored locally in my app. It is not displaying. I'm using the code from GitHub, specifically KmlViewer and that works fine when I click on its local file. I'm running on an iOS Simulator. The code finds the file in the filesystem fine. Code below. Any suggestions on if I'm missing something. I switched to KmlDataset (which works on KlmViewer) but that didn't seem to fix the issue.
using Esri.ArcGISRuntime.Geometry;
using Esri.ArcGISRuntime.Mapping;
using Esri.ArcGISRuntime.Ogc;
using Esri.ArcGISRuntime.Xamarin.Forms;
using System;
using txparks.Data.ViewModel;
using txparks.DS;
using txparks.Utility;
using Xamarin.Forms;
namespace txparks.Views.Downloads
{
public partial class DisplayKml : ContentPage
{
private string TAG { get => this.GetType().Name; }
private readonly Envelope _usEnvelope = new Envelope(-144.619561355187, 18.0328662832097, -66.0903762761083, 67.6390975806745, SpatialReferences.Wgs84);
DisplayKmlVM viewModel;
public DisplayKml()
{
InitializeComponent();
Initialize();
}
protected override void OnAppearing()
{
base.OnAppearing();
//Test2();
Setup();
}
void Initialize()
{
Logger.Debug(TAG, GeneralUtil.GetCallerName());
MySceneView.Scene = new Scene(Basemap.CreateImageryWithLabels());
}
protected override void OnBindingContextChanged()
{
Logger.Debug(TAG, GeneralUtil.GetCallerName());
base.OnBindingContextChanged();
viewModel = (DisplayKmlVM)base.BindingContext;
}
async void Test1()
{
KmlLayer layer = new KmlLayer(new Uri("https://www.wpc.ncep.noaa.gov/kml/noaa_chart/WPC_Day1_SigWx.kml"));
MySceneView.Scene.OperationalLayers.Add(layer);
await MySceneView.SetViewpointAsync(new Viewpoint(viewModel.Envelope));
}
async void Test2()
{
KmlLayer layer = new KmlLayer(new Uri("https://tpwd.texas.gov/spdest/parkinfo/maps/gis/kmz/abilene_sp_trails.kmz"));
//Logger.DebugMedium(TAG, "layer load status: {0}", layer.LoadStatus);
MySceneView.Scene.OperationalLayers.Add(layer);
await MySceneView.SetViewpointAsync(new Viewpoint(viewModel.Envelope));
}
void Refresh(object sender, EventArgs e)
{
Logger.Info(TAG, GeneralUtil.GetCallerName());
Setup();
}
async void Setup()
{
Logger.Info(TAG, GeneralUtil.GetCallerName());
var filePath = viewModel.Uri;
var isExists = DependencyService.Get<IFileService>().FileExists(filePath);
Logger.DebugLow(TAG, "uri exists: {0} | {1}", isExists, filePath);
try
{
MySceneView.Scene.OperationalLayers.Clear();
KmlDataset dataset = new KmlDataset(new Uri(filePath));
Logger.DebugLow(TAG, "dataset status: {0}", dataset.LoadStatus);
Logger.DebugLow(TAG, "dataset error: {0}", dataset.LoadError);
Logger.DebugLow(TAG, "dataset source: {0}", dataset.Source);
KmlLayer layer = new KmlLayer(dataset);
//KmlLayer layer = new KmlLayer(new Uri(filePath));
MySceneView.Scene.OperationalLayers.Add(layer);
await MySceneView.SetViewpointAsync(new Viewpoint(viewModel.Envelope));
}
catch (Exception ex)
{
Logger.Error(TAG, "Setup error: {0}", ex);
}
}
}
}
Solved! Go to Solution.
You could try awaiting the async load on the KmlDataset or KmlLayer (depending on the approach you're taking) and check the load status, noting that load may return an exception is there's an error. Also try the SceneView LayerViewStateChanged event to identify layer-related drawing activity (in/out of scale, errors, etc).
I have also meet the problem,.you can copy tif into smart phone, run and dispaly the image.
You could try awaiting the async load on the KmlDataset or KmlLayer (depending on the approach you're taking) and check the load status, noting that load may return an exception is there's an error. Also try the SceneView LayerViewStateChanged event to identify layer-related drawing activity (in/out of scale, errors, etc).
Thank you for the suggestions. I will hold off on trying the tiff suggestion for now. I've attempted to use loadAsync on both the dataset as well as the layer, but apparently our esri/gis license does not allow for that and I get an 'Unlicensed feature' error. I can do a LoadAsync on the scene but that doesn't appear to help.
I've also moved the kmz file to a different location in the file system and modified the sample DataManager from the ArcGIS samples project to make use of that location but that didn't work as well. I know the kmz file works because it opens up fine in the Google Earth app and I can retrieve the same file from a url and display it that way. Will continue searching for a solution. Thanks for the suggestions.
If the load async throws an unlicensed error, that might indicate you've set a license but the license level is too low for this functionality. Try commenting out any licensing code for now and running in developer mode (you'll see a watermark on the scene view). This topic provides more info on licensing.
Also this topic provides detailed information about API calls that require a specific license level.
Thanks Michael! After commenting out the license and adding layer.LoadAsync, the kmz file displayed on the scene. Now to figure out the license needed to run that method.
Sorry - missed the crucial doc link...a Standard license is required to View, create, edit, and save KML data stored as a local file.
You are correct. With license commented out and removing layer.LoadAsync, the kmz file displayed as well. So it was in the end a license issue. Thanks!