My Account     Contact Us     Cart

Optimizing Point Symbol Placement with MAPublisher LabelPro

This post was contributed by Hans van der Maarel of Red Geographics.


The problem with using GIS data for point symbols is that depending on the scale and symbolization you often end up with symbols partly overlapping each other. Of course, the symbols can be manually moved around after initial placement to get a more aesthetically pleasing result, but that can be a tedious and time-intensive task.

Thankfully, there is a way to automate at least part of this process by using MAPublisher and LabelPro.

Example map of Breda, The Netherlands

This example shows the heart of an old European city (Breda in The Netherlands to be exact). The map is composed of Dutch Top10NL topographic base data, a few labels were manually added for larger features (such as the park), and points imported from OpenStreetMap (OSM) and styled using a Map Theme. As you can see, there are a number of spots where the symbols are densely located and overlap each other.

The MAPublisher LabelPro add-on is capable of collision-avoidance to make sure overlaps don’t happen. But it only works when generating labels (text). Fortunately, the solution is to trick LabelPro into processing symbols too, so that they can benefit from better placement without overlaps.

Let’s start by adding a column to the attributes to the OSM points layer and filling it with a default value, a capital O.

Thankfully, there is a way to automate at least part of this process by using MAPublisher and LabelPro.

Editing the attribute schema

Next, determine how big the symbols are. On the artboard, use the Type tool to place a capital O and adjust its size so that it’s about the same size as one of the point symbols. In this case, a 14 pt Futura Medium, shown here in red, seems to cover it well (your results might be different).

Determine the approximate font size

Futura is a good font in this case because the O is a perfect circle. Once you’ve determined the approximate font size to use, delete the O text as it won’t be needed anymore.

Next, set up the LabelPro labelling rules. Since there is already a layer with the manually placed labels and the symbols shouldn’t interfere with them, the manually placed labels will be designated as an obstacle layer. The symbols layer will be labelled with the attribute created earlier and the style set to the font and size that was just determined.

Set obstacle layer

Setting the appropriate rules partly depends on personal preference but it’s important to specify that the placement prefers the center position (position 1 on the placement control). In other words: if there’s enough space for placement, the label doesn’t need to be moved or offset. Another important rule to configure is that font reduction should be turned off. All of the labels (eventually symbols) are going to be a fixed and similar size.

Set placement point rules
Set fitting point rules

Also, another good practice is to specify a suppression layer. Any labels that can’t be placed with the rules set will be placed on the suppression layer. After placement, you can determine if any labels need to be adjusted manually.

Let’s label! Go ahead and label with these settings and afterward hide the original symbols layer and the suppression layer. The map is filled with O’s where the original symbols are located.

O labels placed

At first glance, this does not seem very useful, but closer inspection shows that the labels have retained the attributes of the original OSM point symbols.

Attributes migrated to the O labels

This means that if they can be turned back into points, they will be able to be styled!

In order to turn them back into points, a text reference point needs to be created. In other words: a little dot on the text selection line, in the center of the O. This is a two-step process. First, select all the O’s on the artboard, open MAPublisher Text Utilities, and set the Action to Set text alignment and Alignment to Center. This action changes the alignment of the text without changing the actual position of the text (due to LabelPro labeling the text alignment is different based on where the label ended up in relation to the original point). This step takes care of the horizontal positioning.

Set text alignment in MAPublisher Text Utilities

The second step is to adjust vertical positioning. Vertical positioning is adjusted by moving all text up by a certain distance. Make sure all the O’s are selected, then use the (Adobe Illustrator) Move tool. In the Position group, set the Horizontal to 0 (no adjustment here since Text Utilities was used), set the Vertical to minus half the text size (font size in this example was 14 pt, so a vertical adjustment of -7 pt), and the Angle to 90 degrees.

Use the Move panel to fine tune position

For reference, this example is zoomed into a symbol that did not get displaced.

Next, these labels need to be turned into point symbols. There is a handy option in MAPublisher Text Utilities that can do that, but it places a point to the lower left of the text and the symbols need to use the center text reference point that was just created. Instead, with all of the O labels selected, open the MAP Attributes panel and export the attribute table to a text file. Make sure to specify the option Export All Attributes because there are two important hidden attributes needed to make this work: #MapX and #MapY, which are the coordinates of the text reference point.

