# M_Map: A mapping package for Matlab

You have collected your data, loaded it into Matlab , analyzed everything to death, and now you want to make a simple map showing how it relates to the world.

But you can't.

Instead you have to figure out how to save all your data, and then read it into another program (like, for example GMT ), and then spend all that extra time figuring out why it doesn't give you what you expected it would...

No more!

#### Announcing M_Map v1.3g!

M_Map is a set of mapping tools written for Matlab v5. These include:

1. Routines to project data in 18 different spherical projections (and determine inverse mappings)
2. A grid generation routine to make nice axes with limits either in lat/long terms or in planar X/Y terms.
3. A coastline database (with 1/4 degree resolution)
4. A global elevation database (1 degree resolution)
5. Hooks into freely available high-resolution coastline and bathymetry databases

#### M_Map is now use at more than 2700 locations around the world!

New in release 1.3g are

1. Links to Jan Even Nilsen's m_namebox routines. This is a slick database-driven routine that can be used to add names to your maps, more or less automatically.

New in release 1.3f are

1. m_xydist and m_lldist to estimate distances between points in either geographic or map coordinates.
2. m_legend (create a legend box!).
3. m_plot
4. Many minor bug fixes.

New in release 1.3e are

1. m_range_rings primitive to draw range rings (just great for nuclear weapon destruction radii and seismic travel-time data - see example 11).
2. Extended usefullness of m_ungrid to allow removal of any specific plot element by a command line option.

New in release 1.3d are

1. m_patch primitive
2. m_scale primitive to allow drawing of maps at a required scale
3. True elliptical UTM projection (thanks to P. Lemmond)
4. m_track for drawing tracklines with time/date annotation (thanks to P. Lemmond)(example 10)
5. m_plotbndry - hooks into an online database of political boundaries (Thanks to M. Mann)

New in release 1.3 are

