Thursday, July 26, 2007 1:10 PM -
MappingCenterTeam
Masking Intersection Overshoots that Result from Line Caps
Jerome Parkin, a cartographer at Lovell Johns, recently posed a challenging question on Ask a Cartographer:
"It is possible to generalise cased roads? The image shows kinks -- the data is ok but the cartographic representation is kinking the road and creating rough edges. Can this be fixed?"
I was already familiar with this problem, but until Jerome wrote to us I had not yet thought a way to resolve it. However, something clicked into place in my mind as I was reading this and 30 minutes later I wrote Jerome back with this solution:
What you described as a generalization problem, I would describe as a symbolization problem. The issue is that the line caps, which are square in this case, are jutting out across the intersecting streets at “T” junctions and where wide streets run into narrow streets. It would not matter whether the line caps were round and using no caps would cause unwanted gaps where line features connect. In ArcMap, line caps are a property of cartographic line symbols and are set in the symbol properties dialog; "caps" are how the ends of a line are symbolized, while "joins" are how lines are symbolized at vertexes.
This problem can be solved with Variable Depth Masking which requires some fairly straightforward use of the cartographic geoprocessing tools to create the masks. For this problem, I assumed the street centerlines were symbolized with cased symbols and symbol level drawing was used to draw the intersections properly.
- For this procedure, you first need to separate your streets data into different layers using a definition query to isolate the layers based on the width of each of the different cased symbols you have.
- Use the Feature Outline Mask tool to Create Feature Outline Masks for each layer EXCEPT the layer with the widest cased street lines. Use these parameters:
- Set the Reference Scale to the scale that your map will be produced at – if your data frame is set to this scale, this will be the default.
- Keep the default Margin of 0.
- Now use the Create Feature Outline masks for all but the layer with narrowest cased streets but very slightly exaggerate their size – you need to do this in order to avoid bleeding issues at draw and print time. To create the slightly exaggerated masks, set the Margin parameter to 0.25 points.
- Use the Erase tool with your “wider” 0.25 point feature masks (from Step 3) as the Input features and your narrow feature masks (from Step 2) as your Erase features.
- Use the Multipart to Singlepart tool on the results of Step 4.
- Set the definition query for the layer that results from Step 5 to “Area < X”, where X is a very small number. To determine what X should be, open the attribute table for the result of Step 5 and sort the Shape_Area field (this assumes you're working with geodatabase files since shapefiles won't have this field). You should see an obvious break in the continuity of size values for the areas—the smallest features are the nubs that stick out at the ends of streets that will be using as masks in the next step.
- Set the variable depth masking by right-clicking on the data frame in the table of contents and choosing Advanced Drawing. Use the layer from Step 6 to mask the wide lines that were used to generate the 0.25 wide masks. You also need to turn off the visibility for the mask layer.
- Repeat steps 4-7 as needed for additional sets of narrow and wide lines. The idea is that you will follow these steps n times, where n is the number of width classes you have minus one. IMPORTANT NOTE: I explained this for a simple case with only two width classes. If you have more classes, then the narrow lines are really all the lines that are narrower than the layer of wide lines you are concerned with. So prior to Step 4, you should append all the narrower masks before you use the Erase tool.
To symbolize the map, another issue must be overcome, which is that symbol level drawing and variable depth masking cannot always be made to work together--this is one such case. Since variable depth masking is required, an old workaround for symbol level drawing can be used, which is to divide your cased street lines up into layers for each symbol level. That means a simple cased line will be represented with two layers; see the image of an example table of contents to get a better idea:
CF