Export attributes to a .txt file
(Click for larger version)
Export attributes to a .txt file

Using MAPublisher Import, add the attributes text file that was just created to the map and make sure to appropriately specify #MapX and #MapY in the X and Y coordinate columns.

Import .txt file as Delimited XY

Since there is no projection information stored in the text file, you’ll need to specify that the coordinates are in the same system as the MAP View it’s coming from and you’ll need to add it to that MAP View upon import.

On the map, there is now a new point layer and because they still have all of their original attributes, the layer can simply be added to the MAP Theme to have all the point symbols reapplied to them instantly. Let’s admire the results:

Symbols reapplied with MAP Themes

If needed, repeat the last few steps for the suppressed labels as well (to a different file and different layer of course) to see what still needs to be done manually.

Placing Text with an Offset Value Using MAP LabelPro

Having introduced some background information about text insertion point coordinate values in a previous post, it would be good to explore if this method works when trying to place text objects (annotations/labels) with a specific offset value. For example, if you have a point layer and there is an attribute for the offset value so that every object has a different offset value.

An Attribute table with the offset value for every object

Placing text objects with a specific offset is possible in MAP LabelPro. You can specify the Label Offset value in the MAP LabelPro dialog box. However, this setting will be applied to all text labels. In the example below (see screenshot), all the text will be placed 0.2 inches away from the object. However, that does not help when every point has different offset value like this example. Also, MAP LabelPro uses page units, not the world/map units. In this example, the offset distance was specified in the world/map unit (metres).

The offset option in The Point Rules dialog window from MAP LabelPro.

There are two methods you can accomplish to make the text placed with offset value. The first method is the same as the step shown above. You can adjust the text placement position by calculating the “ideal” coordinate for the text insertion point. From a MAP layer (point, line, or area), generate text with a MAPublisher feature (MAP LabelPro or Feature Label).  Then adjust the text position (maybe you will have to calculate a new position by adding/subtracting the offset values from the current point), then apply it to #MapX and #MapY. The second method is to adjust the position of the points first before labeling.

In the example below, a point layer with offset values in the attribute: x_Offset and y_Offset.

An example map with offset attributes (x_offset and y_offset)

Step 1: Calculate coordinates with offset.

  1. Create a copy of the layer just because the point value will be adjusted.
  2. Make the #MapX and #MapY visible (so that it’s easy to see when calculating).
  3. Create new columns (here we created “x+coord_withOffsetX” and “y+coord_withOffsetY”).
  4. Calculate the new coordinate of the points for X and Y (here we used Apply Expression) as shown below.

Step 1: Calculating the coordinates with offset

Step 2: Move the points to the calculated coordinates with the offset values.

Use the same method as the one introduced in the previous post. This method works for the Point layer as well. Open the Edit Schema window and apply “x_coord_withOffset” and “y_coord_withOffset” to #MapX and #MapY, respectively.

Step2: moving the points to the calculated coordinates with the offset values

Now, the points are moved to new position. The red point is the original and the blue points are the ones moved to the offset. Now you can label each points. After placing labels for the point layer (blue), you can make the point layer invisible.

The point position is adjusted by #MapX and #MapY

Now you can run the label engine (MAP LabelPro / Label Feature) for the new point layer with offset.

Placing Updated Labels at the Same Position as Existing Labels

After a text placement engine places labels (e.g. annotations or labels) some manual adjustment is usually required. The major reason for this task is to avoid text colliding with other objects and to improve map aesthetics and composition. Here is an example map with the position of labels manually placed and adjusted. What do you usually do when updating your map and you have to update those labels?

An example with labels. The goal is to place the updated labels at the exact same position.
An example with labels. The goal is to place the updated labels at the exact same position.

 

When running a text placement engine, it is common that the placed labels (in red) do not match with the position of the existing labels (in black). Have you ever thought that it would be useful if the updated labels can be positioned in the same place as existing labels? This is definitely possible using a combination of MAPublisher features.

