diff --git a/README.md b/README.md index 4056c98..80fd133 100644 --- a/README.md +++ b/README.md @@ -18,11 +18,17 @@ The following diagram shows the flow of data from the county into UTRANS. flowchart TD subgraph CLI direction TB - updateFeatureClass@{ shape: lean-r , label: "Update Feature Class (County Data)"} --> get-recent-edits - baseFeatureClass@{ shape: lean-r , label: "Base Feature Class (Previously Obtained Data)"} --> get-recent-edits - get-recent-edits --> RoadCenterline_Recents@{ shape: lean-r} - RoadCenterline_Recents --> etl - countyBoundaries@{ shape: lean-r, label: "County Boundaries" } --> etl + updateFeatureClass@{ shape: lean-r , label: "Update Feature Class (--update-features)"} --> getRecentEdits["get-recent-edits"] + countyBaseFeatureClass@{ shape: lean-r , label: "County Base Feature Class (--base-features)"} --> getRecentEdits + getRecentEdits --> RoadCenterline_Recents@{ shape: lean-r , label: "RoadCenterline_Recents (--source-features)"} + + RoadCenterline_Recents --> etl["etl"] + utransRoads@{ shape: lean-r , label: "UTRANS Roads Schema (--utrans-roads)"} --> etl + countyBoundaries@{ shape: lean-r , label: "County Boundaries (--county-boundaries)"} --> etl etl --> etlOutput@{ shape: lean-r , label: "county_etl_YYYYMMDD"} + + etlOutput --> detectChanges["detect-changes"] + utransBaseFeatureClass@{ shape: lean-r , label: "UTRANS Feature Class (--utrans-features)"} --> detectChanges + detectChanges --> productionDfc@{ shape: lean-r , label: "UTRANS/DFC_RESULT"} end ``` diff --git a/add-in/UGRC.UtransTools/Config.daml b/add-in/UGRC.UtransTools/Config.daml index 3107f22..f28cff5 100644 --- a/add-in/UGRC.UtransTools/Config.daml +++ b/add-in/UGRC.UtransTools/Config.daml @@ -5,7 +5,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.esri.com/DADF/Registry file:///C:/Program%20Files/ArcGIS/Pro/bin/ArcGIS.Desktop.Framework.xsd"> - + UGRC_UtransTools UGRC_UtransTools description Images\AddinDesktop32.png diff --git a/cli/PROFILES.md b/cli/PROFILES.md index 6d5ba81..7ccd648 100644 --- a/cli/PROFILES.md +++ b/cli/PROFILES.md @@ -1,16 +1,18 @@ # County Profiles Configuration -`profiles.json` defines flat, per-county settings shared by UTRANS commands. `get-recent-edits` uses its field-mapping settings to run ArcGIS Pro's **Detect Feature Changes** tool between two versions of a county road centerline dataset. `etl` uses the same county key and its `fips` setting to select the matching county transformation. +`profiles.json` defines flat, per-county settings shared by UTRANS commands. `etl` uses the transformation settings to convert county roads into the UTRANS schema. `get-recent-edits` uses its change-detection settings to run ArcGIS Pro's **Detect Feature Changes** tool between two versions of a county road centerline dataset. `detect-changes` uses only `fips` from the profile; its DFC match and comparison fields are fixed by the command. Each key in the JSON object is a county identifier (e.g. `"grand"`, `"davis"`). The script resolves the correct profile at runtime using the `--county` argument. `saltlake` is the Salt Lake County identifier for every command. The former `vecc` identifier is not supported. -## Shared ETL Field +## Profile Fields ### `fips` -**Type:** `string` | **Required by `etl`** +**Type:** `string` | **Required by:** `etl`, `detect-changes` + +**Used by:** `etl`, `detect-changes` The county's five-digit FIPS code plus the name written to `COUNTY_L` and `COUNTY_R` during ETL. For example, `"49035 - Salt Lake"`. @@ -18,6 +20,8 @@ The county's five-digit FIPS code plus the name written to `COUNTY_L` and `COUNT **Type:** `string` | **Required by `etl`** +**Used by:** `etl` + A semicolon-delimited list of `UTRANS_FIELD=COUNTY_FIELD` assignments. These map county source fields into the target schema after colliding source fields have been renamed with an underscore. When the UTRANS destination has a coded-value domain, @@ -33,20 +37,30 @@ are reported with the field and value. ### `value_mappings` -**Type:** `object` | **Optional** — defaults to `{}` +**Type:** `object` | **Optional** - defaults to `{}` + +**Used by:** `etl` + +Per-destination-field mappings for county source values that do not match a +UTRANS coded-value domain code or description. The outer field name is the +destination field name in the UTRANS output data. Each inner mapping uses this form: -Per-target mappings for source values that do not match a UTRANS coded-value -domain code or description. Each target field contains an object mapping the -source value to the desired target value. Field names and source values are -matched case-insensitively after surrounding whitespace is removed. The mapped -target value is then resolved against the destination coded-value domain, so it -can be either a coded value or a domain description. +```text +"county source value": "value written to the UTRANS output field" +``` + +The inner key on the left is the value read from the county source field. The +inner value on the right is the value written to the destination UTRANS field +after it is resolved against that field's coded-value domain. Field names, +source keys, and source values are matched case-insensitively after surrounding +whitespace is removed. The mapping value should be a valid destination domain +code or description, and mapping entries should represent translations rather +than identity mappings. ```json "value_mappings": { - "ONEWAY": { - "ONE DIRECTION": "Y", - "TWO WAY": "N" + "DOT_SRFTYP": { + "PAVED ASPHALT": "P-ASP" }, "DOT_CLASS": { "LOCAL ROAD": "L" @@ -54,15 +68,21 @@ can be either a coded value or a domain description. } ``` -Mappings run after `field_mappings` selects a source field and before normal -destination-domain matching. If no configured mapping or valid domain match is -found, the original source value is handled as an invalid value: it is appended -to `UTRANS_NOTES` and copied only when it fits the target field length. +In this example, `DOT_SRFTYP` and `DOT_CLASS` are UTRANS destination fields. A +county value of `PAVED ASPHALT` is written as `P-ASP` to the output +`DOT_SRFTYP` field, and a county value of `LOCAL ROAD` is written as `L` to the +output `DOT_CLASS` field. +The mapped value is resolved against the destination coded-value domain. Values +that remain invalid are recorded in `UTRANS_NOTES`. + +--- ### `rules` **Type:** `string[]` | **Optional** — defaults to `[]` +**Used by:** `etl` + An ordered list of supported post-mapping transformations. Rules run after field and full-address mappings, but before the feature is normalized and appended. Unknown or duplicate names are rejected. @@ -80,6 +100,8 @@ Supported rules: **Type:** `string` | **Optional** +**Used by:** `etl` + Selects a built-in, county-specific transformation for behavior that requires multiple fields or conditional assignments. Handler names are resolved from the CLI's fixed registry; profile files cannot name Python modules or functions. @@ -114,57 +136,32 @@ Currently supported handlers: **Type:** `string` | **Optional** +**Used by:** `etl` + A semicolon-delimited list of `COUNTY_FIELD=TARGET` values used to parse full street names. `TARGET` is `PRIMARY`, `A1`, or `A2`. -### `translate_vertical_levels` - -**Type:** `boolean` | **Optional** — defaults to `false` - -When `true`, legacy vertical values `1`, `2`, and `3` are translated to `0`, `1`, -and `2` before domain-value matching. Invalid values are still preserved when they -fit within the destination field length and are always appended to `UTRANS_NOTES`. - ### `exclude_if_any` -**Type:** `string` | **Optional** - -A semicolon-delimited list of `COUNTY_FIELD=VALUE,VALUE` exclusions. A feature is -removed when any configured field contains a listed value. +**Type:** `string` or `object` | **Optional** - defaults to no exclusions -County selection is strict: +**Used by:** `etl` -- `--county` must exactly match a top-level key in the active profiles file -- By default, the active profiles file is `cli/profiles.json` -- Use `--profiles ` to supply a custom profiles file -- Matching is case-sensitive -- Aliases and spaced variants are not supported - ---- - -## Fields Reference - -### `match_fields` - -**Type:** `string` | **Required** - -A space-separated field pair (`update_field base_field`) used to confirm that two spatially proximate road segments are the **same road** across the two datasets. This is passed directly to the `match_field` parameter of `DetectFeatureChanges`. - -The tool first finds candidate matches within `--search-distance`, then uses this field to disambiguate — e.g. confirming two nearby segments share the same street name before treating them as the same feature. +Excludes a staged feature when any configured field contains one of the listed +case-insensitive values. The string form uses semicolon-delimited `FIELD=VALUE1,VALUE2` +pairs. The object form maps field names to arrays of values. ```json -"match_fields": "STREETNAME STREETNAME" +"exclude_if_any": "S_SURF=400,410,420,430,440" ``` -When both datasets use the same schema, the field name is repeated. If the schemas differ, the two names can be different (e.g. `"S_NAME STREETNAME"`). - -> **Note:** The specific field chosen per county was determined during original script development and reflects the primary name field in that county's road schema. - --- ### `compare_fields` -**Type:** `string` | **Optional in profile** +**Type:** `string` | **Required** + +**Used by:** `get-recent-edits` A semicolon-delimited list of `update_field base_field` pairs passed to the `compare_fields` parameter of `DetectFeatureChanges`. These are the attribute fields checked for changes after two segments are matched. @@ -176,41 +173,26 @@ A segment is included in the output recents layer if any of these fields differ Fields that don't exist in one or both datasets are silently dropped before the tool runs, with a warning logged. -If omitted from the profile, it must be provided via `--compare-fields` at runtime. +Every active county profile must provide this setting. --- -### `text_fields` - -**Type:** `string[]` | **Optional** — defaults to `[]` +### `match_fields` -Fields that will be text-normalized before change detection runs. Normalization: +**Type:** `string` | **Required** -- Collapses internal whitespace to single spaces -- Trims leading/trailing whitespace -- Converts `None`, `NULL`, and blank values to empty string `""` +**Used by:** `get-recent-edits` -This prevents false positives caused by whitespace or null inconsistencies between datasets. +A space-separated `update_field base_field` pair used to confirm that two +spatially proximate road segments are the same road across the two datasets. +When both datasets use the same schema, the field name is repeated. If the +schemas differ, the two names can be different. ```json -"text_fields": ["PREDIR", "STREETNAME", "STREETTYPE", "SUFDIR"] +"match_fields": "STREETNAME STREETNAME" ``` ---- - -### `numeric_fields` - -**Type:** `string[]` | **Optional** — defaults to `[]` - -Fields that will be numeric-normalized before change detection runs. Normalization: - -- Converts `None`, `NULL`, and blank values to `0` - -This prevents false positives caused by null vs. zero inconsistencies in address range fields. - -```json -"numeric_fields": ["L_F_ADD", "L_T_ADD", "R_F_ADD", "R_T_ADD"] -``` +The specific field is selected per county because source schemas differ. --- @@ -218,69 +200,24 @@ This prevents false positives caused by null vs. zero inconsistencies in address **Type:** `string[]` | **Optional** — defaults to `[]` -A subset of `text_fields` whose values will also be uppercased during normalization. Use this when a county's data may have mixed case values that should compare as equal. +**Used by:** `get-recent-edits` -```json -"uppercase_normalize_fields": ["STREETNAME", "STREETTYPE", "ACSALIAS"] -``` - ---- - -### `required_fields` - -**Type:** `string[]` | **Optional** — defaults to `[]` - -Fields that must exist in **both** the update and base feature classes. If any are missing, the script raises an error before doing any work. Useful for counties whose schemas are known to be strict or whose pipelines depend on specific fields being present. +A list of string fields whose values will also be uppercased during normalization. +Use this when a county's data may have mixed case values that should compare as equal. ```json -"required_fields": ["RoadName", "LeftFrom", "LeftTo", "RightFrom", "RightTo"] +"uppercase_normalize_fields": ["STREETNAME", "STREETTYPE", "ACSALIAS"] ``` --- -### `dfc_output_name` - -**Type:** `string` | **Optional** — defaults to `"DFC_CountyToCounty"` - -Name of the output feature class written by `DetectFeatureChanges`. Output is placed in the same workspace as the update feature class. - ---- - -### `stats_table_name` - -**Type:** `string` | **Optional** — defaults to `"stats_county_to_county"` - -Name of the statistics table written by `DetectFeatureChanges`. - ---- - -### `recents_name` - -**Type:** `string` | **Optional** — defaults to `"RoadCenterline_Recents"` - -Name of the final output feature class containing only roads that changed (i.e. those where `CHANGE_TYPE <> 'NC'`). This is the primary deliverable of the script. - ---- - ## Minimal Profile Example ```json "example": { + "fips": "49000 - Example", + "field_mappings": "NAME=STREETNAME", "match_fields": "STREETNAME STREETNAME", - "compare_fields": "PREDIR PREDIR; STREETNAME STREETNAME; STREETTYPE STREETTYPE; L_F_ADD L_F_ADD; L_T_ADD L_T_ADD; R_F_ADD R_F_ADD; R_T_ADD R_T_ADD", - "text_fields": ["PREDIR", "STREETNAME", "STREETTYPE"], - "numeric_fields": ["L_F_ADD", "L_T_ADD", "R_F_ADD", "R_T_ADD"] + "compare_fields": "PREDIR PREDIR; STREETNAME STREETNAME; STREETTYPE STREETTYPE; L_F_ADD L_F_ADD; L_T_ADD L_T_ADD; R_F_ADD R_F_ADD; R_T_ADD R_T_ADD" } ``` - -## CLI Overrides - -Most profile values can be overridden at runtime without editing `profiles.json`: - -| Profile field | CLI argument | -| ------------------ | -------------------- | -| `match_fields` | `--match-fields` | -| `compare_fields` | `--compare-fields` | -| `dfc_output_name` | `--dfc-output-name` | -| `stats_table_name` | `--stats-table-name` | -| `recents_name` | `--recents-name` | diff --git a/cli/README.md b/cli/README.md index 2392ff7..20b7822 100644 --- a/cli/README.md +++ b/cli/README.md @@ -45,6 +45,8 @@ pip install --upgrade pathspec hatchling utrans get-recent-edits --county Carbon --update-features "Z:\Documents\gdb\Carbon20231019.gdb\Roads" --base-features "Z:\Documents\gdb\Carbon20230208.gdb\CC_Roads" ``` +The output is written to the geodatabase containing `--update-features`. + Run `utrans get-recent-edits --help` for the complete option reference and supported county profiles. ### ETL @@ -52,7 +54,19 @@ Run `utrans get-recent-edits --help` for the complete option reference and suppo Convert county roads to the UTRANS schema with explicit inputs: ```powershell -utrans etl --county saltlake --source-features "Z:\Documents\gdb\SaltLake.gdb\RoadCenterline_Recents" --utrans-roads "Z:\schemas\UtahRoadsNGSchema.gdb\Roads_Edit" --output-workspace "Z:\Documents\gdb\output.gdb" --county-boundaries "Database Connections\internal.sde\SGID.BOUNDARIES.Counties" +utrans etl --county saltlake --source-features "Z:\Documents\gdb\SaltLake.gdb\RoadCenterline_Recents" --utrans-roads "Z:\schemas\UtahRoadsNGSchema.gdb\Roads_Edit" --county-boundaries "Database Connections\internal.sde\SGID.BOUNDARIES.Counties" +``` + +The output is written to the geodatabase containing `--source-features`. It contains complete road features that intersect the selected county boundary; it does not clip features at the boundary. Run `utrans etl --help` for all options. + +### Detect Changes + +Process ETL output against a previous UTRANS road feature class: + +```powershell +utrans detect-changes --county Carbon --update-features "Z:\Documents\gdb\Carbon.gdb\county_etl" --utrans-features "Z:\Documents\gdb\UTRANS.gdb\Roads" --append-target "Database Connections\internal.sde\UTRANS.DFC_RESULT" ``` -The output contains complete road features that intersect the selected county boundary; it does not clip features at the boundary. Run `utrans etl --help` for all options. +The command writes outputs to the geodatabase containing `--update-features`. It uses the `NAME` matching and comparison fields, adds DFC editor metadata, creates `TEST_DFC_RESULT` with `NC` and `D` changes excluded, and appends the filtered result to `--append-target`. + +Run `utrans detect-changes --help` for the remaining options. diff --git a/cli/scripts/county_datasets.csv b/cli/scripts/county_datasets.csv new file mode 100644 index 0000000..0034df6 --- /dev/null +++ b/cli/scripts/county_datasets.csv @@ -0,0 +1,28 @@ +county,profile,source_features +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025 +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS +Cache,cache,C:\Mac\Home\Documents\working\utrans\county_obtained\Cache\CacheCo_20260824.gdb\CacheCountyRoads +Carbon,carbon,C:\Mac\Home\Documents\working\utrans\county_obtained\Carbon\Carbon20241031.gdb\Roads +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads +Garfield,garfield,C:\Mac\Home\Documents\working\utrans\county_obtained\Garfield\Garfield20260427.gdb\Garfield_Streets_Roads +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26 +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026 +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025 +Morgan,morgan,C:\Mac\Home\Documents\working\utrans\county_obtained\Morgan\MorganCo_20260519.gdb\Centerlines_May26 +Piute,piute,C:\Mac\Home\Documents\working\utrans\county_obtained\Piute\PiuteCo_20260414.gdb\Roads_2026_April +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21 +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads +SaltLake,saltlake,C:\Mac\Home\Documents\working\utrans\county_obtained\VECC\SaltLakeVECC_20260728.gdb\Centerlines +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511 +Summit,summit,C:\Mac\Home\Documents\working\utrans\county_obtained\Summit\Summit_20260722.gdb\SummitRoads +Tooele,tooele,C:\Mac\Home\Documents\working\utrans\county_obtained\Tooele\TooeleCo_20260514.gdb\TCRoads +Uintah,uintah,C:\Mac\Home\Documents\working\utrans\county_obtained\Uintah\UintahCo20260423.gdb\Roads +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline +Wasatch,wasatch,C:\Mac\Home\Documents\working\utrans\county_obtained\Wasatch\WasatchCounty20260604.gdb\WC_ROAD +Washington,washington,C:\Mac\Home\Documents\working\utrans\county_obtained\Washington\Washington20260722.gdb\WashCo_RoadCenterlines +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409 +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline diff --git a/cli/scripts/discover_value_mappings.py b/cli/scripts/discover_value_mappings.py new file mode 100644 index 0000000..782c167 --- /dev/null +++ b/cli/scripts/discover_value_mappings.py @@ -0,0 +1,451 @@ +"""Discover county source values that need UTRANS value mappings. + +Run with ArcGIS Pro's Python environment. This is intentionally a one-use +script, not a package entry point. + +The ``discover`` mode reads a county manifest, inspects the source feature +classes, and writes an inventory CSV plus a processing-summary CSV. The +``apply`` mode reads the inventory and a reviewed copy of it, then merges +approved review mappings directly into the profiles JSON file. Values already +marked ``resolved`` need no value mapping and are ignored by ``apply``. + +Required input: + --target-features: A UTRANS feature class whose coded-value domains define + the valid destination values. + +Fixed repository inputs: + ``county_datasets.csv`` and ``../src/utrans/profiles.json`` are resolved + relative to this script. + +Current-working-directory files: + ``discover`` writes ``value-mapping-inventory.csv`` and + ``value-mapping-summary.csv`` and ``reviewed-value-mappings.csv``. + ``apply`` reads + ``reviewed-value-mappings.csv``. +""" + +from __future__ import annotations + +import argparse +import csv +import json +from collections import Counter +from decimal import Decimal, InvalidOperation +from pathlib import Path +from typing import Any + +import arcpy + +INVENTORY_FIELDS = ( + "county", + "profile", + "source_features", + "target_field", + "source_field", + "observed_value", + "normalized_value", + "count", + "resolved_target_value", + "status", +) +SUMMARY_FIELDS = ("county", "profile", "source_features", "status", "detail") +REVIEW_FIELDS = INVENTORY_FIELDS + ("approved_target_value",) +SCRIPT_DIRECTORY = Path(__file__).resolve().parent +DEFAULT_MANIFEST = SCRIPT_DIRECTORY / "county_datasets.csv" +DEFAULT_PROFILES = SCRIPT_DIRECTORY.parent / "src" / "utrans" / "profiles.json" + + +def parse_field_mappings(profile: dict[str, Any], county: str) -> dict[str, str]: + value = profile.get("field_mappings", "") + if not isinstance(value, str): + raise TypeError(f"Profile '{county}' field_mappings must be a string.") + mappings: dict[str, str] = {} + for item in value.split(";"): + item = item.strip() + if not item: + continue + if "=" not in item: + raise TypeError(f"Profile '{county}' has invalid mapping '{item}'.") + target, source = (part.strip() for part in item.split("=", 1)) + mappings[target.upper()] = source + return mappings + + +def target_domains(target_features: str) -> dict[str, dict[str, str]]: + target_description = arcpy.Describe(target_features) + workspace = Path(target_description.catalogPath).parent + workspace_description = arcpy.Describe(str(workspace)) + if getattr(workspace_description, "datasetType", None) == "FeatureDataset": + workspace = workspace.parent + + domains = {domain.name: domain for domain in arcpy.da.ListDomains(str(workspace))} + values: dict[str, dict[str, str]] = {} + for field in arcpy.ListFields(target_features): + if not field.domain or field.domain not in domains: + continue + accepted: dict[str, str] = {} + for code, description in domains[field.domain].codedValues.items(): + code_text = str(code).strip().upper() + accepted[code_text] = str(code) + accepted[str(description).strip().upper()] = str(code) + values[field.name.upper()] = accepted + return values + + +def field_names(feature_class: str) -> dict[str, str]: + return {field.name.upper(): field.name for field in arcpy.ListFields(feature_class)} + + +def normalize_value(value: object) -> str: + normalized = str(value).strip().upper() + try: + number = Decimal(normalized) + except InvalidOperation: + return normalized + canonical = format(number, "f") + if "." in canonical: + canonical = canonical.rstrip("0").rstrip(".") + return canonical + + +def observed_values( + feature_class: str, source_field: str +) -> dict[str, tuple[str, int]]: + counts: Counter[str] = Counter() + representatives: dict[str, str] = {} + with arcpy.da.SearchCursor(feature_class, [source_field]) as cursor: + for (value,) in cursor: + if value is None or not str(value).strip(): + continue + raw_value = str(value).strip() + normalized_value = normalize_value(raw_value) + representatives.setdefault(normalized_value, raw_value) + counts[normalized_value] += 1 + return { + normalized_value: (representatives[normalized_value], count) + for normalized_value, count in counts.items() + } + + +def load_manifest(path: Path) -> list[dict[str, str]]: + with path.open(newline="", encoding="utf-8-sig") as manifest_file: + rows = list(csv.DictReader(manifest_file)) + required = {"county", "profile", "source_features"} + if not rows or not required <= set(rows[0]): + raise TypeError( + "Manifest must contain county, profile, and source_features columns." + ) + return [{key: value.strip() for key, value in row.items()} for row in rows] + + +def load_profiles(path: Path) -> dict[str, dict[str, Any]]: + with path.open(encoding="utf-8") as profiles_file: + profiles = json.load(profiles_file) + if not isinstance(profiles, dict): + raise TypeError("Profiles JSON must contain an object keyed by county.") + return profiles + + +def write_csv( + path: Path, fields: tuple[str, ...], rows: list[dict[str, object]] +) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + with path.open("w", newline="", encoding="utf-8") as output_file: + writer = csv.DictWriter(output_file, fieldnames=fields) + writer.writeheader() + writer.writerows(rows) + + +def discover( + manifest_path: Path, + profiles_path: Path, + target_features: str, + inventory_path: Path, + summary_path: Path, + reviewed_path: Path, +) -> None: + profiles = load_profiles(profiles_path) + domains = target_domains(target_features) + inventory: list[dict[str, object]] = [] + summary: list[dict[str, str]] = [] + + for manifest_row in load_manifest(manifest_path): + county = manifest_row["county"] + profile_key = manifest_row["profile"] + source_features = manifest_row["source_features"] + if profile_key not in profiles: + summary.append( + { + "county": county, + "profile": profile_key, + "source_features": source_features, + "status": "missing_profile", + "detail": "Profile key was not found.", + } + ) + continue + if not arcpy.Exists(source_features): + summary.append( + { + "county": county, + "profile": profile_key, + "source_features": source_features, + "status": "missing_dataset", + "detail": "Feature class was not found.", + } + ) + continue + + try: + mappings = parse_field_mappings(profiles[profile_key], profile_key) + except (TypeError, ValueError) as exc: + summary.append( + { + "county": county, + "profile": profile_key, + "source_features": source_features, + "status": "invalid_profile", + "detail": str(exc), + } + ) + continue + source_names = field_names(source_features) + domain_mappings = [ + (target, source) for target, source in mappings.items() if target in domains + ] + if not domain_mappings: + summary.append( + { + "county": county, + "profile": profile_key, + "source_features": source_features, + "status": "no_domain_mappings", + "detail": "No mapped target fields have coded-value domains.", + } + ) + continue + + county_rows = 0 + for target, source in sorted(domain_mappings): + actual_source = source_names.get(source.upper()) + if actual_source is None: + summary.append( + { + "county": county, + "profile": profile_key, + "source_features": source_features, + "status": "missing_source_field", + "detail": f"{source} maps to {target}.", + } + ) + continue + counts = observed_values(source_features, actual_source) + if not counts: + summary.append( + { + "county": county, + "profile": profile_key, + "source_features": source_features, + "status": "no_observations", + "detail": f"{actual_source} maps to {target}.", + } + ) + for normalized_value, (observed_value, count) in sorted(counts.items()): + resolved = domains[target].get(normalized_value, "") + inventory.append( + { + "county": county, + "profile": profile_key, + "source_features": source_features, + "target_field": target, + "source_field": actual_source, + "observed_value": observed_value, + "normalized_value": normalized_value, + "count": count, + "resolved_target_value": resolved, + "status": "resolved" if resolved else "review", + } + ) + county_rows += 1 + summary.append( + { + "county": county, + "profile": profile_key, + "source_features": source_features, + "status": "discovered", + "detail": f"{county_rows} observed values.", + } + ) + + inventory.sort( + key=lambda row: ( + str(row["county"]), + str(row["target_field"]), + str(row["source_field"]), + str(row["normalized_value"]), + ) + ) + summary.sort(key=lambda row: row["county"]) + write_csv(inventory_path, INVENTORY_FIELDS, inventory) + write_csv(summary_path, SUMMARY_FIELDS, summary) + review_rows = [ + {**row, "approved_target_value": ""} + for row in inventory + if row["status"] == "review" + ] + write_csv(reviewed_path, REVIEW_FIELDS, review_rows) + print(f"Wrote {len(inventory)} inventory rows to {inventory_path}") + print(f"Wrote {len(summary)} summary rows to {summary_path}") + print(f"Wrote {len(review_rows)} rows for review to {reviewed_path}") + + +def apply_mappings( + profiles_path: Path, + inventory_path: Path, + reviewed_path: Path, + target_features: str, +) -> None: + profiles = load_profiles(profiles_path) + domains = target_domains(target_features) + removed = clean_redundant_mappings(profiles, domains) + inventory_rows: dict[tuple[str, str, str], dict[str, str]] = {} + with inventory_path.open(newline="", encoding="utf-8-sig") as inventory_file: + for row in csv.DictReader(inventory_file): + key = ( + row["profile"], + row["target_field"].strip().upper(), + normalize_value(row["normalized_value"]), + ) + inventory_rows[key] = row + + additions: dict[str, dict[str, dict[str, str]]] = {} + with reviewed_path.open(newline="", encoding="utf-8-sig") as reviewed_file: + for row in csv.DictReader(reviewed_file): + approved = row.get("approved_target_value", "").strip() + if not approved: + continue + profile = row["profile"] + target = row["target_field"].strip().upper() + source = normalize_value(row["normalized_value"]) + inventory_row = inventory_rows.get((profile, target, source)) + if profile not in profiles or inventory_row is None: + raise ValueError( + f"Reviewed mapping is not present in inventory: {profile}/{target}/{source}" + ) + if inventory_row["status"] != "review": + raise ValueError( + f"Only review rows may have approval: {profile}/{target}/{source}" + ) + if target not in domains or domains[target].get(approved.upper()) is None: + raise ValueError( + f"Approved value '{approved}' is invalid for target field '{target}'." + ) + destination = domains[target][approved.upper()] + if source == destination.strip().upper(): + continue + pending = ( + additions.setdefault(profile, {}).setdefault(target, {}).get(source) + ) + if pending is not None and pending != destination: + raise ValueError( + f"Conflicting approvals for {profile}/{target}/{source}." + ) + additions[profile][target][source] = destination + + for profile, targets in additions.items(): + profile_mappings = profiles[profile].setdefault("value_mappings", {}) + for target, values in targets.items(): + target_mappings = profile_mappings.setdefault(target, {}) + for source, destination in values.items(): + existing = next( + ( + value + for key, value in target_mappings.items() + if str(key).strip().upper() == source + ), + None, + ) + if ( + existing is not None + and str(existing).strip().upper() != destination.upper() + ): + raise ValueError( + f"Conflicting mappings for {profile}/{target}/{source}." + ) + target_mappings[source] = destination + + profiles_path.write_text(json.dumps(profiles, indent=2) + "\n", encoding="utf-8") + print( + f"Applied inventory mappings to {profiles_path}; removed {removed} redundant mappings" + ) + + +def clean_redundant_mappings( + profiles: dict[str, dict[str, Any]], domains: dict[str, dict[str, str]] +) -> int: + removed = 0 + for profile in profiles.values(): + value_mappings = profile.get("value_mappings", {}) + if not isinstance(value_mappings, dict): + continue + for target, mappings in list(value_mappings.items()): + if not isinstance(mappings, dict): + continue + domain = domains.get(target.upper()) + for source, destination in list(mappings.items()): + source_key = str(source).strip().upper() + destination_key = str(destination).strip().upper() + source_code = domain.get(source_key) if domain else None + destination_code = domain.get(destination_key) if domain else None + if source_key == destination_key or ( + source_code is not None + and destination_code is not None + and source_code == destination_code + ): + del mappings[source] + removed += 1 + if not mappings: + del value_mappings[target] + if not value_mappings: + profile.pop("value_mappings", None) + return removed + + +def build_parser() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "mode", + choices=("discover", "apply"), + help="Run discovery or apply reviewed mappings to profiles.json.", + ) + parser.add_argument( + "--target-features", + required=True, + help="UTRANS target feature class providing coded-value domains.", + ) + return parser + + +def main() -> None: + args = build_parser().parse_args() + working_directory = Path.cwd() + if args.mode == "discover": + discover( + DEFAULT_MANIFEST, + DEFAULT_PROFILES, + args.target_features, + working_directory / "value-mapping-inventory.csv", + working_directory / "value-mapping-summary.csv", + working_directory / "reviewed-value-mappings.csv", + ) + else: + apply_mappings( + DEFAULT_PROFILES, + working_directory / "value-mapping-inventory.csv", + working_directory / "reviewed-value-mappings.csv", + args.target_features, + ) + + +if __name__ == "__main__": + main() diff --git a/cli/scripts/reviewed-value-mappings.csv b/cli/scripts/reviewed-value-mappings.csv new file mode 100644 index 0000000..bbca796 --- /dev/null +++ b/cli/scripts/reviewed-value-mappings.csv @@ -0,0 +1,165 @@ +county,profile,source_features,target_field,source_field,observed_value,normalized_value,count,resolved_target_value,status,approved_target_value,note +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_CLASS,CLASS,ATV,ATV,63,,review,,no matching value +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_CLASS,CLASS,F1,F1,3,,review,,no matching value +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_CLASS,CLASS,F2,F2,70,,review,,no matching value +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_CLASS,CLASS,NT,NT,29,,review,,no matching value +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_CLASS,CLASS,X,X,271,,review,,no matching value +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,0,0,6662,,review,,no matching value +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,100,100,778,,review,P, +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,110,110,1,,review,P, +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,115,115,99,,review,P, +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,200,200,322,,review,I, +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,210,210,48,,review,I, +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,211,211,3,,review,I, +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,213,213,29,,review,,no matching value +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,223,223,5,,review,I, +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,300,300,539,,review,N, +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,310,310,47,,review,N, +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,320,320,61,,review,N, +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,355,355,9,,review,,no matching value +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,400,400,6,,review,,no matching value +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,430,430,1,,review,,no matching value +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,450,450,30,,review,,no matching value +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,999,999,9,,review,U, +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,Cr,CR,1,,review,CIR,assuming Circle and not Creek +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,TR,TR,16,,review,TER,assuming Terrace and not Trail +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,DOT_SRFTYP,S_SURF2,0,0,510,,review,,no matching value +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,DOT_SRFTYP,S_SURF2,Gravel,GRAVEL,1,,review,I, +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,DOT_SRFTYP,S_SURF2,Improv_Agg/gravel,IMPROV_AGG/GRAVEL,33,,review,I, +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,DOT_SRFTYP,S_SURF2,Maintain_Native,MAINTAIN_NATIVE,35,,review,N, +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,DOT_SRFTYP,S_SURF2,Paved_Asphalt,PAVED_ASPHALT,42,,review,P-ASP, +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,SPEED_LMT,SPD_LMT,0,0,1492,,review,25,defaulting to 25 +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,STATUS,S_STATUS,A,A,469,,review,ACTIVE, +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,DOT_SRFTYP,RoadSurfaceType,Asphalt,ASPHALT,20945,,review,P-ASP, +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,DOT_SRFTYP,RoadSurfaceType,Concrete,CONCRETE,104,,review,P-CON, +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,DOT_SRFTYP,RoadSurfaceType,Gravel,GRAVEL,5,,review,I, +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Cswy,CSWY,1,,review,,no matching value +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Pne,PNE,1,,review,,no matching value +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Wy,WY,806,,review,WAY,this is the correct format +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,PREDIR,PrefixDirection,EB,EB,287,,review,,"no matching value in PREDIR field, part of NAME" +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,PREDIR,PrefixDirection,NB,NB,648,,review,,"no matching value in PREDIR field, part of NAME" +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,PREDIR,PrefixDirection,SB,SB,621,,review,,"no matching value in PREDIR field, part of NAME" +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,PREDIR,PrefixDirection,WB,WB,297,,review,,"no matching value in PREDIR field, part of NAME" +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,DOT_SRFTYP,SURFTYPE,300,300,1,,review,N, +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,DOT_SRFTYP,SURFTYPE,GRAVEL,GRAVEL,2,,review,I, +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,DOT_SRFTYP,SURFTYPE,OTHER,OTHER,37,,review,,no matching value +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,DOT_SRFTYP,S_SURF2,300,300,3,,review,N, +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,DOT_SRFTYP,S_SURF2,320,320,1,,review,N, +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,DOT_SRFTYP,S_SURF2,,,1,,review,,no matching value +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,DOT_SRFTYP,S_SURF2,Maintained Native,MAINTAINED NATIVE,1,,review,N, +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,SPEED_LMT,SPD_LMT,0,0,6178,,review,,no matching value +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,ap,AP,15,,review,,no matching value +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,blm,BLM,23,,review,F, +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,co,CO,6,,review,,no matching value +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,dwr,DWR,1,,review,A, +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,fs,FS,181,,review,F, +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,ind,IND,203,,review,,no matching value +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,pr,PR,407,,review,,no matching value +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,rr,RR,7,,review,,no matching value +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,sj,SJ,2,,review,,no matching value +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,sp,SP,27,,review,,no matching value +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,u,U,5,,review,,no matching value +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,wld,WLD,1,,review,,no matching value +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_SRFTYP,SURFTYPE,100,100,1773,,review,P, +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_SRFTYP,SURFTYPE,200,200,986,,review,I, +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_SRFTYP,SURFTYPE,200,200,1,,review,I, +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_SRFTYP,SURFTYPE,300,300,20968,,review,N, +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,SPEED_LMT,SPEED,0,0,239,,review,25, +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,DOT_SRFTYP,SURFTYPE,100,100,3045,,review,P, +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,DOT_SRFTYP,SURFTYPE,200,200,2739,,review,I, +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,DOT_SRFTYP,SURFTYPE,300,300,2460,,review,N, +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,DOT_SRFTYP,SURFTYPE,999,999,4014,,review,U, +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,DOT_SRFTYP,SURFTYPE,OTHER,OTHER,17,,review,,no matching value +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTDIR,SUFDIR,.,.,1,,review,,no matching value +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,c,C,1,,review,,no enough info +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,DIR,DIR,1,,review,DR, +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,LP,LP,6,,review,LOOP, +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,RDE,RDE,1,,review,RD,"Road, Route (RTE) or Ridge (RDG)?" +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,TR,TR,5,,review,,"no matching value, could be Terrace (TER) or Trail (TRL)" +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,W,W,2,,review,,no matching value +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,WY,WY,9,,review,WAY, +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,DOT_SRFTYP,SURFTYPE,100,100,1016,,review,,no matching value +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,DOT_SRFTYP,SURFTYPE,200,200,662,,review,,no matching value +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,DOT_SRFTYP,SURFTYPE,300,300,3148,,review,,no matching value +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,DOT_SRFTYP,SURFTYPE,999,999,3,,review,,no matching value +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,0,0,1,,review,,no matching value +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,LP,LP,1,,review,LOOP,assume should be Loop +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,SST,SST,1,,review,ST,assume typo for Street +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,TR,TR,2,,review,TER,assuming Terrace and not Trail +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,WY,WY,4,,review,WAY, +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,SPEED_LMT,SPEED,0,0,57,,review,25,defaulting to 25 +Morgan,morgan,C:\Mac\Home\Documents\working\utrans\county_obtained\Morgan\MorganCo_20260519.gdb\Centerlines_May26,DOT_CLASS,roadclass,Collector,COLLECTOR,50,,review,,"should be DOT_FCLASS, prefer UDOT to apply classes" +Morgan,morgan,C:\Mac\Home\Documents\working\utrans\county_obtained\Morgan\MorganCo_20260519.gdb\Centerlines_May26,DOT_CLASS,roadclass,Freeway,FREEWAY,28,,review,,"should be DOT_FCLASS, prefer UDOT to apply classes" +Morgan,morgan,C:\Mac\Home\Documents\working\utrans\county_obtained\Morgan\MorganCo_20260519.gdb\Centerlines_May26,DOT_CLASS,roadclass,Highway,HIGHWAY,43,,review,,"should be DOT_FCLASS, prefer UDOT to apply classes" +Morgan,morgan,C:\Mac\Home\Documents\working\utrans\county_obtained\Morgan\MorganCo_20260519.gdb\Centerlines_May26,DOT_CLASS,roadclass,Local,LOCAL,712,,review,,"should be DOT_FCLASS, prefer UDOT to apply classes" +Morgan,morgan,C:\Mac\Home\Documents\working\utrans\county_obtained\Morgan\MorganCo_20260519.gdb\Centerlines_May26,DOT_CLASS,roadclass,Minor Arterial,MINOR ARTERIAL,90,,review,,"should be DOT_FCLASS, prefer UDOT to apply classes" +Morgan,morgan,C:\Mac\Home\Documents\working\utrans\county_obtained\Morgan\MorganCo_20260519.gdb\Centerlines_May26,DOT_CLASS,roadclass,Ramp,RAMP,22,,review,,"should be DOT_FCLASS, prefer UDOT to apply classes" +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,0,0,2861,,review,,no matching value +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,100,100,7,,review,P, +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,115,115,141,,review,P, +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,20,20,1,,review,,no matching value +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,200,200,94,,review,I, +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,210,210,234,,review,I, +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,211,211,85,,review,I, +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,221,221,19,,review,I, +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,223,223,19,,review,I, +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,300,300,413,,review,N, +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,310,310,15,,review,N, +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,320,320,78,,review,N, +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,430,430,60,,review,,no matching value +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,440,440,2,,review,,no matching value +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,POSTTYPE,S_TYPE,CR,CR,5,,review,CIR,assume should be Circle +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,SPEED_LMT,SPD_LMT,0,0,4020,,review,25,defaulting to 25 +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,ARIZONA,ARIZONA,11,,review,,no matching value +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,B Road,B ROAD,1053,,review,B, +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,C Road,C ROAD,174,,review,C, +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,Colorado,COLORADO,9,,review,,no matching value +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,D Road,D ROAD,5553,,review,D, +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,Federal,FEDERAL,27,,review,F, +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,GRAND,GRAND,13,,review,,no matching value +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,NDOT,NDOT,228,,review,,no matching value +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,Private,PRIVATE,1,,review,P, +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,Private Road,PRIVATE ROAD,3,,review,P, +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,Reservation,RESERVATION,1635,,review,,no matching value +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,State Highway,STATE HIGHWAY,12,A,review,A, +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,UDOT,UDOT,3,A,review,A, +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,US Highway,US HIGHWAY,16,A,review,A, +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTTYPE,S_TYPE,BIKE,BIKE,30,,review,,no matching value +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,PREDIR,PRE_DIR,C,C,1,,review,,no matching value +Uintah,uintah,C:\Mac\Home\Documents\working\utrans\county_obtained\Uintah\UintahCo20260423.gdb\Roads,SPEED_LMT,SPD_LMT,0,0,9008,,review,25,defaulting to 25 +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,CORR,CORR,35,,review,,no matching value +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,OFF,OFF,80,,review,RAMP, +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,ON,ON,85,,review,RAMP, +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_CLASS,CLASS,?,?,4,,review,,no matching value +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_CLASS,CLASS,TBD,TBD,16,,review,,no matching value +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_CLASS,CLASS,TR,TR,2,,review,,no matching value - seems like a trail designation +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_CLASS,CLASS,TRL,TRL,18,,review,,no matching value - seems like a trail designation +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,0,0,6,,review,,no matching value +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,100,100,19,,review,P, +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,115,115,16,,review,P, +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,200,200,34,,review,I, +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,91409 SEGMENT RANGE COR,91409 SEGMENT RANGE COR,2,,review,,no matching value +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,GRAVEL,GRAVEL,8,,review,I, +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,Improv_Agg/gravel,IMPROV_AGG/GRAVEL,166,,review,I, +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,Improv_Crushed_agg,IMPROV_CRUSHED_AGG,12,,review,I, +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,Improv_gravel,IMPROV_GRAVEL,5,,review,I, +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,Improv_Mag_chlorid,IMPROV_MAG_CHLORID,1,,review,I, +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,Improv_Oiled,IMPROV_OILED,16,,review,,no matching value +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,Paved_Asphalt,PAVED_ASPHALT,136,,review,P-ASP, +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,PREDIR,PRE_DIR,c,C,1,,review,,no matching value +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,CRT,CRT,1,,review,CT,typo for Court +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,RR,RR,108,,review,,no matching value - railroad features +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,0,0,195,,review,25,defaulting to 25 +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,1,1,1,,review,25,defaulting to 25 +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,10,10,1,,review,10,not sure why this wouldn't match +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,15,15,7,,review,15,not sure why this wouldn't match +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,19,19,4,,review,20, +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,25,25,12513,,review,25,not sure why this wouldn't match +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,30,30,493,,review,30,not sure why this wouldn't match +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,35,35,911,,review,35,not sure why this wouldn't match +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,40,40,476,,review,40,not sure why this wouldn't match +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,45,45,116,,review,45,not sure why this wouldn't match +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,50,50,261,,review,50,not sure why this wouldn't match +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,55,55,164,,review,55,not sure why this wouldn't match +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,60,60,4,,review,60,not sure why this wouldn't match +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,65,65,15,,review,65,not sure why this wouldn't match \ No newline at end of file diff --git a/cli/scripts/value-mapping-inventory.csv b/cli/scripts/value-mapping-inventory.csv new file mode 100644 index 0000000..99e1c98 --- /dev/null +++ b/cli/scripts/value-mapping-inventory.csv @@ -0,0 +1,654 @@ +county,profile,source_features,target_field,source_field,observed_value,normalized_value,count,resolved_target_value,status +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_CLASS,CLASS,A,A,239,A,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_CLASS,CLASS,ATV,ATV,63,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_CLASS,CLASS,B,B,688,B,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_CLASS,CLASS,C,C,702,C,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_CLASS,CLASS,D,D,914,D,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_CLASS,CLASS,F,F,5,F,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_CLASS,CLASS,F1,F1,3,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_CLASS,CLASS,F2,F2,70,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_CLASS,CLASS,NT,NT,29,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_CLASS,CLASS,X,X,271,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,0,0,6662,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,100,100,778,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,110,110,1,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,115,115,99,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,200,200,322,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,210,210,48,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,211,211,3,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,213,213,29,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,223,223,5,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,300,300,539,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,310,310,47,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,320,320,61,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,355,355,9,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,400,400,6,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,430,430,1,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,450,450,30,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,DOT_SRFTYP,SURFTYPE,999,999,9,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTDIR,SUFDIR,E,E,144,E,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTDIR,SUFDIR,N,N,212,N,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTDIR,SUFDIR,S,S,166,S,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTDIR,SUFDIR,W,W,250,W,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,AVE,AVE,17,AVE,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,Cir,CIR,10,CIR,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,Cr,CR,1,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,CT,CT,2,CT,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,DR,DR,68,DR,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,FWY,FWY,50,FWY,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,HWY,HWY,81,HWY,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,LN,LN,82,LN,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,LOOP,LOOP,3,LOOP,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,PL,PL,2,PL,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,RAMP,RAMP,13,RAMP,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,RD,RD,308,RD,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,ST,ST,511,ST,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,TR,TR,16,,review +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,TRL,TRL,6,TRL,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,POSTTYPE,STREETTYPE,Way,WAY,9,WAY,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,VERT_LEVEL,VERTLEVEL,1,1,3,1,resolved +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,VERT_LEVEL,VERTLEVEL,2,2,15,2,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,DOT_CLASS,CLASS,A,A,929,A,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,DOT_CLASS,CLASS,B,B,1623,B,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,DOT_CLASS,CLASS,C,C,5,C,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,DOT_CLASS,CLASS,D,D,593,D,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTDIR,SUF_DIR,E,E,310,E,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTDIR,SUF_DIR,N,N,1288,N,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTDIR,SUF_DIR,S,S,675,S,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTDIR,SUF_DIR,W,W,1594,W,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTTYPE,S_TYPE,AVE,AVE,40,AVE,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTTYPE,S_TYPE,BLVD,BLVD,24,BLVD,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTTYPE,S_TYPE,CIR,CIR,34,CIR,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTTYPE,S_TYPE,CT,CT,5,CT,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTTYPE,S_TYPE,DR,DR,294,DR,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTTYPE,S_TYPE,FWY,FWY,201,FWY,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTTYPE,S_TYPE,LANE,LANE,1,LN,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTTYPE,S_TYPE,LN,LN,45,LN,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTTYPE,S_TYPE,LOOP,LOOP,34,LOOP,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTTYPE,S_TYPE,PL,PL,20,PL,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTTYPE,S_TYPE,RAMP,RAMP,143,RAMP,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTTYPE,S_TYPE,RD,RD,1325,RD,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTTYPE,S_TYPE,ST,ST,325,ST,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTTYPE,S_TYPE,TRL,TRL,4,TRL,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,POSTTYPE,S_TYPE,WAY,WAY,38,WAY,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,PREDIR,PRE_DIR,E,E,503,E,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,PREDIR,PRE_DIR,N,N,1762,N,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,PREDIR,PRE_DIR,S,S,962,S,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,PREDIR,PRE_DIR,W,W,2162,W,resolved +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,VERT_LEVEL,VERTLEVEL,0.0,0.0,11511,,review +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,A2_POSTTYPE,ALIAS2_TYP,RD,RD,15,RD,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,DOT_CLASS,CLASS,A,A,7,A,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,DOT_CLASS,CLASS,B,B,298,B,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,DOT_CLASS,CLASS,C,C,69,C,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,DOT_CLASS,CLASS,D,D,220,D,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,DOT_SRFTYP,S_SURF2,0,0,510,,review +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,DOT_SRFTYP,S_SURF2,Gravel,GRAVEL,1,,review +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,DOT_SRFTYP,S_SURF2,Improved,IMPROVED,393,I,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,DOT_SRFTYP,S_SURF2,Improv_Agg/gravel,IMPROV_AGG/GRAVEL,33,,review +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,DOT_SRFTYP,S_SURF2,Maintain_Native,MAINTAIN_NATIVE,35,,review +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,DOT_SRFTYP,S_SURF2,Native,NATIVE,138,N,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,DOT_SRFTYP,S_SURF2,Paved,PAVED,132,P,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,DOT_SRFTYP,S_SURF2,Paved_Asphalt,PAVED_ASPHALT,42,,review +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,ONEWAY,ONE_WAY,0,0,1665,0,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,POSTTYPE,S_TYPE,AVE,AVE,15,AVE,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,POSTTYPE,S_TYPE,BLVD,BLVD,8,BLVD,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,POSTTYPE,S_TYPE,CIR,CIR,10,CIR,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,POSTTYPE,S_TYPE,DR,DR,43,DR,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,POSTTYPE,S_TYPE,HWY,HWY,77,HWY,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,POSTTYPE,S_TYPE,LANE,LANE,1,LN,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,POSTTYPE,S_TYPE,LN,LN,96,LN,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,POSTTYPE,S_TYPE,LOOP,LOOP,24,LOOP,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,POSTTYPE,S_TYPE,PKWY,PKWY,2,PKWY,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,POSTTYPE,S_TYPE,RD,RD,662,RD,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,POSTTYPE,S_TYPE,ST,ST,38,ST,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,POSTTYPE,S_TYPE,TRL,TRL,3,TRL,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,POSTTYPE,S_TYPE,WAY,WAY,28,WAY,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,PREDIR,PRE_DIR,E,E,178,E,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,PREDIR,PRE_DIR,N,N,154,N,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,PREDIR,PRE_DIR,S,S,166,S,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,PREDIR,PRE_DIR,W,W,135,W,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,SPEED_LMT,SPD_LMT,0,0,1492,,review +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,SPEED_LMT,SPD_LMT,10,10,15,10,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,SPEED_LMT,SPD_LMT,15,15,14,15,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,SPEED_LMT,SPD_LMT,20,20,14,20,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,SPEED_LMT,SPD_LMT,25,25,54,25,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,SPEED_LMT,SPD_LMT,30,30,9,30,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,SPEED_LMT,SPD_LMT,35,35,8,35,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,SPEED_LMT,SPD_LMT,40,40,15,40,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,SPEED_LMT,SPD_LMT,45,45,2,45,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,SPEED_LMT,SPD_LMT,5,5,6,5,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,SPEED_LMT,SPD_LMT,55,55,36,55,resolved +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,STATUS,S_STATUS,A,A,469,,review +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,DOT_SRFTYP,RoadSurfaceType,Asphalt,ASPHALT,20945,,review +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,DOT_SRFTYP,RoadSurfaceType,Concrete,CONCRETE,104,,review +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,DOT_SRFTYP,RoadSurfaceType,Dirt,DIRT,85,D,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,DOT_SRFTYP,RoadSurfaceType,Gravel,GRAVEL,5,,review +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,DOT_SRFTYP,RoadSurfaceType,Unknown,UNKNOWN,46,U,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTDIR,PostDirection,E,E,1770,E,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTDIR,PostDirection,N,N,2928,N,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTDIR,PostDirection,S,S,2571,S,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTDIR,PostDirection,W,W,3745,W,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Ave,AVE,267,AVE,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Blvd,BLVD,185,BLVD,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Bnd,BND,4,BND,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Cir,CIR,586,CIR,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Cor,COR,3,COR,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Crk,CRK,1,CRK,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Cswy,CSWY,1,,review +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Ct,CT,226,CT,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Cv,CV,26,CV,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Dr,DR,2881,DR,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Grv,GRV,2,GRV,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Hl,HL,2,HL,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Holw,HOLW,7,HOLW,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Hwy,HWY,94,HWY,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Ln,LN,1172,LN,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Lndg,LNDG,1,LNDG,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Loop,LOOP,52,LOOP,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Mnr,MNR,1,MNR,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Park,PARK,2,PARK,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Pass,PASS,3,PASS,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Pkwy,PKWY,125,PKWY,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Pl,PL,38,PL,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Pne,PNE,1,,review +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Pt,PT,2,PT,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Rd,RD,1025,RD,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Rte,RTE,2,RTE,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Run,RUN,12,RUN,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,St,ST,1161,ST,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Trce,TRCE,1,TRCE,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Trl,TRL,1,TRL,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Wy,WY,806,,review +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,POSTTYPE,RoadNameType,Xing,XING,6,XING,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,PREDIR,PrefixDirection,E,E,3682,E,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,PREDIR,PrefixDirection,EB,EB,287,,review +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,PREDIR,PrefixDirection,N,N,5301,N,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,PREDIR,PrefixDirection,NB,NB,648,,review +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,PREDIR,PrefixDirection,S,S,4807,S,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,PREDIR,PrefixDirection,SB,SB,621,,review +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,PREDIR,PrefixDirection,W,W,5814,W,resolved +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,PREDIR,PrefixDirection,WB,WB,297,,review +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,A1_POSTTYPE,ALIAS1TYPE,AVE,AVE,2,AVE,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,A1_POSTTYPE,ALIAS1TYPE,HWY,HWY,43,HWY,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,A1_POSTTYPE,ALIAS1TYPE,LN,LN,11,LN,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,A1_POSTTYPE,ALIAS1TYPE,RD,RD,24,RD,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,A1_POSTTYPE,ALIAS1TYPE,ST,ST,6,ST,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,DOT_CLASS,CLASS,A,A,15,A,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,DOT_CLASS,CLASS,B,B,3,B,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,DOT_SRFTYP,SURFTYPE,300,300,1,,review +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,DOT_SRFTYP,SURFTYPE,DIRT,DIRT,1677,D,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,DOT_SRFTYP,SURFTYPE,GRAVEL,GRAVEL,2,,review +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,DOT_SRFTYP,SURFTYPE,IMPROVED,IMPROVED,1103,I,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,DOT_SRFTYP,SURFTYPE,OTHER,OTHER,37,,review +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,DOT_SRFTYP,SURFTYPE,PAVED,PAVED,1544,P,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTDIR,SUFDIR,E,E,202,E,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTDIR,SUFDIR,N,N,589,N,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTDIR,SUFDIR,S,S,523,S,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTDIR,SUFDIR,W,W,857,W,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTTYPE,STREETTYPE,AVE,AVE,11,AVE,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTTYPE,STREETTYPE,BLVD,BLVD,2,BLVD,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTTYPE,STREETTYPE,CIR,CIR,24,CIR,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTTYPE,STREETTYPE,CT,CT,3,CT,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTTYPE,STREETTYPE,CV,CV,16,CV,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTTYPE,STREETTYPE,DR,DR,79,DR,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTTYPE,STREETTYPE,HWY,HWY,28,HWY,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTTYPE,STREETTYPE,LN,LN,30,LN,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTTYPE,STREETTYPE,LOOP,LOOP,12,LOOP,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTTYPE,STREETTYPE,N,N,1,,review +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTTYPE,STREETTYPE,RD,RD,525,RD,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTTYPE,STREETTYPE,SQ,SQ,1,SQ,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTTYPE,STREETTYPE,ST,ST,95,ST,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTTYPE,STREETTYPE,TRL,TRL,1,TRL,resolved +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,POSTTYPE,STREETTYPE,WAY,WAY,11,WAY,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,A1_POSTTYPE,ALIAS1_TYP,LN,LN,1,LN,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,A1_POSTTYPE,ALIAS1_TYP,RD,RD,12,RD,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,A1_POSTTYPE,ALIAS1_TYP,TRL,TRL,330,TRL,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,DOT_CLASS,CLASS,A,A,623,A,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,DOT_CLASS,CLASS,B,B,1387,B,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,DOT_CLASS,CLASS,C,C,1298,C,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,DOT_CLASS,CLASS,D,D,7217,D,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,DOT_CLASS,CLASS,P,P,9,P,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,DOT_SRFTYP,S_SURF2,300,300,3,,review +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,DOT_SRFTYP,S_SURF2,320,320,1,,review +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,DOT_SRFTYP,S_SURF2,,,1,,review +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,DOT_SRFTYP,S_SURF2,Maintained Native,MAINTAINED NATIVE,1,,review +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,DOT_SRFTYP,S_SURF2,Paved Asphalt,PAVED ASPHALT,1,P-ASP,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,ONEWAY,ONE_WAY,0,0,9622,0,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,POSTDIR,SUF_DIR,E,E,309,E,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,POSTDIR,SUF_DIR,N,N,360,N,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,POSTDIR,SUF_DIR,S,S,258,S,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,POSTDIR,SUF_DIR,W,W,262,W,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,POSTTYPE,S_TYPE,AVE,AVE,85,AVE,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,POSTTYPE,S_TYPE,BLVD,BLVD,21,BLVD,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,POSTTYPE,S_TYPE,CT,CT,10,CT,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,POSTTYPE,S_TYPE,DR,DR,36,DR,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,POSTTYPE,S_TYPE,LN,LN,83,LN,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,POSTTYPE,S_TYPE,LOOP,LOOP,1,LOOP,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,POSTTYPE,S_TYPE,PKWY,PKWY,11,PKWY,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,POSTTYPE,S_TYPE,RD,RD,723,RD,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,POSTTYPE,S_TYPE,SPUR,SPUR,8,SPUR,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,POSTTYPE,S_TYPE,ST,ST,410,ST,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,POSTTYPE,S_TYPE,TRL,TRL,502,TRL,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,POSTTYPE,S_TYPE,WAY,WAY,2,WAY,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,PREDIR,PRE_DIR,E,E,920,E,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,PREDIR,PRE_DIR,N,N,940,N,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,PREDIR,PRE_DIR,S,S,742,S,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,PREDIR,PRE_DIR,W,W,795,W,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,SPEED_LMT,SPD_LMT,0,0,6178,,review +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,SPEED_LMT,SPD_LMT,15,15,1,15,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,SPEED_LMT,SPD_LMT,20,20,6,20,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,SPEED_LMT,SPD_LMT,25,25,1502,25,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,SPEED_LMT,SPD_LMT,30,30,727,30,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,SPEED_LMT,SPD_LMT,35,35,267,35,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,SPEED_LMT,SPD_LMT,40,40,140,40,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,SPEED_LMT,SPD_LMT,45,45,188,45,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,SPEED_LMT,SPD_LMT,50,50,133,50,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,SPEED_LMT,SPD_LMT,55,55,200,55,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,SPEED_LMT,SPD_LMT,65,65,199,65,resolved +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,SPEED_LMT,SPD_LMT,75,75,89,75,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,A1_POSTTYPE,ALIAS1TYPE,AVE,AVE,8,AVE,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,A1_POSTTYPE,ALIAS1TYPE,BLVD,BLVD,4,BLVD,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,A1_POSTTYPE,ALIAS1TYPE,COR,COR,1,COR,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,A1_POSTTYPE,ALIAS1TYPE,DR,DR,10,DR,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,A1_POSTTYPE,ALIAS1TYPE,LN,LN,9,LN,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,A1_POSTTYPE,ALIAS1TYPE,RAMP,RAMP,39,RAMP,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,A1_POSTTYPE,ALIAS1TYPE,RD,RD,60,RD,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,A1_POSTTYPE,ALIAS1TYPE,RTE,RTE,1,RTE,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,A1_POSTTYPE,ALIAS1TYPE,ST,ST,51,ST,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,A1_POSTTYPE,ALIAS1TYPE,TRL,TRL,2,TRL,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,A2_POSTTYPE,ALIAS2TYPE,RAMP,RAMP,8,RAMP,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,A2_POSTTYPE,ALIAS2TYPE,RD,RD,65,RD,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,A2_POSTTYPE,ALIAS2TYPE,WAY,WAY,4,WAY,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,AN_POSTDIR,ACSSUF,E,E,14,E,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,AN_POSTDIR,ACSSUF,N,N,8,N,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,a,A,416,A,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,ap,AP,15,,review +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,b,B,4457,B,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,blm,BLM,23,,review +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,co,CO,6,,review +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,d,D,20852,D,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,dwr,DWR,1,,review +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,fs,FS,181,,review +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,ind,IND,203,,review +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,pr,PR,407,,review +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,rr,RR,7,,review +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,sj,SJ,2,,review +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,sp,SP,27,,review +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,u,U,5,,review +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_CLASS,CLASS,wld,WLD,1,,review +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_SRFTYP,SURFTYPE,100,100,1773,,review +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_SRFTYP,SURFTYPE,200,200,986,,review +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_SRFTYP,SURFTYPE,200.00,200.00,1,,review +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,DOT_SRFTYP,SURFTYPE,300,300,20968,,review +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTDIR,SUFDIR,E,E,50,E,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTDIR,SUFDIR,N,N,55,N,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTDIR,SUFDIR,S,S,39,S,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTDIR,SUFDIR,W,W,49,W,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,AVE,AVE,85,AVE,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,BLVD,BLVD,20,BLVD,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,CIR,CIR,61,CIR,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,CT,CT,43,CT,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,DR,DR,331,DR,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,FWY,FWY,50,FWY,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,HTS,HTS,7,HTS,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,HWY,HWY,2,HWY,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,LN,LN,401,LN,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,LOOP,LOOP,36,LOOP,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,PKWY,PKWY,10,PKWY,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,PL,PL,7,PL,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,RAMP,RAMP,55,RAMP,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,RD,RD,910,RD,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,RNCH,RNCH,31,RNCH,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,RUN,RUN,1,RUN,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,ST,ST,80,ST,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,TER,TER,5,TER,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,TRL,TRL,37,TRL,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,POSTTYPE,STREETTYPE,WAY,WAY,18,WAY,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,SPEED_LMT,SPEED,0,0,239,,review +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,SPEED_LMT,SPEED,10,10,86,10,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,SPEED_LMT,SPEED,15,15,4,15,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,SPEED_LMT,SPEED,20,20,125,20,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,SPEED_LMT,SPEED,25,25,26466,25,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,SPEED_LMT,SPEED,30,30,108,30,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,SPEED_LMT,SPEED,35,35,17,35,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,SPEED_LMT,SPEED,40,40,72,40,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,SPEED_LMT,SPEED,45,45,477,45,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,SPEED_LMT,SPEED,5,5,5,5,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,SPEED_LMT,SPEED,55,55,300,55,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,SPEED_LMT,SPEED,65,65,135,65,resolved +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,SPEED_LMT,SPEED,75,75,50,75,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,DOT_CLASS,CLASS,A,A,1,A,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,DOT_CLASS,CLASS,B,B,14,B,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,DOT_CLASS,CLASS,C,C,1,C,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,DOT_SRFTYP,SURFTYPE,100,100,3045,,review +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,DOT_SRFTYP,SURFTYPE,200,200,2739,,review +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,DOT_SRFTYP,SURFTYPE,300,300,2460,,review +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,DOT_SRFTYP,SURFTYPE,999,999,4014,,review +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,DOT_SRFTYP,SURFTYPE,DIRT,DIRT,215,D,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,DOT_SRFTYP,SURFTYPE,IMPROVED,IMPROVED,48,I,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,DOT_SRFTYP,SURFTYPE,OTHER,OTHER,17,,review +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,DOT_SRFTYP,SURFTYPE,PAVED,PAVED,64,P,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTDIR,SUFDIR,.,.,1,,review +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTDIR,SUFDIR,E,E,555,E,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTDIR,SUFDIR,N,N,1736,N,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTDIR,SUFDIR,S,S,668,S,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTDIR,SUFDIR,W,W,1793,W,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,AVE,AVE,46,AVE,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,BLVD,BLVD,42,BLVD,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,c,C,1,,review +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,CIR,CIR,158,CIR,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,CT,CT,27,CT,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,DIR,DIR,1,,review +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,DR,DR,725,DR,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,FWY,FWY,169,FWY,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,HWY,HWY,121,HWY,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,JCT,JCT,6,JCT,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,LN,LN,235,LN,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,LOOP,LOOP,373,LOOP,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,LP,LP,6,,review +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,PKWY,PKWY,14,PKWY,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,PL,PL,9,PL,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,RAMP,RAMP,78,RAMP,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,RD,RD,1244,RD,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,RDE,RDE,1,,review +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,RNCH,RNCH,1,RNCH,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,ROW,ROW,4,ROW,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,RTE,RTE,13,RTE,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,SPUR,SPUR,1,SPUR,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,ST,ST,301,ST,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,TER,TER,2,TER,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,TR,TR,5,,review +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,TRL,TRL,78,TRL,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,W,W,2,,review +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,WAY,WAY,71,WAY,resolved +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,POSTTYPE,STREETTYPE,WY,WY,9,,review +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,VERT_LEVEL,VERTLEVEL,1,1,2,1,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,A1_POSTTYPE,ALIAS1TYPE,DR,DR,5,DR,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,A1_POSTTYPE,ALIAS1TYPE,LN,LN,2,LN,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,A1_POSTTYPE,ALIAS1TYPE,RD,RD,93,RD,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,DOT_SRFTYP,SURFTYPE,100,100,1016,,review +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,DOT_SRFTYP,SURFTYPE,200,200,662,,review +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,DOT_SRFTYP,SURFTYPE,300,300,3148,,review +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,DOT_SRFTYP,SURFTYPE,999,999,3,,review +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTDIR,SUFDIR,E,E,63,E,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTDIR,SUFDIR,N,N,68,N,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTDIR,SUFDIR,S,S,72,S,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTDIR,SUFDIR,W,W,59,W,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,0,0,1,,review +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,ALY,ALY,6,ALY,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,AVE,AVE,78,AVE,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,BLVD,BLVD,19,BLVD,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,CIR,CIR,148,CIR,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,COR,COR,2,COR,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,CT,CT,18,CT,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,CV,CV,14,CV,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,DR,DR,621,DR,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,HTS,HTS,1,HTS,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,LN,LN,168,LN,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,LOOP,LOOP,35,LOOP,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,LP,LP,1,,review +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,PKWY,PKWY,6,PKWY,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,PL,PL,7,PL,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,PT,PT,69,PT,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,RD,RD,1280,RD,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,SST,SST,1,,review +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,ST,ST,168,ST,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,TR,TR,2,,review +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,TRL,TRL,79,TRL,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,VW,VW,1,VW,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,WAY,WAY,60,WAY,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,POSTTYPE,STREETTYPE,WY,WY,4,,review +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,SPEED_LMT,SPEED,0,0,57,,review +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,SPEED_LMT,SPEED,10,10,8,10,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,SPEED_LMT,SPEED,25,25,7338,25,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,SPEED_LMT,SPEED,30,30,3,30,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,SPEED_LMT,SPEED,40,40,101,40,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,SPEED_LMT,SPEED,45,45,300,45,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,SPEED_LMT,SPEED,5,5,3,5,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,SPEED_LMT,SPEED,50,50,22,50,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,SPEED_LMT,SPEED,55,55,132,55,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,SPEED_LMT,SPEED,60,60,3,60,resolved +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,SPEED_LMT,SPEED,65,65,66,65,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,A1_POSTTYPE,ALIAS1TYPE,DR,DR,2,DR,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,A1_POSTTYPE,ALIAS1TYPE,LN,LN,6,LN,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,A1_POSTTYPE,ALIAS1TYPE,RAMP,RAMP,40,RAMP,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,A1_POSTTYPE,ALIAS1TYPE,RD,RD,100,RD,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,A1_POSTTYPE,ALIAS1TYPE,ST,ST,3,ST,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,A2_POSTTYPE,ALIAS2TYPE,LN,LN,1,LN,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,A2_POSTTYPE,ALIAS2TYPE,RAMP,RAMP,4,RAMP,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,A2_POSTTYPE,ALIAS2TYPE,RD,RD,16,RD,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,A2_POSTTYPE,ALIAS2TYPE,ST,ST,1,ST,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,POSTDIR,SUFDIR,E,E,249,E,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,POSTDIR,SUFDIR,N,N,450,N,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,POSTDIR,SUFDIR,S,S,381,S,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,POSTDIR,SUFDIR,W,W,560,W,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,POSTTYPE,STREETTYPE,AVE,AVE,18,AVE,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,POSTTYPE,STREETTYPE,BLVD,BLVD,5,BLVD,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,POSTTYPE,STREETTYPE,CIR,CIR,1,CIR,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,POSTTYPE,STREETTYPE,DR,DR,56,DR,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,POSTTYPE,STREETTYPE,FWY,FWY,170,FWY,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,POSTTYPE,STREETTYPE,HWY,HWY,14,HWY,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,POSTTYPE,STREETTYPE,LN,LN,61,LN,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,POSTTYPE,STREETTYPE,RAMP,RAMP,49,RAMP,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,POSTTYPE,STREETTYPE,RD,RD,12646,RD,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,POSTTYPE,STREETTYPE,ST,ST,1820,ST,resolved +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,POSTTYPE,STREETTYPE,WAY,WAY,9,WAY,resolved +Morgan,morgan,C:\Mac\Home\Documents\working\utrans\county_obtained\Morgan\MorganCo_20260519.gdb\Centerlines_May26,DOT_CLASS,roadclass,Collector,COLLECTOR,50,,review +Morgan,morgan,C:\Mac\Home\Documents\working\utrans\county_obtained\Morgan\MorganCo_20260519.gdb\Centerlines_May26,DOT_CLASS,roadclass,Freeway,FREEWAY,28,,review +Morgan,morgan,C:\Mac\Home\Documents\working\utrans\county_obtained\Morgan\MorganCo_20260519.gdb\Centerlines_May26,DOT_CLASS,roadclass,Highway,HIGHWAY,43,,review +Morgan,morgan,C:\Mac\Home\Documents\working\utrans\county_obtained\Morgan\MorganCo_20260519.gdb\Centerlines_May26,DOT_CLASS,roadclass,Local,LOCAL,712,,review +Morgan,morgan,C:\Mac\Home\Documents\working\utrans\county_obtained\Morgan\MorganCo_20260519.gdb\Centerlines_May26,DOT_CLASS,roadclass,Minor Arterial,MINOR ARTERIAL,90,,review +Morgan,morgan,C:\Mac\Home\Documents\working\utrans\county_obtained\Morgan\MorganCo_20260519.gdb\Centerlines_May26,DOT_CLASS,roadclass,Ramp,RAMP,22,,review +Morgan,morgan,C:\Mac\Home\Documents\working\utrans\county_obtained\Morgan\MorganCo_20260519.gdb\Centerlines_May26,VERT_LEVEL,roadlevel,0,0,946,0,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,A1_POSTTYPE,ALIAS1_TYP,DR,DR,5,DR,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,A1_POSTTYPE,ALIAS1_TYP,LN,LN,1,LN,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,A1_POSTTYPE,ALIAS1_TYP,PKWY,PKWY,2,PKWY,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,A1_POSTTYPE,ALIAS1_TYP,RD,RD,9,RD,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,A1_POSTTYPE,ALIAS1_TYP,ST,ST,11,ST,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,A2_POSTTYPE,ALIAS2_TYP,HWY,HWY,2,HWY,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,0,0,2861,,review +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,100,100,7,,review +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,115,115,141,,review +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,20,20,1,,review +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,200,200,94,,review +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,210,210,234,,review +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,211,211,85,,review +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,221,221,19,,review +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,223,223,19,,review +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,300,300,413,,review +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,310,310,15,,review +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,320,320,78,,review +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,430,430,60,,review +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,DOT_SRFTYP,S_SURF,440,440,2,,review +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,ONEWAY,ONE_WAY,0,0,4029,0,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,POSTTYPE,S_TYPE,AVE,AVE,1,AVE,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,POSTTYPE,S_TYPE,BLVD,BLVD,14,BLVD,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,POSTTYPE,S_TYPE,CIR,CIR,119,CIR,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,POSTTYPE,S_TYPE,CR,CR,5,,review +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,POSTTYPE,S_TYPE,CT,CT,3,CT,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,POSTTYPE,S_TYPE,DR,DR,170,DR,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,POSTTYPE,S_TYPE,LN,LN,74,LN,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,POSTTYPE,S_TYPE,LOOP,LOOP,19,LOOP,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,POSTTYPE,S_TYPE,PKWY,PKWY,13,PKWY,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,POSTTYPE,S_TYPE,PL,PL,2,PL,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,POSTTYPE,S_TYPE,RD,RD,171,RD,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,POSTTYPE,S_TYPE,RUN,RUN,6,RUN,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,POSTTYPE,S_TYPE,ST,ST,89,ST,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,POSTTYPE,S_TYPE,WAY,WAY,34,WAY,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,PREDIR,PRE_DIR,E,E,156,E,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,PREDIR,PRE_DIR,N,N,152,N,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,PREDIR,PRE_DIR,S,S,357,S,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,PREDIR,PRE_DIR,W,W,220,W,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,SPEED_LMT,SPD_LMT,0,0,4020,,review +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,SPEED_LMT,SPD_LMT,25,25,8,25,resolved +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,SPEED_LMT,SPD_LMT,40,40,1,40,resolved +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,ARIZONA,ARIZONA,11,,review +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,B Road,B ROAD,1053,,review +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,C Road,C ROAD,174,,review +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,Colorado,COLORADO,9,,review +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,D Road,D ROAD,5553,,review +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,Federal,FEDERAL,27,,review +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,GRAND,GRAND,13,,review +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,NDOT,NDOT,228,,review +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,Private,PRIVATE,1,,review +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,Private Road,PRIVATE ROAD,3,,review +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,Reservation,RESERVATION,1635,,review +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,State Highway,STATE HIGHWAY,12,,review +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,UDOT,UDOT,3,,review +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,DOT_CLASS,CLASS,US Highway,US HIGHWAY,16,,review +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTDIR,SUR_DIR,E,E,787,E,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTDIR,SUR_DIR,N,N,934,N,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTDIR,SUR_DIR,S,S,813,S,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTDIR,SUR_DIR,W,W,864,W,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTTYPE,S_TYPE,AVE,AVE,22,AVE,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTTYPE,S_TYPE,BIKE,BIKE,30,,review +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTTYPE,S_TYPE,BLVD,BLVD,29,BLVD,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTTYPE,S_TYPE,CIR,CIR,38,CIR,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTTYPE,S_TYPE,CT,CT,5,CT,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTTYPE,S_TYPE,DR,DR,474,DR,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTTYPE,S_TYPE,FWY,FWY,15,FWY,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTTYPE,S_TYPE,HWY,HWY,85,HWY,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTTYPE,S_TYPE,LN,LN,228,LN,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTTYPE,S_TYPE,LOOP,LOOP,35,LOOP,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTTYPE,S_TYPE,PL,PL,1,PL,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTTYPE,S_TYPE,RD,RD,2165,RD,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTTYPE,S_TYPE,ST,ST,576,ST,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTTYPE,S_TYPE,TRL,TRL,4,TRL,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,POSTTYPE,S_TYPE,WAY,WAY,62,WAY,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,PREDIR,PRE_DIR,C,C,1,,review +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,PREDIR,PRE_DIR,E,E,1371,E,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,PREDIR,PRE_DIR,N,N,2298,N,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,PREDIR,PRE_DIR,S,S,1952,S,resolved +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,PREDIR,PRE_DIR,W,W,1662,W,resolved +Uintah,uintah,C:\Mac\Home\Documents\working\utrans\county_obtained\Uintah\UintahCo20260423.gdb\Roads,SPEED_LMT,SPD_LMT,0,0,9008,,review +Uintah,uintah,C:\Mac\Home\Documents\working\utrans\county_obtained\Uintah\UintahCo20260423.gdb\Roads,SPEED_LMT,SPD_LMT,25,25,9,25,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,A1_POSTTYPE,ALTROADTYPE,AVE,AVE,3,AVE,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,A1_POSTTYPE,ALTROADTYPE,BLVD,BLVD,6,BLVD,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,A1_POSTTYPE,ALTROADTYPE,CIR,CIR,4,CIR,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,A1_POSTTYPE,ALTROADTYPE,DR,DR,25,DR,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,A1_POSTTYPE,ALTROADTYPE,HWY,HWY,1346,HWY,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,A1_POSTTYPE,ALTROADTYPE,LN,LN,4,LN,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,A1_POSTTYPE,ALTROADTYPE,PKWY,PKWY,5,PKWY,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,A1_POSTTYPE,ALTROADTYPE,RD,RD,54,RD,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,A1_POSTTYPE,ALTROADTYPE,ST,ST,6895,ST,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,A1_POSTTYPE,ALTROADTYPE,WAY,WAY,34,WAY,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTDIR,ROADPOSTDIR,E,E,8,E,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTDIR,ROADPOSTDIR,N,N,11,N,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTDIR,ROADPOSTDIR,S,S,8,S,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTDIR,ROADPOSTDIR,W,W,14,W,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,ALY,ALY,29,ALY,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,AVE,AVE,773,AVE,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,BLVD,BLVD,799,BLVD,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,BND,BND,5,BND,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,CIR,CIR,1312,CIR,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,CORR,CORR,35,,review +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,CT,CT,697,CT,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,CV,CV,147,CV,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,CYN,CYN,4,CYN,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,DR,DR,6077,DR,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,HL,HL,7,HL,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,HOLW,HOLW,8,HOLW,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,HTS,HTS,1,HTS,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,HWY,HWY,344,HWY,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,LN,LN,2421,LN,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,LNDG,LNDG,4,LNDG,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,LOOP,LOOP,124,LOOP,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,OFF,OFF,80,,review +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,ON,ON,85,,review +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,PASS,PASS,2,PASS,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,PKWY,PKWY,603,PKWY,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,PL,PL,154,PL,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,RD,RD,2402,RD,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,RDG,RDG,26,RDG,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,ROW,ROW,13,ROW,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,RUN,RUN,27,RUN,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,ST,ST,25191,ST,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,TER,TER,10,TER,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,TRL,TRL,65,TRL,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,VW,VW,12,VW,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,WAY,WAY,1708,WAY,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,POSTTYPE,ROADTYPE,XING,XING,51,XING,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,PREDIR,ROADPREDIR,E,E,9953,E,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,PREDIR,ROADPREDIR,N,N,13539,N,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,PREDIR,ROADPREDIR,S,S,8685,S,resolved +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,PREDIR,ROADPREDIR,W,W,11192,W,resolved +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_CLASS,CLASS,?,?,4,,review +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_CLASS,CLASS,A,A,389,A,resolved +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_CLASS,CLASS,B,B,575,B,resolved +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_CLASS,CLASS,C,C,381,C,resolved +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_CLASS,CLASS,D,D,968,D,resolved +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_CLASS,CLASS,F,F,32,F,resolved +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_CLASS,CLASS,P,P,604,P,resolved +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_CLASS,CLASS,TBD,TBD,16,,review +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_CLASS,CLASS,TR,TR,2,,review +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_CLASS,CLASS,TRL,TRL,18,,review +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,0,0,6,,review +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,100,100,19,,review +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,115,115,16,,review +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,200,200,34,,review +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,91409 SEGMENT RANGE COR,91409 SEGMENT RANGE COR,2,,review +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,GRAVEL,GRAVEL,8,,review +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,Improved,IMPROVED,4,I,resolved +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,Improv_Agg/gravel,IMPROV_AGG/GRAVEL,166,,review +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,Improv_Crushed_agg,IMPROV_CRUSHED_AGG,12,,review +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,Improv_gravel,IMPROV_GRAVEL,5,,review +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,Improv_Mag_chlorid,IMPROV_MAG_CHLORID,1,,review +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,Improv_Oiled,IMPROV_OILED,16,,review +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,NATIVE,NATIVE,190,N,resolved +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,PAVED,PAVED,220,P,resolved +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,DOT_SRFTYP,S_SURF2,Paved_Asphalt,PAVED_ASPHALT,136,,review +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,ONEWAY,ONE_WAY,0,0,4734,0,resolved +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,PREDIR,PRE_DIR,c,C,1,,review +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,PREDIR,PRE_DIR,E,E,664,E,resolved +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,PREDIR,PRE_DIR,N,N,477,N,resolved +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,PREDIR,PRE_DIR,S,S,750,S,resolved +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,PREDIR,PRE_DIR,W,W,420,W,resolved +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,VERT_LEVEL,VERTLEVEL,0,0,4734,0,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTDIR,SUFDIR,E,E,2177,E,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTDIR,SUFDIR,N,N,2386,N,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTDIR,SUFDIR,S,S,3286,S,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTDIR,SUFDIR,W,W,3641,W,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,AVE,AVE,1238,AVE,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,BLVD,BLVD,272,BLVD,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,CIR,CIR,141,CIR,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,CRT,CRT,1,,review +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,CT,CT,100,CT,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,CV,CV,12,CV,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,CYN,CYN,32,CYN,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,DR,DR,1244,DR,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,FWY,FWY,46,FWY,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,HOLW,HOLW,6,HOLW,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,HWY,HWY,109,HWY,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,LN,LN,288,LN,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,LOOP,LOOP,2,LOOP,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,PATH,PATH,1,PATH,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,PKWY,PKWY,50,PKWY,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,PL,PL,10,PL,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,PT,PT,12,PT,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,RAMP,RAMP,60,RAMP,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,RD,RD,582,RD,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,RDG,RDG,4,RDG,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,ROW,ROW,2,ROW,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,RR,RR,108,,review +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,ST,ST,10438,ST,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,TRL,TRL,12,TRL,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,WAY,WAY,214,WAY,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,POSTTYPE,STREETTYPE,XING,XING,3,XING,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,PREDIR,PREDIR,E,E,2115,E,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,PREDIR,PREDIR,N,N,2699,N,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,PREDIR,PREDIR,S,S,3464,S,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,PREDIR,PREDIR,W,W,3844,W,resolved +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,0.0,0.0,195,,review +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,1.0,1.0,1,,review +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,10.0,10.0,1,,review +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,15.0,15.0,7,,review +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,19.0,19.0,4,,review +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,25.0,25.0,12513,,review +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,30.0,30.0,493,,review +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,35.0,35.0,911,,review +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,40.0,40.0,476,,review +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,45.0,45.0,116,,review +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,50.0,50.0,261,,review +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,55.0,55.0,164,,review +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,60.0,60.0,4,,review +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,SPEED_LMT,SPEEDLIMIT,65.0,65.0,15,,review diff --git a/cli/scripts/value-mapping-summary.csv b/cli/scripts/value-mapping-summary.csv new file mode 100644 index 0000000..a35fc75 --- /dev/null +++ b/cli/scripts/value-mapping-summary.csv @@ -0,0 +1,99 @@ +county,profile,source_features,status,detail +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,missing_source_field,STATUS_ maps to STATUS. +Beaver,beaver,C:\Mac\Home\Documents\working\utrans\county_obtained\Beaver\BeaverCo_20260604.gdb\Beaver_Roads2025,discovered,49 observed values. +BoxElder,boxelder,C:\Mac\Home\Documents\working\utrans\county_obtained\BoxElder\BoxElder_20260624.gdb\BECO_RDS,discovered,28 observed values. +Cache,cache,C:\Mac\Home\Documents\working\utrans\county_obtained\Cache\CacheCo_20260824.gdb\CacheCountyRoads,no_domain_mappings,No mapped target fields have coded-value domains. +Carbon,carbon,C:\Mac\Home\Documents\working\utrans\county_obtained\Carbon\Carbon20241031.gdb\Roads,missing_source_field,POSTDIR_ maps to POSTDIR. +Carbon,carbon,C:\Mac\Home\Documents\working\utrans\county_obtained\Carbon\Carbon20241031.gdb\Roads,missing_source_field,POSTTYPE_ maps to POSTTYPE. +Carbon,carbon,C:\Mac\Home\Documents\working\utrans\county_obtained\Carbon\Carbon20241031.gdb\Roads,missing_source_field,PREDIR_ maps to PREDIR. +Carbon,carbon,C:\Mac\Home\Documents\working\utrans\county_obtained\Carbon\Carbon20241031.gdb\Roads,discovered,0 observed values. +Daggett,daggett,C:\Mac\Home\Documents\working\utrans\county_obtained\Daggett\DaggettCo_20210515.gdb\Centerlines,discovered,43 observed values. +Davis,davis,C:\Mac\Home\Documents\working\utrans\county_obtained\Davis\DavisCounty_20260722.gdb\DavisRoads,discovered,49 observed values. +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,no_observations,ALIAS2TYPE maps to A2_POSTTYPE. +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,missing_source_field,ONEWAY_ maps to ONEWAY. +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,missing_source_field,PREDIR_ maps to PREDIR. +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,missing_source_field,STATUS_ maps to STATUS. +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,no_observations,VERTLEVEL maps to VERT_LEVEL. +Duchesne,duchesne,C:\Mac\Home\Documents\working\utrans\county_obtained\Duchesne\DuchesneCo_20191009.gdb\Centerlines,discovered,32 observed values. +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,no_observations,ALIAS2_TYP maps to A2_POSTTYPE. +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,missing_source_field,STATUS_ maps to STATUS. +Emery,emery,C:\Mac\Home\Documents\working\utrans\county_obtained\Emery\EmeryCo_20260611.gdb\Roads,discovered,46 observed values. +Garfield,garfield,C:\Mac\Home\Documents\working\utrans\county_obtained\Garfield\Garfield20260427.gdb\Garfield_Streets_Roads,missing_source_field,A1_POSTTYPE_ maps to A1_POSTTYPE. +Garfield,garfield,C:\Mac\Home\Documents\working\utrans\county_obtained\Garfield\Garfield20260427.gdb\Garfield_Streets_Roads,missing_source_field,A2_POSTTYPE_ maps to A2_POSTTYPE. +Garfield,garfield,C:\Mac\Home\Documents\working\utrans\county_obtained\Garfield\Garfield20260427.gdb\Garfield_Streets_Roads,missing_source_field,CARTOCODE_ maps to CARTOCODE. +Garfield,garfield,C:\Mac\Home\Documents\working\utrans\county_obtained\Garfield\Garfield20260427.gdb\Garfield_Streets_Roads,missing_source_field,DOT_CLASS_ maps to DOT_CLASS. +Garfield,garfield,C:\Mac\Home\Documents\working\utrans\county_obtained\Garfield\Garfield20260427.gdb\Garfield_Streets_Roads,missing_source_field,DOT_SRFTYP_ maps to DOT_SRFTYP. +Garfield,garfield,C:\Mac\Home\Documents\working\utrans\county_obtained\Garfield\Garfield20260427.gdb\Garfield_Streets_Roads,missing_source_field,ONEWAY_ maps to ONEWAY. +Garfield,garfield,C:\Mac\Home\Documents\working\utrans\county_obtained\Garfield\Garfield20260427.gdb\Garfield_Streets_Roads,missing_source_field,POSTDIR_ maps to POSTDIR. +Garfield,garfield,C:\Mac\Home\Documents\working\utrans\county_obtained\Garfield\Garfield20260427.gdb\Garfield_Streets_Roads,missing_source_field,POSTTYPE_ maps to POSTTYPE. +Garfield,garfield,C:\Mac\Home\Documents\working\utrans\county_obtained\Garfield\Garfield20260427.gdb\Garfield_Streets_Roads,missing_source_field,PREDIR_ maps to PREDIR. +Garfield,garfield,C:\Mac\Home\Documents\working\utrans\county_obtained\Garfield\Garfield20260427.gdb\Garfield_Streets_Roads,missing_source_field,SPEED_LMT_ maps to SPEED_LMT. +Garfield,garfield,C:\Mac\Home\Documents\working\utrans\county_obtained\Garfield\Garfield20260427.gdb\Garfield_Streets_Roads,missing_source_field,STATUS_ maps to STATUS. +Garfield,garfield,C:\Mac\Home\Documents\working\utrans\county_obtained\Garfield\Garfield20260427.gdb\Garfield_Streets_Roads,discovered,0 observed values. +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,missing_source_field,CARTOCODE_ maps to CARTOCODE. +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,missing_source_field,ONEWAY_ maps to ONEWAY. +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,missing_source_field,PREDIR_ maps to PREDIR. +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,missing_source_field,STATUS_ maps to STATUS. +Grand,grand,C:\Mac\Home\Documents\working\utrans\county_obtained\Grand\GrandCo_20260722.gdb\GC_ROADS_07_09_26,discovered,71 observed values. +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,missing_source_field,ONEWAY_ maps to ONEWAY. +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,missing_source_field,PREDIR_ maps to PREDIR. +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,missing_source_field,STATUS_ maps to STATUS. +Iron,iron,C:\Mac\Home\Documents\working\utrans\county_obtained\Iron\Iron_20260625.gdb\Iron_Roads06_25_2026,discovered,46 observed values. +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,no_observations,ALIAS2TYPE maps to A2_POSTTYPE. +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,missing_source_field,CARTOCODE_ maps to CARTOCODE. +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,no_observations,CLASS maps to DOT_CLASS. +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,missing_source_field,ONEWAY_ maps to ONEWAY. +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,missing_source_field,PREDIR_ maps to PREDIR. +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,missing_source_field,STATUS_ maps to STATUS. +Kane,kane,C:\Mac\Home\Documents\working\utrans\county_obtained\Kane\KaneCo_20250915.gdb\Kane_Street_Centerlines,discovered,46 observed values. +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,missing_source_field,CARTOCODE_ maps to CARTOCODE. +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,missing_source_field,PREDIR_ maps to PREDIR. +Millard,millard,C:\Mac\Home\Documents\working\utrans\county_obtained\Millard\Millard_20251217.gdb\Millard_Roads_Dec_2025,discovered,24 observed values. +Morgan,morgan,C:\Mac\Home\Documents\working\utrans\county_obtained\Morgan\MorganCo_20260519.gdb\Centerlines_May26,no_observations,onewaydir maps to ONEWAY. +Morgan,morgan,C:\Mac\Home\Documents\working\utrans\county_obtained\Morgan\MorganCo_20260519.gdb\Centerlines_May26,discovered,7 observed values. +Piute,piute,C:\Mac\Home\Documents\working\utrans\county_obtained\Piute\PiuteCo_20260414.gdb\Roads_2026_April,missing_source_field,POSTDIR_ maps to POSTDIR. +Piute,piute,C:\Mac\Home\Documents\working\utrans\county_obtained\Piute\PiuteCo_20260414.gdb\Roads_2026_April,missing_source_field,POSTTYPE_ maps to POSTTYPE. +Piute,piute,C:\Mac\Home\Documents\working\utrans\county_obtained\Piute\PiuteCo_20260414.gdb\Roads_2026_April,missing_source_field,PREDIR_ maps to PREDIR. +Piute,piute,C:\Mac\Home\Documents\working\utrans\county_obtained\Piute\PiuteCo_20260414.gdb\Roads_2026_April,discovered,0 observed values. +Rich,rich,C:\Mac\Home\Documents\working\utrans\county_obtained\Rich\RichCo_20211115.gdb\E911_RichRoads11_3_21,discovered,42 observed values. +SaltLake,saltlake,C:\Mac\Home\Documents\working\utrans\county_obtained\VECC\SaltLakeVECC_20260728.gdb\Centerlines,missing_source_field,DOT_SRFTYP_ maps to DOT_SRFTYP. +SaltLake,saltlake,C:\Mac\Home\Documents\working\utrans\county_obtained\VECC\SaltLakeVECC_20260728.gdb\Centerlines,missing_source_field,ONEWAY_ maps to ONEWAY. +SaltLake,saltlake,C:\Mac\Home\Documents\working\utrans\county_obtained\VECC\SaltLakeVECC_20260728.gdb\Centerlines,missing_source_field,POSTDIR_ maps to POSTDIR. +SaltLake,saltlake,C:\Mac\Home\Documents\working\utrans\county_obtained\VECC\SaltLakeVECC_20260728.gdb\Centerlines,missing_source_field,POSTTYPE_ maps to POSTTYPE. +SaltLake,saltlake,C:\Mac\Home\Documents\working\utrans\county_obtained\VECC\SaltLakeVECC_20260728.gdb\Centerlines,missing_source_field,PREDIR_ maps to PREDIR. +SaltLake,saltlake,C:\Mac\Home\Documents\working\utrans\county_obtained\VECC\SaltLakeVECC_20260728.gdb\Centerlines,missing_source_field,STATUS_ maps to STATUS. +SaltLake,saltlake,C:\Mac\Home\Documents\working\utrans\county_obtained\VECC\SaltLakeVECC_20260728.gdb\Centerlines,discovered,0 observed values. +SanJuan,sanjuan,C:\Mac\Home\Documents\working\utrans\county_obtained\SanJuan\SanJuanRoads_20250808.gdb\T2025SanJuanRoads,discovered,14 observed values. +Sevier,sevier,C:\Mac\Home\Documents\working\utrans\county_obtained\Sevier\SevierCo_20260514.gdb\SC911DataUpdate_260511,discovered,24 observed values. +Summit,summit,C:\Mac\Home\Documents\working\utrans\county_obtained\Summit\Summit_20260722.gdb\SummitRoads,missing_source_field,ONEWAY_ maps to ONEWAY. +Summit,summit,C:\Mac\Home\Documents\working\utrans\county_obtained\Summit\Summit_20260722.gdb\SummitRoads,missing_source_field,POST_DIR maps to POSTDIR. +Summit,summit,C:\Mac\Home\Documents\working\utrans\county_obtained\Summit\Summit_20260722.gdb\SummitRoads,missing_source_field,SUFF_TYPE maps to POSTTYPE. +Summit,summit,C:\Mac\Home\Documents\working\utrans\county_obtained\Summit\Summit_20260722.gdb\SummitRoads,missing_source_field,PREFIX_DIR maps to PREDIR. +Summit,summit,C:\Mac\Home\Documents\working\utrans\county_obtained\Summit\Summit_20260722.gdb\SummitRoads,missing_source_field,STATUS_ maps to STATUS. +Summit,summit,C:\Mac\Home\Documents\working\utrans\county_obtained\Summit\Summit_20260722.gdb\SummitRoads,discovered,0 observed values. +Tooele,tooele,C:\Mac\Home\Documents\working\utrans\county_obtained\Tooele\TooeleCo_20260514.gdb\TCRoads,missing_source_field,POSTDIR_ maps to POSTDIR. +Tooele,tooele,C:\Mac\Home\Documents\working\utrans\county_obtained\Tooele\TooeleCo_20260514.gdb\TCRoads,missing_source_field,POSTTYPE_ maps to POSTTYPE. +Tooele,tooele,C:\Mac\Home\Documents\working\utrans\county_obtained\Tooele\TooeleCo_20260514.gdb\TCRoads,missing_source_field,PREDIR_ maps to PREDIR. +Tooele,tooele,C:\Mac\Home\Documents\working\utrans\county_obtained\Tooele\TooeleCo_20260514.gdb\TCRoads,discovered,0 observed values. +Uintah,uintah,C:\Mac\Home\Documents\working\utrans\county_obtained\Uintah\UintahCo20260423.gdb\Roads,missing_source_field,SUF_DIR maps to POSTDIR. +Uintah,uintah,C:\Mac\Home\Documents\working\utrans\county_obtained\Uintah\UintahCo20260423.gdb\Roads,missing_source_field,S_TYPE maps to POSTTYPE. +Uintah,uintah,C:\Mac\Home\Documents\working\utrans\county_obtained\Uintah\UintahCo20260423.gdb\Roads,missing_source_field,PRE_DIR maps to PREDIR. +Uintah,uintah,C:\Mac\Home\Documents\working\utrans\county_obtained\Uintah\UintahCo20260423.gdb\Roads,discovered,2 observed values. +Utah,utah,C:\Mac\Home\Documents\working\utrans\county_obtained\Utah\UtahCo_20260824.gdb\RoadCenterline,discovered,50 observed values. +Wasatch,wasatch,C:\Mac\Home\Documents\working\utrans\county_obtained\Wasatch\WasatchCounty20260604.gdb\WC_ROAD,missing_source_field,POSTDIR_ maps to POSTDIR. +Wasatch,wasatch,C:\Mac\Home\Documents\working\utrans\county_obtained\Wasatch\WasatchCounty20260604.gdb\WC_ROAD,missing_source_field,POSTTYPE_ maps to POSTTYPE. +Wasatch,wasatch,C:\Mac\Home\Documents\working\utrans\county_obtained\Wasatch\WasatchCounty20260604.gdb\WC_ROAD,missing_source_field,PREDIR_ maps to PREDIR. +Wasatch,wasatch,C:\Mac\Home\Documents\working\utrans\county_obtained\Wasatch\WasatchCounty20260604.gdb\WC_ROAD,discovered,0 observed values. +Washington,washington,C:\Mac\Home\Documents\working\utrans\county_obtained\Washington\Washington20260722.gdb\WashCo_RoadCenterlines,missing_source_field,A1_POSTDIR_ maps to A1_POSTDIR. +Washington,washington,C:\Mac\Home\Documents\working\utrans\county_obtained\Washington\Washington20260722.gdb\WashCo_RoadCenterlines,missing_source_field,A1_POSTTYPE_ maps to A1_POSTTYPE. +Washington,washington,C:\Mac\Home\Documents\working\utrans\county_obtained\Washington\Washington20260722.gdb\WashCo_RoadCenterlines,missing_source_field,A2_POSTDIR_ maps to A2_POSTDIR. +Washington,washington,C:\Mac\Home\Documents\working\utrans\county_obtained\Washington\Washington20260722.gdb\WashCo_RoadCenterlines,missing_source_field,A2_POSTTYPE_ maps to A2_POSTTYPE. +Washington,washington,C:\Mac\Home\Documents\working\utrans\county_obtained\Washington\Washington20260722.gdb\WashCo_RoadCenterlines,missing_source_field,AN_POSTDIR_ maps to AN_POSTDIR. +Washington,washington,C:\Mac\Home\Documents\working\utrans\county_obtained\Washington\Washington20260722.gdb\WashCo_RoadCenterlines,missing_source_field,ONEWAY_ maps to ONEWAY. +Washington,washington,C:\Mac\Home\Documents\working\utrans\county_obtained\Washington\Washington20260722.gdb\WashCo_RoadCenterlines,missing_source_field,POSTDIR_ maps to POSTDIR. +Washington,washington,C:\Mac\Home\Documents\working\utrans\county_obtained\Washington\Washington20260722.gdb\WashCo_RoadCenterlines,missing_source_field,POSTTYPE_ maps to POSTTYPE. +Washington,washington,C:\Mac\Home\Documents\working\utrans\county_obtained\Washington\Washington20260722.gdb\WashCo_RoadCenterlines,missing_source_field,PREDIR_ maps to PREDIR. +Washington,washington,C:\Mac\Home\Documents\working\utrans\county_obtained\Washington\Washington20260722.gdb\WashCo_RoadCenterlines,missing_source_field,STATUS_ maps to STATUS. +Washington,washington,C:\Mac\Home\Documents\working\utrans\county_obtained\Washington\Washington20260722.gdb\WashCo_RoadCenterlines,discovered,0 observed values. +Wayne,wayne,C:\Mac\Home\Documents\working\utrans\county_obtained\Wayne\WayneCo_20260414.gdb\WayneCoRds_20260409,discovered,32 observed values. +Weber,weber,C:\Mac\Home\Documents\working\utrans\county_obtained\Weber\WeberCounty_20260729.gdb\weber_centerline,discovered,48 observed values. diff --git a/cli/src/utrans/cli.py b/cli/src/utrans/cli.py index f741a72..b667dae 100644 --- a/cli/src/utrans/cli.py +++ b/cli/src/utrans/cli.py @@ -6,6 +6,7 @@ import sys from utrans import __version__ +from utrans.detect_changes import main as detect_changes_main from utrans.etl import main as etl_main from utrans.recent_edits import main as recent_edits_main @@ -25,6 +26,10 @@ def build_parser() -> argparse.ArgumentParser: "etl", help="Transform county roads into the UTRANS schema.", ) + subparsers.add_parser( + "detect-changes", + help="Detect and publish changes from ETL-produced roads.", + ) return parser @@ -42,6 +47,9 @@ def main(argv: list[str] | None = None) -> int: if arguments[0] == "etl": print(f"utrans {__version__}") return etl_main(arguments[1:], prog="utrans etl") + if arguments[0] == "detect-changes": + print(f"utrans {__version__}") + return detect_changes_main(arguments[1:], prog="utrans detect-changes") try: parser.parse_args(arguments) diff --git a/cli/src/utrans/detect_changes.py b/cli/src/utrans/detect_changes.py new file mode 100644 index 0000000..3326108 --- /dev/null +++ b/cli/src/utrans/detect_changes.py @@ -0,0 +1,196 @@ +"""Detect and publish changes from an ETL-produced UTRANS feature class.""" + +from __future__ import annotations + +import argparse +import os +import re +from datetime import UTC, datetime +from pathlib import Path +from typing import Literal + +import arcpy + +from utrans.profiles import format_county_help, load_profiles, resolve_county_profile +from utrans.recent_edits import ( + ensure_detect_feature_changes_license, +) +from utrans.utilities import get_output_workspace, log + +MATCH_FIELDS = "NAME NAME" +COMPARE_FIELDS = ( + "PREDIR PREDIR; POSTTYPE POSTTYPE; NAME NAME; POSTDIR POSTDIR; " + "FROMADDR_L FROMADDR_L; TOADDR_L TOADDR_L; FROMADDR_R FROMADDR_R; " + "TOADDR_R TOADDR_R; A1_PREDIR A1_PREDIR; A1_NAME A1_NAME; " + "A1_POSTTYPE A1_POSTTYPE; A1_POSTDIR A1_POSTDIR; A2_PREDIR A2_PREDIR; " + "A2_NAME A2_NAME; A2_POSTTYPE A2_POSTTYPE; A2_POSTDIR A2_POSTDIR; " + "AN_NAME AN_NAME; AN_POSTDIR AN_POSTDIR" +) +DFC_OUTPUT_NAME = "DFC_RESULT" +STATS_TABLE_NAME = "new_roads_stats" +TEST_OUTPUT_NAME = "TEST_DFC_RESULT" +CHANGE_FILTER = "CHANGE_TYPE NOT IN ('NC', 'D')" +SEARCH_DISTANCE = "50 Feet" +CHANGE_TOLERANCE = "50 Feet" + + +def extract_fips(fips_setting: str) -> str: + """Extract the five-digit FIPS code from a profile value.""" + match = re.search(r"\b\d{5}\b", str(fips_setting)) + if not match: + raise RuntimeError(f"Invalid county FIPS setting: '{fips_setting}'.") + return match.group(0) + + +def _field_exists(feature_class: str, field_name: str) -> bool: + return any( + field.name.upper() == field_name for field in arcpy.ListFields(feature_class) + ) + + +def add_dfc_fields(dfc_output: str, fips: str) -> None: + fields: tuple[tuple[str, Literal["TEXT", "DATE"], int | None], ...] = ( + ("CURRENT_NOTES", "TEXT", 50), + ("PREV__NOTES", "TEXT", 50), + ("EDITOR", "TEXT", 20), + ("EDIT_DATE", "DATE", None), + ("DATE_ADDED", "DATE", None), + ("COFIPS", "TEXT", 5), + ) + for name, field_type, length in fields: + if not _field_exists(dfc_output, name): + if length is None: + arcpy.management.AddField(dfc_output, name, field_type) + else: + arcpy.management.AddField( + dfc_output, name, field_type, field_length=length + ) + + with arcpy.da.UpdateCursor(dfc_output, ["DATE_ADDED", "COFIPS"]) as rows: + for row in rows: + row[0] = datetime.now(UTC) + row[1] = fips + rows.updateRow(row) + + +def _resolve_field_mapping(feature_classes: tuple[str, ...], mapping: str) -> str: + available_fields = [ + {field.name.upper() for field in arcpy.ListFields(feature_class)} + for feature_class in feature_classes + ] + pairs: list[str] = [] + for token in mapping.split(";"): + parts = token.strip().split() + if len(parts) < 2: + continue + update_field, base_field = parts[0], parts[1] + if all( + update_field.upper() in fields and base_field.upper() in fields + for fields in available_fields + ): + pairs.append(f"{update_field} {base_field}") + if not pairs: + raise RuntimeError( + "No fields from the fixed mapping were found in both datasets." + ) + return "; ".join(pairs) + + +def run_detect_changes( + update_features: str, + base_features: str, + fips: str, + append_target: str, +) -> tuple[str, str]: + arcpy.env.overwriteOutput = True + output_workspace = get_output_workspace(update_features) + dfc_output = os.path.join(output_workspace, DFC_OUTPUT_NAME) + stats_table = os.path.join(output_workspace, STATS_TABLE_NAME) + test_output = os.path.join(output_workspace, TEST_OUTPUT_NAME) + base_layer = "detect_changes_base" + + arcpy.management.MakeFeatureLayer( + base_features, + base_layer, + f"COUNTY_L = '{fips}' OR COUNTY_R = '{fips}'", + ) + try: + datasets = (update_features, base_features) + match_fields = _resolve_field_mapping(datasets, MATCH_FIELDS) + compare_fields = _resolve_field_mapping(datasets, COMPARE_FIELDS) + log("Running DetectFeatureChanges") + arcpy.management.DetectFeatureChanges( + update_features, + base_layer, + dfc_output, + SEARCH_DISTANCE, + match_fields, + stats_table, + CHANGE_TOLERANCE, + compare_fields, + ) + add_dfc_fields(dfc_output, fips) + arcpy.AlterAliasName(dfc_output, "DFC_RESULT") + + changed_layer = "detect_changes_output" + arcpy.management.MakeFeatureLayer(dfc_output, changed_layer, CHANGE_FILTER) + log(f"Creating detect-changes output test feature class: {test_output}") + arcpy.management.CopyFeatures(changed_layer, test_output) + arcpy.management.Append(changed_layer, append_target, "NO_TEST") + log(f"Appended changed features to {append_target}") + return dfc_output, test_output + finally: + if arcpy.Exists(base_layer): + arcpy.management.Delete(base_layer) + + +def build_parser(prog: str | None = None): + profiles = load_profiles() + parser = argparse.ArgumentParser( + prog=prog, + description="Detect changes in ETL-produced UTRANS roads.", + ) + parser.add_argument( + "--county", + required=True, + help=f"County profile key: {format_county_help(profiles)}.", + ) + parser.add_argument( + "--update-features", required=True, help="ETL-produced road feature class." + ) + parser.add_argument( + "--utrans-features", required=True, help="UTRANS baseline road feature class." + ) + parser.add_argument( + "--append-target", + required=True, + help="Feature class to receive the filtered change features.", + ) + parser.add_argument( + "--profiles", type=Path, help="Path to a custom profiles JSON file." + ) + return parser + + +def main(argv=None, *, prog: str | None = None): + parser = build_parser(prog=prog) + args = parser.parse_args(argv) + try: + profiles = load_profiles(args.profiles) + profile = resolve_county_profile(args.county, profiles) + fips = extract_fips(profile.require("fips")) + ensure_detect_feature_changes_license() + run_detect_changes( + args.update_features, + args.utrans_features, + fips, + args.append_target, + ) + except RuntimeError as exc: + log(str(exc)) + return 2 + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/cli/src/utrans/etl.py b/cli/src/utrans/etl.py index 33be914..354704c 100644 --- a/cli/src/utrans/etl.py +++ b/cli/src/utrans/etl.py @@ -23,16 +23,22 @@ load_profiles, resolve_county_profile, ) -from utrans.utilities import log +from utrans.utilities import get_output_workspace, log + +ETL_OUTPUT_DATE_FORMAT = "%Y%m%d" +COUNTY_BOUNDARY_NAMES = { + "boxelder": "BOX ELDER", + "saltlake": "SALT LAKE", + "sanjuan": "SAN JUAN", +} def _default_output_name(county: str) -> str: - return f"{county}_etl_{datetime.now(UTC):%Y%m%d}" + return f"{county}_etl_{datetime.now(UTC):{ETL_OUTPUT_DATE_FORMAT}}" def _county_boundary_name(county: str) -> str: - names = {"boxelder": "BOX ELDER", "saltlake": "SALT LAKE", "sanjuan": "SAN JUAN"} - return names.get(county, county.upper()) + return COUNTY_BOUNDARY_NAMES.get(county, county.upper()) def _unique_name(prefix: str) -> str: @@ -63,22 +69,19 @@ def _rename_colliding_fields(source_features: str, utrans_roads: str) -> None: def _validate_output(output_features: str) -> None: if arcpy.Exists(output_features): - raise RuntimeError( - f"Output already exists: {output_features}. Choose --output-name with a new name." - ) + raise RuntimeError(f"Output already exists: {output_features}.") def run_etl( source_features: str, utrans_roads: str, - output_workspace: str, county_boundaries: str, county: str, profile: CountyProfile, - output_name: str, - county_boundary_name: str | None = None, ) -> str: """Run the county transformation and export whole roads intersecting its boundary.""" + output_workspace = get_output_workspace(source_features) + output_name = _default_output_name(county) if not arcpy.Exists(source_features): raise RuntimeError(f"Source features do not exist: {source_features}") if not arcpy.Exists(utrans_roads): @@ -113,7 +116,7 @@ def run_etl( arcpy.edit.Densify(staging_output, "ANGLE") arcpy.edit.Generalize(staging_output, "2 Meters") - boundary_name = county_boundary_name or _county_boundary_name(county) + boundary_name = _county_boundary_name(county) boundary_field = field_name_map(county_boundaries).get("NAME") if boundary_field is None: raise RuntimeError("County boundaries must include a NAME field.") @@ -153,20 +156,9 @@ def build_parser(prog: str | None = None) -> argparse.ArgumentParser: required=True, help="UTRANS roads feature class used as the target schema.", ) - parser.add_argument( - "--output-workspace", required=True, help="Geodatabase for the ETL output." - ) parser.add_argument( "--county-boundaries", required=True, help="County boundary feature class." ) - parser.add_argument( - "--output-name", - help="Output feature class name. Defaults to county_etl_YYYYMMDD.", - ) - parser.add_argument( - "--county-boundary-name", - help="Override the NAME value used to select the county boundary.", - ) parser.add_argument( "--profiles", metavar="PATH", help="Custom flat profiles JSON file." ) @@ -182,12 +174,9 @@ def main(argv: list[str] | None = None, *, prog: str | None = None) -> int: run_etl( args.source_features, args.utrans_roads, - args.output_workspace, args.county_boundaries, profile.key, profile, - args.output_name or _default_output_name(profile.key), - args.county_boundary_name, ) except (RuntimeError, TypeError, FileNotFoundError, json.JSONDecodeError) as exc: log(str(exc)) diff --git a/cli/src/utrans/etl_mappers.py b/cli/src/utrans/etl_mappers.py index ebcbccf..847af9b 100644 --- a/cli/src/utrans/etl_mappers.py +++ b/cli/src/utrans/etl_mappers.py @@ -219,12 +219,6 @@ def apply_mapper(feature_class: str, profile: CountyProfile, utrans_roads: str) domains = domain_values(utrans_roads) _validate_value_mappings(profile, value_mappings, names, domains) posttypes = domains.get("POSTTYPE", {}) - vertical_translation = profile.get("translate_vertical_levels", False) - if not isinstance(vertical_translation, bool): - raise TypeError( - f"Profile '{profile.key}' setting 'translate_vertical_levels' must be true or false." - ) - with arcpy.da.UpdateCursor(feature_class, fields) as cursor: for row in cursor: for target, source in mappings.items(): @@ -237,10 +231,6 @@ def apply_mapper(feature_class: str, profile: CountyProfile, utrans_roads: str) row[target_index] = row[source_index] continue source_value = row[source_index] - if vertical_translation and target.upper() == "VERT_LEVEL": - source_value = {"1": "0", "2": "1", "3": "2"}.get( - str(source_value).strip(), source_value - ) source_value = value_mappings.get(target.upper(), {}).get( str(source_value).strip().upper(), source_value ) diff --git a/cli/src/utrans/profiles.json b/cli/src/utrans/profiles.json index 2c453ba..0d14d39 100644 --- a/cli/src/utrans/profiles.json +++ b/cli/src/utrans/profiles.json @@ -4,14 +4,43 @@ "field_mappings": "FROMADDR_L=L_F_ADD; TOADDR_L=L_T_ADD; FROMADDR_R=R_F_ADD; TOADDR_R=R_T_ADD; NAME=STREETNAME; POSTDIR=SUFDIR; AN_NAME=ACSNAME; A1_NAME=ALIAS1; A2_NAME=ALIAS2; LOCAL_UID=CO_UNIQUE; STATUS=STATUS_; POSTTYPE=STREETTYPE; DOT_SRFTYP=SURFTYPE; DOT_CLASS=CLASS; VERT_LEVEL=VERTLEVEL", "fips": "49001 - Beaver", "match_fields": "STREETNAME STREETNAME", - "translate_vertical_levels": true + "value_mappings": { + "VERT_LEVEL": { + "1": "0", + "2": "1", + "3": "2" + }, + "DOT_SRFTYP": { + "100": "P", + "110": "P", + "115": "P", + "200": "I", + "210": "I", + "211": "I", + "223": "I", + "300": "N", + "310": "N", + "320": "N", + "999": "U" + }, + "POSTTYPE": { + "CR": "CIR", + "TR": "TER" + } + } }, "boxelder": { "compare_fields": "L_F_ADD L_F_ADD; L_T_ADD L_T_ADD; R_F_ADD R_F_ADD; R_T_ADD R_T_ADD; PRE_DIR PRE_DIR; S_NAME S_NAME; S_TYPE S_TYPE; SUF_DIR SUF_DIR; ACS_ALIAS ACS_ALIAS; ACS_NAME ACS_NAME; ACS_SUF ACS_SUF; ALIAS1 ALIAS1; ALIAS1_TYP ALIAS1_TYP; ALIAS2 ALIAS2; ALIAS2_TYP ALIAS2_TYP", "field_mappings": "FROMADDR_L=L_F_ADD; TOADDR_L=L_T_ADD; FROMADDR_R=R_F_ADD; TOADDR_R=R_T_ADD; PREDIR=PRE_DIR; NAME=S_NAME; POSTDIR=SUF_DIR; AN_NAME=ACS_NAME; A1_NAME=ALIAS1; A2_NAME=ALIAS2; LOCAL_UID=CO_UNIQUE; POSTTYPE=S_TYPE; DOT_CLASS=CLASS; VERT_LEVEL=VERTLEVEL", "fips": "49003 - Box Elder", "match_fields": "S_NAME S_NAME", - "translate_vertical_levels": true + "value_mappings": { + "VERT_LEVEL": { + "1": "0", + "2": "1", + "3": "2" + } + } }, "cache": { "compare_fields": "PRE_DIR PRE_DIR; GEOCODEST GEOCODEST; TYPE TYPE; FAL FAL; TAL TAL; FAR FAR; TAR TAR; AliasPreDir AliasPreDir; AliasStreet AliasStreet; AliasType AliasType; AliasSufDir AliasSufDir; SUFFDIR SUFFDIR", @@ -31,7 +60,21 @@ "field_mappings": "FROMADDR_L=L_F_ADD; TOADDR_L=L_T_ADD; FROMADDR_R=R_F_ADD; TOADDR_R=R_T_ADD; PREDIR=PRE_DIR; NAME=S_NAME; A2_NAME=ALIAS2; LOCAL_UID=CO_UNIQUE; STATUS=S_STATUS; POSTTYPE=S_TYPE; A2_POSTTYPE=ALIAS2_TYP; DOT_CLASS=CLASS; ONEWAY=ONE_WAY; DOT_SRFTYP=S_SURF2; SPEED_LMT=SPD_LMT", "fips": "49009 - Daggett", "match_fields": "S_NAME S_NAME", - "parse_sources": "ALIAS1=A1; ALIAS2=A2; ACS_ALIAS=A1" + "parse_sources": "ALIAS1=A1; ALIAS2=A2; ACS_ALIAS=A1", + "value_mappings": { + "DOT_SRFTYP": { + "GRAVEL": "I", + "IMPROV_AGG/GRAVEL": "I", + "MAINTAIN_NATIVE": "N", + "PAVED_ASPHALT": "P-ASP" + }, + "SPEED_LMT": { + "0": "25" + }, + "STATUS": { + "A": "Active" + } + } }, "davis": { "compare_fields": "PrefixDirection PrefixDirection; RoadName RoadName; RoadNameType RoadNameType; PostDirection PostDirection; RoadAliasName RoadAliasName; LeftFrom LeftFrom; LeftTo LeftTo; RightFrom RightFrom; RightTo RightTo; MPH MPH", @@ -39,18 +82,16 @@ "field_mappings": "FROMADDR_L=LeftFrom; TOADDR_L=LeftTo; FROMADDR_R=RightFrom; TOADDR_R=RightTo; PREDIR=PrefixDirection; NAME=RoadName; POSTTYPE=RoadNameType; POSTDIR=PostDirection; DOT_SRFTYP=RoadSurfaceType", "fips": "49011 - Davis", "match_fields": "RoadName RoadName", - "required_fields": [ - "PrefixDirection", - "RoadName", - "RoadNameType", - "PostDirection", - "RoadAliasName", - "LeftFrom", - "LeftTo", - "RightFrom", - "RightTo", - "MPH" - ] + "value_mappings": { + "DOT_SRFTYP": { + "ASPHALT": "P-ASP", + "CONCRETE": "P-CON", + "GRAVEL": "I" + }, + "POSTTYPE": { + "WY": "WAY" + } + } }, "duchesne": { "compare_fields": "PREDIR PREDIR; STREETNAME STREETNAME; STREETTYPE STREETTYPE; L_F_ADD L_F_ADD; L_T_ADD L_T_ADD; R_F_ADD R_F_ADD; R_T_ADD R_T_ADD; ALIAS1 ALIAS1; ALIAS1TYPE ALIAS1TYPE; ALIAS2 ALIAS2; ALIAS2TYPE ALIAS2TYPE; ACSNAME ACSNAME; ACSSUF ACSSUF; SUFDIR SUFDIR", @@ -58,7 +99,17 @@ "fips": "49013 - Duchesne", "match_fields": "STREETNAME STREETNAME", "parse_sources": "ALIAS1=A1; ALIAS2=A2", - "translate_vertical_levels": true + "value_mappings": { + "VERT_LEVEL": { + "1": "0", + "2": "1", + "3": "2" + }, + "DOT_SRFTYP": { + "300": "N", + "GRAVEL": "I" + } + } }, "emery": { "compare_fields": "PRE_DIR PRE_DIR; S_NAME S_NAME; S_TYPE S_TYPE; L_F_ADD L_F_ADD; L_T_ADD L_T_ADD; R_F_ADD R_F_ADD; R_T_ADD R_T_ADD; ALIAS1 ALIAS1; ALIAS1_TYP ALIAS1_TYP; ALIAS2 ALIAS2; ALIAS2_TYP ALIAS2_TYP; SUF_DIR SUF_DIR", @@ -66,7 +117,14 @@ "exclude_if_any": "S_SURF=400,410,420,430,440", "field_mappings": "FROMADDR_L=L_F_ADD; TOADDR_L=L_T_ADD; FROMADDR_R=R_F_ADD; TOADDR_R=R_T_ADD; PREDIR=PRE_DIR; NAME=S_NAME; POSTDIR=SUF_DIR; AN_NAME=ACS_ALIAS; A1_NAME=ALIAS1; A2_NAME=ALIAS2; LOCAL_UID=CO_UNIQUE; STATUS=STATUS_; POSTTYPE=S_TYPE; DOT_CLASS=CLASS; ONEWAY=ONE_WAY; DOT_SRFTYP=S_SURF2; SPEED_LMT=SPD_LMT; A1_POSTTYPE=ALIAS1_TYP; A2_POSTTYPE=ALIAS2_TYP", "fips": "49015 - Emery", - "match_fields": "S_NAME S_NAME" + "match_fields": "S_NAME S_NAME", + "value_mappings": { + "DOT_SRFTYP": { + "300": "N", + "320": "N", + "MAINTAINED NATIVE": "N" + } + } }, "garfield": { "compare_fields": "FROMADDR_L FROMADDR_L; TOADDR_L TOADDR_L; FROMADDR_R FROMADDR_R; TOADDR_R TOADDR_R; NAME NAME; PREDIR PREDIR; POSTDIR POSTDIR; POSTTYPE POSTTYPE; AN_NAME AN_NAME; A1_NAME A1_NAME; A2_NAME A2_NAME", @@ -86,14 +144,47 @@ "ACSALIAS", "ALIAS1", "ALIAS2" - ] + ], + "value_mappings": { + "DOT_CLASS": { + "BLM": "F", + "DWR": "A", + "FS": "F" + }, + "DOT_SRFTYP": { + "100": "P", + "200": "I", + "300": "N" + }, + "SPEED_LMT": { + "0": "25" + } + } }, "iron": { "compare_fields": "PREDIR PREDIR; STREETNAME STREETNAME; STREETTYPE STREETTYPE; SUFDIR SUFDIR; ALIAS1 ALIAS1; ALIAS1TYPE ALIAS1TYPE; ALIAS2 ALIAS2; ALIAS2TYPE ALIAS2TYPE; ACSALIAS ACSALIAS; ACSNAME ACSNAME; ACSSUF ACSSUF; L_F_ADD L_F_ADD; L_T_ADD L_T_ADD; R_F_ADD R_F_ADD; R_T_ADD R_T_ADD", "field_mappings": "FROMADDR_L=L_F_ADD; TOADDR_L=L_T_ADD; FROMADDR_R=R_F_ADD; TOADDR_R=R_T_ADD; PREDIR=PREDIR_; NAME=STREETNAME; POSTDIR=SUFDIR; AN_NAME=ACSNAME; A1_NAME=ALIAS1; A2_NAME=ALIAS2; LOCAL_UID=COUNIQUE; POSTTYPE=STREETTYPE; ONEWAY=ONEWAY_; DOT_SRFTYP=SURFTYPE; STATUS=STATUS_; DOT_CLASS=CLASS; VERT_LEVEL=VERTLEVEL", "fips": "49021 - Iron", "match_fields": "STREETNAME STREETNAME", - "translate_vertical_levels": true + "value_mappings": { + "VERT_LEVEL": { + "1": "0", + "2": "1", + "3": "2" + }, + "DOT_SRFTYP": { + "100": "P", + "200": "I", + "300": "N", + "999": "U" + }, + "POSTTYPE": { + "DIR": "DR", + "LP": "LOOP", + "RDE": "RD", + "WY": "WAY" + } + } }, "kane": { "compare_fields": "PREDIR PREDIR; STREETNAME STREETNAME; STREETTYPE STREETTYPE; SUFDIR SUFDIR; ACSALIAS ACSALIAS; ALIAS1 ALIAS1; ALIAS1TYPE ALIAS1TYPE; ALIAS2 ALIAS2; ALIAS2TYPE ALIAS2TYPE; L_F_ADD L_F_ADD; L_T_ADD L_T_ADD; R_F_ADD R_F_ADD; R_T_ADD R_T_ADD", @@ -101,7 +192,18 @@ "exclude_if_any": "SURFTYPE=400,410,420,430,440,999", "field_mappings": "FROMADDR_L=L_F_ADD; TOADDR_L=L_T_ADD; FROMADDR_R=R_F_ADD; TOADDR_R=R_T_ADD; PREDIR=PREDIR_; NAME=STREETNAME; POSTDIR=SUFDIR; AN_NAME=ACSNAME; A1_NAME=ALIAS1; A2_NAME=ALIAS2; LOCAL_UID=COUNIQUE; STATUS=STATUS_; POSTTYPE=STREETTYPE; A1_POSTTYPE=ALIAS1TYPE; A2_POSTTYPE=ALIAS2TYPE; DOT_CLASS=CLASS; ONEWAY=ONEWAY_; DOT_SRFTYP=SURFTYPE; CARTOCODE=CARTOCODE_; SPEED_LMT=SPEED", "fips": "49025 - Kane", - "match_fields": "STREETNAME STREETNAME" + "match_fields": "STREETNAME STREETNAME", + "value_mappings": { + "POSTTYPE": { + "LP": "LOOP", + "SST": "ST", + "TR": "TER", + "WY": "WAY" + }, + "SPEED_LMT": { + "0": "25" + } + } }, "millard": { "compare_fields": "PREDIR PREDIR; FULLNAME FULLNAME; STREETTYPE STREETTYPE; SUFDIR SUFDIR; ALIAS1 ALIAS1; ALIAS1TYPE ALIAS1TYPE; ALIAS2 ALIAS2; ALIAS2TYPE ALIAS2TYPE; L_F_ADD L_F_ADD; L_T_ADD L_T_ADD; R_F_ADD R_F_ADD; R_T_ADD R_T_ADD", @@ -127,7 +229,27 @@ "field_mappings": "FROMADDR_L=L_F_ADD; TOADDR_L=L_T_ADD; FROMADDR_R=R_F_ADD; TOADDR_R=R_T_ADD; PREDIR=PRE_DIR; NAME=S_NAME; LOCAL_UID=CO_UNIQUE; POSTTYPE=S_TYPE; A1_POSTTYPE=ALIAS1_TYP; A2_POSTTYPE=ALIAS2_TYP; ONEWAY=ONE_WAY; DOT_SRFTYP=S_SURF; SPEED_LMT=SPD_LMT", "fips": "49033 - Rich", "match_fields": "S_NAME S_NAME", - "parse_sources": "ALIAS1=A1; ALIAS2=A2; ACS_ALIAS=A1" + "parse_sources": "ALIAS1=A1; ALIAS2=A2; ACS_ALIAS=A1", + "value_mappings": { + "DOT_SRFTYP": { + "100": "P", + "115": "P", + "200": "I", + "210": "I", + "211": "I", + "221": "I", + "223": "I", + "300": "N", + "310": "N", + "320": "N" + }, + "POSTTYPE": { + "CR": "CIR" + }, + "SPEED_LMT": { + "0": "25" + } + } }, "saltlake": { "compare_fields": "PREDIR PREDIR; NAME NAME; POSTTYPE POSTTYPE; POSTDIR POSTDIR; AN_NAME AN_NAME; AN_POSTDIR AN_POSTDIR; FROMADDR_L FROMADDR_L; TOADDR_L TOADDR_L; FROMADDR_R FROMADDR_R; TOADDR_R TOADDR_R", @@ -140,7 +262,20 @@ "field_mappings": "NAME=S_NAME; LOCAL_UID=CO_UNIQUE; DOT_CLASS=CLASS", "fips": "49037 - San Juan", "match_fields": "S_NAME S_NAME", - "parse_sources": "S_NAME=PRIMARY" + "parse_sources": "S_NAME=PRIMARY", + "value_mappings": { + "DOT_CLASS": { + "B ROAD": "B", + "C ROAD": "C", + "D ROAD": "D", + "FEDERAL": "F", + "PRIVATE": "P", + "PRIVATE ROAD": "P", + "STATE HIGHWAY": "A", + "UDOT": "A", + "US HIGHWAY": "A" + } + } }, "sanpete": { "compare_fields": "", @@ -170,7 +305,11 @@ "field_mappings": "FULLNAME=FULLNAME_; FROMADDR_L=FROMADDR_L_; TOADDR_L=TOADDR_L_; FROMADDR_R=FROMADDR_R_; TOADDR_R=TOADDR_R_; PREDIR=PREDIR_; NAME=NAME_; POSTTYPE=POSTTYPE_; POSTDIR=POSTDIR_; AN_NAME=AN_NAME_; A1_NAME=A1_NAME_; A2_NAME=A2_NAME_; LOCAL_UID=LOCAL_UID_", "fips": "49045 - Tooele", "match_fields": "FULLNAME FULLNAME", - "uppercase_normalize_fields": ["FULLNAME", "A1_NAME", "A2_NAME"] + "uppercase_normalize_fields": [ + "FULLNAME", + "A1_NAME", + "A2_NAME" + ] }, "uintah": { "compare_fields": "toleft toleft; toright toright; fromleft fromleft; fromright fromright; S_NAME S_NAME; ALIAS1 ALIAS1", @@ -179,7 +318,15 @@ "fips": "49047 - Uintah", "match_fields": "S_NAME S_NAME", "parse_sources": "S_NAME=PRIMARY; ALIAS1=A1", - "uppercase_normalize_fields": ["S_NAME", "ALIAS1"] + "uppercase_normalize_fields": [ + "S_NAME", + "ALIAS1" + ], + "value_mappings": { + "SPEED_LMT": { + "0": "25" + } + } }, "utah": { "compare_fields": "ROADPREDIR ROADPREDIR; ROADNAME ROADNAME; ROADTYPE ROADTYPE; ROADPOSTDIR ROADPOSTDIR; ALTROADNAME ALTROADNAME; ALTROADTYPE ALTROADTYPE; ALTROADNAME2 ALTROADNAME2; ALTROADTYPE2 ALTROADTYPE2; FROMLEFT FROMLEFT; TOLEFT TOLEFT; FROMRIGHT FROMRIGHT; TORIGHT TORIGHT", @@ -187,14 +334,24 @@ "field_mappings": "FROMADDR_L=FROMLEFT; TOADDR_L=TOLEFT; FROMADDR_R=FROMRIGHT; TOADDR_R=TORIGHT; PREDIR=ROADPREDIR; NAME=ROADNAME; POSTTYPE=ROADTYPE; POSTDIR=ROADPOSTDIR; A1_NAME=ALTROADNAME; A1_POSTTYPE=ALTROADTYPE; A2_NAME=ALTROADNAME2", "fips": "49049 - Utah", "match_fields": "ROADNAME ROADNAME", - "rules": ["remove_posttype_if_numeric"] + "rules": [ + "remove_posttype_if_numeric" + ], + "value_mappings": { + "POSTTYPE": { + "OFF": "RAMP", + "ON": "RAMP" + } + } }, "wasatch": { "compare_fields": "FROMADDR_L FROMADDR_L; TOADDR_L TOADDR_L; FROMADDR_R FROMADDR_R; TOADDR_R TOADDR_R; FULLNAME FULLNAME; PREDIR PREDIR; AN_NAME AN_NAME", "field_mappings": "FULLNAME=FULLNAME_; FROMADDR_L=FROMADDR_L_; TOADDR_L=TOADDR_L_; FROMADDR_R=FROMADDR_R_; TOADDR_R=TOADDR_R_; PREDIR=PREDIR_; NAME=NAME_; POSTTYPE=POSTTYPE_; POSTDIR=POSTDIR_; AN_NAME=AN_NAME_; LOCAL_UID=LOCAL_UID_", "fips": "49051 - Wasatch", "match_fields": "FULLNAME FULLNAME", - "uppercase_normalize_fields": ["FULLNAME"] + "uppercase_normalize_fields": [ + "FULLNAME" + ] }, "washington": { "compare_fields": "FROMADDR_L FROMADDR_L; TOADDR_L TOADDR_L; FROMADDR_R FROMADDR_R; TOADDR_R TOADDR_R; PREDIR PREDIR; NAME NAME; POSTTYPE POSTTYPE; POSTDIR POSTDIR; SUFFIXDIR SUFFIXDIR; AN_NAME AN_NAME; AN_POSTDIR AN_POSTDIR; A1_NAME A1_NAME; A1_POSTTYPE A1_POSTTYPE; A2_NAME A2_NAME; A2_POSTTYPE A2_POSTTYPE", @@ -209,7 +366,20 @@ "field_mappings": "FROMADDR_L=L_F_ADD; TOADDR_L=L_T_ADD; FROMADDR_R=R_F_ADD; TOADDR_R=R_T_ADD; PREDIR=PRE_DIR; NAME=S_NAME; LOCAL_UID=CO_UNIQUE; DOT_CLASS=CLASS; ONEWAY=ONE_WAY; DOT_SRFTYP=S_SURF2; VERT_LEVEL=VERTLEVEL", "fips": "49055 - Wayne", "match_fields": "S_NAME S_NAME", - "parse_sources": "S_NAME=PRIMARY; ALIAS1=A1" + "parse_sources": "S_NAME=PRIMARY; ALIAS1=A1", + "value_mappings": { + "DOT_SRFTYP": { + "100": "P", + "115": "P", + "200": "I", + "GRAVEL": "I", + "IMPROV_AGG/GRAVEL": "I", + "IMPROV_CRUSHED_AGG": "I", + "IMPROV_GRAVEL": "I", + "IMPROV_MAG_CHLORID": "I", + "PAVED_ASPHALT": "P-ASP" + } + } }, "weber": { "compare_fields": "PREDIR PREDIR; S_NAME S_NAME; STREETTYPE STREETTYPE; SUFDIR SUFDIR; ALIAS ALIAS; ACS_ALIAS ACS_ALIAS; SUFFIX_911 SUFFIX_911; LEFTFROM LEFTFROM; LEFTTO LEFTTO; RIGHTFROM RIGHTFROM; RIGHTTO RIGHTTO", @@ -217,6 +387,19 @@ "field_mappings": "FROMADDR_L=LEFTFROM; TOADDR_L=LEFTTO; FROMADDR_R=RIGHTFROM; TOADDR_R=RIGHTTO; PREDIR=PREDIR; NAME=S_NAME; POSTTYPE=STREETTYPE; POSTDIR=SUFDIR; SPEED_LMT=SPEEDLIMIT; LOCAL_UID=S_UNIQUE", "fips": "49057 - Weber", "match_fields": "S_NAME S_NAME", - "rules": ["remove_postdir_if_alpha", "remove_posttype_if_numeric"] + "rules": [ + "remove_postdir_if_alpha", + "remove_posttype_if_numeric" + ], + "value_mappings": { + "POSTTYPE": { + "CRT": "CT" + }, + "SPEED_LMT": { + "0": "25", + "1": "25", + "19": "20" + } + } } } diff --git a/cli/src/utrans/recent_edits.py b/cli/src/utrans/recent_edits.py index b46eeea..e21e46b 100644 --- a/cli/src/utrans/recent_edits.py +++ b/cli/src/utrans/recent_edits.py @@ -15,9 +15,14 @@ import arcpy from utrans.profiles import load_profiles as load_shared_profiles -from utrans.utilities import log +from utrans.utilities import get_output_workspace, log NUMERIC_TYPES = {"SmallInteger", "Integer", "Single", "Double", "BigInteger"} +DEFAULT_SEARCH_DISTANCE = "200 Feet" +DEFAULT_CHANGE_TOLERANCE = "40" +DEFAULT_DFC_OUTPUT_NAME = "DFC_CountyToCounty" +DEFAULT_STATS_TABLE_NAME = "stats_county_to_county" +DEFAULT_RECENTS_NAME = "RoadCenterline_Recents" def _detect_field_groups(feature_class: str) -> tuple[list[str], list[str]]: @@ -43,10 +48,6 @@ class CountyProfile: match_fields: str = "" compare_fields: str | None = None uppercase_normalize_fields: set[str] = field(default_factory=set) - dfc_output_name: str = "DFC_CountyToCounty" - stats_table_name: str = "stats_county_to_county" - recents_name: str = "RoadCenterline_Recents" - required_fields: list[str] = field(default_factory=list) def _load_profiles(path: Path | None = None) -> dict[str, CountyProfile]: @@ -57,10 +58,6 @@ def _load_profiles(path: Path | None = None) -> dict[str, CountyProfile]: match_fields=data["match_fields"], compare_fields=data.get("compare_fields"), uppercase_normalize_fields=set(data.get("uppercase_normalize_fields", [])), - dfc_output_name=data.get("dfc_output_name", "DFC_CountyToCounty"), - stats_table_name=data.get("stats_table_name", "stats_county_to_county"), - recents_name=data.get("recents_name", "RoadCenterline_Recents"), - required_fields=data.get("required_fields", []), ) return profiles @@ -122,14 +119,6 @@ def resolve_field_pairs(update_features, base_features, field_mapping): return resolved_pairs -def get_output_workspace(update_features): - dirname = os.path.dirname(arcpy.Describe(update_features).catalogPath) - desc = arcpy.Describe(dirname) - if hasattr(desc, "datasetType") and desc.datasetType == "FeatureDataset": - dirname = os.path.dirname(dirname) - return dirname - - def _blank_like(value): if value is None: return True @@ -213,14 +202,37 @@ def resolve_required_inputs(args): return args.county, args.update_features, args.base_features -def ensure_required_fields(feature_class, required_fields, dataset_label): - lookup = get_field_name_map(feature_class) - missing = [ - field_name for field_name in required_fields if field_name.lower() not in lookup - ] - if missing: +def ensure_configured_fields(update_features, base_features, field_mappings): + update_map = get_field_name_map(update_features) + base_map = get_field_name_map(base_features) + missing_update = [] + missing_base = [] + missing_update_lookup = set() + missing_base_lookup = set() + + for field_mapping in field_mappings: + for update_field, base_field in parse_field_pairs(field_mapping or ""): + if ( + update_field.lower() not in update_map + and update_field.lower() not in missing_update_lookup + ): + missing_update.append(update_field) + missing_update_lookup.add(update_field.lower()) + if ( + base_field.lower() not in base_map + and base_field.lower() not in missing_base_lookup + ): + missing_base.append(base_field) + missing_base_lookup.add(base_field.lower()) + + if missing_update: + raise RuntimeError( + "Update features are missing configured fields: " + f"{', '.join(missing_update)}" + ) + if missing_base: raise RuntimeError( - f"{dataset_label} is missing required fields: {', '.join(missing)}" + f"Base features are missing configured fields: {', '.join(missing_base)}" ) @@ -234,38 +246,31 @@ def run_change_detection( profile, update_features, base_features, - search_distance, match_fields, - change_tolerance, compare_fields, - dfc_output_name, - stats_table_name, - recents_name, ): arcpy.env.overwriteOutput = True output_workspace = get_output_workspace(update_features) - dfc_output = os.path.join(output_workspace, dfc_output_name) - stats_table = os.path.join(output_workspace, stats_table_name) - out_feature = os.path.join(output_workspace, recents_name) - - if profile.required_fields: - ensure_required_fields( - update_features, profile.required_fields, "Update features" - ) - ensure_required_fields(base_features, profile.required_fields, "Base features") + dfc_output = os.path.join(output_workspace, DEFAULT_DFC_OUTPUT_NAME) + stats_table = os.path.join(output_workspace, DEFAULT_STATS_TABLE_NAME) + out_feature = os.path.join(output_workspace, DEFAULT_RECENTS_NAME) if not compare_fields: raise RuntimeError( "Compare fields were not provided and county profile has no default compare mapping." ) + ensure_configured_fields( + update_features, base_features, (match_fields, compare_fields) + ) + resolved_match_pairs = resolve_field_pairs( update_features, base_features, match_fields ) if not resolved_match_pairs: raise RuntimeError( "No valid match field pairs found between update and base feature classes. " - "Pass --match-fields with fields that exist in both datasets." + "Update the county profile with fields that exist in both datasets." ) resolved_match_fields = "; ".join( [ @@ -280,7 +285,7 @@ def run_change_detection( if not resolved_compare_pairs: raise RuntimeError( "No valid compare field pairs found between update and base feature classes. " - "Pass --compare-fields with fields that exist in both datasets." + "Update the county profile with fields that exist in both datasets." ) resolved_compare_fields = "; ".join( [ @@ -316,15 +321,15 @@ def run_change_detection( update_features, base_features, dfc_output, - search_distance, + DEFAULT_SEARCH_DISTANCE, resolved_match_fields, stats_table, - change_tolerance, + DEFAULT_CHANGE_TOLERANCE, resolved_compare_fields, ) log("DetectFeatureChanges finished") - log(f"Creating changed-road output feature class: {recents_name}") + log(f"Creating changed-road output feature class: {out_feature}") arcpy.env.qualifiedFieldNames = False roads_layer = "roads_lyr" @@ -382,38 +387,6 @@ def build_parser(prog: str | None = None): help="Full path to previous county road feature class.", ) - parser.add_argument( - "--search-distance", - default="200 Feet", - help="Search distance for candidate matches in Detect Feature Changes.", - ) - parser.add_argument( - "--match-fields", - help="Semicolon-delimited field mapping string used for matching.", - ) - parser.add_argument( - "--change-tolerance", - default="40", - help="Change tolerance used by Detect Feature Changes.", - ) - parser.add_argument( - "--compare-fields", - help=( - "Optional semicolon-delimited field mapping string for compare attributes. " - "When omitted, county defaults are used." - ), - ) - parser.add_argument( - "--dfc-output-name", - help="Output feature class name for Detect Feature Changes result.", - ) - parser.add_argument( - "--stats-table-name", - help="Output table name for Detect Feature Changes statistics.", - ) - parser.add_argument( - "--recents-name", help="Output feature class name for selected changed roads." - ) parser.add_argument( "--profiles", default=None, @@ -435,28 +408,13 @@ def main(argv=None, *, prog: str | None = None): ensure_detect_feature_changes_license() - match_fields = args.match_fields or profile.match_fields - compare_fields = ( - args.compare_fields - if args.compare_fields is not None - else profile.compare_fields - ) - dfc_output_name = args.dfc_output_name or profile.dfc_output_name - stats_table_name = args.stats_table_name or profile.stats_table_name - recents_name = args.recents_name or profile.recents_name - run_change_detection( profile_key=profile_key, profile=profile, update_features=update_features, base_features=base_features, - search_distance=args.search_distance, - match_fields=match_fields, - change_tolerance=args.change_tolerance, - compare_fields=compare_fields, - dfc_output_name=dfc_output_name, - stats_table_name=stats_table_name, - recents_name=recents_name, + match_fields=profile.match_fields, + compare_fields=profile.compare_fields, ) except RuntimeError as exc: log(str(exc)) diff --git a/cli/src/utrans/utilities.py b/cli/src/utrans/utilities.py index bf7245a..49edfd7 100644 --- a/cli/src/utrans/utilities.py +++ b/cli/src/utrans/utilities.py @@ -1,6 +1,19 @@ """Small shared utilities for UTRANS commands.""" +import os + +import arcpy + def log(message: str) -> None: """Write a command message to standard output.""" print(message) + + +def get_output_workspace(feature_class: str) -> str: + """Return the containing geodatabase for a feature class.""" + dirname = os.path.dirname(arcpy.Describe(feature_class).catalogPath) + desc = arcpy.Describe(dirname) + if hasattr(desc, "datasetType") and desc.datasetType == "FeatureDataset": + dirname = os.path.dirname(dirname) + return dirname diff --git a/cli/tests/test_cli.py b/cli/tests/test_cli.py index 53d9021..0158a46 100644 --- a/cli/tests/test_cli.py +++ b/cli/tests/test_cli.py @@ -25,6 +25,7 @@ def test_version(capsys): @pytest.mark.parametrize( ("command", "main_name"), [ + ("detect-changes", "detect_changes_main"), ("get-recent-edits", "recent_edits_main"), ("etl", "etl_main"), ], @@ -50,6 +51,13 @@ def test_get_recent_edits_help(capsys): assert exit_info.value.code == 0 assert "utrans get-recent-edits" in captured.out assert "--update-features" in captured.out + assert "--search-distance" not in captured.out + assert "--match-fields" not in captured.out + assert "--change-tolerance" not in captured.out + assert "--compare-fields" not in captured.out + assert "--dfc-output-name" not in captured.out + assert "--stats-table-name" not in captured.out + assert "--recents-name" not in captured.out def test_etl_help(capsys): @@ -61,6 +69,7 @@ def test_etl_help(capsys): assert "utrans etl" in captured.out assert "--source-features" in captured.out assert "--county-boundaries" in captured.out + assert "--output-workspace" not in captured.out @pytest.mark.parametrize( diff --git a/cli/tests/test_detect_changes.py b/cli/tests/test_detect_changes.py new file mode 100644 index 0000000..c7c789c --- /dev/null +++ b/cli/tests/test_detect_changes.py @@ -0,0 +1,142 @@ +import os +from types import SimpleNamespace +from unittest.mock import MagicMock, Mock + +import pytest + +from utrans import detect_changes +from utrans.utilities import get_output_workspace + + +def _cursor(rows): + cursor = MagicMock() + cursor.__enter__.return_value = cursor + cursor.__exit__.return_value = False + cursor.__iter__.return_value = iter(rows) + return cursor + + +def test_extract_fips_from_profile_value(): + assert detect_changes.extract_fips("49035 - Salt Lake") == "49035" + assert detect_changes.extract_fips("56041 - Uinta") == "56041" + + +def test_parser_does_not_require_county_field_configuration(): + parser = detect_changes.build_parser() + + actions = {action.dest for action in parser._actions} + + assert "required_fields" not in actions + assert "match_fields" not in actions + assert "compare_fields" not in actions + assert "base_features" not in actions + assert "search_distance" not in actions + assert "change_tolerance" not in actions + assert "dfc_output_name" not in actions + assert "stats_table_name" not in actions + assert "test_output_name" not in actions + assert "append_target" in actions + assert "utrans_features" in actions + assert "output_workspace" not in actions + + +@pytest.mark.parametrize( + ("feature_class", "descriptions", "expected"), + [ + ( + r"C:\data\roads.gdb\roads", + [ + SimpleNamespace(catalogPath=r"C:\data\roads.gdb\roads"), + SimpleNamespace(), + ], + r"C:\data\roads.gdb", + ), + ( + r"C:\data\roads.gdb\transportation\roads", + [ + SimpleNamespace(catalogPath=r"C:\data\roads.gdb\transportation\roads"), + SimpleNamespace(datasetType="FeatureDataset"), + ], + r"C:\data\roads.gdb", + ), + ], +) +def test_get_output_workspace_returns_containing_geodatabase( + monkeypatch, feature_class, descriptions, expected +): + monkeypatch.setattr( + detect_changes.arcpy, "Describe", Mock(side_effect=descriptions) + ) + + assert get_output_workspace(feature_class) == expected + + +def test_add_dfc_fields_creates_legacy_fields_and_populates_metadata(monkeypatch): + add_field = Mock() + update_cursor = _cursor([[None, None]]) + monkeypatch.setattr(detect_changes.arcpy, "ListFields", Mock(return_value=[])) + monkeypatch.setattr(detect_changes.arcpy.management, "AddField", add_field) + monkeypatch.setattr( + detect_changes.arcpy.da, "UpdateCursor", Mock(return_value=update_cursor) + ) + + detect_changes.add_dfc_fields("dfc", "49035") + + assert [call.args[:3] for call in add_field.call_args_list] == [ + ("dfc", "CURRENT_NOTES", "TEXT"), + ("dfc", "PREV__NOTES", "TEXT"), + ("dfc", "EDITOR", "TEXT"), + ("dfc", "EDIT_DATE", "DATE"), + ("dfc", "DATE_ADDED", "DATE"), + ("dfc", "COFIPS", "TEXT"), + ] + assert update_cursor.__iter__.return_value is not None + assert update_cursor.updateRow.call_count == 1 + assert update_cursor.updateRow.call_args.args[0][1] == "49035" + + +def test_run_detect_changes_uses_shared_filter_and_appends_to_utrans(monkeypatch): + management = detect_changes.arcpy.management + make_feature_layer = Mock() + copy_features = Mock() + append = Mock() + detect_feature_changes = Mock() + monkeypatch.setattr(management, "MakeFeatureLayer", make_feature_layer) + monkeypatch.setattr(management, "CopyFeatures", copy_features) + monkeypatch.setattr(management, "Append", append) + monkeypatch.setattr(management, "DetectFeatureChanges", detect_feature_changes) + monkeypatch.setattr( + detect_changes, + "_resolve_field_mapping", + Mock(side_effect=["NAME NAME", "NAME NAME"]), + ) + monkeypatch.setattr(detect_changes, "add_dfc_fields", Mock()) + monkeypatch.setattr(detect_changes.arcpy, "AlterAliasName", Mock()) + monkeypatch.setattr(detect_changes.arcpy, "Exists", Mock(return_value=False)) + + monkeypatch.setattr( + detect_changes, + "get_output_workspace", + Mock(return_value="workspace"), + ) + detect_changes.run_detect_changes("update", "base", "49035", "append-target") + + make_feature_layer.assert_any_call( + "base", "detect_changes_base", "COUNTY_L = '49035' OR COUNTY_R = '49035'" + ) + make_feature_layer.assert_any_call( + os.path.join("workspace", "DFC_RESULT"), + "detect_changes_output", + detect_changes.CHANGE_FILTER, + ) + copy_features.assert_called_once_with( + "detect_changes_output", os.path.join("workspace", "TEST_DFC_RESULT") + ) + append.assert_called_once_with("detect_changes_output", "append-target", "NO_TEST") + + +def test_extract_fips_rejects_invalid_profile_value(): + import pytest + + with pytest.raises(RuntimeError, match="Invalid county FIPS"): + detect_changes.extract_fips("Salt Lake") diff --git a/cli/tests/test_etl_mappers.py b/cli/tests/test_etl_mappers.py index 8fe2a57..dfc2a3b 100644 --- a/cli/tests/test_etl_mappers.py +++ b/cli/tests/test_etl_mappers.py @@ -9,11 +9,7 @@ def test_value_mappings_normalizes_fields_and_source_values(): profile = CountyProfile( key="example", - values={ - "value_mappings": { - "oneway": {" One Direction ": "Y"}, - } - }, + values={"value_mappings": {"oneway": {" One Direction ": "Y"}}}, ) assert _value_mappings(profile) == {"ONEWAY": {"ONE DIRECTION": "Y"}} diff --git a/cli/tests/test_recent_edits.py b/cli/tests/test_recent_edits.py new file mode 100644 index 0000000..a8eb253 --- /dev/null +++ b/cli/tests/test_recent_edits.py @@ -0,0 +1,61 @@ +import pytest + +from utrans import recent_edits + + +def _profile_fields(*names): + return {name.lower(): name for name in names} + + +def test_ensure_configured_fields_accepts_case_insensitive_matches(monkeypatch): + feature_fields = { + "update": _profile_fields("RoadName", "LeftFrom"), + "base": _profile_fields("ROADNAME", "LEFTFROM"), + } + monkeypatch.setattr( + recent_edits, + "get_field_name_map", + lambda feature_class: feature_fields[feature_class], + ) + + recent_edits.ensure_configured_fields( + "update", + "base", + ("roadname roadname", "LeftFrom leftfrom"), + ) + + +@pytest.mark.parametrize( + ("missing_dataset", "expected_message"), + [ + ("update", "Update features are missing configured fields: LeftFrom"), + ("base", "Base features are missing configured fields: LeftFrom"), + ], +) +def test_ensure_configured_fields_reports_missing_mapping_fields( + monkeypatch, missing_dataset, expected_message +): + feature_fields = { + "update": _profile_fields("RoadName") + if missing_dataset == "update" + else _profile_fields("RoadName", "LeftFrom"), + "base": _profile_fields("ROADNAME") + if missing_dataset == "base" + else _profile_fields("ROADNAME", "LEFTFROM"), + } + monkeypatch.setattr( + recent_edits, + "get_field_name_map", + lambda feature_class: feature_fields[feature_class], + ) + + with pytest.raises(RuntimeError, match=expected_message): + recent_edits.ensure_configured_fields( + "update", "base", ("RoadName RoadName", "LeftFrom LeftFrom") + ) + + +def test_recent_edits_profile_no_longer_exposes_required_fields(): + profile = recent_edits._load_profiles()["davis"] + + assert not hasattr(profile, "required_fields")