Ask A Cartographer

Rank Street Name (Maplex) & Generalise Cartographic Representations

July 17 2007 | 0 comments

Is it possible to Rank by 'Street Name' important small streets? In a cartographic
representation using Maplex best placement.

It is also possible to generalise cased roads, the image shows kinks, the data is ok but the cartographic representation is kinking the road creating rough edges. (see the image)

Attachment: mapvu_rank_street_name_generalise_kinks_CR

Mapping Center Answer:

On the street labeling, the trick I use is to add a field that contains the length of the name (number of characters). The main issue is that I don't think the Street Placement handles small (short) streets well—my preference is not to stack the labels if I can avoid it. The way I add the number of characters is to use the Field Calculator and I use the statement: Len(). Then depending on the scale and the size I'm using for the street label font, I use the SQL Query option (described about ½ down in the linked help topic) to exclude streets that are shorter than a certain length, but with a name that is shorter than a certain length (leaving the long names that I want Maplex to Stack using the Street Placement). Then I create a new label class that has an SQL query that has the short streets and the short names, and here I don't let Maplex stack the text. The main thing that makes this work is that I've dissolved my streets by type (surface, arterials, collectors, highways, etc.) and name, and I do not use the multi-part option. That guarantees that the small (short) segments are not part of a larger street, but just broken up at the intersections.

All of that was important to your question because no matter how you rank the streets, it's going to need to be a combination that is based on actual length and some idea of how much space is required for placing a label. The big advantage though, is that once you've identified these streets, and put them in a separate label class, you can prioritize that label class so it is labeled first, ensuring other labels don't eat up that valuable space; to do that use the Label Priority Ranking dialog, which you can open from the Labeling toolbar.

On what you described as a generalization problem, I would describe as a symbolization issue where portions of the cased symbols overshoot intersecting streets at T joints where a large street runs into a narrow street and where the angle of intersection is not a right angle. This problem can be solved with Variable Depth Masking and some geoprocessing to create the masks. I am also assuming you are actually symbolizing street centerlines with cased symbols and using symbol level drawing to deal with drawing the intersections properly.

Here's how to do it:

  1. Divide your streets data into different layers (only for the purposes of this geoprocessing procedure) where you use a definition query to isolate each different cased symbol you have. Basically you only need layers for each different width of symbol you have.

  2. You need to create Feature Outline Masks for each of your most narrow street width layers (all but the widest). Use the Feature Outline Mask tool to do this. Use these parameters:

    • Set the Reference Scale to be the scale that your map will be produced (your data frame is probably already set correct, so this will be the default).

    • Keep the default Margin of 0.

  3. You will need to create Feature outline masks for all your widest layers (all but the narrowest) that very slightly exaggerate their size (to avoid bleeding issues at draw and print time). Set the Margin parameter in this case to be 0.25 points

  4. Use the Erase tool with your 'wide' 0.25 point feature masks as the Input features and your narrow feature masks as Erase features.

  5. Use the Multipart to Singlepart tool on the results of step 4.

  6. Set the definition query for the layer that results from step 5 to be Area < X, where X is a very small number. To determine what X is, open the attribute table for the result of step 5 and sort the Shape_Area field (assuming you're working with a geodatabase as shapefiles won't have it). You should see an obvious break in the continuity of areas—the smallest features are the nubs that stick out at the ends of streets, and we want to use those as masks.

  7. Set the variable depth masking by right-clicking on the data frame in the table of contents and choosing Advanced Drawing. Use the layer you set up in steps 5 & 6 to mask the wide lines that were used to generate the 0.25 wide masks.

  8. Repeat steps 4-7 as needed for additional sets of narrow and wide lines.


  9. IMPORTANT NOTE: I explained this in a simple form, which was based on only having two width classes, however if you have more, then the narrow lines are really all the lines that are narrower than the layer of wide lines you are concerned with, and so you should append all the narrower masks prior to using the Erase tool in step 4.

    I think that will do what you need; at least it worked on the dataset I just tested it with.

    Good luck and let me know how it turns out.

If you would like to post a comment, please login.

Contact Us | Legal | Privacy |