A result after labels were placed with MAP LabelPro or Label Features.
A result after labels were placed with MAP LabelPro or Label Features.

 

Workflow involved to perform this task:

  • Obtain the position coordinate of existing text objects
    • Create new attributes to record #MapX and #MapY of each text object insertion point
    • Export the attribute table as a text file
  • Transfer the deteremined coordinte values of the text objects to the MAP layer (point layer in this example)
    • Join Tables using a common attribute between two tables
  • Place labels for the MAP layer
    • MAP LabelPro or Label Features
  • Adjust the position by those determined coordinate values for the text objects
    • Applying the recorded value to #MapX and #MapY

 

Step 1: Find the coordinates of the text insertion point from a text layer.

Every map object (point, line, area, image, and text) has a coordinate. MAPublisher calculates an insertion point when map objects are added to the artboard. For labels, a text insertion point can be seen as an anchor point or the square dot that is at the beginning of a text object. In this example, the text insertion point is placed at the lower-left corner of the word “Le Crocodile Restaurant” (highlighted in the red color in the screencapture below). The coordinate of this text insertion point is represented by the #MapX and #MapY attributes in the MAP Attribute panel. These two attributes are considered MAPublisher properties and are usually hidden. To display them, change their setting to “Visible” in the Edit Schema window as shown below.

Step 1: Finding the coordinate of the text insertion point from a "good existing text" layer
Step 1: Finding the coordinate of the text insertion point from a “good existing text” layer

 

Step 2: Record the coordinates of the text insertion point from a text layer.

Make the #MapX and #MapY coordinate values as useable attributes. Create new attributes called “TextCoord_X” and “TextCoord_Y”, then copy the values from #MapX and #MapY using Apply Expression.

Step 2: Recording the coordinate of the text insertion point from a "good existing text" layer
Step 2: Recording the coordinate of the text insertion point from a “good existing text” layer

 

Step 3: Prepare to copy coordinates of existing labels to the point layer.

The coordinate values of the text insertion coordinate of a text layer are now copied. The next step is to copy these coordinates from the text layer to the point layer. A simple method to do this is to use Join Tables based on a common attribute. In this example, the string field “RESTAURANT” is the common field in both text and point layers to make a connection. If you already have some other attributes (i.e. object ID or feature ID in both the text layer and the point layer, you should use that). Export the attributes as a text layer from the MAPublisher Attributes panel options menu.

Step 3: Preparing for bringing the coordinates of good, existing labels to the point layer
Step 3: Preparing for bringing the coordinates of good, existing labels to the point layer

 

Step 3: Preparing for bringing the coordinates of good, existing labels to the point layer (2)
Step 3: Preparing for bringing the coordinates of good, existing labels to the point layer (2)

 

Step 4: Join the Point layer to the exported attributes table.

Now, create a table join between the point layer table and the exported attribute table using the Join Table feature.

Step 4: Joining Tables with the exported Text layer and Point layer
Step 4: Joining Tables with the exported Text layer and Point layer

 

Below is the result from joining the tables together. There are also _MapX and _MapY columns because all visible attributes were exported. While the the step of copying attribute to TextCoord_X and TextCoord_Y was not totally be necessary, having columns named _MapX and _MapY could avoid some confusion because the point layer also has #MapX and #MapY columns. In this case, having attributes clearly indicating the values from the text insertion point is what is most important.

Step 4: Result from Join Tables
Step 4: Result from Join Tables

 

Step 5: Place labels with MAPublisher (inherit the attribute values from the point layer to text layer)

Now, place labels with MAPublisher using either Feature Label or MAP LabelPro. The important step here is to inherit the attributes from the point layer to the text layer (the target layer for generating new, updated labels).

When creating a new Text MAP layer, make sure that the “Base attribute schema on:” option is checked. This will allow the text layer to inherit the attributes from the point layer.

Step 5: creating a new MAP Text layer with the same attribute structure as the MAP Point Layer
Step 5: creating a new MAP Text layer with the same attribute structure as the MAP Point Layer

 

Below is the result of placing labels with MAP LabelPro (red labels). The result (in terms of the attribute structure) should be the same if labels are placed using Feature Labels. The position of new labels are not the same as the existing one. The label position can now be adjusted using the TextCoord_X and TextCoord_Y values.

