Hi, I want to know hod can I edit a point on a map clicking on the point then dragging it, and also updating the coordinates of the point. Below is my code, where I create a point using the saved coordinates.
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no">
<title>ArcGIS JavaScript Tutorials: Display point, line, and polygon graphics</title>
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
</style>
<link rel="stylesheet" href="https://js.arcgis.com/4.14/esri/themes/light/main.css">
<script src="https://js.arcgis.com/4.14/"></script>
<script>
require([
"esri/Map",
"esri/views/MapView",
"esri/Graphic",
"esri/layers/GraphicsLayer"
], function(Map, MapView, Graphic, GraphicsLayer) {
var map = new Map({
basemap: "topo-vector"
});
var view = new MapView({
container: "viewDiv",
map: map,
center: [28.159843448357865, -26.374449292814024],
zoom: 13
});
var graphicsLayer = new GraphicsLayer();
map.add(graphicsLayer);
// Create a point
var point = {
type: "point",
longitude: 28.159843448357865,
latitude: -26.374449292814024
};
var simpleMarkerSymbol = {
type: "simple-marker",
color: [226, 119, 40], // orange
size: 30,
style: "triangle", // default is a circle
outline: {
color: [255, 255, 255], // white
width: 2
}
};
var pointGraphic = new Graphic({
geometry: point,
symbol: simpleMarkerSymbol
});
graphicsLayer.add(pointGraphic);
});
</script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>
Solved! Go to Solution.
Not at all. You use your variable for the point class that you want thew lat an lon for and then code like this.
var lat = myPointVar.getLatitutde();
var lon = myPointVar.getLongitutde();
Just use SketchViewModel update function. The SketchViewModel handles all the click events and geometry updates for you.
Hi Robert
Please see my code, now it does not work, it does not not display the map anymore.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="initial-scale=1,maximum-scale=1,user-scalable=no"
/>
<title>Load a basic WebMap - 4.14</title>
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
</style>
<link
rel="stylesheet"
href="https://js.arcgis.com/4.14/esri/themes/light/main.css"
/>
<script src="https://js.arcgis.com/4.14/"></script>
<script>
require(["esri/views/MapView",
"esri/WebMap",
"esri/Graphic",
"esri/config",
"esri/widgets/Sketch/SketchViewModel",
"esri/layers/GraphicsLayer"
], function(MapView, WebMap, Graphic, esriConfig, SketchViewModel, GraphicsLayer) {
/************************************************************
* Creates a new WebMap instance. A WebMap must reference
* a PortalItem ID that represents a WebMap saved to
* arcgis.com or an on-premise portal.
*
* To load a WebMap from an on-premise portal, set the portal
* url with esriConfig.portalUrl.
************************************************************/
esriConfig.portalUrl = "https://portal.environment.gov.za/portal";
var webmap = new WebMap({
portalItem: {
// autocasts as new PortalItem()
id: "04582be14885483da48f29398960f653"
}
});
/************************************************************
* Set the WebMap instance to the map property in a MapView.
************************************************************/
var view = new MapView({
map: webmap,
container: "viewDiv"
center:[ 28.159843448357865, -26.374449292814024],
zoom: 14
});
var graphicsLayer = new GraphicsLayer();
webmap.layers.add(graphicsLayer);
// Create a point
var point = {
type: "point",
longitude: 28.159843448357865,
latitude: -26.374449292814024
};
var simpleMarkerSymbol = {
type: "simple-maker",
color: [226, 119, 40], // orange
size: 30,
style: "circle",
outline: {
color: [255, 255, 255], // white
width: 2
}
};
var pointGraphic = new Graphic({
geometry: point,
symbol: simpleMarkerSymbol
});
graphicsLayer.add(pointGraphic);
var sketch = new SketchViewModel({
layer: graphicsLayer,
view: view,
//container: "viewDiv"
});
view.ui.add(sketch, {
position: "top-right"
});
// Listen to sketch widget's create event.
sketch.on("create", function(event) {
// check if the create event's state has changed to complete indicating
// the graphic create operation is completed.
console.log(view.zoom);
if (event.state === "complete") {
// remove the graphic from the layer. Sketch adds
// the completed graphic to the layer by default.
graphicsLayer.remove(event.graphic);
// use the graphic.geometry to query features that intersect it
selectFeatures(event.graphic.geometry);
}
});
});
</script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" />
<title>Load a basic WebMap - 4.14</title>
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
</style>
<link rel="stylesheet" href="https://js.arcgis.com/4.14/esri/themes/light/main.css" />
<script src="https://js.arcgis.com/4.14/"></script>
<script>
require(["esri/views/MapView",
"esri/WebMap",
"esri/Graphic",
"esri/config",
"esri/widgets/Sketch/SketchViewModel",
"esri/layers/GraphicsLayer",
"esri/geometry/support/webMercatorUtils"
], function (MapView, WebMap, Graphic, esriConfig, SketchViewModel, GraphicsLayer, webMercatorUtils) {
/************************************************************
* Creates a new WebMap instance. A WebMap must reference
* a PortalItem ID that represents a WebMap saved to
* arcgis.com or an on-premise portal.
*
* To load a WebMap from an on-premise portal, set the portal
* url with esriConfig.portalUrl.
************************************************************/
esriConfig.portalUrl = "https://portal.environment.gov.za/portal";
var webmap = new WebMap({
portalItem: {
// autocasts as new PortalItem()
id: "04582be14885483da48f29398960f653"
}
});
/************************************************************
* Set the WebMap instance to the map property in a MapView.
************************************************************/
var view = new MapView({
map: webmap,
container: "viewDiv",
//You were missing the comma at the end of this line
center: [28.159843448357865, -26.374449292814024],
zoom: 14
});
var graphicsLayer = new GraphicsLayer();
webmap.layers.add(graphicsLayer);
// Create a point
var point = {
type: "point",
longitude: 28.159843448357865,
latitude: -26.374449292814024
};
var simpleMarkerSymbol = {
//You had "simple maker" notice the "r" is missing
type: "simple-marker", //
color: [226, 119, 40], // orange
size: 30,
style: "circle",
outline: {
color: [255, 255, 255], // white
width: 2
}
};
var pointGraphic = new Graphic({
//edited geometry has to be in the same spatial reference as the view
geometry: webMercatorUtils.geographicToWebMercator(point),
symbol: simpleMarkerSymbol
});
graphicsLayer.add(pointGraphic);
var sketch = new SketchViewModel({
layer: graphicsLayer,
view: view,
//container: "viewDiv"
});
// // Listen to sketch widget's create event.
// sketch.on("create", function (event) {
// // check if the create event's state has changed to complete indicating
// // the graphic create operation is completed.
// console.log(view.zoom);
// if (event.state === "complete") {
// // remove the graphic from the layer. Sketch adds
// // the completed graphic to the layer by default.
// graphicsLayer.remove(event.graphic);
// // use the graphic.geometry to query features that intersect it
// selectFeatures(event.graphic.geometry);
// }
// });
//You have to activate the sketchviewmodels update method
view.on("click", function (event) {
view.hitTest(event).then(function (response) {
var results = response.results;
results.forEach(function (result) {
if (result.graphic.layer === sketchViewModel.layer) {
sketchViewModel.update([result.graphic], {
tool: "move"
});
}
});
})
});
});
</script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>
Thank you very much Robert
Hi Robert,
Once again, thank you very much for your assistance. Your code works like a charm, thank you very much. My one last question is this, supposed I get the latitude and longitude from variables, now after I have moved the point or the pin from one location to the other obviously the coordinates will change, how can I update the variables?
Use the Point class getLatitude() and getLongitude() methods.
https://developers.arcgis.com/javascript/3/jsapi/point-amd.html#getlatitude
Hi Robert,
Thank you very much for the response. I went through the article, but it is not clear on how to use getLatitude() and getLongitude() methods. Must I do it like this?
var point = new Point(
{
getLatitude();
getLongitude();
});
Not at all. You use your variable for the point class that you want thew lat an lon for and then code like this.
var lat = myPointVar.getLatitutde();
var lon = myPointVar.getLongitutde();
Hi Robert,
When you look at the code, is
// Create a point
var point = {
type: "point",
longitude: 28.159843448357865,
latitude: -26.374449292814024
};
a point class that you are referring to? Or must I create a new class like this?
// Create a new class
var point = new Point{
var myLatitude;
var myLongitude;
};
Please forgive me for such many questions, I am new on Esri and GIS, I am trying to get as much knowledge as I can.