On Tue, 5 Jun 2007, Eric Lemoine wrote:
As pointed out by Christopher you can use Tim Schaub's GoogleMercator
layer, his openlayers tree is located here
<http://dev.openlayers.org/sandbox/tschaub/google/.

Thanks, that got me almost all the way there :)

The snag I hit was that I'm using the google projection (I'm told it's EPSG:41001), and GoogleMercator seems to use true mercator (EPSG:54005). This means things almost, but not quite line up.


Attached is a patch for GoogleMercator which sorts this. It checks to see if the overall maps projection is set to EPSG:41001 or not. If it's not, the current behaviour applies. If it is, then it uses slightly different conversion routines, which allow it to be compatible.

With the patch applied, everything lines up very nicely for me

Nick
--- GoogleMercator.js.sav       2007-06-05 15:28:53.000000000 +0100
+++ GoogleMercator.js   2007-06-05 15:55:41.000000000 +0100
@@ -19,6 +19,7 @@
     rMajor: 6378137.0,
     rMinor: 6356752.31424518,
     eccent: Math.sqrt(1.0 - Math.pow(6356752.31424518 / 6378137.0, 2)),
+    halfExt41001: 20037508.34,
 
     /** 
      * @constructor
@@ -159,7 +160,8 @@
     },
     
     /**
-     * Given a point in EPSG:4326, return a point in EPSG:54005 (Mercator)
+     * Given a point in EPSG:4326, return a point in EPSG:54005 (Mercator),
+     *  or EPSG:41001 if that's set for the map.
      *
      * @param {OpenLayers.LonLat|GLatLng} lonlat
      * @type OpenLayers.LonLat
@@ -174,7 +176,37 @@
             lon = lonlat.lon;
             lat = lonlat.lat;
         }
-        
+
+               if(this.map.projection == "EPSG:41001") {
+                       return this.forwardMercator41001(lon,lat);
+               }
+               return this.forwardMercator54005(lon,lat);
+       },
+
+    /**
+     * Given a point in EPSG:4326, return a point in EPSG:41001 (Google 
Modified Mercator)
+     *
+     * @param {OpenLayers.LonLat|GLatLng} lonlat
+     * @type OpenLayers.LonLat
+     * @returns The coordinates transformed to Mercator
+     */
+       forwardMercator41001: function(lon,lat) {    
+               var x = Math.log( Math.tan( (90+lat) * Math.PI / 360 ) ) / 
(Math.PI/180);       
+               x = x * this.halfExt41001 / 180;
+
+               var y = lon * this.halfExt41001 / 180;
+               
+        return new OpenLayers.LonLat(x, y);
+       },
+    
+    /**
+     * Given a point in EPSG:4326, return a point in EPSG:54005 (Mercator)
+     *
+     * @param {OpenLayers.LonLat|GLatLng} lonlat
+     * @type OpenLayers.LonLat
+     * @returns The coordinates transformed to Mercator
+     */
+       forwardMercator54005: function(lon,lat) {    
         // convert to radians
         if(lat <= 90.0 && lat >= -90.0 && lon <= 180.0 && lon >= -180.0) {
             lat *= this.deg2rad;
@@ -202,7 +234,8 @@
     },
 
     /**
-     * Given a point in EPSG:54005 (Mercator), return a point in EPSG:4326.
+     * Given a point in EPSG:54005 (Mercator) or EPSG:41001 (if set for the
+     *  overall Map), return a point in EPSG:4326.
      * Ignore that the argument type is named LonLat - these are coordinates in
      * a Mercator projection, with units of meters.
      *
@@ -211,7 +244,42 @@
      * @returns The coordinates transformed to EPSG:4326
      */
     inverseMercator: function(merc) {
+               if(this.map.projection == "EPSG:41001") {
+                       return this.inverseMercator41001(merc);
+               }
+               return this.inverseMercator54005(merc);
+       },
 
+    /**
+     * Given a point in EPSG:41001 (Google Modified Mercator), return a point 
in EPSG:4326.
+     * Ignore that the argument type is named LonLat - these are coordinates in
+     * a Mercator projection, with units of meters.
+     *
+     * @param {OpenLayers.LonLat} merc
+     * @type OpenLayers.LonLat
+     * @returns The coordinates transformed to EPSG:4326
+     */
+    inverseMercator41001: function(merc) {
+               var lon = merc.lon * 180 / this.halfExt41001;
+               var lat = merc.lat * 180 / this.halfExt41001;
+
+               lat = lat * Math.PI / 180;
+               lat = Math.atan( Math.pow(Math.E,lat) ) / PI * 360
+               lat = lat - 90
+
+        return new OpenLayers.LonLat(lon, lat);
+       },
+
+    /**
+     * Given a point in EPSG:54005 (Mercator), return a point in EPSG:4326.
+     * Ignore that the argument type is named LonLat - these are coordinates in
+     * a Mercator projection, with units of meters.
+     *
+     * @param {OpenLayers.LonLat} merc
+     * @type OpenLayers.LonLat
+     * @returns The coordinates transformed to EPSG:4326
+     */
+    inverseMercator54005: function(merc) {
         // calculate latitude
         var temp = this.rMinor / this.rMajor;
         var ts = Math.exp(-merc.lat / this.rMajor);
_______________________________________________
Users mailing list
[email protected]
http://openlayers.org/mailman/listinfo/users

Reply via email to