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).