# Create Common Plots over Basemap Images

When you create maps using geographic axes, you can provide context for your data by specifying a basemap. Geographic axes support several types of plots, including point, line, and polygon plots (`geoplot`), scatter plots (`geoscatter`), density plots (`geodensityplot`), and bubble plots (`geobubble` or `bubblechart`).

When geographic axes do not support a type of plot, you can read an image from a basemap by using the `readBasemapImage` function and then display both the image and the plot over an axes. This topic includes examples for displaying these types of plots over basemap images:

### Digraphs

This example shows how to display a digraph of airport traffic over a basemap image.

Specify the codes and geographic coordinates of five US airports.

```code = ["DEN" "LAS" "LAX" "SEA" "SFO"]; lat = [39.8561 36.1699 33.9416 47.4502 37.6213]; lon = [-104.6737 -115.1398 -118.4085 -122.3088 -122.379];```

Create a digraph from a table containing airport traffic data. Reorder the digraph nodes to match the order in `code`.

• The `Origin` and `Dest` table variables contain codes for the origin airports and destination airports.

• The `NumFlights` variable table contains the number of flights between the origin and destination airport.

```T = readtable("airport_traffic.xlsx"); G = digraph(T.Origin,T.Dest,T.NumFlights); G = reordernodes(G,code);```

Specify latitude and longitude limits for the basemap image. Find the limits for the region containing the airports by using the `geoquadline` function. Expand the limits by `2` degrees in latitude and `3` degrees in longitude by using the `bufgeoquad` function.

```[latlim,lonlim] = geoquadline(lat,lon); [latlim,lonlim] = bufgeoquad(latlim,lonlim,2,3);```

Read an image for the region from the `"landcover"` basemap, using a zoom level of `5`, as an array and a map cells reference object.

`[A,RA] = readBasemapImage("landcover",latlim,lonlim,5);`

#### Project Data to Web Mercator Coordinates

The `readBasemapImage` function spatially references basemap images by using a Web Mercator (WGS 84 / Pseudo-Mercator) projected coordinate reference system (CRS). Project the airport locations from geographic coordinates to Web Mercator coordinates.

`[x,y] = projfwd(RA.ProjectedCRS,lat,lon);`

#### Display Data over Basemap Image

Display the basemap image on a map with no axis labels.

```figure mapshow(A,RA) hold on axis off```

Display the digraph on the same map. Customize the digraph plot using these options:

• Position the nodes by setting the x-data and y-data properties to the projected airport coordinates.

• Use thicker edges for more heavily trafficked routes by setting the line width property.

• Improve the visibility of the plot by setting the node font size, edge transparency, arrow size, edge color, and node color properties.

```lineWidth = G.Edges.Weight/min(G.Edges.Weight); plot(G,XData=x,YData=y,LineWidth=lineWidth, ... NodeFontSize=11,EdgeAlpha=0.6,ArrowSize=12, ... EdgeColor="#A2142F",NodeColor="#A2142F")```

```title("Airport Traffic for Five US Airports") subtitle("Basemap Attribution: Natural Earth")```

### Contours

This example shows how to display contours of the Earth Gravitational Model of 1996 (EGM96) over a basemap image.

Load geoid heights from EGM96 for a region containing the conterminous United States. The `egm96geoid` function returns geoid heights as an array and a geographic cells reference object in WGS 84 coordinates.

```latlim = [17 56]; lonlim = [-128 -64]; [N,RN] = egm96geoid; [N,RN] = geocrop(N,RN,latlim,lonlim);```

To read spatially referenced raster data from a file, use the `readgeoraster` function.

Read an image for the region from the `"satellite"` basemap as an array, a map cells reference object, and an attribution string.

`[A,RA,attrib] = readBasemapImage("satellite",latlim,lonlim);`

#### Project Data to Web Mercator Coordinates

The `readBasemapImage` function spatially references basemap images by using a Web Mercator (WGS 84 / Pseudo-Mercator) projected CRS. To display the geoid heights over the basemap image, you must project the geographic coordinates to the projected CRS.

Extract the geographic coordinates of the geoid heights from the reference object. Then, project the geographic coordinates to Web Mercator coordinates.

```[lat,lon] = geographicGrid(RN); [x,y] = projfwd(RA.ProjectedCRS,lat,lon);```

