Converting NZMG (or NZTM) to latitude / longitude for use with R map library

One of the most overlooked aspects of transforming coordinates from NZGD1949 to NZGD2000, including NZMG1949 to NZTM2000, is that it should use a transformation method. There are three methods:

  • 3 parameter similarity, with 5 metres nominal accuracy
  • 7 parameter similarity, with 4 metres nominal accuracy
  • Distortion grid, with 0.1 - 1.0 metres nominal accuracy

These are available to most GIS, including ArcGIS and PROJ-based. The distortion grid approach is clearly the best method, and can be used with a "nzgd2kgrid0005.gsb" grid shift file, available in PROJ's proj-datumgrid-1.5.zip (or newer). If building PROJ from source, this zip file needs to be unzipped to the data subdirectory before ./configure.

The following PROJ.4 string is the correct one for NZMG1949 (SRID=27200):

+proj=nzmg +lat_0=-41 +lon_0=173 +x_0=2510000 +y_0=6023150 +ellps=intl +datum=nzgd49 +units=m +towgs84=59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993 +nadgrids=nzgd2kgrid0005.gsb +no_defs

For NZ coordinates, it's also a good idea to check them using the LINZ Online Converter, otherwise you may have points that are hundreds of meters off.


NZTM is not UTM zone 60 South. Its parameter values should be specified like this:

+proj=tmerc +lat_0=0.0 +lon_0=173.0 +k=0.9996 +x_0=1600000.0 +y_0=10000000.0 +datum=WGS84 +units=m

(it's not really WGS84, but NZGD2000 but close enough)

NZMG uses:

+proj=nzmg +lat_0=-41.0 +lon_0=173.0 +x_0=2510000.0 +y_0=6023150.0 +ellps=intl +units=m

NZMG is on NZGD 1949 which is not WGS84/NZGD 2000. That means a datum transformation. I believe you need to use cs2cs rather than +proj. There's some discussion here or here and it's definitely been discussed before. A possible transformation uses these parameters:

+towgs84=59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993