Step 5: Labels placed with MAPublisher LabelPro or Label Features
Step 5: Labels placed with MAPublisher LabelPro or Label Features

 

Step 6:  Move the text objects by adjusting the #MapX and #MapY.

As illustrated above, the text position is obtained from the text insertion point. The next step is to apply the text insertion point coordinates to the #MapX and #MapY attributes of the point layer using an expression with the Apply Expression feature or use the “Derive value from expression” option in the Edit Schema dialog box.

Apply the TextCoord_X and TextCoord_Y values to #MapX and #MapY, respectively.

Step 6: Now moving the text objects using the #MapX and #MapY
Step 6: Now moving the text objects using the #MapX and #MapY

 

The labels are now positioned in the exact same location as the existing text layer.

Result: the new, updated labels are placed at the same position as the existing labels.
Result: the new, updated labels are placed in the same position as the existing labels.

New Image Data Type Available in MAPublisher

Do you have pictures and images you want to insert as an attribute in MAPublisher?

MAPublisher 9.4 introduces a new data type called Image. To work with the Image data type, you’ll have to take a look in the MAP Attributes panel. The Image data type can be used in the same way as the other data types in the MAP Attributes panel. Use the Edit Schema dialog box to edit or create the Image data type as an attribute.

For this example, we have a point layer called “Point of Interests”. Let’s create a new attribute column with Image data type called “Picture”.

Edit Schema with a new data type "Image Data Type

We added a fourth attribute to this point layer (existing attributes were PlaceName, Note, and PhoneNumber).

Let’s insert an image into the attribute cell. Click the “No image…” hyperlink in the attribute cell. It will open the Edit Picture dialog box. Click Let's insert an image file to an attribute cell to browse for an image to add to the attribute cell. Once the image is added, a preview of the image will be visible in the Edit Picture dialog box.

Inserting a photo as an attribute value

There are other controls in this dialog box.

Edit Image Attribute Window: button for Select an image Select and insert an image to the attribute cell. Use this button to replace the existing image to something else. You can insert jpg or png file.
Edit Image Attribute Window: button for Export image attribute as jpg or png Export image as jpg or png
Edit Image Attribute Window: button for removing image from the attribute cell Remove image from the attribute cell
Edit Image Attribute Window: button for navigation control (zoom to fit) Navigation control – zoom to fit
Edit Image Attribute Window: button for navigation control (zoom to actual size) Navigation control – zoom to actual size
Edit Image Attribute Window: button for navigation control (zoom in) Navigation control – zoom in
Edit Image Attribute Window: button for navigation control (zoom out) Navigation control – zoom out
Edit Image Attribute Window: Textbox to change the name of the imageChange the name of the image

 

After clicking OK, the image will be listed in the attribute cell. The cell shows the file name of the image (it will be the file name of the image by default but you can change the name of the image to anything else). Also, hovering the mouse pointer over the image name in the attribute cell will show a quick preview of it.

An image file is inserted to an attribute cell as image data

The Image attribute type also supports images exported from PDF Maps (in KML format) and images exported to Google (in KML format).

 

Data Collection: Getting Elevation Information with MAPublisher

Mountain Information with no Elevation Data

Have you ever had a point dataset where you wanted to obtain the elevation information for every point?

Instead of looking up another dataset to join elevation values or worse, looking them up by hand, MAPublisher 9.3 introduced a new feature to determine the elevation value for every point in a MAP Point layer using the “Add Calculate Data” tool. MAPublisher 9.3.: Add Calculated Data Tool Icon. This is based on using a GeoName account (more on this below).

To use it, simply have a MAP Point layer imported to the artboard and open the Add Calculate Data dialog box. In this example, we’re trying to gather elevation points for mountains in Japan. In the Calculation drop-down list, choose Elevation. You can choose the units for the elevation value from the drop-down list. For this example, we are choosing “meter”. If you do not have the GeoName account yet, click the hyperlink and obtain one (for free). After you’ve registered for a GeoName account, enter your username and click “OK”.

MAPublisher: Add Calculate Data Tool Window