#### Display Data over Basemap Image

Display the basemap image on a map with no axis labels.

```figure mapshow(A,RA) hold on axis off```

Display `10` contours of the geoid heights on the same map.

`contour(x,y,N,10,LineWidth=1.5)`

```title("Contours of EGM96") subtitle("Basemap Attribution: " + attrib)```

### Images

This example shows how to display an icon of the L-shaped membrane over a basemap image containing the MathWorks® Lakeside Campus in Natick, MA.

Read an image of size `800`-by-`1000` from the `"streets-dark"` basemap for a region centered on the Lakeside Campus. The `readBasemapImage` function returns the basemap image as an array, a map cells reference object, and an attribution string.

```lat = 42.3010; lon = -71.3751; [A,RA,attrib] = readBasemapImage("streets-dark",[lat lon],16,[800 1000]);```

Read the icon as an indexed image of size `16`-by-`16` and a colormap. To improve visibility on the map, increase the image size by a factor of `4`.

```[M,cmap] = imread(fullfile(matlabroot,"toolbox","matlab","icons","matlabicon.gif")); [M,cmap] = imresize(M,cmap,4);```

#### Spatially Reference Icon

The `readBasemapImage` function spatially references basemap images by using a Web Mercator (WGS 84 / Pseudo-Mercator) projected CRS. Using the coordinates of the Lakeside Campus as the lower-left corner of the image, spatially reference the icon to Web Mercator coordinates.

Project the latitude and longitude coordinates of the Lakeside Campus to Web Mercator coordinates.

`[x,y] = projfwd(RA.ProjectedCRS,lat,lon);`

Specify the xy-limits of the icon using the projected coordinates, the size of the icon, and the sizes of individual cells in the basemap image.

```sz = size(M); xlimits = [x (x + sz(2)*RA.CellExtentInWorldX)]; ylimits = [y (y + sz(1)*RA.CellExtentInWorldY)];```

Spatially reference the icon by creating a map cells reference object. Indicate that the first row of the image is the northmost row (as is common with images) by setting the `ColumnsStartFrom` property.

`RM = maprefcells(xlimits,ylimits,sz,ColumnsStartFrom="north");`

#### Display Data over Basemap Image

Display the basemap image on a map with no axis labels.

```figure mapshow(A,RA) hold on axis off```

Display the icon on the same map.

`mapshow(M,cmap,RM)`

```title("Location of Lakeside Campus") t = "Basemap Attribution: " + attrib; t = string(textwrap(t,55)); subtitle(t)```

### 3-D Surfaces

This example shows how to display a sample 3-D surface over a basemap image.

Create a sample 3-D surface referenced to geographic coordinates. Generate the z-coordinates by using the `peaks` function. Reference the z-coordinates to a region in latitude-longitude coordinates by using the `georefcells` function.

```Z = 100*peaks; RZ = georefcells([42.3342 42.3561],[-73.3191 -73.2847],size(Z));```

To read spatially referenced raster data from a file, use the `readgeoraster` function.

Specify latitude and longitude limits for the basemap image by expanding the 2-D limits of the surface. For this example, expand the limits by `0.01` degrees.

`[latlim,lonlim] = bufgeoquad(RZ.LatitudeLimits,RZ.LongitudeLimits,0.01,0.01);`

Read an image from the `"streets"` basemap as an array, a map cells reference object, and an attribution string.

`[A,RA,attrib] = readBasemapImage("streets",latlim,lonlim);`

#### Project Data to Web Mercator Coordinates

The `readBasemapImage` function spatially references basemap images by using a Web Mercator (WGS 84 / Pseudo-Mercator) projected CRS. To display the surface over the basemap image, you must project the geographic coordinates to the projected CRS.

Extract the geographic coordinates of the surface from the reference object. Then, project the geographic coordinates to Web Mercator coordinates.

```[lat,lon] = geographicGrid(RZ); [x,y] = projfwd(RA.ProjectedCRS,lat,lon);```

#### Display Data over Basemap Image

Display the basemap image on a map with no axis labels.

```figure mapshow(A,RA) hold on axis off```

Display the 3-D surface on the same map.

```surf(x,y,Z) view(3)```

```title("3-D Surface Over Basemap") t = "Basemap Attribution: " + attrib; t = string(textwrap(t,55)); subtitle(t)```