CAD to GIS: Convert Parcel Lines and Text from DGN to Geodatabase

Liz Sanderson
Liz Sanderson
  • Updated

Introduction

Translating from CAD to GIS enables the CAD drawings to become enhanced with spatial information and attributes. The data in a CAD file requires manipulation to extract valuable information, such as geometries and labels, to fit the data structure of GIS data. This article provides an overview of some common tasks involved in a CAD to GIS transformation.

In the example workspace, the following tasks are performed to translate from a MicroStation DGN file to an Esri File Geodatabase:

  • Transfer attributes by overlaying text features onto polygons representing districts from the DGN file, and write to a new polygon Esri Geodatabase feature class, "District"
  • Create polygons from lines representing parcels in the DGN file, overlay parcel text features with the parcel polygons, and write to a new polygon feature class, "Parcel"
  • Take a text feature representing parcel line length, and use a nearest neighbor operation to transfer the length to an attribute of the "ParcelLine" Esri Geodatabase feature class

Step-by-Step Instructions

Part 1: Read Microstation DGN Data

1. Add a Bentley MicroStation V8 Reader

Start FME Workbench. On the Start Page, select New Workspace to create a blank canvas.

Add a Reader to the workspace (from the Readers menu, select Add Reader).

Set the Format to Bentley MicroStation V8 and set the Dataset to read the NorthVancouver.dgn. Set the Coordinate System to UTM83-10.

As of FME 2025.2, the Coordinate System parameter is now configured within the Parameters dialog of each reader/writer format. For more information, including details about the change and affected transformers, please see Coordinate System Parameter Location Change.

Open the Parameters and set Group Elements By to Level Name, click OK

Choose all of the Feature Types except Default.

We will have to expose extra attributes so that they can be used downstream in the workspace to create the relevant parcels in the Geodatabase. Expose the Following Attributes for each feature type by double-clicking on the feature type and clicking on the Format Attributes tab and clicking the check box next to the desired attributes.

DistrictLotLBL

  • igds_basename
  • igds_class
  • igds_color
  • igds_graphic_group
  • igds_style
  • igds_text_string
  • igds_weight

DistrictLot

  • igds_class
  • igds_color
  • igds_graphic_group
  • igds_style
  • igds_weight

LotLBL

  • igds_basename
  • igds_class
  • igds_color
  • igds_graphic_group
  • igds_style
  • igds_text_string
  • igds_weight

ParcelBoundary

  • igds_class
  • igds_color
  • igds_graphic_group
  • igds_style
  • igds_weight

ParcelLineLength

  • igds_basename
  • igds_class
  • igds_color
  • igds_graphic_group
  • igds_style
  • igds_text_string
  • igds_weight

Part 2: Create Polygons and Transfer Attributes from Text to Polygons

Part 2a: Transfer Attributes from Text to Polygons

1. Rename Attributes

Add an AttributeRenamer transformer to the canvas. Connect the DistrictLotLBL to the AttributeRenamer. Rename the following Attributes:

  • Input Attribute: igds_text_string
    • OutputAttribute: BlockID
  • Input Attribute: igds_basename
    • OutputAttribute: District

 

2. Overlay Polygons with BlockID and District Attributes

Add a PointOnAreaOverlayer transformer to the canvas. Connect the AttributeRenamer to the Point input port and the DistrictLot Feature type to the Area input port. Expand the Attribute Accumulation section and tick the Merge Attributes box. 

3. Add File Geodatabase Writer

Add the Esri Geodatabase (File Geodb Open API) Writer, then select an output folder to write the .gdb file to. Name the Feature Class as District, select geodb_polygon as the Geometry.

Part 2b: Parcels - Create Polygons and transfer attributes. 

1. Build Polygons

Add an AreaBuilder transformer to the canvas. Connect the ParcelBoundary feature type to the AreaBuilder. Expand the Snapping Pre-Processing Parameters, set the Snapping Type to End Point Snapping, and Snapping Tolerance to 0.2. Expand Attribute Accumulation and set Accumulation Mode to Drop Incoming Attributes. 

2. Rename Attributes

Add another AttributeRenamer transformer to the canvas. Connect the LotLBL feature type to the AttributeRenamer_2. Set the following attributes to be renamed: 

  • Input Attribute: igds_text_string
    • OutputAttribute: BlockID
  • Input Attribute: igds_basename
    • OutputAttribute: District

3. Overlay Polygons with BlockID and District Attributes

Add another PoinOnAreaOverlayer transformer to the canvas. Connect the AttributeRenamer to the Point input port and the AreaBuilder Area output port to the Area input port on the PointOnAreaOverlayer. Expand the Merge Attributes dialog choose Accumulation Mode as Merge Incoming and Conflict Resolution to Use Original. 

4. Add DGN Feature Type

Right-click on the canvas and select Insert Writer Feature Type. Name the Feature Class as Parcel and set the Geometry geodb_polygon.

Part 3: Transfer Text Values Onto Lines

Part 3a: Separate Single Text Features from Multi Text Features

1. Rename Attributes
Add a third AttributeRenamer transformer to the canvas. Connect the ParcelLineLength reader to the AttributeRenamer_3. Rename the following Attributes:
  • Input Attribute: igds_text_string
    • OutputAttribute: Length
  • Input Attribute: igds_basename
    • OutputAttribute: District

2. Filter Geometry

Next, add a GeometryFilter to the canvas and connect the AttributeRenamer_3 to the GeometryFilter. Open the GeometryFilter parameters and set Geometry Types to Filter to Text. 

3. Calculate the length of the Text

Add a StringLengthCalculator to the canvas. Connect the Text output port from the GeometryFilter to the StringLengthCalculator. Open the StringLengthCalculator parameters, set the Source Attribute to Length, and set the String Length Attribute to _stringlength. 