A new column “Elev_metre” is populated as specified in the Add Calculated Data dialog window and every point has the elevation information in meters.

Your data now have the elevation information

This is a handy tool that may help when you have point data along hiking trails, ski courses, waypoints collected with PDF Maps (etc.) or when you need to find elevation data for any type of points.

If you use this feature, please send us your feedback and tell us how you like it!

Split Layer using Unique Values in Attribute in MAPublisher

MAPView with One MAP Layer

Do you have some data you would like to divide into multiple layers using unique values in an attribute? If so, you might want to try using the Split Layer feature in MAPublisher.

MP931: Split Layer

For example, we have a MAP Layer of the world (world_area layer). The world_area layer has many attributes and one of the attributes is about “Continent” information. With the “Continent” attribute, there are eight unique values: 1) Africa, 2) Antarctica, 3) Asia, 4) Australia, 5) Europe, 6) North America, 7) Oceania, and 8) South America.

To split this world_area layer into eight different layers based on unique values in the “Continent” attribute, we simply specify the Continent layer in the Split Layer dialog box.

Attribute data for the world data

Open the Split Layer dialog box. Choose the world_area source layer, then select the option “Split art to new layer(s) by unique attribute value:”. If you have a specific word you would like to include with the eight layers, enter the value for the “New layer prefix” option. Here, we entered the word “continent” as the prefix.

MP931: Split Layer

Now you have eight new MAP layers created based on the unique values of the “Continent” attribute. The attribute scheme, structure, and attribute values are inherited from the source layer to the split layers.

MAPView panel with the Split Layers

MAP Attribute Panel: Attribute Tear-Off Panel (CS6 or higher versions only)

MAPublisher Attribute Panel

A little known (but very useful) feature is the Attribute Tear-Off Panel which is located in the upper-right corner of the MAP Attribute panel (available in MAPublisher that’s compatible with Adobe Illustrator CS6 or higher). Use it to help you edit and view attributes even when they are deselected. It is very handy when used to compare attributes of different datasets.

Simply click the MAPublisher Attribute Panel: Tear-off icon Attribute Tear-Off Panel icon to open another MAP Attribute panel. There are a few key difference between MAP Attribute panel and Tear-off panel:

1) The tear-off panel does not have any MAP Attribute functions (e.g. Join Tables, Find and Replace, Edit Schema, etc).

MAPublisher Attribute Panel and Tear-off Panel:

 

2) The tear-off panel view remains active and shows attributes even after features are deselected.

MAPublisher Attribute Panel and Tear-off panel when objects are deselected.

If your data values are updated within MAP Attribute panel, click the Attribute Tear-Off Panel again MAPublisher Attribute Panel: Tear-off icon to update the values in the tear-off panel.

Labeling Trick for MAPublisher

This blog post was written by Avenza reseller in The Netherlands, Hans van der Maarel of Red Geographics.

When you’re labeling point features (let’s say cities) in MAPublisher, using either Label Pro or Label Features, and you’re not placing a label for every single point, you’re left with the task of removing the points you haven’t labeled. This trick will have the text inherit the attribute structure of the points including a lat/long and guarantee that there are no orphan points.

Take for example the above map. I want to label the cities, but not all of them. I’ll decide as I go along which city will get labeled, and which will get dropped. In order to more easily remove the unlabeled cities I need to do some preparation. I’ll create two columns in the cities layer, X and Y, and assign the expression #MapX and #MapY to them, respectively. It’s important that you do this through the Apply Expression option in the Map Attribute panel.

This gives two attributes with the original coordinates of the city points.

Next, I’ll create a layer for the labels and put it into the MAP View as a text layer, indicating that I want to copy the attribute structure of the cities layer.

Now that all the preparatory work is done, I’ll start the labeling. I’m going to be using the Label Features option, but this will work with MAP LabelPro as well.

If I select one of the texts and look at its attributes, I’ll see that the attributes from the city point have been transferred to the text, including the X and Y attributes which hold the position of the original city point.

Next, I’ll remove the city points layer, select all city labels and use the Export Attributes option in the MAP Attributes panel:

