{"id":2981217,"date":"2026-08-28T10:34:35","date_gmt":"2026-08-28T17:34:35","guid":{"rendered":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2981217"},"modified":"2026-09-11T12:11:53","modified_gmt":"2026-09-11T19:11:53","slug":"from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro","title":{"rendered":"From documents to a living map: Transform boring logs with AI in ArcGIS Pro"},"author":386702,"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,770712,615021],"tags":[758311,310982,781226,781227],"industry":[],"product":[36561],"class_list":["post-2981217","blog","type-blog","status-publish","format-standard","hentry","category-3d-gis","category-geoai","category-aec","tag-ai","tag-construction","tag-geotechnical","tag-soil-borings","product-arcgis-pro"],"acf":{"authors":[{"ID":386702,"user_firstname":"Brett","user_lastname":"Heist","nickname":"Brett Heist","user_nicename":"bre13078esri-com_arcaec","display_name":"Brett Heist","user_email":"bheist@esri.com","user_url":"","user_registered":"2025-06-27 16:19:25","user_description":"Brett Heist is a Senior Solution Engineer at Esri specializing in the Architecture, Engineering, and Construction industry. With over a decade of AEC experience and a foundation in Environmental Geography and spatial data science, Brett brings a rare combination of domain depth and technical fluency to his work. \r\n\r\nAt Esri, Brett helps AEC organizations unlock the strategic value of location intelligence, from translating complex GIS capabilities into clear business outcomes to developing technical solutions that fit real-world workflows. He's a regular presence at industry conferences, an active creator of AEC-focused content, and someone who gravitates toward the intersection of spatial data, automation, and practical problem-solving.\r\n\r\nWhether he's writing Arcade expressions, building out Python workflows, or piloting a drone to capture aerial data, Brett's approach is consistent: find the most effective way to make spatial technology work harder for the people using it.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/04\/ChatGPT-Image-Apr-30-2026-06_29_26-PM-465x465.png' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"},{"ID":335622,"user_firstname":"Michael","user_lastname":"Davidson","nickname":"Michael Davidson","user_nicename":"mdavidson","display_name":"Michael Davidson","user_email":"mdavidson@esri.com","user_url":"","user_registered":"2023-03-20 21:32:25","user_description":"As a Product Manager, Michael pushes the boundaries of interoperability across GIS, CAD, and BIM as well as ArcGIS for AutoCAD. Michael possesses more than 10 years of experience in civil engineering software development, including past focuses on BIM for bridges and geostatistics. He has a PhD in Civil Engineering from the University of Florida and is a licensed PE in Florida.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2023\/04\/Capture-213x200.png' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"}],"short_description":"Read soil boring log PDFs with an AI model in ArcGIS Pro\u2014no manual entry. A custom .dlpk you can retarget to your own reports, any provider.","flexible_content":[{"acf_fc_layout":"content","content":"<p><strong>See it first before diving in:<\/strong><\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2981221,"id":2981221,"title":"Soil borings mapped with AI-extracted profiles","filename":"Image-1.png","filesize":1255269,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-1.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro\/image-1-39","alt":"Map of soil boring points along a corridor with a popup showing one borehole's layer-by-layer soil profile.","author":"386702","description":"An ArcGIS Pro map of soil boring locations across a project corridor. An open popup displays a single borehole's complete vertical profile: soil classification codes, depth intervals, field notes, and depth to refusal\u2014all extracted automatically from a PDF boring log by an AI model.","caption":"Each point is a borehole sample; the popup carries the full layer-by-layer profile\u2014classification codes, depths, and refusal\u2014none of it typed by hand.","name":"image-1-39","status":"inherit","uploaded_to":2981217,"date":"2026-08-28 13:28:03","modified":"2026-08-28 13:29:46","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":1913,"height":841,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-1-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-1.png","medium-width":464,"medium-height":204,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-1.png","medium_large-width":768,"medium_large-height":338,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-1.png","large-width":1913,"large-height":841,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-1-1536x675.png","1536x1536-width":1536,"1536x1536-height":675,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-1.png","2048x2048-width":1913,"2048x2048-height":841,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-1-826x363.png","card_image-width":826,"card_image-height":363,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-1.png","wide_image-width":1913,"wide_image-height":841}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/mediaspace.esri.com\/playlist\/dedicated\/392351693\/1_xmpnpmy7\/1_xyum1x78"},{"acf_fc_layout":"content","content":"<p>The image above shows a map of soil borings. Each point is a borehole log record, and each pop-up carries the full layer-by-layer profile of the core sample captured underground, classification codes, depths, field notes about cobbles and gravel, and where refusal occurred. None of them were typed in by hand. Every point was built by using a PDF boring log as input for an AI model running in ArcGIS Pro.<\/p>\n<p>In this article, you will learn how to use a custom deep learning package (.dlpk) to build and modify a custom AI model. First, you\u2019ll learn what this deep learning package contains and how it works.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>A problem worth digging into<\/strong><\/h2>\n<p>In geotechnical work, the boring log is one of the most information-dense documents in AEC, with a tight grid of depths, blow counts, recovery percentages, standard classifications, and terse field descriptions that were written next to a drill rig. A project might have dozens. A program might have thousands in a folder, scanned years ago and never looked at again.<\/p>\n<p>The information in those logs is exactly what engineers need to understand ground conditions, but you cannot ask a folder of PDFs where the clay layers thin out or which borings hit refusal early. Someone has to open each file, read the column, and transcribe it by hand.<\/p>\n<p>Every boring has a location and a vertical profile\u2014a pure spatial signal\u2014but a useful connection between that signal and a map requires manual data entry, time, and energy before it can inform a decision. Now you can use an AI model to read and process that data without leaving the geoprocessing environment, and you can build and modify that model to meet your needs.<\/p>\n<p>&nbsp;<\/p>\n<h2><strong>The tool and the extensibility hook<\/strong><\/h2>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2981225,"id":2981225,"title":"Process Text Using AI Model tool pane","filename":"Image-2-1.png","filesize":56148,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-2-1.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro\/image-2-29","alt":"ArcGIS Pro geoprocessing pane for the Process Text Using AI Model tool showing its Model Arguments.","author":"386702","description":"The Process Text Using AI Model geoprocessing tool open in the ArcGIS Pro pane. The Model Arguments section lists the run-time parameters defined by the custom deep learning package, including the provider, API key, model and fallback, and optional prompt and page-chunk settings.","caption":"The Model Arguments exposed by the custom package\u2014provider, API key, model, and more\u2014let users configure the run without opening the .dlpk.","name":"image-2-29","status":"inherit","uploaded_to":2981217,"date":"2026-08-28 13:33:53","modified":"2026-08-28 13:34:20","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":620,"height":840,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-2-1-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-2-1.png","medium-width":193,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-2-1.png","medium_large-width":620,"medium_large-height":840,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-2-1.png","large-width":620,"large-height":840,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-2-1.png","1536x1536-width":620,"1536x1536-height":840,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-2-1.png","2048x2048-width":620,"2048x2048-height":840,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-2-1-343x465.png","card_image-width":343,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-2-1.png","wide_image-width":620,"wide_image-height":840}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>The ArcGIS Pro tool at the center of this workflow is the <a href=\"https:\/\/doc.esri.com\/en\/arcgis-pro\/latest\/tool-reference\/geoai\/an-overview-of-the-geoai-toolbox.html\">GeoAI toolbox<\/a> and the <a href=\"https:\/\/doc.esri.com\/en\/arcgis-pro\/latest\/tool-reference\/geoai\/an-overview-of-the-text-analysis-toolset.html\">Text Analysis<\/a> framework for third-party language models. Rather than being limited to models trained directly in ArcGIS Pro, the framework allows Python developers to create a custom Natural Language Processing (NLP) function. This connects ArcGIS to an external language model, whether that is an open-source model or a commercial LLM exposed through a web API, and package that logic as an Esri deep learning package (.dlpk). That package then runs through the standard ArcGIS text analysis tools. In this case, that extensibility is what makes it possible to read geotechnical boring logs with a model that was not originally built inside ArcGIS.<\/p>\n<p>Because the model uses a web API, the package is not tied to any one provider. It is compatible with Anthropic, OpenAI, Google Gemini, or Azure OpenAI, and the user running the tool chooses which one and supplies a key for it. Changing providers does not affect the extraction logic; it only changes which service the request is addressed to.<\/p>\n<p>&nbsp;<\/p>\n<p><em>License: Using this capability requires the Advanced license level.<\/em><\/p>\n<p><em>Caution: Only run Python and .dlpk files from a source you trust.<\/em><\/p>\n<p><em>When you wrap a web-hosted LLM, the text you process is sent to that provider. Verify your data policy and your provider\u2019s terms before using an LLM or AI tool.<\/em><\/p>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"sidebar","content":"<p>Learn more:<\/p>\n<p><a href=\"https:\/\/doc.esri.com\/en\/arcgis-pro\/latest\/tool-reference\/geoai\/process-text-using-ai-model.html\">Process Text Using AI Model<\/a> and <a href=\"https:\/\/doc.esri.com\/en\/arcgis-pro\/latest\/tool-reference\/geoai\/using-third-party-language-models-with-arcgis.html\">Use third-party language models with ArcGIS<\/a>.<\/p>\n","image_reference":false,"layout":"standard","image_reference_figure":"","snippet":"","spotlight_name":"","section_title":"","position":"Center","spotlight_image":false},{"acf_fc_layout":"content","content":"<h2><\/h2>\n<h2><strong>Anatomy of a .dlpk file<\/strong><\/h2>\n<p>A custom .dlpk file is a zipped folder containing an Esri model definition (.emd) file and the Python file that holds your inference logic. To create this .dlpk file, store the .emd and Python files in a folder with the same name as the .emd file name. Then compress it, and rename the zipped file to use the .dlpk extension.<\/p>\n<p>In the .emd file, InferenceFunction names the Python file containing the logic, and ModelType communicates the type of task the model is designed to do. See the following example:<\/p>\n"},{"acf_fc_layout":"sidebar","content":"","image_reference":false,"layout":"code_snippet","image_reference_figure":"","snippet":"{\r\n    \"InferenceFunction\": \"SoilBoringExtractor.py\",\r\n    \"ModelType\": \"ProcessText\"\r\n}","spotlight_name":"","section_title":"","position":"Center","spotlight_image":false},{"acf_fc_layout":"content","content":"<p>You can also run the package from an ArcGIS Pro notebook, which does not use the tool dialog box. Test on the version you intend to support.<\/p>\n<p>In summary, the tool uses the information in the .emd file to access and process the code in the Python file.<\/p>\n"},{"acf_fc_layout":"content","content":"<h2><\/h2>\n<h2><strong>Five methods that do the work<\/strong><\/h2>\n"},{"acf_fc_layout":"image","image":{"ID":2981235,"id":2981235,"title":"The five methods of the inference function","filename":"Image-3.png","filesize":31471,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-3.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro\/image-3-37","alt":"Python inference class showing its five methods: __init__, initialize, getParameterInfo, getConfiguration, and predict.","author":"386702","description":"A view of the custom NLP inference function\u2014a Python class implementing the five methods the framework expects: __init__ (identity), initialize (model load), getParameterInfo (tool arguments), getConfiguration (provider and request setup), and predict (encode the PDF, call the model, return a FeatureSet of soil layers).","caption":"The inference class implements five methods that map onto the lifecycle of a single tool run, from identity to returning the results FeatureSet.","name":"image-3-37","status":"inherit","uploaded_to":2981217,"date":"2026-08-28 14:12:28","modified":"2026-08-28 14:12:59","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":813,"height":411,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-3-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-3.png","medium-width":464,"medium-height":235,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-3.png","medium_large-width":768,"medium_large-height":388,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-3.png","large-width":813,"large-height":411,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-3.png","1536x1536-width":813,"1536x1536-height":411,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-3.png","2048x2048-width":813,"2048x2048-height":411,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-3.png","card_image-width":813,"card_image-height":411,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-3.png","wide_image-width":813,"wide_image-height":411}},"image_position":"center","orientation":"horizontal","hyperlink":"https:\/\/doc.esri.com\/en\/arcgis-pro\/latest\/tool-reference\/geoai\/using-third-party-language-models-with-arcgis.html"},{"acf_fc_layout":"content","content":"<p>The inference function is a Python class, and the framework uses it to implement a small, predictable set of methods. Understanding these five methods is most of what you need to build or modify this AI model because they correlate to steps of a single tool run.<\/p>\n<p>The constructor, <strong>__init__<\/strong>, sets identity. It names the class and provides a one-line description of what it does, which is extracting structured data from PDFs linked in a feature class.<\/p>\n<p><strong>initialize<\/strong> is where the model is loaded. It receives the path to the .emd file so it can read the configuration you stored there. For a locally loaded model, this is where the model\u2019s trained weights (its numeric parameters) would be loaded. For this web-hosted model, there is little to load since it uses an API.<\/p>\n<p><strong>getParameterInfo<\/strong> is the method you will modify first when adapting this to your workflow. It defines the arguments the tool shows the user. Each parameter is a dictionary with a name, a data type, a default value, and whether it is required, and the tool turns that list into the model-arguments interface in the geoprocessing pane. The arguments a user sets at run time include the provider and a matching API key, which is supplied per run and never stored in the package. The arguments also include the model and its fallback, an endpoint for Azure, an optional page-chunk size for oversized PDFs, and optional overrides that use a different prompt or output schema on disk. The tool still uses the same patterns to build its model-arguments interface, but now it has more customization that does not require opening the .dlpk file.<\/p>\n<p><strong>getConfiguration<\/strong> runs after the parameters are known and sets up how the run will behave. This method reads which provider and model to call and its fallback, resolves the API key, and provides the right endpoint. You can choose Anthropic, OpenAI, Gemini, or Azure, and it supplies that provider\u2019s endpoint, its authentication header, and the exact request and response shape that provider expects. The prompt, parsing, and output stay the same. getConfiguration also returns the batch size, which is the number of records the tool sends to the model at a time. You can modify this for your reports and rate limits.<\/p>\n<p><strong>predict<\/strong> is the engine. The tool sends it a FeatureSet of input rows and the name of the field holding the input, and it returns a FeatureSet of results. In this model, each input row points to a PDF, so predict encodes each PDF, sends it to the model with the extraction instructions, parses the structured response, and assembles the output, one row per soil layer. The shape you return here\u2014the fields and their types\u2014is exactly what appears in your output feature class.<\/p>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"content","content":"<h2><strong>Modify the package for your reports<\/strong><\/h2>\n<p>What makes this package specific to boring logs is the extraction prompt and the output schema.<\/p>\n<p>The extraction prompt communicates to the model the name of the input document and which data is requested. This is where geotechnical knowledge is stored, including the header fields, the per-layer classification codes, the depth intervals, and the descriptions. If you were using a different report type, such as environmental phase reports (for example, utility as-builts or inspection forms), you would rewrite this prompt to describe that document and its fields, and much of the rest of the script would carry over unchanged. The prompt is the domain expertise, written in plain language.<\/p>\n<p>The output schema lists the fields the predict method builds into its returned FeatureSet. This determines what shows in your attribute table. When you add a field here and define how the parsed response fills it, it appears in the feature class. This also allows you to review your data for consistency and organization. For example, if a few depth fields carry meter labels in their aliases while the underlying values are in feet, that is the kind of unit-label mismatch a sharp geotechnical reviewer will catch. Aligning those is a quick and worthwhile task.<\/p>\n<p>To further customize the package, you can also set the parameter list and configuration, the model you call, the fallback, and the batch size. However, these are optional because modifying the prompt and the schema allows you to retarget this package for a different set of documents without rebuilding the integration, which is the advantage of using a custom .dlpk file rather than a one-off script.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"sidebar","content":"<p dir=\"ltr\">PROMPT EXAMPLE:<\/p>\n<p>You are an expert data extraction AI specializing in engineering design documents. Your task is to read the provided PDF document, which contains soil boring information, and extract specific pieces of information. Analyze the entire document carefully to find the best and most accurate information for each field. Return your findings as a SINGLE JSON object with a root key &#8220;data&#8221;.<\/p>\n<p dir=\"ltr\"><strong>Additional Instructions:<\/strong><\/p>\n<ul dir=\"ltr\">\n<li>Dates must be in YYYY-MM-DD format.<\/li>\n<li>Times must be in HH:MM:SS format.<\/li>\n<li>If information is not found, use an empty string &#8220;&#8221;.<\/li>\n<li>Extract coordinates if available in the document (may be in various formats like decimal degrees, DMS, UTM, State Plane, etc.). Convert them to decimal degrees format as floating-point numbers.<\/li>\n<li>Extract all relevant drilling parameters and conditions including rig type, drilling method, driller name, water depth, and hole depth.<\/li>\n<li>For numeric fields (Water Depth, Hole Depth), extract actual numbers. If the value cannot be determined, use 0.<\/li>\n<li>For coordinate fields (LATITUDE, LONGITUDE), use floating-point numbers with proper precision. If coordinates cannot be determined, use 0.0.<\/li>\n<li>Look for boring log numbers in headers, titles, or identifying sections (e.g., &#8220;BORING NO.&#8221;, &#8220;BORING LOG NO.&#8221;, &#8220;B-1&#8221;, etc.).<\/li>\n<li>Extract project names, contractor information, and location details from headers, titles, footers, or metadata sections.<\/li>\n<\/ul>\n<p dir=\"ltr\"><strong>Lithology Parsing Rules:<\/strong><\/p>\n<ul dir=\"ltr\">\n<li>You must identify soil layers based on depth intervals (from_depth_ft to to_depth_ft).<\/li>\n<li>Analyze the &#8216;Visual Material Classification&#8217; or description block for each layer.<\/li>\n<li>Layer Type Extraction: If the description starts with a code followed by a colon or space (e.g., &#8220;SL:&#8221;, &#8220;CP:&#8221;, &#8220;CL:&#8221;, &#8220;SC:&#8221;, etc.), extract this code into the &#8216;layer_code&#8217; field.<\/li>\n<li>Description Extraction: All text following the code (including remarks, color, moisture, density, etc.) must be appended together and placed in the &#8216;description&#8217; field.<\/li>\n<li>If no code is present at the start, leave &#8216;layer_code&#8217; empty and place the entire text in &#8216;description&#8217;.<\/li>\n<li>Ensure every layer found in the log is added to the &#8216;lithology_layers&#8217; array.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Here is the required JSON structure:<\/p>\n","image_reference":false,"layout":"code_snippet","image_reference_figure":"","snippet":"{\r\n  \"data\": {\r\n    \"Boring Log #\": \"string\",\r\n    \"Project\": \"string\",\r\n    \"Contractor\": \"string\",\r\n    \"Location\": \"string\",\r\n    \"Start Date\": \"YYYY-MM-DD\",\r\n    \"Finish Date\": \"YYYY-MM-DD\",\r\n    \"Rig Type\": \"string\",\r\n    \"Drilling Method\": \"string\",\r\n    \"Driller\": \"string\",\r\n    \"Water Depth\": 0,\r\n    \"Hole Depth\": 0,\r\n    \"LATITUDE\": 0.0,\r\n    \"LONGITUDE\": 0.0,\r\n    \"lithology_layers\": [\r\n      {\r\n        \"from_depth_ft\": 0.0,\r\n        \"to_depth_ft\": 0.0,\r\n        \"layer_code\": \"string\",\r\n        \"description\": \"string\"\r\n      }\r\n    ]\r\n  }\r\n}","spotlight_name":"","section_title":"","position":"Center","spotlight_image":false},{"acf_fc_layout":"content","content":"<h2><strong>Putting it into production<\/strong><\/h2>\n<p>A package that runs on your desktop is a proof of concept. Building it as a custom .dlpk file rather than a stand-alone script allows you to use it as more than a demonstration and integrate it into the rest of the ArcGIS system and your team\u2019s workflows.<\/p>\n<p>Boring logs are not standardized\u2014a log from one firm can look nothing like another firm\u2019s logs, and permits differ by jurisdiction. In production, you will need a small library of prompts, keyed to document type, and the tool must use the right one. The integration never changes; only the instructions do.<\/p>\n<p>The next step is to increase the level of automation. Because Process Text Using AI Model is a geoprocessing tool, the workflow built around it can be published as a geoprocessing service to ArcGIS Enterprise and run on your server rather than a desktop. Once it is a service, it can be called on a schedule, triggered when new reports land in a watched location, or wired into a larger automated pipeline, so new logs added to a folder become mapped points without requiring you to open ArcGIS Pro. That is the difference between a tool a single analyst runs and a capability the whole organization relies on.<\/p>\n<p>The Python inside the .dlpk file does not have to stop at returning a table. As code running in the geoprocessing environment, it can access the full ArcGIS API. That means the same package that reads the PDF can act on the extracted data. The package can publish a hosted feature layer, flag records that need human review, or write back into an existing dataset. The extraction and the action happen in one place. Instead of handing off a spreadsheet to another team, you can use the package to create a published, usable layer.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2982071,"id":2982071,"title":"log example","filename":"log-example.png","filesize":148271,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/log-example.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro\/log-example","alt":"Example of a Soil Boring Log","author":"386702","description":"Example of a Soil Boring Log","caption":"Example of a Soil Boring Log","name":"log-example","status":"inherit","uploaded_to":2981217,"date":"2026-09-11 18:33:08","modified":"2026-09-11 18:33:24","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":1182,"height":943,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/log-example-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/log-example.png","medium-width":327,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/log-example.png","medium_large-width":768,"medium_large-height":613,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/log-example.png","large-width":1182,"large-height":943,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/log-example.png","1536x1536-width":1182,"1536x1536-height":943,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/log-example.png","2048x2048-width":1182,"2048x2048-height":943,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/log-example-583x465.png","card_image-width":583,"card_image-height":465,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/log-example.png","wide_image-width":1182,"wide_image-height":943}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"image","image":{"ID":2982072,"id":2982072,"title":"Log attribute table","filename":"Log-attribute-table.png","filesize":93152,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Log-attribute-table.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro\/log-attribute-table","alt":"Extracted text in Attribute Table in ArcGIS Pro","author":"386702","description":"Extracted text in Attribute Table in ArcGIS Pro","caption":"Extracted text in Attribute Table in ArcGIS Pro","name":"log-attribute-table","status":"inherit","uploaded_to":2981217,"date":"2026-09-11 18:33:50","modified":"2026-09-11 18:34:15","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":1474,"height":579,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Log-attribute-table-213x200.png","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Log-attribute-table.png","medium-width":464,"medium-height":182,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Log-attribute-table.png","medium_large-width":768,"medium_large-height":302,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Log-attribute-table.png","large-width":1474,"large-height":579,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Log-attribute-table.png","1536x1536-width":1474,"1536x1536-height":579,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Log-attribute-table.png","2048x2048-width":1474,"2048x2048-height":579,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Log-attribute-table-826x324.png","card_image-width":826,"card_image-height":324,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Log-attribute-table.png","wide_image-width":1474,"wide_image-height":579}},"image_position":"right-center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"blockquote","content":"<p>Tip: A single PDF of data that contains many boreholes can be more than the model can return in one answer, and the structured output comes back truncated. The page-per-chunk setting splits a large PDF into smaller page ranges, reads each on its own, and combines the records back together. Set it to about the number of pages one boring log spans, so a single hole is never cut across a boundary.<\/p>\n"},{"acf_fc_layout":"content","content":"<h2><\/h2>\n<h2><\/h2>\n<h2><strong>Accuracy<\/strong><\/h2>\n<p>A confident wrong answer about subsurface conditions is worse than no answer. In testing, ten boring logs from a Tucson corridor project were run through the workflow. The test compared every extracted layer against the original PDF, building a frozen ground-truth file so the comparison could be repeated against any future change.<\/p>\n<p>Across all ten boreholes, the soil layer sequence was correct every time, with the right classification codes in the right order, top to bottom. The layer count matched the log on all ten, including the busier profiles with six and seven distinct strata. And the total depth of each hole, where the sampler stopped or hit refusal, matched the log on all ten, down to the hundredth of a foot. Across 49 extracted layers, the stratigraphy and the codes were accurate to what the drillers recorded.<\/p>\n<p>One header field, the site location, returned inconsistent values because these logs carry two different fields labeled location, a city and a named site, and the model often grabbed the city. That is not a model failure so much as an ambiguity in the source form, and the solution is a clearer line in the extraction prompt naming which location was intended. The extraction is only as unambiguous as the instructions you provide, and you find the ambiguities by checking the output against the source.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2981237,"id":2981237,"title":"Accuracy scorecard: extracted vs. ground truth","filename":"Image-4.png","filesize":62375,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-4.png","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro\/image-4-32","alt":"Excel scorecard comparing extracted vs. ground-truth values for ten boreholes\u2014layer sequence, count, and total depth all matching.","author":"386702","description":"A spreadsheet scorecard from the accuracy test of ten boring logs from a Tucson corridor project. Each borehole's AI-extracted values are compared against a frozen ground-truth file: soil-layer sequence, layer count, and total depth to refusal. All ten boreholes match the original logs across 49 extracted layers.","caption":"Every extracted layer checked against the original PDF for all ten boreholes\u2014sequence, layer count, and total depth match down to the hundredth of a foot.","name":"image-4-32","status":"inherit","uploaded_to":2981217,"date":"2026-08-28 14:34:30","modified":"2026-08-28 14:35:50","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":624,"height":123,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-4-213x123.png","thumbnail-width":213,"thumbnail-height":123,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-4.png","medium-width":464,"medium-height":91,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-4.png","medium_large-width":624,"medium_large-height":123,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-4.png","large-width":624,"large-height":123,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-4.png","1536x1536-width":624,"1536x1536-height":123,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-4.png","2048x2048-width":624,"2048x2048-height":123,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-4.png","card_image-width":624,"card_image-height":123,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-4.png","wide_image-width":624,"wide_image-height":123}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<table style=\"height: 495px\" width=\"1015\">\n<tbody>\n<tr>\n<td width=\"312\"><strong>\u00a0Accuracy check<\/strong><\/td>\n<td width=\"312\"><strong>\u00a0Result across all ten boreholes<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"312\">\u00a0Soil-layer sequence (classification codes, top to bottom)<\/td>\n<td width=\"312\">\u00a0Correct on all ten<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">\u00a0Layer count per hole<\/td>\n<td width=\"312\">\u00a0Matched the log on all ten, including profiles with six and seven strata<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">\u00a0Total depth (sampler stop or refusal)<\/td>\n<td width=\"312\">\u00a0Matched the log on all ten, to the hundredth of a foot<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">\u00a0Total layers extracted<\/td>\n<td width=\"312\">\u00a049 layers, all faithful to what the drillers recorded<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">\u00a0Site-location header field<\/td>\n<td width=\"312\">\u00a0Inconsistent \u2014 a source-form ambiguity, corrected in the extraction\u00a0 \u00a0prompt<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n"},{"acf_fc_layout":"content","content":"<p>That discipline is also how you handle a new log style. A form from a different firm may group its rows or name its classes in ways your prompt has not seen, and the first run will show you where. The fix stays in the prompt, not the integration: revise the instructions, use the new prompt without rebuilding the package, and check against the source until it matches. When you do that once per format, you build up a small library of prompts, each tuned to the layout it reads.<\/p>\n"},{"acf_fc_layout":"sidebar","content":"<p><strong>Dive deeper: <\/strong>The project repository documents this refine-and-verify workflow, including how to swap the extraction prompt at run time through the tool\u2019s model arguments\u2014no rebuild required. See <a href=\"https:\/\/github.com\/CodeHeistPy\/soil-boring-extractor\">soil-boring-extractor<\/a> on GitHub.<\/p>\n","image_reference":false,"layout":"standard","image_reference_figure":"","snippet":"","spotlight_name":"","section_title":"","position":"Center","spotlight_image":false},{"acf_fc_layout":"content","content":"<h2>Automation supporting expertise<\/h2>\n<p>None of this replaces the geotechnical engineer or the boring log itself; the log is still the record. What the workflow adds is reach\u2014decades of dense reports turned into interactive spatial layers that your team can view. Because every boring carries a location and its ordered stack of layers, the output geolocates automatically. When you symbolize by depth to refusal, dominant soil type, or whether groundwater was encountered, a corridor of scattered PDFs becomes a readable picture of ground conditions you can use in a dashboard, a web app, or a 3D scene. The data entry is automated, while the interpretation and decisions stay with the users.<\/p>\n<p>If you have an archive of reports like this, your GIS team can transform those PDFs into actionable data visualization and map layers.\u00a0 Have questions, or want to share how you\u2019d apply this?<\/p>\n<p>Reach out to me on <a href=\"http:\/\/www.linkedin.com\/in\/brett-heist-gisp-5479794b\">LinkedIn<\/a><\/p>\n"}],"related_articles":[{"ID":2980391,"post_author":"335622","post_date":"2026-08-18 12:08:12","post_date_gmt":"2026-08-18 19:08:12","post_content":"","post_title":"Turn Subsurface Data into Shared Project Insight","post_excerpt":"","post_status":"publish","comment_status":"open","ping_status":"closed","post_password":"","post_name":"turn-subsurface-data-into-shared-project-insight","to_ping":"","pinged":"","post_modified":"2026-08-28 11:28:38","post_modified_gmt":"2026-08-28 18:28:38","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2980391","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"}],"show_article_image":false,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/826-465.png","wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/1920-1080.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>From documents to a living map: Transform boring logs with AI in ArcGIS Pro<\/title>\n<meta name=\"description\" content=\"Read boring logs with AI in ArcGIS Pro: a custom, provider-agnostic deep learning package that turns soil boring log PDFs into mapped, layer-by-layer data.\" \/>\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\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"From documents to a living map: Transform boring logs with AI in ArcGIS Pro\" \/>\n<meta property=\"og:description\" content=\"Read boring logs with AI in ArcGIS Pro: a custom, provider-agnostic deep learning package that turns soil boring log PDFs into mapped, layer-by-layer data.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro\" \/>\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=\"2026-09-11T19:11:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1913\" \/>\n\t<meta property=\"og:image:height\" content=\"841\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"14 minutes\" \/>\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\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro\"},\"author\":{\"name\":\"Brett Heist\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/22c1ccfb24ab34f369a443d6a95b6750\"},\"headline\":\"From documents to a living map: Transform boring logs with AI in ArcGIS Pro\",\"datePublished\":\"2026-08-28T17:34:35+00:00\",\"dateModified\":\"2026-09-11T19:11:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro\"},\"wordCount\":14,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"AI\",\"Construction\",\"geotechnical\",\"soil borings\"],\"articleSection\":[\"3D Visualization &amp; Analytics\",\"AI\",\"Architecture, Engineering, and Construction\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro\",\"name\":\"From documents to a living map: Transform boring logs with AI in ArcGIS Pro\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2026-08-28T17:34:35+00:00\",\"dateModified\":\"2026-09-11T19:11:53+00:00\",\"description\":\"Read boring logs with AI in ArcGIS Pro: a custom, provider-agnostic deep learning package that turns soil boring log PDFs into mapped, layer-by-layer data.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"From documents to a living map: Transform boring logs with AI in ArcGIS Pro\"}]},{\"@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\/22c1ccfb24ab34f369a443d6a95b6750\",\"name\":\"Brett Heist\",\"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\/2026\/04\/ChatGPT-Image-Apr-30-2026-06_29_26-PM-465x465.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/04\/ChatGPT-Image-Apr-30-2026-06_29_26-PM-465x465.png\",\"caption\":\"Brett Heist\"},\"description\":\"Brett Heist is a Senior Solution Engineer at Esri specializing in the Architecture, Engineering, and Construction industry. With over a decade of AEC experience and a foundation in Environmental Geography and spatial data science, Brett brings a rare combination of domain depth and technical fluency to his work. At Esri, Brett helps AEC organizations unlock the strategic value of location intelligence, from translating complex GIS capabilities into clear business outcomes to developing technical solutions that fit real-world workflows. He's a regular presence at industry conferences, an active creator of AEC-focused content, and someone who gravitates toward the intersection of spatial data, automation, and practical problem-solving. Whether he's writing Arcade expressions, building out Python workflows, or piloting a drone to capture aerial data, Brett's approach is consistent: find the most effective way to make spatial technology work harder for the people using it.\",\"sameAs\":[\"www.linkedin.com\/in\/brett-heist-gisp-5479794b\"],\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/author\/bre13078esri-com_arcaec\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"From documents to a living map: Transform boring logs with AI in ArcGIS Pro","description":"Read boring logs with AI in ArcGIS Pro: a custom, provider-agnostic deep learning package that turns soil boring log PDFs into mapped, layer-by-layer data.","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\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro","og_locale":"en_US","og_type":"article","og_title":"From documents to a living map: Transform boring logs with AI in ArcGIS Pro","og_description":"Read boring logs with AI in ArcGIS Pro: a custom, provider-agnostic deep learning package that turns soil boring log PDFs into mapped, layer-by-layer data.","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2026-09-11T19:11:53+00:00","og_image":[{"width":1913,"height":841,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/Image-1.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@ESRI","twitter_misc":{"Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro"},"author":{"name":"Brett Heist","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/22c1ccfb24ab34f369a443d6a95b6750"},"headline":"From documents to a living map: Transform boring logs with AI in ArcGIS Pro","datePublished":"2026-08-28T17:34:35+00:00","dateModified":"2026-09-11T19:11:53+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro"},"wordCount":14,"commentCount":0,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["AI","Construction","geotechnical","soil borings"],"articleSection":["3D Visualization &amp; Analytics","AI","Architecture, Engineering, and Construction"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro","name":"From documents to a living map: Transform boring logs with AI in ArcGIS Pro","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2026-08-28T17:34:35+00:00","dateModified":"2026-09-11T19:11:53+00:00","description":"Read boring logs with AI in ArcGIS Pro: a custom, provider-agnostic deep learning package that turns soil boring log PDFs into mapped, layer-by-layer data.","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"From documents to a living map: Transform boring logs with AI in ArcGIS Pro"}]},{"@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\/22c1ccfb24ab34f369a443d6a95b6750","name":"Brett Heist","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\/2026\/04\/ChatGPT-Image-Apr-30-2026-06_29_26-PM-465x465.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/04\/ChatGPT-Image-Apr-30-2026-06_29_26-PM-465x465.png","caption":"Brett Heist"},"description":"Brett Heist is a Senior Solution Engineer at Esri specializing in the Architecture, Engineering, and Construction industry. With over a decade of AEC experience and a foundation in Environmental Geography and spatial data science, Brett brings a rare combination of domain depth and technical fluency to his work. At Esri, Brett helps AEC organizations unlock the strategic value of location intelligence, from translating complex GIS capabilities into clear business outcomes to developing technical solutions that fit real-world workflows. He's a regular presence at industry conferences, an active creator of AEC-focused content, and someone who gravitates toward the intersection of spatial data, automation, and practical problem-solving. Whether he's writing Arcade expressions, building out Python workflows, or piloting a drone to capture aerial data, Brett's approach is consistent: find the most effective way to make spatial technology work harder for the people using it.","sameAs":["www.linkedin.com\/in\/brett-heist-gisp-5479794b"],"url":"https:\/\/www.esri.com\/arcgis-blog\/author\/bre13078esri-com_arcaec"}]}},"text_date":"August 28, 2026","author_name":"Multiple Authors","author_page":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-pro\/geoai\/from-documents-to-a-living-map-transform-boring-logs-with-ai-in-arcgis-pro","custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2026\/08\/1920-1080.png","primary_product":"ArcGIS Pro","tag_data":[{"term_id":758311,"name":"AI","slug":"ai","term_group":0,"term_taxonomy_id":758311,"taxonomy":"post_tag","description":"","parent":0,"count":41,"filter":"raw"},{"term_id":310982,"name":"Construction","slug":"construction","term_group":0,"term_taxonomy_id":310982,"taxonomy":"post_tag","description":"","parent":0,"count":7,"filter":"raw"},{"term_id":781226,"name":"geotechnical","slug":"geotechnical","term_group":0,"term_taxonomy_id":781226,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":781227,"name":"soil borings","slug":"soil-borings","term_group":0,"term_taxonomy_id":781227,"taxonomy":"post_tag","description":"","parent":0,"count":1,"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":725,"filter":"raw"},{"term_id":770712,"name":"AI","slug":"geoai","term_group":0,"term_taxonomy_id":770712,"taxonomy":"category","description":"","parent":0,"count":82,"filter":"raw"},{"term_id":615021,"name":"Architecture, Engineering, and Construction","slug":"aec","term_group":0,"term_taxonomy_id":615021,"taxonomy":"category","description":"","parent":0,"count":146,"filter":"raw"}],"product_data":[{"term_id":36561,"name":"ArcGIS Pro","slug":"arcgis-pro","term_group":0,"term_taxonomy_id":36561,"taxonomy":"product","description":"","parent":0,"count":2173,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=arcgis-pro","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2981217","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\/386702"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=2981217"}],"version-history":[{"count":28,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2981217\/revisions"}],"predecessor-version":[{"id":2982074,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2981217\/revisions\/2982074"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=2981217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=2981217"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=2981217"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=2981217"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=2981217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}