Hello, I try to programmatically measure the length of several lines that are not in the same layer at the same time. After that I want to write the individual distances in the form (there is no problem with that ...). Unfortunately, I don't know how to write a method that would measure individual lines for me.
What I have tried:
namespace ProAppModule1
{
internal class Delka : Button
{
protected override void OnClick()
{
Form1 formular = new Form1();
double delka = new double();
var lyrs = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>();
MapView.Active.SelectLayers(lyrs.ToList());
var openTableBtnCmd = FrameworkApplication.GetPlugInWrapper("esri_editing_table_openTablePaneButton") as ICommand;
if (openTableBtnCmd != null)
{
openTableBtnCmd.Execute(null);
}
formular.richTextBox1.Text = delka.ToString();
formular.Show();
}
}
}
Sorry for the wrong explanation, I'll try better.
I described the individual things in the picture, and now my idea, I would like the individual lines to be measured after pressing the button and then write their lengths in the form (I already have it ready, this is not a problem).
Perhaps it is understandable and understandable.
I will be happy for any advice or help.
Thank you.
Solved! Go to Solution.
I attached a sample that is using a dockpane to show the selected [line] rows and the respective length. Note that the length was computed using a area specific projection (in my case Hawaii), so you might want to change this to fit your needs. When you click on a line in the grid the corresponding feature will flash on the map.
I don't quite understand what your workflow is and why you are opening the attribute table. Can you show a screenshot of what you're trying to show? Are you computing something based on an attribute column's value?
I tried to adjust it so maybe it's better.
I think I see your desired workflow now, i will try to find some matching samples over the weekend.
Hello Wolf,
I hate to bother you, but haven't found any examples or anything about my project?
I attached a sample that is using a dockpane to show the selected [line] rows and the respective length. Note that the length was computed using a area specific projection (in my case Hawaii), so you might want to change this to fit your needs. When you click on a line in the grid the corresponding feature will flash on the map.
Thank you so much, if you had a problem I could still call?
Hello,
I tried to transform the code into its own form, but I have a problem with lambda:
namespace ShowLineLength
{
internal class ShowSelectedLineLengths : Button
{
ProAppModule2.Form1 formular = new ProAppModule2.Form1();
protected override async void OnClick()
{
try
{
var result = await QueuedTask.Run<(ProAppModule2.Form1 formular ,double Total)>(() =>
{
double dTotalLen = 0.0;
// retrieve the currently selected features in the map view
var selectedFeatureSets = MapView.Active.Map.GetSelection();
var mapa = SpatialReferenceBuilder.CreateSpatialReference(3759);
// use this projection to get the most accurate length
if (MapView.Active != null)
{
// Get the active map view.
var mapView = MapView.Active;
// Get the list of selected layers.
IReadOnlyList<Layer> selectedLayerList = MapView.Active.GetSelectedLayers();
if (selectedLayerList.Count > 0)
// for each of the map members that is a line feature we put a row
// into our dataTable
foreach (var selectedFeatureSet in selectedFeatureSets)
{
var featLayer = selectedFeatureSet.Key as BasicFeatureLayer;
if (featLayer == null) continue;
if (!(featLayer.ShapeType == esriGeometryType.esriGeometryPolyline)) continue;
// use the selection to get all records
using (var rowCursor = featLayer.Search(new QueryFilter() { ObjectIDs = selectedFeatureSet.Value }))
{
while (rowCursor.MoveNext())
{
using (var feature = rowCursor.Current as Feature)
{
var theLine = feature.GetShape();
if (theLine != null)
{
var projectedLine = GeometryEngine.Instance.Project(theLine, mapa) as Polyline;
}
}
}
}
}
}
});
formular.richTextBox1.Text = result.ToString();
formular.Show();
}
catch (Exception ex)
{
MessageBox.Show($@"Exception in ShowSelectedLineLengths: {ex}");
}
}
}
}