This will export a comma-delimited text file (CSV). Make sure to check the “Field names on first line” option. It’s not exactly necessary, but it will make things a lot easier.

Import the CSV file back into MAPublisher. Make sure to specify that the projection of the data is the same as the existing MAP View. Once the data is imported, you can apply any existing Stylesheets that you had in place to style the cities, or create a new one. This way, you end up with just the symbols for the cities you’ve actually labeled.

New Join Areas feature in MAPublisher 8.4

The upcoming release of MAPublisher 8.4 introduces many new features. One of the new features is called Join Areas. We have received a lot of requests from our customers to create area objects by merging common attribute values. This geoprocessing function is generally known as “dissolve”.

The picture below shows polygon objects from a USA Counties layer. The goal is to create a layer with state boundaries and summing the population count by joining the objects of the counties layer.

USA County MAP

In the MAP Attributes panel of the USA Counties layer, every object of the counties layer contains attribute information including county name, state name, FIPS codes, area in km2, population and so on. We’ll be using the StateName attribute value to combine all the county polygons into one polygon per state.

MAP Attribute of the USA County layer

This is the new Join Area dialog box. On the left side, we’ll specify 1) target layer, 2) destination (output) layer, 3) join type and 4) join method. We are trying to create state boundaries from the counties target layer so we’ll select a join type based on the StateName attribute and output it to a new layer called USA States. The join will create compound paths and since our goal is to create state polygons, we’ll dissolve borders between adjacent sub-areas.

On the right side of the dialog box are attribute value operations available for each column. These operations determine what kind of the values will result for every attribute and the operations available are different for each data type (String, Real, Integer). The screenshot below shows the attribute value operation set to Sum for Population attribute (Integer data type). When the Join Area is complete, each state polygon will have the sum of the population of all the counties that belong to it.

After running the Join Areas function, county polygons are dissolved into state boundaries.

The population values show the total sum from all the counties for every state.

This is just one example of how Join Areas can be used. It was initially a feature request and with some discussion and planning, it became real. If you have any feature requests for MAPublisher, Geographic Imager or PDF Maps, please feel free to drop us a line at support@avenza.com. We’re happy to hear from all of you!

Making dashed lines intersect at every intersection in MAPublisher

One of the great advantages of using Adobe Illustrator for a mapping project is that you can make great line styles easily. For example, to make a double line stroke and one of them is dashed:

01: Double Stroke Line

Double strokes are a line graphic style where two different line strokes overlap each other. For example, the image shows that there is a stroke with a brown color and its stroke size is 3 pts. On top of this brown line, there is a 1 pt white dash line:

02: Double stroke lines with the settings shown in the appearance panel

You might have an experience where you duplicated one line layer and assigned a different style for lines in each of those layers. However, this has some disadvantages. The file size will increase because all the line segments as well as the attribute information attached to every line object is duplicated. Also, when you apply the double stroke line to road layer, the white dash line does not intersect nicely at every intersection of the map:

02: Double stroke problem

With Adobe Illustrator CS5, these problems are solved.

0) Create a graphic style like the one shown above.

1) Open the Pathfinder panel (Window > Pathfinder).

03: Pathfinder Tool

2) Select all the line objects in the line layer.
Click the outline tool 04: Pathfinder - outline tool .

This function in the Pathfinder tool breaks lines at every intersection.

03: Pathfinder - function: breaking lines at every intersection

All the selected objects which were selected at Step 2 will be broken into segments at every intersection and they will be grouped as one object in the layer.

04: Pathfinder result - all the objects are now grouped.

3) Having the grouped objects selected, apply the graphic style with the double stoke.

4) The white dashed line is intersected at every intersection nicely.
05: dashed lines intersect at every intersection

Quick tip

When creating double stroke, make sure to select the option trick tool “Align dashes to corners & path ends, adjusting length to fit” available next to the dash line option.

Note

Since this operation involves a pathfinder functions, the attribute information will not be matintained after the “outline” function is applied to those selected line works. Our development team is looking for a possible solution to keep the attribute information for the future version of MAPublisher.

Privacy Preference Center

Close your account?

Your account will be closed and all data will be permanently deleted and cannot be recovered. Are you sure?