AnsweredAssumed Answered

ProximityResult from GeometryEngine.nearestCoordinate

Question asked by paul.haakma on Apr 19, 2018
Latest reply on Apr 20, 2018 by paul.haakma

Can someone help me understand the what the GeometryEngine.nearestCoordinate returns? I'm wondering if there is a bug in Runtime v100.1, as I'm seeing different results between a Polyline and a Polygon.

 

It returns a ProximityResult, which has a pointIndex. What exactly is that pointIndex supposed to be?

 

I made a basic polyline. I then click along the edges. The pointIndex seems to be the index of the lower vertex of that segment. e.g. if I click between vertices 0 and 1 I get a pointIndex of 0. If I click between vertices 2 and 3 I get 2. And so on.

 

I tried making a basic square polygon, and then started clicking along the edge. Obviously the polygon has 4 vertices, numbering 0-3. Clicking between 0-1 returns a pointIndex of 0. But as I move along from 1-2, it randomly alternates between returning 1 and 0. Again, as I move between 2-3, it randomly returns sometimes 2 and sometimes 0. And so on.

 

I have pasted below a very basic sample app. Is there someone that can test this, and confirm is this is either a bug, or whether I'm misunderstanding how the method works?

 

import QtQuick 2.7
import QtQuick.Controls 2.1
import ArcGIS.AppFramework 1.0
import ArcGIS.AppFramework.Controls 1.0
import Esri.ArcGISRuntime 100.0
Item {
    id: mainPage
    Graphic{
        id: samplePolygon
        symbol:        SimpleLineSymbol{
            color:  "blue"
            width: Qt.platform.os === "ios" || Qt.platform.os === "android" ? 3 * scaleFactor : 2 * scaleFactor;
            style: Enums.SimpleLineSymbolStyleSolid
        }
        Component.onCompleted: {
            geometry = ArcGISRuntimeEnvironment.createObject("Polygon", {json: {"rings":[[[-11136550.000343282,5201675.000715708],[-10361849.999553088,5220725.0007351395],[-10374549.999566041,4573025.000074485],[-11117500.00032385,4598425.000100394],[-11136550.000343282,5201675.000715708]]],"spatialReference":{"latestWkid":3857,"wkid":102100}}
                                                             })
        }
    }
    Graphic{
        id: samplePolyline
        symbol:        SimpleLineSymbol{
            color:  "blue"
            width: Qt.platform.os === "ios" || Qt.platform.os === "android" ? 3 * scaleFactor : 2 * scaleFactor;
            style: Enums.SimpleLineSymbolStyleSolid
        }
        Component.onCompleted: {
            geometry = ArcGISRuntimeEnvironment.createObject("Polyline", {json:   {"paths"
                                                                 :[[[-11422300.000634747,4122174.9996146187],[-10526949.99972149,4109474.999601665],[-10558699.999753874,3487174.9989669183],[-11390550.00060236,3525274.9990057806]]],"spatialReference":{"latestWkid":3857,"wkid":102100}}
                                                            } )}
    }
    MapView {
        id: mapView
        anchors.fill: parent
        wrapAroundMode: Enums.WrapAroundModeDisabled
        magnifierEnabled: true
        GraphicsOverlay{
            id: drawingLayer
        }
        onMouseClicked: {
            console.log('--------------------------------------------')
            var nearestCoordinate = GeometryEngine.nearestCoordinate(samplePolygon.geometry, mouse.mapPoint)
            console.log('polygon pointIndex: ', nearestCoordinate.pointIndex)
            var nearestCoordinate2 = GeometryEngine.nearestCoordinate(samplePolyline.geometry, mouse.mapPoint)
            console.log('polyline pointIndex: ', nearestCoordinate2.pointIndex)
        }
        Map {
            // Set the initial basemap to Streets
            BasemapStreets { }
            // set initial viewpoint to The United States
            ViewpointCenter {
                Point {
                    x: -10800000
                    y: 4500000
                    spatialReference: SpatialReference {
                        wkid: 102100
                    }
                }
                targetScale: 3e7
            }
            onLoadStatusChanged: {
                if (loadStatus === Enums.LoadStatusLoaded){
                    drawingLayer.graphics.append(samplePolygon)
                    drawingLayer.graphics.append(samplePolyline)
                }
            }
        }
    }
}

Outcomes