Определите точки, которые находятся под эскизом Overlay на карте - PullRequest
0 голосов
/ 23 января 2019

У меня есть карта с графикой с различными точками. Я дал пользователю возможность выбрать подмножество точек путем рисования многоугольника с помощью SketchEditor. Как я могу определить, какие точки были выбраны?

Вот подмножество кода для настройки карты:

private GraphicsOverlay graphicsOverlayLow;

// Graphics overlay to host sketch graphics
private GraphicsOverlay _sketchOverlay;

var symbolLow = new SimpleMarkerSymbol(SimpleMarkerSymbolStyle.Circle, Colors.Green, 10d);

graphicsOverlayLow = new GraphicsOverlay() { Renderer = new SimpleRenderer(symbolLow) };

foreach (var graphic in graphicListLow)  // graphicListLow is a List of Points
    graphicsOverlayLow.Graphics.Add(graphic);

MyMapView.GraphicsOverlays = new GraphicsOverlayCollection();

MyMapView.GraphicsOverlays.Add(graphicsOverlayLow);

_sketchOverlay = new GraphicsOverlay();
MyMapView.GraphicsOverlays.Add(_sketchOverlay);

У меня есть две кнопки, одна для начала рисования многоугольника и одна для щелчка по окончании (это следует примеру esri для SketchEditor). Код для запуска выглядит следующим образом:

private async void SelectButton_Click(object sender, RoutedEventArgs e)
{
    try
    {
        // Let the user draw on the map view using the chosen sketch mode
        SketchCreationMode creationMode = SketchCreationMode.Polygon;
        Esri.ArcGISRuntime.Geometry.Geometry geometry = await MyMapView.SketchEditor.StartAsync(creationMode, true);

        // Create and add a graphic from the geometry the user drew
        Graphic graphic = CreateGraphic(geometry);
        _sketchOverlay.Graphics.Add(graphic);
    }
    catch (TaskCanceledException)
    {
        // Ignore ... let the user cancel drawing
    }
    catch (Exception ex)
    {
        // Report exceptions
        MessageBox.Show("Error drawing graphic shape: " + ex.Message);
    }
}


private Graphic CreateGraphic(Esri.ArcGISRuntime.Geometry.Geometry geometry)
{
    // Create a graphic to display the specified geometry
    Symbol symbol = null;
    switch (geometry.GeometryType)
    {
        // Symbolize with a fill symbol
        case GeometryType.Envelope:
        case GeometryType.Polygon:
            {
                symbol = new SimpleFillSymbol()
                {
                    Color = Colors.Red,
                    Style = SimpleFillSymbolStyle.Solid,
                };
                break;
            }

Вот обработчик для процедуры, которая вызывается, когда пользователь нажимает кнопку, сигнализируя, что он завершил рисование многоугольника. Здесь я хочу определить, какие точки были выбраны.

private void CompleteButton_Click(object sender, RoutedEventArgs e)
{
    // Cancel execution of the sketch task if it is already active
    if (MyMapView.SketchEditor.CancelCommand.CanExecute(null))
    {
        MyMapView.SketchEditor.CancelCommand.Execute(null);
    }
}

Обратите внимание, что я использую 100.4 SDK для WPF.

enter image description here

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вы можете использовать метод GeometryEngine.Intersects, чтобы проверить, когда точечная графика пересекается, касается, пересекает полигон выделения. https://community.esri.com/message/826699-re-determine-points-that-are-under-a-sketchoverlay-in-a-map?commentID=826699#comment-826699

0 голосов
/ 23 января 2019

Это может быть выполнено пространственным запросом.Вам нужно будет использовать геометрию, возвращаемую редактором эскизов, и использовать ее для выполнения пространственного запроса к слоям с использованием фильтра геометрии.

Esri.ArcGISRuntime.Geometry.Geometry geometry = await MyMapView.SketchEditor.StartAsync(creationMode, true);

var queryparameters = new QueryParameters()
            {
                Geometry = geometry,
                SpatialRelationship = SpatialRelationship.Intersects
            };
await layer.SelectFeaturesAsync(queryparameters, Esri.ArcGISRuntime.Mapping.SelectionMode.New);
...