diff --git a/guide/06-imagery-and-raster-analysis/create-2D-digital-aerial-products.ipynb b/guide/06-imagery-and-raster-analysis/create-2D-digital-aerial-products.ipynb index 269895e02f..29c9bcb89a 100644 --- a/guide/06-imagery-and-raster-analysis/create-2D-digital-aerial-products.ipynb +++ b/guide/06-imagery-and-raster-analysis/create-2D-digital-aerial-products.ipynb @@ -31,18 +31,18 @@ "source": [ "## Getting Started\n", "\n", - "Reality mapping capability through ArcGIS API for Python requires ArcGIS Enterprise federated with a Reality Server license. See the [configuration instruction](https://doctopia.esri.com/builds/reality-server/main/en/deploy/configure-arcgis-reality.html) for setup details.\n", + "Reality mapping capability through ArcGIS API for Python requires ArcGIS Enterprise federated with a Reality Server license. See the [configuration instruction](https://doc.esri.com/en/arcgis-reality-server/latest/deploy/configure-arcgis-reality.html) for setup details.\n", "\n", - "Once your environment is configured, import the required modules:\n", + "Once your environment is configured, import the required class and module:\n", "\n", - "- `GIS`module: Manages GIS content, users, and groups\n", + "- [GIS](/python/latest/api-reference/arcgis.gis.toc.html#gis) class: Represents the organizational deployment and accesses classes to manage content, users, and groups\n", "\n", - "- [`Realitymapping` module](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.realitymapping.html) : Automates reality mapping tasks in the server environment." + "- [arcgis.raster.realitymapping](/python/latest/api-reference/arcgis.raster.realitymapping.html) submodule provides the functionality to automate reality mapping tasks in the server environment. The reality mapping module is available with ArcGIS API for Python (version >= 2.4.2)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "410f3a79", "metadata": {}, "outputs": [], @@ -56,7 +56,9 @@ "id": "fd553a67", "metadata": {}, "source": [ - "Establish a connection to your ArcGIS Enterprise portal and verify that reality mapping is supported in your environment." + "Establish a connection to your ArcGIS Enterprise portal and verify that reality mapping is supported in your environment. \n", + "\n", + "> *note:* Change credentials to match your organization credentials." ] }, { @@ -84,7 +86,7 @@ "source": [ "## Step 1: Create a Project\n", "\n", - "The first step is to create a reality mapping project using the [Project](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster.realitymapping.Project) class of the reality mapping module. For this example, we are using nadir digital aerial data, so we set the `sensor_type` and `scenario_type` accordingly." + "The first step is to create a reality mapping project using the [Project](python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster.realitymapping.Project) class of the reality mapping module. For this example, we are using nadir digital aerial data, so we set the `sensor_type` and `scenario_type` accordingly." ] }, { @@ -94,7 +96,11 @@ "metadata": {}, "outputs": [], "source": [ - "project = realitymapping.Project(\"RMDigitalAerial2Dy\", sensor_type = \"AerialDigital\", scenario_type= \"AerialNadir\")\n", + "project = realitymapping.Project(\n", + " project= \"RMDigitalAerial2Dy\", \n", + " sensor_type = \"AerialDigital\", \n", + " scenario_type= \"AerialNadir\"\n", + ")\n", "project" ] }, @@ -135,7 +141,7 @@ "source": [ "## Step 2: Create a Mission\n", "\n", - "The next step is to create a mission which is a container for managing all related imagery and the resulting processed data products of a single data capture session. Mission creation involves creating an image collection for the source rasters. So we need to first define the type, properties and path of the source rasters using the [ImageSource](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.toc.html#imagesource) class." + "The next step is to create a mission which is a container for managing all related imagery and the resulting processed data products of a single data capture session. Mission creation involves creating an image collection for the source rasters. So we need to first define the type, properties and path of the source rasters using the [ImageSource](/python/latest/api-reference/arcgis.raster.toc.html#imagesource) class." ] }, { @@ -159,40 +165,15 @@ "id": "8f999152-8ede-4bfa-bca2-aa75eb096ea0", "metadata": {}, "source": [ - "Other parameters specific to the digital aerial raster type we just created can be defined, similar to the camera_info and dem. To see the possible attributes, use the attributes property of the [raster_type](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.toc.html#rastertype) instance." + "Other parameters specific to the digital aerial raster type we just created can be defined, similar to the camera_info and dem. To see the possible attributes, use the attributes property of the [raster_type](/python/latest/api-reference/arcgis.raster.toc.html#rastertype) instance." ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "bf3f10d9-5ce1-4e7f-89e5-1b7dbc147749", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'name': 'Frame Camera',\n", - " 'camera_info': 'C:\\\\SampleData\\\\RM_DigitalAerial_Tutorial_2D\\\\Nadir_FramesCam_unc.csv',\n", - " 'processing_template': None,\n", - " 'dem': 'C:\\\\SampleData\\\\RM_DigitalAerial_Tutorial_2D\\\\DEM\\\\DEM_USGS_1m.tif',\n", - " 'averagezdem': None,\n", - " 'constant_z': None,\n", - " 'zfactor': None,\n", - " 'zoffset': None,\n", - " 'correct_geoid': None,\n", - " 'estimate_flight_height': None,\n", - " 'is_altitude_flight_height': None,\n", - " 'minimum_flight_height': None,\n", - " 'stretch_type': None,\n", - " 'scale_factor': None,\n", - " 'valid_range': None}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "DA_src.raster_type.attributes" ] @@ -212,8 +193,10 @@ "metadata": {}, "outputs": [], "source": [ - "mission = project.create_mission(image_sources = DA_src,\n", - " out_sr = {\"wkid\": 6423, \"vcsWkid\": 5703}) #NAD 1983 California/NAVD88" + "mission = project.create_mission(\n", + " image_sources = DA_src,\n", + " out_sr = {\"wkid\": 6423, \"vcsWkid\": 5703} # NAD 1983 California/NAVD88\n", + ") " ] }, { @@ -251,7 +234,9 @@ "\n", "### 3.1 Compute Initial Block Adjustment\n", "\n", - "For this tutorial, you will perform adjustment for the mission created using `compute_sensor_model()` method. The `compute_sensor_model()` method computes block adjustment for the image collection and applies the frame transform to the images, which is based on the raster type information used when creating the image collection. It also generates the control points feature class, solution table, solution points feature class, and flight path feature class. (These feature classes and tables will be saved in raster store and will not be created in the ArcGIS Enterprise as separated items.)" + "For this tutorial, you will perform adjustment for the mission created using [compute_sensor_model()](/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster._realitymapping_mission.Mission.compute_sensor_model) method. The *compute_sensor_model()* method computes block adjustment for the image collection and applies the frame transform to the images based on the raster type information used when creating the image collection. It also generates the control points feature class, solution table, solution points feature class, and flight path feature class. \n", + "\n", + "> *note:* These feature classes and tables will be saved in raster store and will not be created in the ArcGIS Enterprise as separated items." ] }, { @@ -291,7 +276,7 @@ "source": [ "## Step 4: Get Results\n", "\n", - "The final step after block adjustment is to generate products. The `reconstruct_surface()` method can generate one or multiple reality mapping products- DSM, true ortho and DSM Mesh from adjusted imagery." + "The final step after block adjustment is to generate products. The [reconstruct_surface()](/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster._realitymapping_mission.Mission.reconstruct_surface) method can generate one or multiple reality mapping products- DSM, true ortho and DSM Mesh from adjusted imagery." ] }, { @@ -301,7 +286,8 @@ "metadata": {}, "outputs": [], "source": [ - "mission_products_2d = mission.reconstruct_surface(scenario= \"AerialNadir\",\n", + "mission_products_2d = mission.reconstruct_surface(\n", + " scenario= \"AerialNadir\",\n", " quality= \"Ultra\",\n", " output_dsm_name= \"DigitalAerial2D_p_dsm\",\n", " output_true_ortho_name= \"DigitalAerial2D_p_ortho\",\n", @@ -322,7 +308,10 @@ "- Performed block adjustment to geometrically correct your imagery collection.\n", "- Generated DSM, true ortho and DSM mesh products.\n", "\n", - "The same concept and workflow demonstrated here can be adapted for UAV, oblique digital aerial, and satellite imagery processing." + "See additional guides to see the same concept and workflow demonstrated here adapted for different raster types:\n", + " * [UAV](../guide/create-trueortho-dsm-from-drone-imagery)\n", + " * [obligue digital aerial](../guide/create-3D-digital-aerial-products)\n", + " * [satellite imagery](../guide/create-trueortho-dsm-from-satellite-imagery)" ] } ], @@ -342,7 +331,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.10" + "version": "3.13.13" } }, "nbformat": 4, diff --git a/guide/06-imagery-and-raster-analysis/create-3D-digital-aerial-products.ipynb b/guide/06-imagery-and-raster-analysis/create-3D-digital-aerial-products.ipynb index c9386ee574..a64aa91f71 100644 --- a/guide/06-imagery-and-raster-analysis/create-3D-digital-aerial-products.ipynb +++ b/guide/06-imagery-and-raster-analysis/create-3D-digital-aerial-products.ipynb @@ -33,11 +33,11 @@ "\n", "Reality mapping capability through ArcGIS API for Python requires ArcGIS Enterprise federated with a Reality Server license. See the [configuration instruction](https://doctopia.esri.com/builds/reality-server/main/en/deploy/configure-arcgis-reality.html) for setup details.\n", "\n", - "Once your environment is configured, import the required modules:\n", + "Once your environment is configured, import the required class and module:\n", "\n", - "- `GIS`module: Manages GIS content, users, and groups\n", + "- [GIS](/python/latest/api-reference/arcgis.gis.toc.html#gis) class: Represents the organizational deployment and accesses classes to manage content, users, and groups\n", "\n", - "- [`Realitymapping` module](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.realitymapping.html) : Automates reality mapping tasks in the server environment." + "- [arcgis.raster.realitymapping](/python/latest/api-reference/arcgis.raster.realitymapping.html) submodule provides the functionality to automate reality mapping tasks in the server environment. The reality mapping module is available with ArcGIS API for Python (version >= 2.4.2)" ] }, { @@ -56,7 +56,9 @@ "id": "448e39bf", "metadata": {}, "source": [ - "Establish a connection to your ArcGIS Enterprise portal and verify that reality mapping is supported in your environment." + "Establish a connection to your ArcGIS Enterprise portal and verify that reality mapping is supported in your environment.\n", + "\n", + "> *note:* Change credentials to match your organization credentials." ] }, { @@ -84,7 +86,7 @@ "source": [ "## Step 1: Create a Project\n", "\n", - "The first step is to create a reality mapping project using the [Project](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster.realitymapping.Project) class of the reality mapping module. For this example, we are using oblique digital aerial data, so we set the `sensor_type` and `scenario_type` accordingly." + "The first step is to create a reality mapping project using the [Project](/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster.realitymapping.Project) class of the reality mapping module. For this example, we are using oblique digital aerial data, so we set the `sensor_type` and `scenario_type` accordingly." ] }, { @@ -94,7 +96,11 @@ "metadata": {}, "outputs": [], "source": [ - "project = realitymapping.Project(\"RMDigitalAerial3Dz\", sensor_type = \"AerialDigital\", scenario_type= \"AerialOblique\")\n", + "project = realitymapping.Project(\n", + " project=\"RMDigitalAerial3Dz\", \n", + " sensor_type = \"AerialDigital\", \n", + " scenario_type= \"AerialOblique\"\n", + ")\n", "project" ] }, @@ -103,7 +109,7 @@ "id": "09f23077-9479-4a4a-b8c9-4db677f8f058", "metadata": {}, "source": [ - "A project is a top-level workspace for managing reality mapping activities. Project creation involves creating a new portal folder and a reality mapping project item inside that folder. The project item contains the basic information (e.g. project name, group name, workspace name, etc.) that defines a reality mapping project. All related image services and products generated in subsequent steps will be stored in the project folder." + "A project is a top-level workspace for managing reality mapping activities. When a *project* is initialized, both a new portal folder and a reality mapping project item inside that folder are created. The project [item](/python/latest/api-reference/arcgis.gis.toc.html#item contains the basic information (e.g. project name, group name, workspace name, etc.) that defines a reality mapping project. All related image services and products generated in subsequent steps will be stored in the project folder." ] }, { @@ -135,7 +141,7 @@ "source": [ "## Step 2: Create a Mission\n", "\n", - "The next step is to create a mission which is a container for managing all related imagery and the resulting processed data products of a single data capture session. Mission creation involves creating an image collection for the source rasters. So we need to first define the type, properties and path of the source rasters using the [ImageSource](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.toc.html#imagesource) class. " + "The next step is to create a [mission](/python/latest/api-reference/arcgis.raster.realitymapping.html#mission). It contains all related imagery and the resulting processed data products for managing a single data capture session. A *mission* also uses an image collection for the source rasters. So we need to first define the type, properties and path of the source rasters using the [ImageSource](/python/latest/api-reference/arcgis.raster.toc.html#imagesource) class. " ] }, { @@ -159,7 +165,7 @@ "id": "937f920f-9ca1-4478-937a-7500a716f843", "metadata": {}, "source": [ - "Other parameters specific to the digital aerial raster type we just created can be defined, similar to the camera_info and dem. To see the possible attributes, use the attributes property of the [raster_type](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.toc.html#rastertype) instance." + "Other parameters specific to the digital aerial raster type we just created can be defined similarly to the *camera_info* and *dem* parameters in the cell above. To see the possible attributes, use the [attributes](/python/latest/api-reference/arcgis.raster.toc.html#arcgis.raster.RasterType.attributes) property of the [raster_type](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.toc.html#rastertype) instance." ] }, { @@ -212,8 +218,10 @@ "metadata": {}, "outputs": [], "source": [ - "mission = project.create_mission(image_sources = DA_src,\n", - " out_sr = {\"wkid\": 6423, \"vcsWkid\": 5703}) #NAD 1983 California/NAVD88" + "mission = project.create_mission(\n", + " image_sources = DA_src,\n", + " out_sr = {\"wkid\": 6423, \"vcsWkid\": 5703} # NAD 1983 California/NAVD88\n", + ") " ] }, { @@ -249,7 +257,9 @@ "\n", "### 3.1 Compute Initial Block Adjustment\n", "\n", - "For this tutorial, you will perform adjustment for the mission created using `compute_sensor_model()` method. The `compute_sensor_model()` method computes block adjustment for the image collection and applies the frame transform to the images, which is based on the raster type information used when creating the image collection. It also generates the control points feature class, solution table, solution points feature class, and flight path feature class. (These feature classes and tables will be saved in raster store and will not be created in the ArcGIS Enterprise as separated items.)" + "For this tutorial, you will perform adjustment for the mission created using [compute_sensor_model()](/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster._realitymapping_mission.Mission.compute_sensor_model) method. The *compute_sensor_model()* method computes block adjustment for the image collection and applies the frame transform to the images based on the raster type information used when creating the image collection. It also generates the control points feature class, solution table, solution points feature class, and flight path feature class. \n", + "\n", + "> *note:* These feature classes and tables will be saved in raster store and will not be created in the ArcGIS Enterprise as separated items." ] }, { @@ -289,7 +299,7 @@ "source": [ "## Step 4: Get Results\n", "\n", - "The final step after block adjustment is to generate products. The `reconstruct_surface()` method can generate one or multiple reality mapping products from adjusted imagery. In this tutorial, You will create point clouds and 3D mesh. " + "The final step after block adjustment is to generate products. The [reconstruct_surface()](/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster._realitymapping_mission.Mission.reconstruct_surface) method can generate one or multiple reality mapping products from adjusted imagery. In this tutorial, You will create point clouds and 3D mesh. " ] }, { @@ -299,10 +309,11 @@ "metadata": {}, "outputs": [], "source": [ - "products_3d = mission.reconstruct_surface(scenario= \"AerialOblique\", \n", - " quality= \"Ultra\", \n", - " output_point_cloud_name= \"DigitalAerial_p_pc2\", \n", - " output_mesh_name= \"DigitalAerial_p_mesh2\"\n", + "products_3d = mission.reconstruct_surface(\n", + " scenario= \"AerialOblique\", \n", + " quality= \"Ultra\", \n", + " output_point_cloud_name= \"DigitalAerial_p_pc2\", \n", + " output_mesh_name= \"DigitalAerial_p_mesh2\"\n", ")" ] }, @@ -319,7 +330,10 @@ "- Performed block adjustment to geometrically correct your imagery collection.\n", "- Generated point clouds and 3D Mesh products.\n", "\n", - "The same concept and workflow demonstrated here can be adapted for UAV, nadir digital aerial, and satellite imagery processing." + "See the following guides to see how the same principles and methods demonstrated here can be adapted for other raster types:\n", + "* [UAV](../guide/create-trueortho-dsm-from-drone-imagery)\n", + "* [nadir](../guide/create-2D-digital-aerial-products)\n", + "* [satellite](../guide/create-trueortho-dsm-from-satellite-imagery)" ] } ], @@ -339,7 +353,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.10" + "version": "3.13.13" } }, "nbformat": 4, diff --git a/guide/06-imagery-and-raster-analysis/create-trueortho-dsm-from-drone-imagery.ipynb b/guide/06-imagery-and-raster-analysis/create-trueortho-dsm-from-drone-imagery.ipynb index 08f0d0a984..0437d618ad 100644 --- a/guide/06-imagery-and-raster-analysis/create-trueortho-dsm-from-drone-imagery.ipynb +++ b/guide/06-imagery-and-raster-analysis/create-trueortho-dsm-from-drone-imagery.ipynb @@ -13,14 +13,14 @@ "source": [ "## Introduction\n", "\n", - "This tutorial demonstrates how to automate photogrammetric correction of drone images and generate reality mapping products using the ArcGIS API for Python.You'll learn to create Digital Surface Models (DSM), Digital Terrain Models (DTM), true ortho imagery, and DSM mesh. In this workflow, you will process a collection of nadir drone images through the complete reality mapping pipeline, including:\n", + "This tutorial demonstrates how to automate photogrammetric correction of drone images and generate reality mapping products using the ArcGIS API for Python. You'll learn to create Digital Surface Models (DSM), Digital Terrain Models (DTM), true ortho imagery, and DSM mesh. In this workflow, you will process a collection of nadir drone images through the complete reality mapping pipeline, including:\n", "\n", "- Creating a project\n", "- Create a mission\n", "- Perform block adjustment and refine the adjustment using Ground Control Points (GCP)\n", "- Generate true ortho and DSM products\n", "\n", - "To learn about more about reality mapping concepts, workflows and configurations, see the introduction to reality mapping guide." + "To learn about more about reality mapping concepts, workflows and configurations, see the [Introduction to reality mapping](../guide/introduction-to-reality-mapping) guide." ] }, { @@ -36,7 +36,7 @@ "source": [ "A collection of 195 drone images covering a section of the Esri campus, California, is provided for this tutorial. Each image has embedded EXIF metadata which is used along with the supplied GCP’s to support the block adjustment process.\n", "\n", - "Download [the tutorial dataset](https://esri-rasterdev.maps.arcgis.com/home/item.html?id=d99cc2563beb4208a3db4e60e9384b43&rsource=https%3A%2F%2Fesriurl.com%2FRealityMappingTutorialData), unzip it, and save contents to `C:\\SampleData\\RM_Drone_tutorial`." + "Download [the tutorial dataset](https://esri-rasterdev.maps.arcgis.com/home/item.html?id=d99cc2563beb4208a3db4e60e9384b43&rsource=https%3A%2F%2Fesriurl.com%2FRealityMappingTutorialData), unzip it, and save contents to your local system, for example `C:\\SampleData\\RM_Drone_tutorial`." ] }, { @@ -47,11 +47,11 @@ "\n", "Reality mapping capability through ArcGIS API for Python requires ArcGIS Enterprise federated with a Reality Server license. See the [configuration instruction](https://doctopia.esri.com/builds/reality-server/main/en/deploy/configure-arcgis-reality.html) for setup details.\n", "\n", - "Once your environment is configured, import the required modules:\n", + "Once your environment is configured, import the required class and module:\n", "\n", - "- `GIS` module: Manages GIS content, users, and groups\n", + "- [GIS](/python/latest/api-reference/arcgis.gis.toc.html#gis) class: Represents the organizational deployment and accesses classes to manage content, users, and groups\n", "\n", - "- [`Realitymapping` module](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.realitymapping.html) : Automates reality mapping tasks in the server environment." + "- [arcgis.raster.realitymapping](/python/latest/api-reference/arcgis.raster.realitymapping.html) submodule provides the functionality to automate reality mapping tasks in the server environment. The reality mapping module is available with ArcGIS API for Python (version >= 2.4.2)" ] }, { @@ -68,7 +68,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Establish a connection to your ArcGIS Enterprise portal and verify that reality mapping is supported in your environment." + "Establish a connection to your ArcGIS Enterprise portal and verify that reality mapping is supported in your environment.\n", + "\n", + "> *note:* Change credentials to match your organization credentials." ] }, { @@ -94,7 +96,7 @@ "source": [ "## Step 1: Create a Project\n", "\n", - "The first step is to create a reality mapping project using the [Project](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster.realitymapping.Project) class of the reality mapping module. " + "The first step is to create a reality mapping project using the [Project](/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster.realitymapping.Project) class of the reality mapping module. " ] }, { @@ -123,7 +125,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "A project is a top-level workspace for managing reality mapping activities. Project creation involves creating a new portal folder and a reality mapping project item inside that folder. The project item contains the basic information (e.g. project name, group name, workspace name, etc.) that defines a reality mapping project." + "A project is a top-level workspace for managing reality mapping activities. Initializing a new a project creates a new portal folder and a reality mapping project [item](/python/latest/api-reference/arcgis.gis.toc.html#item) inside that folder. The project item contains the basic information (e.g. project name, group name, workspace name, etc.) that defines a reality mapping project." ] }, { @@ -153,7 +155,7 @@ "source": [ "## Step 2: Create a Mission\n", "\n", - "The next step is to create a mission which is a container for managing all related imagery and the resulting processed data products of a single data capture session. Mission creation involves creating an image collection for the source rasters. So we need to first define the type, properties and path of the source rasters using the [ImageSource](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.toc.html#imagesource) class." + "The next step is to create a [mission](/python/latest/api-reference/arcgis.raster.realitymapping.html#mission), which contains all related imagery and processed data products for managing a single data capture session. Creating a *mission* creates a supporting image collection for the source rasters. So we need to first define the type, properties and path of the source rasters using the [ImageSource](/python/latest/api-reference/arcgis.raster.toc.html#imagesource) class." ] }, { @@ -174,7 +176,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Other properties specific to the UAV/UAS image source object we just created can be defined, similar to the estimate_flight_height. To see the possible attributes, use the attributes property of the [raster_type](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.toc.html#rastertype) instance." + "Other properties specific to the UAV/UAS image source object we just created can be defined similarly to the *estimate_flight_height* assignment in the cell above. To see the possible attributes, use the [attributes](/python/latest/api-reference/arcgis.raster.toc.html#arcgis.raster.RasterType.attributes) property of the [raster_type](/python/latest/api-reference/arcgis.raster.toc.html#rastertype) instance." ] }, { @@ -217,7 +219,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now we can create mission (and image collection) using the image source object" + "Now we can create the *mission* (and image collection) using the image source object" ] }, { @@ -226,8 +228,10 @@ "metadata": {}, "outputs": [], "source": [ - "mission = project.create_mission(image_sources= uav_src,\n", - " out_sr = {\"wkid\": 32611, \"vcsWkid\": 5773})\n", + "mission = project.create_mission(\n", + " image_sources= uav_src,\n", + " out_sr = {\"wkid\": 32611, \"vcsWkid\": 5773}\n", + ")\n", "mission" ] }, @@ -285,7 +289,9 @@ "source": [ "### 3.1 Compute Initial Block Adjustment\n", "\n", - "To perform block adjustment, we call the `compute_sensor_model()` method of the mission object. The `compute_sensor_model()` method computes block adjustment for the image collection and applies the frame transform to the images, which is based on the raster type information used when creating the image collection. It also generates the control points feature class, solution table, solution points feature class, and flight path feature class. (These feature classes and tables will be saved in raster store and will not be created in the ArcGIS Enterprise as separated items.)\n", + "To perform block adjustment, we call the [compute_sensor_model()](/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster._realitymapping_mission.Mission.compute_sensor_model) method of the mission object. The *compute_sensor_model()* method computes block adjustment for the image collection and applies the frame transform to the images based on the raster type information used when creating the image collection. It also generates the control points feature class, solution table, solution points feature class, and flight path feature class. \n", + "\n", + "> *note:* These feature classes and tables will be saved in raster store and will not be created in the ArcGIS Enterprise as separate items.\n", "\n", "For preliminary quality purposes, we can perform block adjustment at quick or full mode. Quick mode computes tie points and adjustment at 8x of the source imagery resolution while full mode adjust the images in Quick mode then at 1x of the source imagery resolution. Running under either of these two modes will make it ready for another block adjustment run with more ground control points and matching tie points later on." ] @@ -296,7 +302,7 @@ "metadata": {}, "outputs": [], "source": [ - "mission.compute_sensor_model(mode=\"Full\", location_accuracy=\"High\")\n" + "mission.compute_sensor_model(mode=\"Full\", location_accuracy=\"High\")" ] }, { @@ -335,8 +341,8 @@ "The workflow for adding GCP involves:\n", "\n", "1. Prepare input control points for the data : The first step is to define the ground control points. This will be a list of GCPs (see figure below) and for each gcp in the list, a tie point on at least one image needs to be specified. \n", - "2. Match control points : Next, we will use [match_control_points](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster._realitymapping_mission.Mission.match_control_points) to find matching tie points on other overlapping images. \n", - "3. Update the control points feature class : Then, we will run [edit_control_points](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster._realitymapping_mission.Mission.edit_control_points) to update the control point feature class." + "2. Match control points : Next, we will use [match_control_points](/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster._realitymapping_mission.Mission.match_control_points) to find matching tie points on other overlapping images. \n", + "3. Update the control points feature class : Then, we will run [edit_control_points](/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster._realitymapping_mission.Mission.edit_control_points) to update the control point feature class." ] }, { @@ -370,106 +376,140 @@ "metadata": {}, "outputs": [], "source": [ - "input_gcp = [{\"pointId\": 1,\"x\": 481759.9533, \"y\": 3768700.799,\"z\": 391.1696,\n", - " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", - " \"xyAccuracy\": 0.013,\"zAccuracy\": 0.052,\n", - " \"imagePoints\": [{\n", - " \"imageID\": 69,\n", - " \"u\": 4108,\n", - " \"v\": -2929\n", - " }] \n", - " },\n", - " {\"pointId\": 2, \"gcptype\": 3, \"x\": 481759.9227, \"y\": 3768667.486,\"z\": 391.0711,\n", - " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", - " \"xyAccuracy\": 0.013,\"zAccuracy\": 0.044,\n", - " \"imagePoints\": [{\n", - " \"imageID\": 69,\n", - " \"u\": 2135,\n", - " \"v\": -1086\n", - " }] \n", - " },\n", - " {\"pointId\": 3, \"x\": 481763.9006, \"y\": 3768653.822,\"z\": 390.9542,\n", - " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", - " \"xyAccuracy\": 0.012,\"zAccuracy\": 0.044,\n", - " \"imagePoints\": [{\n", - " \"imageID\": 51,\n", - " \"u\": 2598,\n", - " \"v\": -3113\n", - " }] \n", - " },\n", - " {\"pointId\": 4,\"x\": 481809.5816, \"y\": 3768635.463,\"z\": 390.0384,\n", - " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", - " \"xyAccuracy\": 0.03,\"zAccuracy\": 0.1,\n", - " \"imagePoints\": [{\n", - " \"imageID\": 36,\n", - " \"u\": 1366,\n", - " \"v\": -2462\n", - " }] \n", - " },\n", - " {\"pointId\": 5,\"x\": 481833.5886, \"y\": 3768652.399,\"z\": 391.8996,\n", - " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", - " \"xyAccuracy\": 0.019,\"zAccuracy\": 0.075,\n", - " \"imagePoints\": [{\n", - " \"imageID\": 15,\n", - " \"u\": 2664,\n", - " \"v\": -2159\n", - " }] \n", - " },\n", - " {\"pointId\": 6,\"x\": 481877.181, \"y\": 3768656.118,\"z\": 391.1185,\n", - " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", - " \"xyAccuracy\": 0.026,\"zAccuracy\": 0.085,\n", - " \"imagePoints\": [{\n", - " \"imageID\": 8,\n", - " \"u\": 2518,\n", - " \"v\": -3162\n", - " }] \n", - " },\n", - " {\"pointId\": 7, \"gcptype\": 3, \"x\": 481870.2391, \"y\": 3768697.345,\"z\": 392.046,\n", - " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", - " \"xyAccuracy\": 0.017,\"zAccuracy\": 0.057,\n", - " \"imagePoints\": [{\n", - " \"imageID\": 28,\n", - " \"u\": 1360,\n", - " \"v\": -724\n", - " }] \n", - " },\n", - " {\"pointId\": 8,\"x\": 481870.28, \"y\": 3768711.083,\"z\": 392.0088,\n", - " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", - " \"xyAccuracy\": 0.022,\"zAccuracy\": 0.065,\n", - " \"imagePoints\": [{\n", - " \"imageID\": 28,\n", - " \"u\": 2170,\n", - " \"v\": -1490\n", - " }] \n", - " },\n", - " {\"pointId\": 9,\"x\": 481856.2017, \"y\": 3768735.404,\"z\": 391.5458,\n", - " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", - " \"xyAccuracy\": 0.012,\"zAccuracy\": 0.036,\n", - " \"imagePoints\": [{\n", - " \"imageID\": 58,\n", - " \"u\": 3152,\n", - " \"v\": -871\n", - " }] \n", - " },\n", - " {\"pointId\": 11, \"gcptype\": 3, \"x\": 481812.8916, \"y\": 3768653.304,\"z\": 392.924,\n", - " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", - " \"xyAccuracy\": 0.023,\"zAccuracy\": 0.094,\n", - " \"imagePoints\": [{\n", - " \"imageID\": 35,\n", - " \"u\": 2132,\n", - " \"v\": -2613\n", - " }] \n", - " },\n", - " {\"pointId\": 12,\"x\": 481774.7308, \"y\": 3768681.601,\"z\": 392.5825,\n", - " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", - " \"xyAccuracy\": 0.017,\"zAccuracy\": 0.051,\n", - " \"imagePoints\": [{\n", - " \"imageID\": 68,\n", - " \"u\": 2081,\n", - " \"v\": -1625\n", - " }] \n", - " }\n", - " ]" + "input_gcp = [\n", + " {\n", + " \"pointId\": 1,\"x\": 481759.9533, \"y\": 3768700.799,\"z\": 391.1696,\n", + " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", + " \"xyAccuracy\": 0.013,\"zAccuracy\": 0.052,\n", + " \"imagePoints\": [\n", + " {\n", + " \"imageID\": 69,\n", + " \"u\": 4108,]\n", + " \"v\": -2929\n", + " }\n", + " ] \n", + " },\n", + " {\n", + " \"pointId\": 2, \"gcptype\": 3, \"x\": 481759.9227, \"y\": 3768667.486,\"z\": 391.0711,\n", + " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", + " \"xyAccuracy\": 0.013,\"zAccuracy\": 0.044,\n", + " \"imagePoints\": [\n", + " {\n", + " \"imageID\": 69,\n", + " \"u\": 2135,\n", + " \"v\": -1086\n", + " }\n", + " ] \n", + " },\n", + " {\n", + " \"pointId\": 3, \"x\": 481763.9006, \"y\": 3768653.822,\"z\": 390.9542,\n", + " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", + " \"xyAccuracy\": 0.012,\"zAccuracy\": 0.044,\n", + " \"imagePoints\": [\n", + " {\n", + " \"imageID\": 51,\n", + " \"u\": 2598,\n", + " \"v\": -3113\n", + " }\n", + " ] \n", + " },\n", + " {\n", + " \"pointId\": 4,\"x\": 481809.5816, \"y\": 3768635.463,\"z\": 390.0384,\n", + " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", + " \"xyAccuracy\": 0.03,\"zAccuracy\": 0.1,\n", + " \"imagePoints\": [\n", + " {\n", + " \"imageID\": 36,\n", + " \"u\": 1366,\n", + " \"v\": -2462\n", + " }\n", + " ] \n", + " },\n", + " {\n", + " \"pointId\": 5,\"x\": 481833.5886, \"y\": 3768652.399,\"z\": 391.8996,\n", + " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", + " \"xyAccuracy\": 0.019,\"zAccuracy\": 0.075,\n", + " \"imagePoints\": [\n", + " {\n", + " \"imageID\": 15,\n", + " \"u\": 2664,\n", + " \"v\": -2159\n", + " }\n", + " ] \n", + " },\n", + " {\n", + " \"pointId\": 6,\"x\": 481877.181, \"y\": 3768656.118,\"z\": 391.1185,\n", + " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", + " \"xyAccuracy\": 0.026,\"zAccuracy\": 0.085,\n", + " \"imagePoints\": [\n", + " {\n", + " \"imageID\": 8,\n", + " \"u\": 2518,\n", + " \"v\": -3162\n", + " }\n", + " ] \n", + " },\n", + " {\n", + " \"pointId\": 7, \"gcptype\": 3, \"x\": 481870.2391, \"y\": 3768697.345,\"z\": 392.046,\n", + " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", + " \"xyAccuracy\": 0.017,\"zAccuracy\": 0.057,\n", + " \"imagePoints\": [\n", + " {\n", + " \"imageID\": 28,\n", + " \"u\": 1360,\n", + " \"v\": -724\n", + " }\n", + " ] \n", + " },\n", + " {\n", + " \"pointId\": 8,\"x\": 481870.28, \"y\": 3768711.083,\"z\": 392.0088,\n", + " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", + " \"xyAccuracy\": 0.022,\"zAccuracy\": 0.065,\n", + " \"imagePoints\": [\n", + " {\n", + " \"imageID\": 28,\n", + " \"u\": 2170,\n", + " \"v\": -1490\n", + " }\n", + " ] \n", + " },\n", + " {\n", + " \"pointId\": 9,\"x\": 481856.2017, \"y\": 3768735.404,\"z\": 391.5458,\n", + " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", + " \"xyAccuracy\": 0.012,\"zAccuracy\": 0.036,\n", + " \"imagePoints\": [\n", + " {\n", + " \"imageID\": 58,\n", + " \"u\": 3152,\n", + " \"v\": -871\n", + " }\n", + " ] \n", + " },\n", + " {\n", + " \"pointId\": 11, \"gcptype\": 3, \"x\": 481812.8916, \"y\": 3768653.304,\"z\": 392.924,\n", + " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", + " \"xyAccuracy\": 0.023,\"zAccuracy\": 0.094,\n", + " \"imagePoints\": [\n", + " {\n", + " \"imageID\": 35,\n", + " \"u\": 2132,\n", + " \"v\": -2613\n", + " }\n", + " ] \n", + " },\n", + " {\n", + " \"pointId\": 12,\"x\": 481774.7308, \"y\": 3768681.601,\"z\": 392.5825,\n", + " \"spatialReference\": {\"wkid\":26911, \"vcsWkid\": 5773},\n", + " \"xyAccuracy\": 0.017,\"zAccuracy\": 0.051,\n", + " \"imagePoints\": [\n", + " {\n", + " \"imageID\": 68,\n", + " \"u\": 2081,\n", + " \"v\": -1625\n", + " }\n", + " ] \n", + " }\n", + "]" ] }, { @@ -478,7 +518,7 @@ "source": [ "#### 3.2.2 Match Control Points\n", "\n", - "We have created a GCP with atleast one tie point but each tie point needs to be identified in other overlapping images. Manually creating tie points for all overlapping images is labor intensive. For a given ground control point and initial tie point in one of the overlapping images, `match_control_points() ` will help find all remaining tie points on all other image items of the image collection." + "We have created a GCP with atleast one tie point but each tie point needs to be identified in other overlapping images. Manually creating tie points for all overlapping images is labor intensive. For a given ground control point and initial tie point in one of the overlapping images, [match_control_points()](/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster._realitymapping_mission.Mission.match_control_points) will help find all remaining tie points on all other image items of the image collection." ] }, { @@ -487,7 +527,10 @@ "metadata": {}, "outputs": [], "source": [ - "control_point_sets = mission.match_control_points(control_points= input_gcp, similarity=\"High\")" + "control_point_sets = mission.match_control_points(\n", + " control_points=input_gcp, \n", + " similarity=\"High\"\n", + " )" ] }, { @@ -1306,7 +1349,7 @@ "source": [ "#### 3.2.3 Update Control Points Feature Class\n", "\n", - "Next, we will append the control point sets to the image collection’s control point feature class using `edit_control_points()`" + "Next, we will append the control point sets to the image collection’s control point feature class using [edit_control_points()](/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster._realitymapping_mission.Mission.edit_control_points)." ] }, { @@ -1326,7 +1369,7 @@ "\n", "After adding the ground control point sets to the image collection's control point table with steps above, we can rerun compute sensor model to refine block adjustment result.\n", "\n", - "Here, mode='Refine' represents to adjust the image at 1x of the source imagery resolution." + "Here, `mode='Refine'` represents to adjust the image at 1x of the source imagery resolution." ] }, { @@ -1335,7 +1378,10 @@ "metadata": {}, "outputs": [], "source": [ - "mission.compute_sensor_model(mode = \"Refine\", location_accuracy= \"High\")" + "mission.compute_sensor_model(\n", + " mode=\"Refine\", \n", + " location_accuracy=\"High\"\n", + ")" ] }, { @@ -1344,7 +1390,7 @@ "metadata": {}, "outputs": [], "source": [ - "mission.generate_report(report_format= \"HTML\")" + "mission.generate_report(report_format=\"HTML\")" ] }, { @@ -1353,7 +1399,7 @@ "source": [ "## Step 4: Get Results\n", "\n", - "The final step after block adjustment is to generate products. The `reconstruct_surface()` method can generate one or multiple reality mapping products- DSM, DTM, true ortho, DSM Mesh, 3D meshes, and point clouds from adjusted imagery." + "The final step after block adjustment is to generate products. The [reconstruct_surface()](/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster._realitymapping_mission.Mission.reconstruct_surface) method can generate one or multiple reality mapping products- DSM, DTM, true ortho, DSM Mesh, 3D meshes, and point clouds from adjusted imagery." ] }, { @@ -1363,12 +1409,13 @@ "outputs": [], "source": [ "%%time\n", - "products_2d = mission.reconstruct_surface(scenario= \"Drone\",\n", - " quality= \"High\",\n", - " output_dsm_name= \"DroneDSM\",\n", - " output_dtm_name= \"DroneDTM\",\n", - " output_true_ortho_name= \"DroneTrueOrtho\"\n", - " )" + "products_2d = mission.reconstruct_surface(\n", + " scenario= \"Drone\",\n", + " quality= \"High\",\n", + " output_dsm_name= \"DroneDSM\",\n", + " output_dtm_name= \"DroneDTM\",\n", + " output_true_ortho_name= \"DroneTrueOrtho\"\n", + " )" ] }, { @@ -1405,7 +1452,12 @@ "- Refined the adjustment using GCPs for improved absolute accuracy.\n", "- Generated DSM, DTM and true ortho products.\n", "\n", - "The same principles and methods demonstrated here can be adapted for satellite, nadir, and oblique digital aerial imagery processing, making this a versatile approach for reality mapping across different platforms and scales." + "The same principles and methods demonstrated here can be adapted for:\n", + "* [satellite](../guide/create-trueortho-dsm-from-satellite-imagery)\n", + "* [nadir](../guide/create-2D-digital-aerial-products)\n", + "* [oblique digital aerial imagery processing](../guide/create-3D-digital-aerial-products)\n", + "\n", + "This is a versatile approach for reality mapping across different platforms and scales." ] } ], @@ -1425,7 +1477,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.10" + "version": "3.13.13" } }, "nbformat": 4, diff --git a/guide/06-imagery-and-raster-analysis/create-trueortho-dsm-from-satellite-imagery.ipynb b/guide/06-imagery-and-raster-analysis/create-trueortho-dsm-from-satellite-imagery.ipynb index e4104578c4..d06bb035c4 100644 --- a/guide/06-imagery-and-raster-analysis/create-trueortho-dsm-from-satellite-imagery.ipynb +++ b/guide/06-imagery-and-raster-analysis/create-trueortho-dsm-from-satellite-imagery.ipynb @@ -36,11 +36,11 @@ "\n", "Reality mapping capability through ArcGIS API for Python requires ArcGIS Enterprise federated with a Reality Server license. See the [configuration instruction](https://doctopia.esri.com/builds/reality-server/main/en/deploy/configure-arcgis-reality.html) for setup details.\n", "\n", - "Once your environment is configured, import the required modules:\n", + "Once your environment is configured, import the required class and module:\n", "\n", - "- `GIS`module: Manages GIS content, users, and groups\n", + "- [GIS](/python/latest/api-reference/arcgis.gis.toc.html#gis) class: Represents the organizational deployment and accesses classes to manage content, users, and groups\n", "\n", - "- [`Realitymapping` module](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.realitymapping.html) : Automates reality mapping tasks in the server environment." + "- [arcgis.raster.realitymapping](/python/latest/api-reference/arcgis.raster.realitymapping.html) submodule provides the functionality to automate reality mapping tasks in the server environment. The reality mapping module is available with ArcGIS API for Python (version >= 2.4.2)" ] }, { @@ -50,7 +50,6 @@ "metadata": {}, "outputs": [], "source": [ - "import arcgis\n", "from arcgis.gis import GIS\n", "from arcgis.raster import realitymapping" ] @@ -60,7 +59,9 @@ "id": "9816b14e", "metadata": {}, "source": [ - "Establish a connection to your ArcGIS Enterprise portal and verify that reality mapping is supported in your environment." + "Establish a connection to your ArcGIS Enterprise portal and verify that reality mapping is supported in your environment.\n", + "\n", + "> *note:* Change credentials to match your organization credentials." ] }, { @@ -78,7 +79,7 @@ ")\n", "\n", "# confirm that reality mapping is supported\n", - "realitymapping.is_supported(gis)\n" + "realitymapping.is_supported(gis)" ] }, { @@ -88,7 +89,7 @@ "source": [ "## Step 1: Create a Project\n", "\n", - "The first step is to create a reality mapping project using the [Project](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster.realitymapping.Project) class of the reality mapping module." + "The first step is to create a reality mapping project using the [Project](/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster.realitymapping.Project) class of the reality mapping module." ] }, { @@ -107,7 +108,7 @@ "id": "6983b290-e84b-480d-98ca-05fecee381ad", "metadata": {}, "source": [ - "A project is a top-level workspace for managing reality mapping activities. Project creation involves creating a new portal folder and a reality mapping project item inside that folder. The project item contains the basic information (e.g. project name, group name, workspace name, etc.) that defines a reality mapping project. All related image services and products generated in subsequent steps will be stored in the project folder." + "A project is a top-level workspace for managing reality mapping activities. When you create a *project*, the operation also creates a new portal folder and a reality mapping project [item](/python/latest/api-reference/arcgis.gis.toc.html#item) inside that folder. The project item contains the basic information (e.g. project name, group name, workspace name, etc.) that defines a reality mapping project. All related image services and products generated in subsequent steps will be stored in the project folder." ] }, { @@ -139,7 +140,7 @@ "source": [ "## Step 2: Create a Mission\n", "\n", - "The next step is to create a mission which is a container for managing all related imagery and the resulting processed data products of a single data capture session. Mission creation involves creating an image collection for the source rasters. So we need to first define the type, properties and path of the source rasters using the [ImageSource](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.toc.html#imagesource) class. \n", + "The next step is to create a [mission](/python/latest/api-reference/arcgis.raster.realitymapping.html#mission). It contains all related imagery and the resulting processed data products for managing a single data capture session. A *mission* needs an image collection for the source rasters. So we need to first define the type, properties and path of the source rasters using the [ImageSource](/python/latest/api-reference/arcgis.raster.toc.html#imagesource) class. \n", "\n", "Satellite processing is controlled by the raster type and processing template. For this example, we are processing GeoEye-1 and we want to generate Pansharpen product so we define the ImageSource object accordingly. [Check this page for supported satellite sensor raster types](https://pro.arcgis.com/en/pro-app/latest/help/data/imagery/satellite-sensor-raster-types.htm)." ] @@ -165,7 +166,7 @@ "id": "6d5f3219-e276-4837-8d9d-fc217f2c4ea8", "metadata": {}, "source": [ - "Other parameters specific to the GeoEye-1 raster type we just created can be defined, similar to the processing_template and dem. To see the possible attributes, use the attributes property of the [raster_type](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.toc.html#rastertype) instance." + "Other parameters specific to the GeoEye-1 raster type we just created can be defined similarly to the *processing_template* and *dem* parameters in the above cell. To see the possible attributes, use the [attributes](/python/latest/api-reference/arcgis.raster.toc.html#arcgis.raster.RasterType.attributes) property of the [raster_type](/python/latest/api-reference/arcgis.raster.toc.html#rastertype) instance." ] }, { @@ -221,8 +222,10 @@ "metadata": {}, "outputs": [], "source": [ - "mission = project.create_mission(image_sources = sat_src, \n", - " out_sr={\"wkid\": 32610, \"vcsWkid\": 115700})\n", + "mission = project.create_mission(\n", + " image_sources = sat_src, \n", + " out_sr={\"wkid\": 32610, \"vcsWkid\": 115700}\n", + " )\n", "mission" ] }, @@ -265,11 +268,11 @@ "source": [ "You have just created a image collection of panchromatic template using rasters on local folder. Missions can also be created for rasters stored in registered datastores (fileshare, rasterstore or cloudstore). \n", "\n", - "The [`list_datastore_content()`](https://developers.arcgis.com/python/latest/api-reference/arcgis.raster.analytics.html#list-datastore-content) function becomes very handy for listing the contents of registered datastores. The parameter argument can be a string of the datastore path or the datastore object. If using a string, the format is `/datastore_type/datastore_name/...` \n", - "\n", - "To list contents on a cloudstore registered as Azure1: `arcgis.raster.analytics.list_datastore_content(f\"/cloudStores/Azure1\")`\n", + "The [list_datastore_content()](/python/latest/api-reference/arcgis.raster.analytics.html#list-datastore-content) function becomes very handy for listing the contents of registered datastores. The *datastore* parameter argument can be a string of the datastore path or the datastore object. If using a string, the format is `/datastore_type/datastore_name/...`. For example, \n", "\n", - "To list contents on a fileshare registered as fS1: `arcgis.raster.analytics.list_datastore_content(f\"/fileShares/fS1\")`" + "To list contents on a \n", + "* cloudstore registered as Azure1: `arcgis.raster.analytics.list_datastore_content(f\"/cloudStores/Azure1\")`\n", + "* fileshare registered as fS1: `arcgis.raster.analytics.list_datastore_content(f\"/fileShares/fS1\")`" ] }, { @@ -288,7 +291,7 @@ "id": "cbfb4383", "metadata": {}, "source": [ - "Let's create a second mission using multispectral imagery from a FileShate. Since the datastore is registered with the server, we'll set `byref=True` to reference the source rasters directly without copying them to the raster store." + "Let's create a second mission using multispectral imagery from a FileShare. Since the datastore is registered with the server, we'll set `byref=True` to reference the source rasters directly without copying them to the raster store." ] }, { @@ -307,8 +310,10 @@ "sat_src2.raster_type.dem = f\"/fileShares/FS_Desk/RM_Satellite_Tutorial/DEM.tif\"\n", "\n", "# Create mission\n", - "mission2 = project.create_mission(image_sources = sat_src2, \n", - " out_sr={\"wkid\": 32610, \"vcsWkid\": 115700})\n", + "mission2 = project.create_mission(\n", + " image_sources = sat_src2, \n", + " out_sr={\"wkid\": 32610, \"vcsWkid\": 115700}\n", + " )\n", "mission2" ] }, @@ -336,7 +341,9 @@ "\n", "`Block adjustment` involves using tie points to calculate the exterior orientation for each each image such that they are consistent with neighboring images (Relative orientation). A more refined adjustment can then be performed using Ground Control Points (GCP). [Read more about adjustment here](https://www.esri.com/arcgis-blog/products/arcgis-pro/imagery/ortho-mapping-arcgis-block-adjustment/)\n", "\n", - "For this tutorial, you will perform adjustment for the first mission (panchromatic) created using `compute_sensor_model()` method. The `compute_sensor_model()` method computes block adjustment for the image collection and applies the frame transform to the images, which is based on the raster type information used when creating the image collection. It also generates the control points feature class, solution table, solution points feature class, and flight path feature class. (These feature classes and tables will be saved in raster store and will not be created in the ArcGIS Enterprise as separated items.)" + "For this tutorial, you will perform adjustment for the first mission (panchromatic) created using [compute_sensor_model()](/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster._realitymapping_mission.Mission.compute_sensor_model) method. The *compute_sensor_model()* method computes block adjustment for the image collection and applies the frame transform to the images based on the raster type information used when creating the image collection. It also generates the control points feature class, solution table, solution points feature class, and flight path feature class. \n", + "\n", + "> *note:* These feature classes and tables will be saved in raster store and will not be created in the ArcGIS Enterprise as separated items." ] }, { @@ -375,7 +382,7 @@ "source": [ "## Step 4: Generate Products\n", "\n", - "The final step is to generate reality mapping products from your adjusted imagery. The `reconstruct_surface()` method can generate one or multiple reality mapping products- DSM, DTM, true ortho, DSM Mesh, 3D meshes, and point clouds from adjusted imagery." + "The final step is to generate reality mapping products from your adjusted imagery. The [reconstruct_surface()](/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster._realitymapping_mission.Mission.reconstruct_surface) method can generate one or multiple reality mapping products- DSM, DTM, true ortho, DSM Mesh, 3D meshes, and point clouds from adjusted imagery." ] }, { @@ -385,12 +392,12 @@ "metadata": {}, "outputs": [], "source": [ - "%%time\n", - "product_2D = mission.reconstruct_surface(quality=\"HIGH\",\n", - " scenario=\"SATELLITE\",\n", - " output_true_ortho_name= \"PS_Ortho\",\n", - " output_dsm_name= \"PS_DSM\",\n", - " )" + "product_2D = mission.reconstruct_surface(\n", + " quality=\"HIGH\",\n", + " scenario=\"SATELLITE\",\n", + " output_true_ortho_name= \"PS_Ortho\",\n", + " output_dsm_name= \"PS_DSM\"\n", + " )" ] }, { @@ -412,7 +419,10 @@ "- Creating additional products like DTM, point clouds, or 3D meshes\n", "- Processing imagery from multiple missions within the same project\n", "\n", - "The same concept and workflow demonstrated here can be adapted for UAV, nadir, and oblique digital aerial imagery processing." + "See the following guides to see how the same principles and methods demonstrated here can be adapted for other raster types:\n", + "* [UAV](../guide/create-trueortho-dsm-from-drone-imagery)\n", + "* [nadir](../guide/create-2D-digital-aerial-products)\n", + "* [oblique digital aerial imagery processing](../guide/create-3D-digital-aerial-products)" ] } ], @@ -432,7 +442,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.10" + "version": "3.13.13" } }, "nbformat": 4, diff --git a/guide/06-imagery-and-raster-analysis/Introduction-to-reality-mapping.ipynb b/guide/06-imagery-and-raster-analysis/introduction-to-reality-mapping.ipynb similarity index 98% rename from guide/06-imagery-and-raster-analysis/Introduction-to-reality-mapping.ipynb rename to guide/06-imagery-and-raster-analysis/introduction-to-reality-mapping.ipynb index b6cf5a5e04..d3be369e9d 100644 --- a/guide/06-imagery-and-raster-analysis/Introduction-to-reality-mapping.ipynb +++ b/guide/06-imagery-and-raster-analysis/introduction-to-reality-mapping.ipynb @@ -60,7 +60,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Establish a connection to your ArcGIS Enterprise portal" + "Establish a connection to your ArcGIS Enterprise portal. \n", + "\n", + "> *note:* Change credentials below to match your organization credentials." ] }, { @@ -134,7 +136,7 @@ "source": [ "### Step 1: Create a Project\n", "\n", - "The first step is to initialize a reality mapping project using the [Project](python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster.realitymapping.Project) class of the reality mapping module." + "The first step is to initialize a reality mapping project using the [Project](/python/latest/api-reference/arcgis.raster.realitymapping.html#arcgis.raster.realitymapping.Project) class of the reality mapping module." ] }, { @@ -188,12 +190,78 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n", - "The raster type can be any of supported aerial types such as `UAV/UAS` for drones, `Frame Table` for digital aerial, `Scanned Aerial Imagery` for scanned aerial photos or any of the supported satellite sensors such as `WorldView-1`, `GeoEye-1` etc. The current supported raster types is listed below:\n", - "\n", - "['ASTER', 'Aerial', 'DMCII', 'DubaiSat-2', 'Frame Camera', 'GF-1 PMS', 'GF-1 WFV', 'GF-2 PMS', 'GRIB', 'GeoEye-1', 'HDF', 'IKONOS', 'Jilin-1', 'KOMPSAT-2', 'KOMPSAT-3', 'Landsat 1-5 MSS', 'Landsat 4-5 TM', 'Landsat 7 ETM+', 'Landsat 8', 'Landsat 9', 'PlanetScope', 'Pleiades NEO', 'Pleiades-1', 'QuickBird', 'RapidEye', 'SPOT 5', 'SPOT 6', 'SPOT 7', 'Sentinel-2', 'SkySat', 'Superview-1', 'UAV/UAS', 'WorldView-1', 'WorldView-2', 'WorldView-3', 'WorldView-4', 'ZY3-CRESDA', 'ZY3-SASMAC']\n", - "\n", - "The properties of the rasters to be added can be defined using `raster_type` attribute of an _ImageSource_ instance. Some properties are specific to a particular raster type, while some are common to all raster types. To see the possible properties for a raster type, use the [attributes](python/latest/api-reference/arcgis.raster.toc.html#arcgis.raster.RasterType.attributes) property of the [raster_type](/python/latest/api-reference/arcgis.raster.toc.html#rastertype) instance.\n", + "The raster type can be any of supported aerial types such as `UAV/UAS` for drones, `Frame Table` for digital aerial, `Scanned Aerial Imagery` for scanned aerial photos or any of the supported satellite sensors such as `WorldView-1`, `GeoEye-1` etc. The current supported raster types is listed below:" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "
\n", + "
\n", + "
Raster Type
\n", + " \n", + "
\n", + "
\n", + "
Raster Type
\n", + " \n", + "
\n", + "
\n", + "
Raster Type
\n", + " \n", + "
\n", + "
\n", + "
Raster Type
\n", + " \n", + "
\n", + "
" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The properties of the rasters to be added can be defined using `raster_type` attribute of an _ImageSource_ instance. Some properties are specific to a particular raster type, while some are common to all raster types. To see the possible properties for a raster type, use the [attributes](/python/latest/api-reference/arcgis.raster.toc.html#arcgis.raster.RasterType.attributes) property of the [raster_type](/python/latest/api-reference/arcgis.raster.toc.html#rastertype) instance.\n", "\n", "`uav_src.raster_type.attributes`\n", "\n", @@ -292,7 +360,7 @@ ], "metadata": { "kernelspec": { - "display_name": "pro-dl-py3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -306,7 +374,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.13.10" + "version": "3.13.13" } }, "nbformat": 4,