[thredds] spanning the dateline with TDS WMS in Google Maps API

Hi TDS folks,
This tip is for anybody trying to display a global overlay or an overlay
spanning the dateline using WMS (ncWMS) from their TDS in Google Maps API. A
GetMap, GetFeatureInfo, or GetMetadata request will fail if the minimum x
coordinate is greater than the maximum x coordinate, which happens when your
bounding box spans the dateline: the error is something like "invalid bbox".
For those tiles or requests that fall in this category, you can spoof a
projection that is identical to Google Map's (spherical mercator, EPSG:3857)
except that the longitude of origin gets shifted to 0 degrees longitude
rather than 180 degrees longitude. This side-steps the problem of the min x
> max x scenario while remaining spatially accurate. It was suggested to me
by ncWMS author Jon Blower (thanks!).

*Global NCOM sea surface height from TDS ncWMS in Google Maps API
before/after dateline correction (dateline labeled with yellow line in
"before" image):

*[image: google_wms_dateline_beforeafter.png]

Here are my notes for setting up this custom EPSG code in TDS, which I named
EPSG:93857 (so I would remember it's related to EPSG:3857):

   1. shutdown Tomcat
   2. cd /usr/local/tomcat/webapps/thredds/WEB-INF/lib/ (/usr/local/tomcat/
   may live elsewhere on your system)
   3. mkdir temp
   4. cp epsg-wkt.jar temp
   5. cd temp
   6. unzip epsg-wkt.jar
   7. rm epsg-wkt.jar
   8. vi org/geotoolkit/referencing/factory/epsg/epsg.properties
   9. Add the following EPSG code, probably below 3857 since it's related;
   this just changes "Longitude of natural origin" from 0.0 to 180.0:
   93857=PROJCS["WGS 84 / Pseudo-Mercator Dateline",GEOGCS["WGS
   84",DATUM["World Geodetic System 1984",SPHEROID["WGS
   84",6378137.0,298.257223563,AUTHORITY["EPSG","7030"]],
   AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0.0,
   AUTHORITY["EPSG","8901"]],UNIT["degree",0.017453292519943295],AXIS["Geodetic
   latitude",NORTH],AXIS["Geodetic longitude",EAST],AUTHORITY["
   EPSG","4326"]],PROJECTION["Popular Visualisation Pseudo
   Mercator",AUTHORITY["EPSG","1024"]],PARAMETER["Latitude of natural
   origin",0.0],PARAMETER["Longitude of natural origin",180.0],PARAMETER["False
   easting",0.0],PARAMETER["False northing",0.0],UNIT["metre",1.
   0],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","93857"]]
   10. zip -r epsg-wkt.zip META-INF/ org/
   11. mv epsg-wkt.zip epsg-wkt.jar
   12. mv epsg-wkt.jar ..
   13. cd ..
   14. rmdir temp
   15. start Tomcat back up
   16. NOTE: works for WMS requests (GetMap, GetFeatureInfo, GetMetadata)
   but will not appear in GetCapabilities (a future TDS/ncWMS enhancement
   should allow admin to add more EPSG codes)

As another tip, you can convert from latitude and longitude to EPSG:3857
using PROJ.4's JavaScript library (PROJ4JS <http://www.proj4js.org>):
surprisingly, the Google Maps API doesn't provide a function for computing
this. You can then convert an x coordinate from EPSG:3857 to EPSG:93857
using a JavaScript function like this:

function invertEPSG3857 ( x ) {

  var new_x = 0.0;

  // Maximum x coordinate in EPSG:3857 in meters:

  var max_x = 20037508.34;

  if ( x > 0 ) {
    new_x = x - max_x;
  }
  else {
    new_x = x + max_x;
  }

  return new_x;

}

Aloha,
John Maurer
Pacific Islands Ocean Observing System (PacIOOS)
University of Hawaii at Manoa

Attachment: google_wms_dateline_beforeafter.png
Description: PNG image