4. Filter the Text by Length

Add a Tester transformer to the canvas and connect the StringLengthCalculator to the Tester transformer. Open the Tester parameters and set up the following Test Clause: _stringlength = 1

If _stringlength = 1, this means there are individual pieces of text that need to be combined into one in Step 3b; otherwise, the text is a complete piece and is passed to Step 3c.

Part 3b: Combine Multiple Text Features into one

1. Extract Coordinates

Add a CoordinateExtractor transformer to the canvas, connect the Passed output port from the Tester transformer in 3a to the CoordinateExtractor transformer. Set the transformer to specify coordinates and set the default z value to -9999

2. Convert Text to Polygons

Next, add a Bufferer transformer to the canvas. Connect the CoordinateExtractor transformer output port to the Bufferer transformer. Open the Bufferer parameters and set the following parameters. Changes the ParcelLineLength geometry from text to polygon. Text is preserved as the Length attribute. End Cap Style & Corner Style: Round Interpolation Angle: 1.


 

3. Merge Overlapping Polygons

Add a Dissolver transformer to the canvas. Connect the Buffered output port from the Bufferer to the Dissolver. Open the Dissolver parameters. Set the Tolerance to None. Connect Z Mode to First Wins, Aggregate Handling to Deaggregate. Attribute Accumulation to Drop incoming Attributes, Attributes to Average fme_rotation and fem_text_size. Click the "Generate List" option and type "List" as the list name. 

The Dissolver merges overlapping polygons by removing shared boundaries. Length attribute values are preserved by storing them in lists.

4. Sort List

Add a ListSorter transformer to the canvas. Connect the Dissolver Area output port to the ListSorter. In the ListSorter, set the List Attribute to List{}._x, then leave the Sort Type and Sort Order as the default. 

5. Index List

Add a ListIndexer transformer to the canvas. Connect the Output port of the ListSorter to the ListIndexer. Set List Attributes to the List{} and set List Index To Copy as 0. 

6. Populate Length Attribute 

Add a ListConcatenator transformer to the canvas. Connect the Output port of the ListIndexer to the ListConcatenator. The ListConcatenator concatenates the lists' Length values, then populates the main Length attribute with the concatenated result. Set List Attributes to List{}.Length then set Destination Attribute as Length.

7. Create Points 

Add a VertexCreator transformer to the canvas. Connect the ListConcatenator Output port to the VertexCreator. Set the Mode to Replace with Point and set the X and Y values to read _x and _y, respectively. The VertexCreator will serve as the insertion point for the Length value.

8. Set Text Properties 

Add a TextPropertySetter transformer to the canvas; this transformer will change the geometry back to Text. Connect the VertexCreator Output port to the TextPropertySetter. Open the TextPropertySetter parameters, set the following parameters: Text String: Length, Text Size: fme_text_size, Text Rotation: fme_rotation. 

Part 3c: Transfer Text Values onto Parcel Lines

1. Create a Bounding Box for ParcelLineLength 

Add a BoundingBoxReplacer transformer to the canvas. Connect the TextPropertySetter to the BoundingBoxReplacer. This transformer replaces all ParcelLineLength features with a bounding box so that it is easier to match the correct parcel length with the parcel lines.

2. Filter Line and Arc Geometry 

Add a GeometryFilter transformer to the canvas. Connect the ParcelBoundary feature type to the GeometryFilter transformer. In the GeometryFilter parameters, set the Geometry Types to Filter to read Lines and Arcs. 

3. Match ParcelBoundary Lines and Arcs with  

Add a NeighborFinder transformer to the canvas. Connect the Line and Arc output ports from the GeometryFilter to the Base input port of the NeighborFinder. Then connect the Box output port from the BoundingBoxReplacer transformer to the Candidate input port on the NeighborFinder. The NeighborFinder matches ParcelBoundary lines and arcs with the ParcelLineLength text features. ParcelBoundary lines and arcs which have matches will obtain Length and District attributes from ParcelLineLength.

4. Calculate Length of Lines and Arcs  

Add a LengthCalculator transformer to the canvas. Connect the Matched output port from the NeighborFinder transformer to the LengthCalculator. Change the Length Attribute to _calculatedLength. 

5. Calculate Length of Lines and Arcs  

Add a Tester transformer to the canvas. Connect the Output port from the LengthCalculator to the Tester transformer. Set up the following Test Clause.

 

Left Value

Operation

Right Value

 

@Value(_calculatedLength)-@Value(Length)

<

1

OR

@Value(_calculatedLength)-@Value(Length)

<

-1

6. Remove Length Attribute 

Add an AttributeRemover transformer to the canvas. Connect the Failed output port of the Tester to the AttributeRemover. Open the AttributeRemover transformer parameters, set the Attributes to Remove to the Length attribute. 

Right-click on the canvas and select Insert Writer Feature Type. Name the Feature Class as ParcelLine and set the Geometry geodb_polyline. Once this is complete, connect the Passed output port from the Tester transformer and the Output port from the AttributeRemover transformer to the ParcelLine writer feature type.

Results

3 feature classes in a Geodatabase:

  • Polygon Feature Class: “District”
  • Polygon Feature Class: “Parcel”
  • Line Feature Class: “ParcelLine”

Data Attribution

The data used here originates from open data made available by the District of North Vancouver. It contains information licensed under the Open Government License - North Vancouver.

Was this article helpful?

We're sorry to hear that.

Please tell us why.

As of January 14th, 2026, comments on knowledge base articles have been closed. To make sure questions don’t get missed and to enable more community support, we’ve moved discussions to the FME Community. If you have a question or a comment about this article, please create a new post or create a support ticket.