[Users] Programmatically changing the base map projection

Hugo hfpmartins at gmail.com
Tue Jun 21 15:42:56 CEST 2011


Hi Matt,

That works like a charm ;)
Really, thanks a lot for this suggestion and code!

Cheers,

Hugo


On Mon, Jun 20, 2011 at 8:29 PM, Matt Priour <mpriour at kestrelcomputer.com>wrote:

> **
> I've had similar problems and I've solved it by adding an event listener to
> the map's baselayerchange event.
> 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.
>
> here is my baselayerchange event handler, which is called with the map as
> scope.
>
> function onBaseLayerChange(evtObj){
>    var mapProj, baseProj, map, newBase, reproject;
>    map = this;
>    newBase = evtObj.layer;
>    mapProj = (map.projection && map.projection instanceof
> OpenLayers.Projection) ? map.projection : new
> OpenLayers.Projection(map.projection);
>    baseProj = newBase.projection;
>    reproject = !(baseProj.equals(mapProj));
>    if (reproject) {
>       var center, maxExt;
>       //calc proper reporojected center
>       center = map.getCenter().transform(mapProj, baseProj);
>       //calc correct reprojected extents
>       maxExt = newBase.maxExtent;
>       //set map projection, extent, & center of map to proper values
>       map.projection = baseProj;
>       map.maxExtent = maxExt;
>       map.setCenter(center);
>    }
> }
>
> Matt Priour
> Kestrel Computer Consulting
>
>  *From:* Hugo <hfpmartins at gmail.com>
> *Sent:* Monday, June 20, 2011 12:45 PM
> *To:* users at geoext.org
> *Subject:* [Users] Programmatically changing the base map projection
>
> Dear Geoext users,
>
> 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).
>
> My steps are:
> 1. Remove all OSM/Google/Yahoo/Bing layers from the map.
> 2. Add new options to the map
> 3. Merge new options (projection) to a blank layer and set it as basellayer
> 4. Loop the remaining layers and add new options.
>
> The relevant part of the code is below:
>
> //Map options
> var mapOptions = {
>     maxExtent: bBox,
>     maxResolution: 305.74811309814453,
>     minResolution: 0.29858214169740677,
>     resolutions: mapResolutions,
>     units: 'm',
>     projection: baseMercator,
>     displayProjection: wgs,
>     restrictedExtent: bBox,
>     panMethod: OpenLayers.Easing.Quad.easeOut,
>     numZoomLevels: 20,
>     controls: []
> };
>
> var mapOptionsEtrs = {
>     maxExtent: bBoxEtrs,
>     maxResolution: 282.2220698223045,
>     minResolution: 0.35277758727788067,
>     resolutions: mapResolutionsEtrs,
>     units: 'm',
>     projection: etrs,
>     displayProjection: etrs,
>     restrictedExtent: bBoxEtrs,
>     panMethod: OpenLayers.Easing.Quad.easeOut,
>     numZoomLevels: 10,
> };
>
>
> //Reprojection logic
> var radioValue = Ext.getCmp('srsradiogroup').getValue().getGroupValue();
> var mapProj = map.getProjection();
> var baseCart = treePanel.getNodeById('basecartography');
> if (radioValue != mapProj && radioValue == 'EPSG:3763') {
>     baseCart.cascade(function () {
>         var childNodes = this.childNodes;
>         for (i = 0; i < childNodes.length; i++) {
>             switch (childNodes[i].text) {
>             case 'OpenStreetMap':
>                 childNodes[i].disable();
>                 map.removeLayer(osm);
>                 break;
>             case 'Google Streets':
>                 childNodes[i].disable();
>                 map.removeLayer(gstreets);
>                 break;
>                 // and so on...
>             }
>         }
>     });
>
>     map.setOptions(mapOptionsEtrs);
>     map.layerContainerOrigin.transform(baseMercator, etrs);
>
>     blankLayer.addOptions({
>         projection: etrs
>     });
>     map.setBaseLayer(blankLayer);
>
>     for (i = 0; i < mapPanel.map.layers.length; i++) {
>         var className = mapPanel.map.layers[i].CLASS_NAME;
>         if (className == 'OpenLayers.Layer.WMS') {
>             mapPanel.map.layers[i].addOptions({
>                 srs: etrs
>             });
>         } else if (className == 'OpenLayers.Layer.Vector') {
>             mapPanel.map.layers[i].projection = etrs;
>         } else {
>             //here i will control other types of layers like tilecache
>         }
>     }
> }
>
> Checking the map and layers projection through firebug, it seems everything
> is correct.
> 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.
>
> What might be the issues here?? Am i doing something completely wrong?
> Cheers,
>
> Hugo
>
>
>
> --
> Hugo Martins
> LabNT - ISEGI UNL
> Campus de Campolide
> 1070-312 Lisboa
> N 38°43'56.84", W 9°9'35.74"
>
> ------------------------------
>
> _______________________________________________
> Users mailing list
> Users at geoext.org
> http://www.geoext.org/cgi-bin/mailman/listinfo/users
>
>


-- 
Hugo Martins
LabNT - ISEGI UNL
Campus de Campolide
1070-312 Lisboa
N 38°43'56.84", W 9°9'35.74"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.geoext.org/pipermail/users/attachments/20110621/dcbdaa08/attachment.htm 


More information about the Users mailing list