<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content=text/html;charset=iso-8859-1>
<META content="MSHTML 6.00.6002.18457" name=GENERATOR></HEAD>
<BODY id=MailContainerBody 
style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-TOP: 15px" leftMargin=0 
topMargin=0 CanvasTabStop="true" name="Compose message area">
<DIV><FONT face=Arial size=2>I've had similar problems and I've solved it by 
adding an event listener to the map's baselayerchange event.</FONT></DIV>
<DIV>you would put mapOptionsEtrs properties on the Etrs base layer rather than 
on the map. Map options are most ignored and overwritten by base layer 
options.</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>here is my baselayerchange event handler, which is 
called with the map as scope.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>function onBaseLayerChange(evtObj){<BR>&nbsp;&nbsp; 
var mapProj, baseProj, map, newBase, reproject;<BR>&nbsp;&nbsp; map = 
this;<BR>&nbsp;&nbsp; newBase = evtObj.layer;<BR>&nbsp;&nbsp; mapProj = 
(map.projection &amp;&amp; map.projection instanceof OpenLayers.Projection) ? 
map.projection : new OpenLayers.Projection(map.projection);<BR>&nbsp;&nbsp; 
baseProj = newBase.projection;<BR>&nbsp;&nbsp; reproject = 
!(baseProj.equals(mapProj));<BR>&nbsp;&nbsp; if (reproject) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var center, 
maxExt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //calc proper reporojected 
center<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; center = 
map.getCenter().transform(mapProj, baseProj);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
//calc correct reprojected extents<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxExt = 
newBase.maxExtent;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //set map projection, 
extent, &amp; center of map to proper values<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
map.projection = baseProj;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.maxExtent = 
maxExt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.setCenter(center);<BR>&nbsp;&nbsp; 
}<BR>}</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>Matt Priour</FONT></DIV>
<DIV><FONT face=Arial size=2>Kestrel Computer Consulting</FONT></DIV>
<DIV style="FONT: 10pt Tahoma">
<DIV><BR></DIV>
<DIV style="BACKGROUND: #f5f5f5">
<DIV style="font-color: black"><B>From:</B> <A title=hfpmartins@gmail.com 
href="mailto:hfpmartins@gmail.com">Hugo</A> </DIV>
<DIV><B>Sent:</B> Monday, June 20, 2011 12:45 PM</DIV>
<DIV><B>To:</B> <A title=users@geoext.org 
href="mailto:users@geoext.org">users@geoext.org</A> </DIV>
<DIV><B>Subject:</B> [Users] Programmatically changing the base map 
projection</DIV></DIV></DIV>
<DIV><BR></DIV>Dear Geoext users,<BR><BR>I'm trying to develop a functionality 
that will allow the user to change the base map projection. The initial map is 
using the spherical mercator projection so that OSM and Google/Yahoo/Bing layers 
can be displayed. Because the users will need to edit features at specific 
scales (1:25.000; 1:10.000) i need to develop a function that will change the 
projection from spherical mercator to ETRS PTM06 (EPSG:3763). I think i'm almost 
there but somehow, after reprojection the base map i get my map full extent much 
higher in latitude (so, more to the north) and much smaller in longitude (more 
to the west).<BR><BR>My steps are:<BR>1. Remove all OSM/Google/Yahoo/Bing layers 
from the map.<BR>2. Add new options to the map<BR>3. Merge new options 
(projection) to a blank layer and set it as basellayer<BR>4. Loop the remaining 
layers and add new options.<BR><BR>The relevant part of the code is 
below:<BR><BR>//Map options<BR>var mapOptions = {<BR>&nbsp;&nbsp;&nbsp; 
maxExtent: bBox,<BR>&nbsp;&nbsp;&nbsp; maxResolution: 
305.74811309814453,<BR>&nbsp;&nbsp;&nbsp; minResolution: 
0.29858214169740677,<BR>&nbsp;&nbsp;&nbsp; resolutions: 
mapResolutions,<BR>&nbsp;&nbsp;&nbsp; units: 'm',<BR>&nbsp;&nbsp;&nbsp; 
projection: baseMercator,<BR>&nbsp;&nbsp;&nbsp; displayProjection: 
wgs,<BR>&nbsp;&nbsp;&nbsp; restrictedExtent: bBox,<BR>&nbsp;&nbsp;&nbsp; 
panMethod: OpenLayers.Easing.Quad.easeOut,<BR>&nbsp;&nbsp;&nbsp; numZoomLevels: 
20,<BR>&nbsp;&nbsp;&nbsp; controls: []<BR>};<BR><BR>var mapOptionsEtrs = 
{<BR>&nbsp;&nbsp;&nbsp; maxExtent: bBoxEtrs,<BR>&nbsp;&nbsp;&nbsp; 
maxResolution: 282.2220698223045,<BR>&nbsp;&nbsp;&nbsp; minResolution: 
0.35277758727788067,<BR>&nbsp;&nbsp;&nbsp; resolutions: 
mapResolutionsEtrs,<BR>&nbsp;&nbsp;&nbsp; units: 'm',<BR>&nbsp;&nbsp;&nbsp; 
projection: etrs,<BR>&nbsp;&nbsp;&nbsp; displayProjection: 
etrs,<BR>&nbsp;&nbsp;&nbsp; restrictedExtent: bBoxEtrs,<BR>&nbsp;&nbsp;&nbsp; 
panMethod: OpenLayers.Easing.Quad.easeOut,<BR>&nbsp;&nbsp;&nbsp; numZoomLevels: 
10,<BR>};<BR><BR><BR>//Reprojection logic<BR>var radioValue = 
Ext.getCmp('srsradiogroup').getValue().getGroupValue();<BR>var mapProj = 
map.getProjection();<BR>var baseCart = 
treePanel.getNodeById('basecartography');<BR>if (radioValue != mapProj 
&amp;&amp; radioValue == 'EPSG:3763') {<BR>&nbsp;&nbsp;&nbsp; 
baseCart.cascade(function () {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var 
childNodes = this.childNodes;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for 
(i = 0; i &lt; childNodes.length; i++) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch 
(childNodes[i].text) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 
'OpenStreetMap':<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
childNodes[i].disable();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
map.removeLayer(osm);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
case 'Google 
Streets':<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
childNodes[i].disable();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
map.removeLayer(gstreets);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
// and so 
on...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; 
});<BR><BR>&nbsp;&nbsp;&nbsp; 
map.setOptions(mapOptionsEtrs);<BR>&nbsp;&nbsp;&nbsp; 
map.layerContainerOrigin.transform(baseMercator, 
etrs);<BR><BR>&nbsp;&nbsp;&nbsp; 
blankLayer.addOptions({<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
projection: etrs<BR>&nbsp;&nbsp;&nbsp; });<BR>&nbsp;&nbsp;&nbsp; 
map.setBaseLayer(blankLayer);<BR><BR>&nbsp;&nbsp;&nbsp; for (i = 0; i &lt; 
mapPanel.map.layers.length; i++) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
var className = 
mapPanel.map.layers[i].CLASS_NAME;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
if (className == 'OpenLayers.Layer.WMS') 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
mapPanel.map.layers[i].addOptions({<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
srs: etrs<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
});<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (className == 
'OpenLayers.Layer.Vector') 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
mapPanel.map.layers[i].projection = 
etrs;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //here i 
will control other types of layers like 
tilecache<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; 
}<BR>}<BR><BR>Checking the map and layers projection through firebug, it seems 
everything is correct.<BR>I've also tried to get the initial extent of the map, 
reproject it and zoom to it after the reprojection but the it still goes to the 
same place.<BR><BR>What might be the issues here?? Am i doing something 
completely wrong?<BR>Cheers,<BR><BR>Hugo<BR>&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <BR><BR 
clear=all><BR>-- <BR>Hugo Martins<BR>LabNT - ISEGI UNL<BR>Campus de 
Campolide<BR>1070-312 Lisboa<BR>N 38°43'56.84", W 9°9'35.74"<BR>
<P>
<HR>

<P></P>_______________________________________________<BR>Users mailing 
list<BR>Users@geoext.org<BR>http://www.geoext.org/cgi-bin/mailman/listinfo/users<BR></BODY></HTML>