{"id":980662,"date":"2020-08-20T14:52:10","date_gmt":"2020-08-20T21:52:10","guid":{"rendered":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=980662"},"modified":"2020-12-18T08:07:23","modified_gmt":"2020-12-18T16:07:23","slug":"arcgis-api-for-javascript-camera-intro","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro","title":{"rendered":"3D camera intro using the ArcGIS API for JavaScript"},"author":9302,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[23771],"tags":[25781,521112,549072,27491],"industry":[],"product":[36831,36551],"class_list":["post-980662","blog","type-blog","status-publish","format-standard","hentry","category-3d-gis","tag-3d","tag-3d-scene-viewer","tag-esrirdzurich","tag-jsapi4","product-js-api-arcgis","product-arcgis-online"],"acf":{"short_description":"In this blog post we\u2019ll explain how to define a camera, how to retrieve it and how to animate the camera to another position in the scene.","flexible_content":[{"acf_fc_layout":"content","content":"<p>When working in 3D, we need to define a point in the 3D space from where we view the scene. This point is also called a camera. In this blog post we\u2019ll explain how to define a camera, how to retrieve it and how to animate the camera to another point in the scene. We\u2019ll also briefly look into creating more complex animations, like rotating a globe or rotating the camera around an object in the scene.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":980672,"id":980672,"title":"intro","filename":"intro.png","filesize":74681,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/intro.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro\/intro","alt":"","author":"9302","description":"","caption":"","name":"intro","status":"inherit","uploaded_to":980662,"date":"2020-08-18 13:06:25","modified":"2020-08-18 13:06:25","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":1400,"height":1033,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/intro-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/intro.png","medium-width":354,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/intro.png","medium_large-width":768,"medium_large-height":567,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/intro.png","large-width":1400,"large-height":1033,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/intro.png","1536x1536-width":1400,"1536x1536-height":1033,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/intro.png","2048x2048-width":1400,"2048x2048-height":1033,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/intro-630x465.png","card_image-width":630,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/intro.png","wide_image-width":1400,"wide_image-height":1033}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<h2>How to define a\u00a0camera?<\/h2>\n<p>The <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-Camera.html\">Camera<\/a> object lives directly on the <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-views-SceneView.html#camera\">SceneView<\/a> and has 3 main components:<\/p>\n<ul>\n<li><strong>Position\u200a<\/strong>\u2014\u200alongitude, latitude, z &#8211; where z indicates the height of the point, relative to sea level 0.<\/li>\n<li><strong>Tilt<\/strong> (also called pitch in other software)\u200a\u2014\u200athe angle that the camera direction creates with the perpendicular to the ground. Tilt values range from 0 to 180 degrees, where 0 is looking straight down (center of the earth) and 180 looking straight up (towards outer space).<\/li>\n<li><strong>Heading<\/strong> (also called bearing in other software)\u200a\u2014\u200athe horizontal angle that the camera direction forms with the North direction clockwise. The value ranges from 0 to 360 degrees. A value of 0 means the camera is pointing North, and a value of 90 means it is pointing East.<\/li>\n<\/ul>\n<p>This video explains these concepts visually:<\/p>\n"},{"acf_fc_layout":"youtube","start_time":"0","end_time":"","youtube_video_url":"<iframe title=\"3D camera - ArcGIS API for JavaScript\" width=\"520\" height=\"390\" src=\"https:\/\/www.youtube.com\/embed\/RVJtusvqZ5A?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>"},{"acf_fc_layout":"content","content":"<p>&nbsp;<\/p>\n<h1>Interactively position\u00a0camera<\/h1>\n<p>Depending on what you want to focus on in your scene, finding that ideal point-of-view can involve some experimenting. Instead of manually tweaking the above components (position, tilt and heading) it is simpler to interactively place the camera in the scene.<\/p>\n<p>You can do so by zooming <img loading=\"lazy\" decoding=\"async\" style=\"vertical-align: middle\" src=\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/icon-minus.png\" alt=\"zoom out\" width=\"32\" height=\"32\" \/>\u00a0<img loading=\"lazy\" decoding=\"async\" style=\"vertical-align: middle\" src=\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/icon-plus.png\" alt=\"zoom in\" width=\"32\" height=\"32\" \/>,\u00a0panning <img loading=\"lazy\" decoding=\"async\" style=\"vertical-align: middle\" src=\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/icon-pan.png\" alt=\"pan\" width=\"32\" height=\"32\" \/>\u00a0and rotating <img loading=\"lazy\" decoding=\"async\" style=\"vertical-align: middle\" src=\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/icon-rotate.png\" alt=\"rotate\" width=\"32\" height=\"32\" \/> the camera using the mouse, trackpad and keyboard. The ArcGIS API for JavaScript also supports <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-views-SceneView.html#gamepad-navigation\">additional input devices<\/a> such as touchscreens, gamepads or the 3DConnexion SpaceMouse. Please refer to the SceneView <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-views-SceneView.html#sceneview-navigation\">documentation<\/a> for specific key- and button mappings.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":980722,"id":980722,"title":"standard-gamepad","filename":"standard-gamepad.png","filesize":9156,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/standard-gamepad.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro\/standard-gamepad-2","alt":"","author":"9302","description":"","caption":"You can navigate in a scene using a gamepad","name":"standard-gamepad-2","status":"inherit","uploaded_to":980662,"date":"2020-08-18 13:13:51","modified":"2020-08-20 12:20:58","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":375,"height":226,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/standard-gamepad-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/standard-gamepad.png","medium-width":375,"medium-height":226,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/standard-gamepad.png","medium_large-width":375,"medium_large-height":226,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/standard-gamepad.png","large-width":375,"large-height":226,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/standard-gamepad.png","1536x1536-width":375,"1536x1536-height":226,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/standard-gamepad.png","2048x2048-width":375,"2048x2048-height":226,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/standard-gamepad.png","card_image-width":375,"card_image-height":226,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/standard-gamepad.png","wide_image-width":375,"wide_image-height":226}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>There are a number of hidden gimmicks that help you place the camera in the 3D space. For example, when you start to pan while the mouse pointer is on top of a facade or far away mountains, the camera will move horizontally. Vice versa when pointing at the flat ground, the camera will also move vertically.<\/p>\n<h1>Define camera programmatically<\/h1>\n<p>Once you\u2019ve navigated to your favorite position in the scene, you usually want to have your application provide it as a preset to the user. This is where we will look into retrieving the values for the position, tilt and heading and reuse them to initialize a new camera object on the SceneView.<\/p>\n"},{"acf_fc_layout":"storymap","title":"","description":"","static":false,"storymap_url":"<a href=\"https:\/\/codepen.io\/arnofiva\/embed\/3e50e7a2afbb73a361cfcd10606f119d\">https:\/\/codepen.io\/arnofiva\/embed\/3e50e7a2afbb73a361cfcd10606f119d<\/a>"},{"acf_fc_layout":"content","content":"<p>&nbsp;<\/p>\n<h2>Get camera<\/h2>\n<p>In the spirit of <code>printf()<\/code> debugging, you can always print it to the plain camera object to the console using <code>console.log(view.camera)<\/code>. But this will print it as a JavaScript object which is not very useful if you want to copy paste it in your code. This <a href=\"https:\/\/github.com\/RalucaNicola\/code-snippets-arcgis-api-js\/blob\/master\/debug-snippets\/snippets.md#-pretty-print-camera\">code snippet<\/a> will print the camera in a nice format, no matter which coordinate system you use in the view:<\/p>\n<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\">(<span style=\"color: #333;font-weight: bold\">function<\/span>() {\r\n  <span style=\"color: #333;font-weight: bold\">const<\/span> view = <span style=\"color: #0086b3\">require<\/span>(<span style=\"color: #d14\">\"esri\/views\/View\"<\/span>).views.getItemAt(<span style=\"color: #008080\">0<\/span>);\r\n  <span style=\"color: #333;font-weight: bold\">const<\/span> p = view.camera.position;\r\n\r\n  <span style=\"color: #333;font-weight: bold\">if<\/span> (p.spatialReference.isWebMercator || p.spatialReference.isWGS84) {\r\n    <span style=\"color: #0086b3\">console<\/span>.log(<span style=\"color: #d14\">`\r\n{\r\n  position: [\r\n    <span style=\"color: #333;font-weight: normal\">${p.longitude.toFixed(8)}<\/span>,\r\n    <span style=\"color: #333;font-weight: normal\">${p.latitude.toFixed(8)}<\/span>,\r\n    <span style=\"color: #333;font-weight: normal\">${p.z.toFixed(5)}<\/span>\r\n  ],\r\n  heading: <span style=\"color: #333;font-weight: normal\">${view.camera.heading.toFixed(2)}<\/span>,\r\n  tilt: <span style=\"color: #333;font-weight: normal\">${view.camera.tilt.toFixed(2)}<\/span>\r\n}`<\/span>);\r\n  }\r\n  <span style=\"color: #333;font-weight: bold\">else<\/span> {\r\n    <span style=\"color: #0086b3\">console<\/span>.log(<span style=\"color: #d14\">`\r\n{\r\n  position: {\r\n    x: <span style=\"color: #333;font-weight: normal\">${p.x.toFixed(5)}<\/span>,\r\n    y: <span style=\"color: #333;font-weight: normal\">${p.y.toFixed(5)}<\/span>,\r\n    z: <span style=\"color: #333;font-weight: normal\">${p.z.toFixed(3)}<\/span>,\r\n    spatialReference: <span style=\"color: #333;font-weight: normal\">${p.spatialReference.wkid}<\/span>\r\n  },\r\n  heading: <span style=\"color: #333;font-weight: normal\">${view.camera.heading.toFixed(2)}<\/span>,\r\n  tilt: <span style=\"color: #333;font-weight: normal\">${view.camera.tilt.toFixed(2)}<\/span>\r\n}`<\/span>);\r\n  }\r\n})();\r\n<\/code><\/pre>\n<p>You can also use this code snippet with the <a href=\"https:\/\/arcgis.com\/home\/webscene\/viewer.html\" target=\"_blank\" rel=\"noopener\">Scene Viewer<\/a>. Just copy paste it in the console and it will print out the camera position like this:<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":980772,"id":980772,"title":"camera-snippet","filename":"camera-snippet.png","filesize":14691,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/camera-snippet.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro\/camera-snippet","alt":"","author":"9302","description":"","caption":"","name":"camera-snippet","status":"inherit","uploaded_to":980662,"date":"2020-08-18 13:27:47","modified":"2020-08-18 13:27:47","menu_order":0,"mime_type":"image\/png","type":"image","subtype":"png","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":456,"height":283,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/camera-snippet-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/camera-snippet.png","medium-width":421,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/camera-snippet.png","medium_large-width":456,"medium_large-height":283,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/camera-snippet.png","large-width":456,"large-height":283,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/camera-snippet.png","1536x1536-width":456,"1536x1536-height":283,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/camera-snippet.png","2048x2048-width":456,"2048x2048-height":283,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/camera-snippet.png","card_image-width":456,"card_image-height":283,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/camera-snippet.png","wide_image-width":456,"wide_image-height":283}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<h2>Set camera<\/h2>\n<p>Thanks to the <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/guide\/programming-patterns\/#autocasting\" target=\"_blank\" rel=\"noopener\">autocasting<\/a> capabilities of the JavaScript API, we can directly pass the above JSON object as the camera object to the SceneView.<\/p>\n<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #333;font-weight: bold\">const<\/span> view = <span style=\"color: #333;font-weight: bold\">new<\/span> SceneView({ ... });\r\n\r\nview.camera = {\r\n  position: [\r\n    <span style=\"color: #008080\">8.22216751<\/span>,\r\n    <span style=\"color: #008080\">46.48873434<\/span>,\r\n    <span style=\"color: #008080\">13032241.44725<\/span>,\r\n  ],\r\n  heading: <span style=\"color: #008080\">0.00<\/span>,\r\n  tilt: <span style=\"color: #008080\">0.16<\/span>,\r\n};\r\n<\/code><\/pre>\n<p>You can do this again in your application code but also directly in the Scene Viewer through the developer console. This is helpful for example when creating slides that should have a specific camera position.<\/p>\n<h2>Using targets<\/h2>\n<p>The SceneView provides an additional way to change the camera through a method called <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-views-SceneView.html#goTo\">goTo()<\/a>. As an argument it accepts a Camera object as we have seen above. Unlike setting the camera directly on the SceneView, <code>goTo()<\/code> will create a smooth transition to the new view point.<\/p>\n<p>But <code>goTo()<\/code> is powerful in that you can also pass it <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-views-SceneView.html#GoToTarget3D\">parameters<\/a> about what you want to see in the scene. We can pass one or multiple targets and <code>goTo()<\/code> will figure out the new camera position that it needs to navigate to. Targets can be a <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-geometry-Geometry.html\" target=\"_blank\" rel=\"noopener\">Geometry<\/a> (<a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-geometry-Point.html\" target=\"_blank\" rel=\"noopener\">Point<\/a>, <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-geometry-Polyline.html\" target=\"_blank\" rel=\"noopener\">Polyline<\/a>, <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-geometry-Polygon.html\" target=\"_blank\" rel=\"noopener\">Polygon<\/a>, <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-geometry-Mesh.html\" target=\"_blank\" rel=\"noopener\">Mesh<\/a>, <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-geometry-Extent.html\" target=\"_blank\" rel=\"noopener\">Extent<\/a>) or a <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-Graphic.html\" target=\"_blank\" rel=\"noopener\">Graphic<\/a>.<br \/>\nSometimes we only want to change parts of a camera definition, like the tilt or the heading while preserving the camera zoom and center. In this case, we can again use the <code>goTo()<\/code> method and only pass the property that we want to change (view center or zoom, camera heading, tilt or position).<\/p>\n"},{"acf_fc_layout":"content","content":"<h1>Camera animations<\/h1>\n<p>As we have seen previously <code>goTo()<\/code> uses animations to transition the camera to its new position. Animations are a nice way to show off your 3D content and invite users to further explore the scene themselves. Let\u2019s have a look how we can use the JavaScript API to create some custom camera animations.<\/p>\n<h2><code>goTo<\/code> animation options<\/h2>\n<p>When used without additional arguments <code>goTo()<\/code> will choose default <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-views-SceneView.html#GoToOptions3D\">animation properties<\/a> that best suit the transition. For example, the further away the final position is, the longer the duration of the animation.<\/p>\n<p>We can tweak the duration either relatively using <code>speedFactor<\/code> or providing an absolute <code>duration<\/code> in milliseconds, allowing us to speed up or slow down animations.<\/p>\n<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #998;font-style: italic\">\/\/ Animate twice as fast<\/span>\r\nview.goTo(target, {\r\n  speedFactor: <span style=\"color: #008080\">2<\/span>,\r\n});\r\n\r\n<span style=\"color: #998;font-style: italic\">\/\/ Animate for 30 seconds<\/span>\r\nview.goTo(target, {\r\n  duration: <span style=\"color: #008080\">30000<\/span>,\r\n  maxDuration: <span style=\"color: #008080\">30000<\/span>,\r\n});\r\n\r\n<span style=\"color: #998;font-style: italic\">\/\/ Disable animations<\/span>\r\nview.toTo(target, { duration: <span style=\"color: #008080\">0<\/span> });<\/code><\/pre>\n<p>In addition <code>goTo()<\/code> will also accelerate the transition at the beginning and slow it down towards the end. In animation terminology this is called <em>easing<\/em> and <code>goTo()<\/code> supports a variety of different <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/api-reference\/esri-views-SceneView.html#GoToOptions3D\" target=\"_blank\" rel=\"noopener\">presets<\/a>. To make sure the camera always transitions at the same speed, simply call <code>view.goTo(target, { easing 'linear' })<\/code>. Checkout this <a href=\"https:\/\/developers.arcgis.com\/javascript\/latest\/sample-code\/scene-goto\/index.html\" target=\"_blank\" rel=\"noopener\">sample<\/a> in the JavaScript API documentation that demonstrates different easing values.<\/p>\n"},{"acf_fc_layout":"content","content":"<h2>Rotate a\u00a0globe<\/h2>\n<p>If we have an app where data is depicted on a globe, it might be nice to spin the globe when the app starts. This way the user knows that they can interact with the globe. To do that we\u2019ll just change the camera to a new camera with modified longitude which we update on every frame. When the user interacts with the globe we want to stop the animation, so we\u2019ll check in the beginning whether <code>view.interacting<\/code> is true:<\/p>\n<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #333;font-weight: bold\">function<\/span> <span style=\"color: #900;font-weight: bold\">rotate<\/span>() {\r\n  <span style=\"color: #333;font-weight: bold\">if<\/span> (!view.interacting) {\r\n    <span style=\"color: #333;font-weight: bold\">const<\/span> camera = view.camera.clone();\r\n    camera.position.longitude -= <span style=\"color: #008080\">0.2<\/span>;\r\n    view.goTo(camera, { animate: <span style=\"color: #333;font-weight: 500\">false<\/span> });\r\n    requestAnimationFrame(rotate);\r\n  }\r\n}\r\n\r\nview.when(<span style=\"color: #333;font-weight: bold\">function<\/span> () {\r\n  watchUtils.whenFalseOnce(view, <span style=\"color: #d14\">\"updating\"<\/span>, rotate);\r\n});\r\n<\/code><\/pre>\n<p>You might notice that we\u2019re setting animate to false. That is because we change the camera longitude position by a small amount and we want to change it without interpolating the positions in between. This creates an animation without any lags, as shown in the following <a href=\"https:\/\/codepen.io\/arnofiva\/pen\/8072a2cb6ef38f07068a151930524484\">CodePen<\/a> when you click on the play button:<\/p>\n"},{"acf_fc_layout":"storymap","title":"","description":"","static":false,"storymap_url":"<a href=\"https:\/\/codepen.io\/arnofiva\/embed\/8072a2cb6ef38f07068a151930524484\">https:\/\/codepen.io\/arnofiva\/embed\/8072a2cb6ef38f07068a151930524484<\/a>"},{"acf_fc_layout":"content","content":"<p>&nbsp;<\/p>\n<p>An example that makes use of this animation is the <a href=\"https:\/\/github.com\/RalucaNicola\/the-globe-of-extremes\">Globe of Extremes<\/a> demo.<\/p>\n<h2>Rotate around a\u00a0point<\/h2>\n<p>Similar to rotating the globe, the following <a href=\"https:\/\/codepen.io\/arnofiva\/pen\/byzOoM\" target=\"_blank\" rel=\"noopener\">CodePen<\/a> will change the heading while keeping the center always at the same place. This is useful when highlighting a specific feature in your scene from various perspectives.<\/p>\n<pre><code style=\"padding: 0.5em;color: #333;background: #f8f8f8\"><span style=\"color: #333;font-weight: bold\">function<\/span> <span style=\"color: #900;font-weight: bold\">rotate<\/span>() {\r\n  <span style=\"color: #333;font-weight: bold\">if<\/span> (!view.interacting) {\r\n    view.goTo({\r\n        heading: view.camera.heading + <span style=\"color: #008080\">0.2<\/span>,\r\n        center: view.center\r\n    }, {animate: <span style=\"color: #333;font-weight: 500\">false<\/span>});\r\n    requestAnimationFrame(rotate);\r\n  }\r\n}\r\n<\/code><\/pre>\n"},{"acf_fc_layout":"storymap","title":"","description":"","static":false,"storymap_url":"<a href=\"https:\/\/codepen.io\/arnofiva\/embed\/d2fb464786d4ae435f291c2f7901defe\">https:\/\/codepen.io\/arnofiva\/embed\/d2fb464786d4ae435f291c2f7901defe<\/a>"},{"acf_fc_layout":"content","content":"<p>&nbsp;<\/p>\n<p>We hope this blog post was useful whether you are new to 3D or in that it revealed some camera capabilities you were not aware of. Try changing the above CodePens using different animation properties and check out Raluca&#8217;s <a href=\"https:\/\/github.com\/RalucaNicola\/code-snippets-arcgis-api-js\">GitHub repository<\/a> for other useful code snippets.<\/p>\n<p>Please let us know if you are interested in more advanced animations and we\u2019ll write up a follow up blog post!<\/p>\n<p>Happy mapping\u00a0\ud83d\ude42<\/p>\n<p>Raluca and Arno<\/p>\n"}],"authors":[{"ID":7011,"user_firstname":"Raluca","user_lastname":"Nicola","nickname":"Raluca Nicola","user_nicename":"raluca_zurich","display_name":"Raluca Nicola","user_email":"RNicola@esri.com","user_url":"https:\/\/raluca-nicola.net\/","user_registered":"2018-03-02 00:19:07","user_description":"Raluca works as a web cartographer with the Geo Experience Center team at Esri. She loves to play around with web technologies and visualization styles. If she's not in front of the computer, she's probably somewhere up in the mountains.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/7VkWXsZ3_400x400.jpg' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"},{"ID":9302,"user_firstname":"Arno","user_lastname":"Fiva","nickname":"Arno Fiva","user_nicename":"afiva","display_name":"Arno Fiva","user_email":"afiva@esri.com","user_url":"http:\/\/js.arcgis.com","user_registered":"2019-03-26 21:36:58","user_description":"Developer Evangelist at the Esri R&amp;D Center Z\u00fcrich, creating 3D web apps using the ArcGIS Maps SDK for JavaScript.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/IMG_1603-213x200.jpg' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"}],"related_articles":[{"ID":561822,"post_author":"7011","post_date":"2019-07-08 06:28:22","post_date_gmt":"2019-07-08 13:28:22","post_content":"","post_title":"Useful code snippets for ArcGIS API for JavaScript","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"code-snippets-arcgis-api-javascript","to_ping":"","pinged":"","post_modified":"2020-01-29 01:40:29","post_modified_gmt":"2020-01-29 09:40:29","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=561822","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":680652,"post_author":"7011","post_date":"2019-12-13 07:32:50","post_date_gmt":"2019-12-13 15:32:50","post_content":"","post_title":"A classical visualization of earthquakes using ArcGIS API for JavaScript","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"a-classical-visualization-of-earthquakes-using-arcgis-api-for-javascript","to_ping":"","pinged":"","post_modified":"2020-06-17 06:18:12","post_modified_gmt":"2020-06-17 13:18:12","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=680652","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":861861,"post_author":"4271","post_date":"2020-07-09 11:48:26","post_date_gmt":"2020-07-09 18:48:26","post_content":"","post_title":"What's new in the ArcGIS API for JavaScript (July 2020)","post_excerpt":"","post_status":"publish","comment_status":"open","ping_status":"closed","post_password":"","post_name":"whats-new-in-the-arcgis-api-for-javascript-july-2020","to_ping":"","pinged":"","post_modified":"2020-07-10 11:56:53","post_modified_gmt":"2020-07-10 18:56:53","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=861861","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"}],"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/camera-card.png","wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/banner-berlin-5.png"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>3D camera intro using the ArcGIS API for JavaScript<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"3D camera intro using the ArcGIS API for JavaScript\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta property=\"article:modified_time\" content=\"2020-12-18T16:07:23+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro\"},\"author\":{\"name\":\"Arno Fiva\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/781a6e1e56d59223e7af5e76cefab224\"},\"headline\":\"3D camera intro using the ArcGIS API for JavaScript\",\"datePublished\":\"2020-08-20T21:52:10+00:00\",\"dateModified\":\"2020-12-18T16:07:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro\"},\"wordCount\":9,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"3D\",\"3D Scene Viewer\",\"EsriRDZurich\",\"jsapi4\"],\"articleSection\":[\"3D Visualization &amp; Analytics\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro\",\"name\":\"3D camera intro using the ArcGIS API for JavaScript\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2020-08-20T21:52:10+00:00\",\"dateModified\":\"2020-12-18T16:07:23+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"3D camera intro using the ArcGIS API for JavaScript\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"name\":\"ArcGIS Blog\",\"description\":\"Get insider info from Esri product teams\",\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\",\"name\":\"Esri\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"width\":400,\"height\":400,\"caption\":\"Esri\"},\"image\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/esrigis\/\",\"https:\/\/x.com\/ESRI\",\"https:\/\/www.linkedin.com\/company\/5311\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/781a6e1e56d59223e7af5e76cefab224\",\"name\":\"Arno Fiva\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/IMG_1603-213x200.jpg\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/IMG_1603-213x200.jpg\",\"caption\":\"Arno Fiva\"},\"description\":\"Developer Evangelist at the Esri R&amp;D Center Z\u00fcrich, creating 3D web apps using the ArcGIS Maps SDK for JavaScript.\",\"sameAs\":[\"http:\/\/js.arcgis.com\",\"https:\/\/www.linkedin.com\/in\/arnofiva\/\",\"https:\/\/x.com\/arnofiva\"],\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/author\/afiva\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"3D camera intro using the ArcGIS API for JavaScript","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro","og_locale":"en_US","og_type":"article","og_title":"3D camera intro using the ArcGIS API for JavaScript","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2020-12-18T16:07:23+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro"},"author":{"name":"Arno Fiva","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/781a6e1e56d59223e7af5e76cefab224"},"headline":"3D camera intro using the ArcGIS API for JavaScript","datePublished":"2020-08-20T21:52:10+00:00","dateModified":"2020-12-18T16:07:23+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro"},"wordCount":9,"commentCount":0,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["3D","3D Scene Viewer","EsriRDZurich","jsapi4"],"articleSection":["3D Visualization &amp; Analytics"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro","name":"3D camera intro using the ArcGIS API for JavaScript","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2020-08-20T21:52:10+00:00","dateModified":"2020-12-18T16:07:23+00:00","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"3D camera intro using the ArcGIS API for JavaScript"}]},{"@type":"WebSite","@id":"https:\/\/www.esri.com\/arcgis-blog\/#website","url":"https:\/\/www.esri.com\/arcgis-blog\/","name":"ArcGIS Blog","description":"Get insider info from Esri product teams","publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization","name":"Esri","url":"https:\/\/www.esri.com\/arcgis-blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","width":400,"height":400,"caption":"Esri"},"image":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/esrigis\/","https:\/\/x.com\/ESRI","https:\/\/www.linkedin.com\/company\/5311\/"]},{"@type":"Person","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/781a6e1e56d59223e7af5e76cefab224","name":"Arno Fiva","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/IMG_1603-213x200.jpg","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/01\/IMG_1603-213x200.jpg","caption":"Arno Fiva"},"description":"Developer Evangelist at the Esri R&amp;D Center Z\u00fcrich, creating 3D web apps using the ArcGIS Maps SDK for JavaScript.","sameAs":["http:\/\/js.arcgis.com","https:\/\/www.linkedin.com\/in\/arnofiva\/","https:\/\/x.com\/arnofiva"],"url":"https:\/\/www.esri.com\/arcgis-blog\/author\/afiva"}]}},"text_date":"August 20, 2020","author_name":"Multiple Authors","author_page":"https:\/\/www.esri.com\/arcgis-blog\/products\/js-api-arcgis\/3d-gis\/arcgis-api-for-javascript-camera-intro","custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2020\/08\/banner-berlin-5.png","primary_product":"ArcGIS Maps SDK for JavaScript","tag_data":[{"term_id":25781,"name":"3D","slug":"3d","term_group":0,"term_taxonomy_id":25781,"taxonomy":"post_tag","description":"","parent":0,"count":342,"filter":"raw"},{"term_id":521112,"name":"3D Scene Viewer","slug":"3d-scene-viewer","term_group":0,"term_taxonomy_id":521112,"taxonomy":"post_tag","description":"","parent":0,"count":7,"filter":"raw"},{"term_id":549072,"name":"EsriRDZurich","slug":"esrirdzurich","term_group":0,"term_taxonomy_id":549072,"taxonomy":"post_tag","description":"","parent":0,"count":96,"filter":"raw"},{"term_id":27491,"name":"jsapi4","slug":"jsapi4","term_group":0,"term_taxonomy_id":27491,"taxonomy":"post_tag","description":"","parent":0,"count":111,"filter":"raw"}],"category_data":[{"term_id":23771,"name":"3D Visualization &amp; Analytics","slug":"3d-gis","term_group":0,"term_taxonomy_id":23771,"taxonomy":"category","description":"","parent":0,"count":686,"filter":"raw"}],"product_data":[{"term_id":36831,"name":"ArcGIS Maps SDK for JavaScript","slug":"js-api-arcgis","term_group":0,"term_taxonomy_id":36831,"taxonomy":"product","description":"","parent":36601,"count":361,"filter":"raw"},{"term_id":36551,"name":"ArcGIS Online","slug":"arcgis-online","term_group":0,"term_taxonomy_id":36551,"taxonomy":"product","description":"","parent":0,"count":2419,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=js-api-arcgis","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/980662","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/users\/9302"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=980662"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/980662\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=980662"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=980662"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=980662"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=980662"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=980662"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}