Main Content

Create and Display Polygons

Polygons represent geographic objects that cover area, such as continents, islands, and lakes. They may contain holes or multiple regions. Create a polygon by listing vertices that define its boundaries without intersecting. The order of the vertices determines what parts of the polygon are filled. List external boundaries clockwise and internal boundaries counterclockwise, such that the inside of the polygon is always to the right of the boundary.

A polygon with a hole. Arrows show the order of vertices.

Simple Polygon

Display a simple polygon with one region and no holes. First, list its vertices in a clockwise order. Close the polygon by repeating the first vertex at the end of the list.

x1 = [0 3 4 1 0];
y1 = [0 1 3 2 0];

Display the vertices as a polygon using the mapshow function by specifying 'DisplayType' as 'polygon'.


Polygons with Holes or Multiple Regions

Define polygons with multiple regions or holes by separating the boundaries with NaN values. List the vertices of external boundaries in a clockwise order and the vertices of internal boundaries in a counterclockwise order.

x2 = [0 1 8 6 0 NaN 1 4 2 1 NaN 5 6 7 3 5];
y2 = [0 6 8 2 0 NaN 1 3 5 1 NaN 3 5 7 6 3];

These vectors define a polygon with one external boundary and two internal boundaries. The boundaries are separated using NaN values. Verify the vertex order of the boundaries using the ispolycw function. The ispolycw function returns 1 when the vertices are in a clockwise order.

ans = 1x3 logical array

   1   0   0

Display the polygon. The internal boundaries create holes within the polygon.


Now, list the vertices for a polygon with two nonintersecting regions. One of the regions has a hole. Verify the vertex order of the boundaries using ispolycw.

x3 = [0 1 5 6 0 NaN 1 5 4 2 1 NaN 7 6 8 8 7];
y3 = [0 6 7 2 0 NaN 1 3 6 5 1 NaN 4 7 8 7 4];
ans = 1x3 logical array

   1   0   1

Display the polygon. The external boundaries create two nonintersecting regions and the internal boundary creates a hole.


Polygons Using Geographic Coordinates

In general, you can use geographic coordinates when you define polygons over small regions and call functions such as ispolycw. This is true except in cases where the polygon wraps a pole or crosses the Antimeridian.

For example, display the state of Michigan on a map using polygons with geographic coordinates. First, read the vertices of the state boundaries.

states = shaperead('usastatehi.shp','UseGeoCoords',true);
michigan = states(22);
lat = michigan.Lat;
lon = michigan.Lon;

Count the boundaries and verify their vertex order. To use ispolycw with geographic coordinates, list the longitude vector as the first argument and the latitude vector as the second argument. The 1-by-6 output array means there are six boundaries. Each element of the array is 1, which means that each boundary is the exterior boundary of its own region.

ans = 1x6 logical array

   1   1   1   1   1   1

Display the polygon on a map using the geoshow function, specifying 'DisplayType' as 'polygon'.

usamap 'Michigan'

Clip the polygon to the latitude and longitude limits of Isle Royale National Park using the maptrimp function. Display the clipped polygon on a new map.

latlim = [47.8 48.2];
lonlim = [-89.3 -88.4];
[latT,lonT] = maptrimp(lat,lon,latlim,lonlim);


Filled Region of Polygons Using Geographic Coordinates

When you display a polygon on the Earth, the boundary divides the Earth into two regions. Both of these regions have finite area, so either could be the inside region of the polygon.

As a result, when you project the vertices of a polygon onto a map using the geoshow function, the filled region may be different than you expect. Change which region is filled by reversing the order of the vertices.

For example, display a small polygon on a world map.

lat2 = [0 10 40 30 0];
lon2 = [0 20 30 10 0];


The outside region of the polygon is filled. Reverse the order of the vertices by applying the flip function to the coordinate vectors. Then, display the polygon again.

lat2f = flip(lat2);
lon2f = flip(lon2);


The inside region of the polygon is filled instead.

See Also