Convert Engineering 'DWG' Drawings to Auditable 'GeoJSON'

Converts engineering 'DWG' drawings ('AutoCAD' 2013+ format) to 'GeoJSON' entirely in-process, with no 'CAD' software, 'LibreDWG', or 'GDAL' required. Wraps the pure-Rust 'dwg2geo' conversion core < https://github.com/milkway/dwg2geo>: every feature carries resolved 'CAD' style metadata (layer, colour, line weight, text), skipped and failed entities are reported with reasons, and the output is deterministic: the same bytes always produce byte-identical 'GeoJSON'. Coordinates are kept in the drawing's local system; the package never guesses a coordinate reference system.


dwg2geo dwg2geo hex logo

R-CMD-check License: MIT Website

Convert engineering DWG drawings to auditable GeoJSON from R, with no CAD software, LibreDWG, or GDAL required. dwg2geo wraps the pure-Rust dwg2geo conversion core as a native extension:

  • every feature carries resolved CAD style metadata (layer, color_rgb, color_index, linetype, lineweight_mm, text properties);
  • skipped and failed entities are reported with reasons; nothing is silently dropped;
  • the output is deterministic: the same bytes always produce byte-identical GeoJSON on a given platform;
  • coordinates stay in the drawing's local system, and the package never guesses a CRS. Georeferencing is explicit and in your hands.

Installation

# install.packages("dwg2geo")  # once on CRAN

# development version (needs Rust >= 1.85: https://rustup.rs)
pak::pak("milkway/dwg2geo-r")

Usage

library(dwg2geo)

result <- dwg_convert("drawing.dwg")
#> ℹ Converting 'drawing.dwg' (9.0 MB)...
#> ✔ Converted 11781 features from 2793 model-space entities.
#> ! Skipped 145 entities; see `$skipped` for reasons.

result
#> ── dwg2geo conversion ──────────────────────────────
#> • 11781 features from 2793 model-space entities
#> • source SHA-256: "1b8555f87365"…
#> • bbox (local units): [247024.4, 7398959] – [248911, 7400880]
#> ── Converted ──
#> # A tibble: 11 × 3
#>    entity_type count reason
#>    <chr>       <int> <chr>
#>  1 ARC          1839 <NA>
#>  2 CIRCLE        937 <NA>
#> # …

result$skipped
#> # A tibble: 4 × 4
#>   entity_type reason                              count sample_handles
#>   <chr>       <chr>                               <int> <list>
#> 1 ATTDEF      attribute definition template; …       46 <chr [10]>
#> # …

Georeference with sf

The GeoJSON keeps the drawing's local coordinates. Read it as an sf object, set the CRS you know the drawing uses, and reproject:

library(sf)

shapes <- dwg_convert("drawing.dwg") |>
  dwg_as_sf() |>
  st_set_crs(31983) |>       # SIRGAS 2000 / UTM 23S: you must know this
  st_transform(4326)

plot(shapes["layer"])

Why fail closed on CRS?

A DWG can be drawn in SIRGAS 2000 / UTM, a local engineering grid, millimetres, or arbitrary coordinates. GeoJSON that merely copies CAD coordinates can be syntactically valid while geographically wrong, so dwg2geo always returns local coordinates and leaves the CRS decision to you, explicitly.

The dwg2geo family

The same audited core is available everywhere: CLI + Rust crate · npm (WebAssembly) · PyPI · browser app (upload a DWG and see it on a map, entirely client-side).

License

MIT © André Leite. The bundled conversion core is MIT; its only weak-copyleft dependency is acadrust (MPL-2.0).

Reference manual

It appears you don't have a PDF plugin for this browser. You can click here to download the reference manual.

install.packages("dwg2geo")

0.2.4 by André Leite, 2 months ago


https://milkway.github.io/dwg2geo-r/, https://github.com/milkway/dwg2geo-r


Report a bug at https://github.com/milkway/dwg2geo-r/issues


Browse source code at https://github.com/cran/dwg2geo


Authors: André Leite [aut, cre]


Documentation:   PDF Manual  


MIT + file LICENSE license


Imports cli, jsonlite, rlang, tibble

Suggests sf, testthat, withr

System requirements: Cargo (Rust's package manager), rustc (>= 1.85)


See at CRAN