About shapes in the MapPoint object model
Shapes in Microsoft MapPoint are similar to shapes in other applications, such as Microsoft PowerPoint or WordArt. The differences mostly have to do with the shapes being drawn on a round globe as opposed to a flat presentation or document.
Note Most of the samples in this topic set the Name property of the shape as soon as it's created. Setting the name of a shape gives you a way to access the shape by name using the Item property of the Shapes collection. The name never appears in the user interface; it is only used when programming with the MapPoint object model.
Drawing lines
A line is defined by two Location objects. Use the AddLine method to draw a line. To learn more about Location objects, see Working with locations and finding places and address in the MapPoint object model.
Sub TransPacific()
Dim oMap As MapPoint.Map
Set oMap = GetObject(, "MapPoint.Application").ActiveMap
oMap.FindResults("Pacific Ocean")(1).GoTo
Dim locLA, locTokyo As MapPoint.Location
Set locLA = oMap.FindResults("Los Angeles, California")(1)
Set locTokyo = oMap.FindResults("Tokyo, Japan")(1)
' Create and name the shape
oMap.Shapes.AddLine(locLA, locTokyo).Name = "Tokyo Route"
End Sub
Drawing polylines
A polyline is a line that consists of more than two vertices. To create a polyline, pass an array of Location objects to the AddPolyline method. A polyline that has only two vertices is a line, even if it was created with the AddPolyline method.
To display a distance measurement with MapPoint, set the polyline's SizeVisible property to True. Distances are measured in GeoUnits. For information about calculating a distance, see "Measuring distances" in Working with locations and finding places and address in the MapPoint object model.
Sub ViaHawaii()
Dim oMap As MapPoint.Map
Set oMap = GetObject(, "MapPoint.Application").ActiveMap
oMap.FindResults("Pacific Ocean")(1).GoTo
Dim locLA, locHawaii, locTokyo As MapPoint.Location
Set locLA = oMap.FindResults("Los Angeles, California")(1)
Set locHawaii = oMap.FindResults("Honolulu, Hawaii")(1)
Set locTokyo = oMap.FindResults("Tokyo, Japan")(1)
' Create and name the shape
Dim oShp As MapPoint.Shape
Set oShp = oMap.Shapes.AddPolyline(Array(locLA, locHawaii, locTokyo))
oShp.Name = "Tokyo Via Hawaii"
oShp.SizeVisible = True
End Sub
To draw a closed polyline, make the first and last location the same.
Sub BermudaTriangle()
Dim oMap As MapPoint.Map
Set oMap = GetObject(, "MapPoint.Application").ActiveMap
Dim locFL, locPR, locB As MapPoint.Location
Set locFL = oMap.FindResults("Fort Lauderdale, Florida")(1)
Set locPR = oMap.FindResults("San Juan, Puerto Rico")(1)
Set locB = oMap.FindResults("Bermuda")(1)
Dim arrTri
arrTri = Array(locFL, locPR, locB, locFL)
' Go there first
oMap.Union(arrTri).GoTo
' Create and name the shape
oMap.Shapes.AddPolyline(arrTri).Name = "Bermuda Triangle"
End Sub
Working with complex polylines
Every time you access an object in MapPoint from a Microsoft Visual Basic project, Visual Basic and MapPoint must communicate information about that object. This time is usually negligible, but it adds up quickly when operations involve more than a few hundred objects. If you are drawing complex shapes, you could be working with hundreds of Location objects and thus spending a lot of time setting up the communication between Visual Basic and MapPoint. You may want to consider writing an add-in executable to create and modify the shape. An add-in runs as part of MapPoint, not as a separate program, which makes communication faster and can result in a significant performance gain. For more information, see About creating a COM add-in.
Modifying polylines
To modify a polyline, use the Vertices property. This is the array of locations that were used to create the polyline. By setting the Vertices property to a new array of locations, you can modify an existing polyline. In this example, a line is turned into a polyline by adding an extra vertex.
Sub TransPacificMod()
Dim oMap As MapPoint.Map
Set oMap = GetObject(, "MapPoint.Application").ActiveMap
oMap.FindResults("Pacific Ocean")(1).GoTo
Dim locLA, locHawaii, locTokyo As MapPoint.Location
Set locLA = oMap.FindResults("Los Angeles, California")(1)
Set locHawaii = oMap.FindResults("Honolulu, Hawaii")(1)
Set locTokyo = oMap.FindResults("Tokyo, Japan")(1)
' Create and name the shape
Dim oShp As MapPoint.Shape
Set oShp = oMap.Shapes.AddLine(locLA, locTokyo)
oShp.Name = "Tokyo Route"
MsgBox "The line will be a polyline after this message."
oShp.Vertices = Array(locLA, locHawaii, locTokyo)
End Sub
Drawing AutoShapes
AutoShapes in MapPoint are defined by a center point (the location of the shape) and width and height defined in GeoUnits. There are three types of AutoShapes: rectangle, oval, and radius. Rectangle and oval shapes have separate Width and Height properties. With the radius shape, Width and Height are always equal, and setting one results in the other being set.
AutoShape Shape objects have a Type property of geoAutoShape and an AutoShapeType property that distinguishes between the three kinds of AutoShapes.
The following example draws AutoShapes of each type.
Sub EuroShapes()
Dim oMap As MapPoint.Map
Set oMap = GetObject(, "MapPoint.Application").ActiveMap
oMap.Application.Units = geoKm
Dim locDublin, locRome, locWarsaw As Location
oMap.FindResults("Europe")(1).GoTo
Set locDublin = oMap.FindResults("Dublin, Ireland")(1)
Set locRome = oMap.FindResults("Rome, Italy")(1)
Set locWarsaw = oMap.FindResults("Warsaw, Poland")(1)
With oMap.Shapes
.AddShape(geoShapeOval, locDublin, 1200, 800).Name = "Dublin"
.AddShape(geoShapeRadius, locRome, 1200, 800).Name = "Rome"
.AddShape(geoShapeRectangle, locWarsaw, 1200, 800).Name = "Warsaw"
End With
End Sub
A radius is always drawn with the smaller of the two dimensions given.
The radius shape has a directional line that shows the size of the radius in miles or kilometers. You can change the angle of the directional line by using the Adjustments collection. (There is only one adjustment in MapPoint: the radius angle.)
Sub MtPinatubo()
Dim oMap As MapPoint.Map
Set oMap = GetObject(, "MapPoint.Application").ActiveMap
oMap.Application.Units = geoKm
Dim locVolcano As MapPoint.Location
oMap.FindResults("Luzon")(1).GoTo
Set locVolcano = oMap.FindResults("Mount Pinatubo")(1)
' Give it that "radar" look
Dim iRad, i As Integer
iRad = 50
For i = 1 To 3
oMap.Shapes.AddShape(geoShapeRadius, locVolcano, iRad * 2 * i, iRad * 2 * i).Name = "Zone" & CStr(i)
oMap.Shapes("Zone" & CStr(i)).Adjustments(1) = 45
Next i
End Sub
Drawing text boxes
Text boxes are rectangles that are measured in pixels rather than GeoUnits. The FontColor property changes the color of the text. The following example draws a text box.
Sub OhCanada()
Dim oMap As MapPoint.Map
Set oMap = GetObject(, "MapPoint.Application").ActiveMap
oMap.FindResults("Canada")(1).GoTo
Dim oShp As MapPoint.Shape
Set oShp = oMap.Shapes.AddTextbox(oMap.Location, 100, 100)
oShp.Text = "Largest country by land mass in Western Hemisphere"
oShp.FontColor = vbRed
End Sub
Creating drivetime zones
A drivetime zone is a closed polyline that encloses all places that can be driven to from a center point in a specific amount of time. To create a drivetime zone, use the AddDrivetimeZone method. This example creates a 10-minute drivetime zone that is drawn behind (beneath) roads.
Sub Atlanta10()
Dim oMap As MapPoint.Map
Set oMap = GetObject(, "MapPoint.Application").ActiveMap
Dim oLoc As MapPoint.Location
Set oLoc = oMap.FindAddressResults(, "Atlanta", , "GA")(1)
oLoc.GoTo
Dim oShp As MapPoint.Shape
Set oShp = oMap.Shapes.AddDrivetimeZone(oLoc, geoOneMinute * 10)
oShp.ZOrder geoSendBehindRoads
End Sub
Changing the z-order of shapes
Change the z-order of shapes by using the ZOrderPosition property and the ZOrder method.
You can also use the ZOrder method to specify that a shape be drawn behind roads.
Sub ShapeOrder()
Dim oMap As MapPoint.Map
Set oMap = GetObject(, "MapPoint.Application").ActiveMap
oMap.Application.Units = geoKm
oMap.FindResults("Europe")(1).GoTo
Dim shpLondon, shpParis, shpBrussles As MapPoint.Shape
Set shpLondon = oMap.Shapes.AddShape(geoShapeRectangle, oMap.FindResults("London, England")(1), 800, 500)
shpLondon.Name = "London"
shpLondon.Fill.Visible = True
shpLondon.Fill.ForeColor = vbWhite
Set shpParis = oMap.Shapes.AddShape(geoShapeOval, oMap.FindResults("Paris, France")(1), 600, 700)
shpParis.Name = "Paris"
shpParis.Fill.Visible = True
shpParis.Fill.ForeColor = vbWhite
Set shpBrussles = oMap.Shapes.AddShape(geoShapeRadius, oMap.FindResults("Brussles, Belgium")(1), 500, 500)
shpBrussles.Name = "Brussles"
shpBrussles.Fill.Visible = True
shpBrussles.Fill.ForeColor = vbWhite
MsgBox "The z-order will change after this message."
shpBrussles.ZOrder geoSendBehindRoads
shpParis.ZOrderPosition = 1
End Sub
Modifying AutoShapes
AutoShapes are modified by setting the Location, Width, and Height properties. When either the width or height of a radius shape is changed, both are changed.
To learn about changing the line and fill of a shape, see "Setting the line format" and "Setting the fill format" below.
Sub ShapeProps()
Dim oMap As MapPoint.Map
Set oMap = GetObject(, "MapPoint.Application").ActiveMap
oMap.Application.Units = geoKm
oMap.FindResults("Europe")(1).GoTo
Dim shpLondon, shpParis, shpEUCapitol As MapPoint.Shape
Set shpLondon = oMap.Shapes.AddShape(geoShapeRectangle, oMap.FindResults("London, England")(1), 600, 500)
shpLondon.Name = "London"
shpLondon.Fill.Visible = True
shpLondon.Fill.ForeColor = vbWhite
Set shpParis = oMap.Shapes.AddShape(geoShapeOval, oMap.FindResults("Paris, France")(1), 600, 500)
shpParis.Name = "Paris"
shpParis.Fill.Visible = True
shpParis.Fill.ForeColor = vbWhite
Set shpEUCapitol = oMap.Shapes.AddShape(geoShapeRadius, oMap.FindResults("Rome, Italy")(1), 500, 500)
shpEUCapitol.Name = "EUCapitol"
shpEUCapitol.Fill.Visible = True
shpEUCapitol.Fill.ForeColor = vbWhite
MsgBox "The properties will change after this message."
shpLondon.Width = 700
shpParis.Height = 700
shpEUCapitol.Height = 700
Set shpEUCapitol.Location = oMap.FindResults("Brussels, Belgium")(1)
End Sub
Setting the line format
The LineFormat object has properties that can be used to change the look of a line. This example draws a line from London to Paris, sets the line weight, makes it blue, and gives it an arrowhead pointing to Paris. It then displays the size of the line.
Sub CrossChannel()
Dim oMap As MapPoint.Map
Set oMap = GetObject(, "MapPoint.Application").ActiveMap
Dim locLondon, locParis As MapPoint.Location
Set locLondon = oMap.FindResults("London, England")(1)
Set locParis = oMap.FindResults("Paris, France")(1)
oMap.Union(Array(locLondon, locParis)).GoTo
oMap.ZoomOut
Dim oShp As MapPoint.Shape
' Create and name the shape
Set oShp = oMap.Shapes.AddPolyline(Array(locLondon, locParis))
oShp.Name = "London to Paris"
oShp.Line.EndArrowhead = True
oShp.Line.ForeColor = vbBlue
oShp.Line.Weight = 4
oShp.SizeVisible = True
End Sub
Setting the fill format
Shape objects can have a fill as well as line formatting properties. The FillFormat object has properties that allow you to change the look of the fill. The following code draws a textbox, hides the line, and makes the fill blue and the text yellow.
Sub FillProps()
Dim oMap As MapPoint.Map
Set oMap = GetObject(, "MapPoint.Application").ActiveMap
oMap.Application.Units = geoMiles
oMap.FindResults("Canada")(1).GoTo
Dim oShp As MapPoint.Shape
Set oShp = oMap.Shapes.AddShape(geoShapeRectangle, oMap.Location, 800, 400)
oShp.Text = "Largest country by land mass in Western Hemisphere"
oShp.Line.Visible = False
oShp.Fill.Visible = True
oShp.Fill.ForeColor = vbBlue
oShp.FontColor = vbYellow
End Sub
More information
About using shapes in MapPoint
About the Microsoft MapPoint object model
What's new for Microsoft MapPoint 2004 developers
Getting started with the MapPoint object model
Getting started with the MapPoint Control
About mapping data with the MapPoint object model
About locations in the MapPoint object model
About routing in the MapPoint object model