I want to relocation Graphic.
What I want to do is click on an already placed graphic, rewrite the latitude and longitude, and reposition it.
To be more specific.
When I click near a point that I have already placed, can I read the information about that point?
Solved! Go to Solution.
Hello @KanjaSousuke ,
When I click near a point that I have already placed, can I read the information about that point?
Yes. GeoView.identifyGraphicsOverlay will identify the topmost graphic which you can then use to obtain the graphic identified which has attributes, geometry, symbol, and a few other properties which you can see here, https://developers.arcgis.com/qt/qml/api-reference/qml-esri-arcgisruntime-graphic.html.
Below I wrote a quick little example to show the functionality you seek to implement. It looks for two clicks on the map. For the first two it creates two points from those clicks. Then on all subsequent clicks it does an identifyGraphicsOverlay operation to locate the graphic you clicked near. It creates a new point using the Long and Lat from the identified graphic and add 100000 to it just to show you can update it's location. You could also take another mouse click and update it's location that way. We have many samples that illustrate similar behavior but the one that comes to mind right now is "Edit features with feature-linked annotation", https://github.com/Esri/arcgis-runtime-samples-qt/blob/main/ArcGISRuntimeSDKQt_QMLSamples/EditData/E....
import QtQuick 2.6
import QtQuick.Controls 2.2
import Esri.ArcGISRuntime 100.11
ApplicationWindow {
    id: appWindow
    width: 800
    height: 600
    title: "RelocateGraphic"
    // add a mapView component
    MapView {
        id: mapView
        anchors.fill: parent
        // set focus to enable keyboard navigation
        focus: true
        // add a map to the mapview
        Map {
            // add the ArcGISStreets basemap to the map
            initBasemapStyle: Enums.BasemapStyleArcGISStreets
        }
        onMouseClicked: {
            let clickPoint = screenToLocation(mouse.x, mouse.y);
            if (pointA.geometry == null) {
                pointA.geometry = clickPoint;
            } else if (pointB.geometry == null) {
                pointB.geometry = clickPoint;
                setViewpointGeometryAndPadding(overlay.extent, 100 /*padding in device independent pixels (DIPS)*/);
            } else {
                identifyGraphicsOverlay(overlay, mouse.x, mouse.y, 5 /*tolerance*/, false /*returnPopupsOnly*/);
            }
        }
        onIdentifyGraphicsOverlayStatusChanged: {
            if (identifyGraphicsOverlayStatus != Enums.TaskStatusCompleted)
                return;
            const result = identifyGraphicsOverlayResult;
            print("longitude: " + result.graphics[0].geometry.x);
            print("latitude: " + result.graphics[0].geometry.y);
            print("Add 100000 to long and lat respectively and update");
            let geom = result.graphics[0].geometry;
            // Point is immutable which requires us to create a new one
            // then assign it to the graphic we want to update.
            let newPoint = ArcGISRuntimeEnvironment.createObject("Point", {
                                                                 x: geom.x + 100000,
                                                                 y: geom.y + 100000,
                                                                 spatialReference: geom.spatialReference
                                                                 });
            result.graphics[0].geometry = newPoint;
            print("new longitude: " + result.graphics[0].geometry.x);
            print("new latitude: " + result.graphics[0].geometry.y);
        }
        GraphicsOverlay {
            id: overlay
            Graphic {
                id: pointA
                SimpleMarkerSymbol {
                    color: "red"
                    size: 15
                    style: Enums.SimpleMarkerSymbolStyleCircle
                }
            }
            Graphic {
                id: pointB
                SimpleMarkerSymbol {
                    color: "blue"
                    size: 15
                    style: Enums.SimpleMarkerSymbolStyleCross
                }
            }
        }
    }
}
I hope you find this helpful. Let me know if you have any other questions.
Sincerely,
Jared
Hello @KanjaSousuke ,
When I click near a point that I have already placed, can I read the information about that point?
Yes. GeoView.identifyGraphicsOverlay will identify the topmost graphic which you can then use to obtain the graphic identified which has attributes, geometry, symbol, and a few other properties which you can see here, https://developers.arcgis.com/qt/qml/api-reference/qml-esri-arcgisruntime-graphic.html.
Below I wrote a quick little example to show the functionality you seek to implement. It looks for two clicks on the map. For the first two it creates two points from those clicks. Then on all subsequent clicks it does an identifyGraphicsOverlay operation to locate the graphic you clicked near. It creates a new point using the Long and Lat from the identified graphic and add 100000 to it just to show you can update it's location. You could also take another mouse click and update it's location that way. We have many samples that illustrate similar behavior but the one that comes to mind right now is "Edit features with feature-linked annotation", https://github.com/Esri/arcgis-runtime-samples-qt/blob/main/ArcGISRuntimeSDKQt_QMLSamples/EditData/E....
import QtQuick 2.6
import QtQuick.Controls 2.2
import Esri.ArcGISRuntime 100.11
ApplicationWindow {
    id: appWindow
    width: 800
    height: 600
    title: "RelocateGraphic"
    // add a mapView component
    MapView {
        id: mapView
        anchors.fill: parent
        // set focus to enable keyboard navigation
        focus: true
        // add a map to the mapview
        Map {
            // add the ArcGISStreets basemap to the map
            initBasemapStyle: Enums.BasemapStyleArcGISStreets
        }
        onMouseClicked: {
            let clickPoint = screenToLocation(mouse.x, mouse.y);
            if (pointA.geometry == null) {
                pointA.geometry = clickPoint;
            } else if (pointB.geometry == null) {
                pointB.geometry = clickPoint;
                setViewpointGeometryAndPadding(overlay.extent, 100 /*padding in device independent pixels (DIPS)*/);
            } else {
                identifyGraphicsOverlay(overlay, mouse.x, mouse.y, 5 /*tolerance*/, false /*returnPopupsOnly*/);
            }
        }
        onIdentifyGraphicsOverlayStatusChanged: {
            if (identifyGraphicsOverlayStatus != Enums.TaskStatusCompleted)
                return;
            const result = identifyGraphicsOverlayResult;
            print("longitude: " + result.graphics[0].geometry.x);
            print("latitude: " + result.graphics[0].geometry.y);
            print("Add 100000 to long and lat respectively and update");
            let geom = result.graphics[0].geometry;
            // Point is immutable which requires us to create a new one
            // then assign it to the graphic we want to update.
            let newPoint = ArcGISRuntimeEnvironment.createObject("Point", {
                                                                 x: geom.x + 100000,
                                                                 y: geom.y + 100000,
                                                                 spatialReference: geom.spatialReference
                                                                 });
            result.graphics[0].geometry = newPoint;
            print("new longitude: " + result.graphics[0].geometry.x);
            print("new latitude: " + result.graphics[0].geometry.y);
        }
        GraphicsOverlay {
            id: overlay
            Graphic {
                id: pointA
                SimpleMarkerSymbol {
                    color: "red"
                    size: 15
                    style: Enums.SimpleMarkerSymbolStyleCircle
                }
            }
            Graphic {
                id: pointB
                SimpleMarkerSymbol {
                    color: "blue"
                    size: 15
                    style: Enums.SimpleMarkerSymbolStyleCross
                }
            }
        }
    }
}
I hope you find this helpful. Let me know if you have any other questions.
Sincerely,
Jared
Thanks, I think I can manage that.