1. High-resolution coastlines! (through hooks into the nested set of coastlines at different resolutions making up the Global Self-consistent Hierarchical High-resolution Shoreline Database (GSHHS) used by GMT (see example 9)
2. Instructions on how to use the new Sandwell and Smith bathymetry
3. Hammer-Aitoff (example 11) and Mollweide projections (example 4)

New in release 1.2 are

1. Built-in functions for drawing lines, text, and quiver plots in long/lat coords
2. Built-in functions for contouring data (filled and line contours) in long/lat coords
3. Hooks into a 5-minute global bathymetry ( TerrainBase ) available from the net.
4. Fancy quiver plots, thanks to E. Firing (see example 8)
5. Gall-Peters projection (handy for large tropical areas)
6. Fancy outline boxes! (see example 2 and example 6)

## How to get M_Map

You can download the M_Map toolbox either as a gzipped tar-file , or as zip archive (Click on these links to download). Both are around 250k in size. Once you have this archive, read the Getting started section of the User's guide to correctly install this toolbox, and sections 9 and 10.1 to install TerrainBase and GSHHS respectively.

A number of examples have been given to highlight the various capabilities of M_Map.

You can also get m_namebox (a set of utilities for automatically adding names to you map), either through its home page http://www.gfi.uib.no/~even/matlab/m_namebox/m_namebox.html or directly as a zip file

## User's guide

1. Getting started
2. Specifying projections

1. Azimuthal projections
2. Cylindrical and Pseudo-cylindrical projections
3. Conic projections
4. Miscellaneous global projections
5. Yeah, but which projection should I use?
6. Map scales

3. Coastlines and Bathymetry

1. Coastline options
2. Topography/Bathymetry options

4. Customizing the axes

1. Grid lines and labels
2. Titles and x/ylabels
3. Legend Boxes

5. Adding your own data

1. Drawing lines, text, arrows, patches and contours
2. Drawing tracklines
3. Drawing range rings
4. Converting longitude/latitude to projection coordinates
5. Converting projection coordinates to longitude/latitude
6. Computing distances between points

6. More complex plots
7. Removing data from a plot
8. Adding your own coastlines

1. DCW political boundaries

9. Adding your own topography/bathymetry

1. Sandwell and Smith Bathymetry

10. Using TerrainBase 5-minute global bathymetry/topography
11. Using the GSHHS high-resolution coastline database

1. Installing GSHHS
2. Using GSHHS effectively

12. M_Map toolbox contents and description
13. Known Problems and Bugs
14. Changes since last release

For information, help, suggestions, or bug reports, contact Rich Pawlowicz , ( rich@ocgy.ubc.ca )

## Acknowledgements

A number of people have helped out with suggestions, code fixes, etc. I am especially grateful for the work done by E. Firing, D. Byrne, M. Mann, J. Pringle, and J. E. Nilsen who have all contributed code.

## Examples

#### 1. M_Map Logo

    m_proj('ortho','lat',48','long',-123');
    m_coast('patch','r');
    m_grid('linest','-','xticklabels',[],'yticklabels',[]);
    patch(.55*[-1 1 1 -1],.25*[-1 -1 1 1]-.55,'w');
    text(0,-.55,'M\_Map','fontsize',25,'color','b',...
       'vertical','middle','horizontal','center');
    set(gcf,'units','inches','position',[2 2 3 3]);
    set(gcf,'paperposition',[3 3 3 3]);

#### 2. Lambert Conformal Conic projection of North American Topography

    m_proj('lambert','long',[-160 -40],'lat',[30 80]);
    m_coast('patch',[1 .85 .7]);
    m_elev('contourf',[500:500:6000]);
    m_grid('box','fancy','tickdir','in');
    colormap(flipud(copper));

#### 3. Stereographic projection of North Polar regions

    % Note that coastline is drawn OVER the grid because of the order in which
    % the two routines are called

    m_proj('stereographic','lat',90,'long',30,'radius',25);
    m_elev('contour',[-3500:1000:-500],'edgecolor','b');
    m_grid('xtick',12,'tickdir','out','ytick',[70 80],'linest','-');
    m_coast('patch',[.7 .7 .7],'edgecolor','r');

#### 4. Two Interrupted Projections of the World's Oceans

    subplot(211);
    Slongs=[-100 0;-75 25;-5 45; 25 145;45 100;145 295;100 290];
    Slats= [  8 80;-80  8; 8 80;-80   8; 8  80;-80   0;  0  80];
    for l=1:7,
     m_proj('sinusoidal','long',Slongs(l,:),'lat',Slats(l,:));
     m_grid('fontsize',6,'xticklabels',[],'xtick',[-180:30:360],...
            'ytick',[-80:20:80],'yticklabels',[],'linest','-','color',[.9 .9 .9]);
     m_coast('patch','g');
    end;
    xlabel('Interrupted Sinusoidal Projection of World Oceans');
    % In order to see all the maps we must undo the axis limits set by m_grid calls:
    set(gca,'xlimmode','auto','ylimmode','auto');

    subplot(212);
    Slongs=[-100 43;-75 20; 20 145;43 100;145 295;100 295];
    Slats= [  0  90;-90  0;-90   0; 0  90;-90   0;  0  90];
    for l=1:6,
     m_proj('mollweide','long',Slongs(l,:),'lat',Slats(l,:));
     m_grid('fontsize',6,'xticklabels',[],'xtick',[-180:30:360],...
            'ytick',[-80:20:80],'yticklabels',[],'linest','-','color','k');
     m_coast('patch',[.6 .6 .6]);
    end;
    xlabel('Interrupted Mollweide Projection of World Oceans');
    set(gca,'xlimmode','auto','ylimmode','auto');

#### 5. Oblique Mercator Projection with quiver and contour data

    %% Nice looking data
    [lon,lat]=meshgrid([-136:2:-114],[36:2:54]);
    u=sin(lat/6);
    v=sin(lon/6);

    m_proj('oblique','lat',[56 30],'lon',[-132 -120],'aspect',.8);

    subplot(121);
    m_coast('patch',[.9 .9 .9],'edgecolor','none');
    m_grid('tickdir','out','yaxislocation','right',...
           'xaxislocation','top','xlabeldir','end','ticklen',.02);
    hold on;
    m_quiver(lon,lat,u,v);
    xlabel('Simulated surface winds');

    subplot(122);
    m_coast('patch',[.9 .9 .9],'edgecolor','none');
    m_grid('tickdir','out','yticklabels',[],...
           'xticklabels',[],'linestyle','none','ticklen',.02);
    hold on;
    [cs,h]=m_contour(lon,lat,sqrt(u.*u+v.*v));
    clabel(cs,h,'fontsize',8);
    xlabel('Simulated something else');

#### 6. Miller Projection with Great Circle

    % Plot a circular orbit
    lon=[-180:180];
    lat=atan(tan(60*pi/180)*cos((lon-30)*pi/180))*180/pi;

    m_proj('miller','lat',82);
    m_coast('color',[0 .6 0]);
    m_line(lon,lat,'linewi',3,'color','r');
    m_grid('linestyle','none','box','fancy','tickdir','out');

#### 7. Lambert Conformal Projection with high-resolution bathymetry of Western Mediterranean

    m_proj('lambert','lon',[-10 20],'lat',[33 48]);
    m_tbase('contourf');
    m_grid('linestyle','none','tickdir','out','linewidth',3);

#### 8. Demonstration of fancy vectors

    m_vec   % See code in m_vec.m for details

#### 9. Zoom in on Prince Edward Island to show different coastline resolutions

    % Example showing the default coastline and all of the different resolutions
    % of GSHHS coastlines as we zoom in on a section of Prince Edward Island.

    clf
    axes('position',[.35 .6 .37 .37]);
    m_proj('albers equal-area','lat',[40 60],'long',[-90 -50],'rect','on');
    m_coast('patch',[0 1 0]);
    m_grid('linest','none','linewidth',2,'tickdir','out','xaxisloc','top','yaxisloc','right');
    m_text(-69,41,'Standard coastline','color','r','fontweight','bold');

    axes('position',[.09 .5 .37 .37]);
    m_proj('albers equal-area','lat',[40 54],'long',[-80 -55],'rect','on');
    m_gshhs_c('patch',[.2 .8 .2]);
    m_grid('linest','none','linewidth',2,'tickdir','out','xaxisloc','top');
    m_text(-80,52.5,'GSHHS\_C (crude)','color','m','fontweight','bold','fontsize',14);

    axes('position',[.13 .2 .37 .37]);
    m_proj('albers equal-area','lat',[43 48],'long',[-67 -59],'rect','on');
    m_gshhs_l('patch',[.4 .6 .4]);
    m_grid('linest','none','linewidth',2,'tickdir','out');
    m_text(-66.5,43.5,'GSHHS\_L (low)','color','m','fontweight','bold','fontsize',14);

    axes('position',[.35 .05 .37 .37]);
    m_proj('albers equal-area','lat',[45.8 47.2],'long',[-64.5 -62],'rect','on');
    m_gshhs_i('patch',[.5 .6 .5]);
    m_grid('linest','none','linewidth',2,'tickdir','out','yaxisloc','right');
    m_text(-64.4,45.9,'GSHHS\_I (intermediate)','color','m','fontweight','bold','fontsize',14);

    axes('position',[.55 .23 .37 .37]);
    m_proj('albers equal-area','lat',[46.375 46.6],'long',[-64.2 -63.7],'rect','on');
    m_gshhs_h('patch',[.6 .6 .6]);
    m_grid('linest','none','linewidth',2,'tickdir','out','xaxisloc','top','yaxisloc','right');
    m_text(-64.18,46.58,'GSHHS\_H (high)','color','m','fontweight','bold','fontsize',14);

#### 10. Tracklines and UTM projection

    m_proj('UTM','long',[-72 -68],'lat',[40 44]);
    m_gshhs_i('color','k');
    m_grid('box','fancy','tickdir','in');

    % fake up a trackline
    lons=[-71:.1:-67];
    lats=60*cos((lons+115)*pi/180);
    dates=datenum(1997,10,23,15,1:41,zeros(1,41));

    m_track(lons,lats,dates,'ticks',0,'times',4,'dates',8,...
            'clip','off','color','r','orient','upright');

#### 11. Range rings

        m_proj('hammer','clong',170);
        m_grid('xtick',[],'ytick',[],'linestyle','-');
        m_coast('patch','g');
        m_line(100.5,13.5,'marker','square','color','r');
        m_range_ring(100.5,13.5,[1000:1000:15000],'color','b','linewi',2);
        xlabel('1000km range rings from Bangkok');

Last changed 19/Dec/2000. Questions and comments to rich@ocgy.ubc.ca