Problem with limit zoom levels(want to stop zoom method)

1796
2
05-01-2014 09:21 PM
NoppadonHimananto
New Contributor II
My map has limit level at 21 level, and I limit user at level 19 that user can't zoom more on this level.

this is my code.
    map.on("zoom-end", function(){
     if(map.getLevel() > 19 )
     {
      map.setZoom(19);
     }
    });// end map zoomEnd


The result is after map zoom over level 19 , my map will continue zoom then re-render and zoom back to level 19.

But what i need is map must not zoom anymore at level 19.

So, I think i must do something at "zoom-start" event for assign it to stop zoom.
map.on("zoom-start", function(){
  if(map.getLevel() > 18 )
  {
   //do something to break, cancel zoom method
                        //like disableScrollWheelZoom() results that user can't not zoom anymore
                        // but i don't want to disable it because I still let user to zoom out.
  }
 });

But I don't know how.
________________________________________________________________________

On other ways that I try is I set maxZoom on starting create map.
var lods = [
    {"level" : 0, "resolution" : 156543.03392800014, "scale" : 5.91657527591555E8},
    {"level" : 1, "resolution" : 78271.51696399994, "scale" : 2.95828763795777E8},
    {"level" : 2, "resolution" : 39135.75848200009, "scale" : 1.47914381897889E8},
    {"level" : 3, "resolution" : 19567.87924099992, "scale" : 7.3957190948944E7},
    {"level" : 4, "resolution" : 9783.93962049996, "scale" : 3.6978595474472E7},
    {"level" : 5, "resolution" : 4891.96981024998, "scale" : 1.8489297737236E7},
    {"level" : 6, "resolution" : 2445.98490512499, "scale" : 9244648.868618},
    {"level" : 7, "resolution" : 1222.992452562495, "scale" : 4622324.434309},
    {"level" : 8, "resolution" : 611.4962262813797, "scale" : 2311162.217155},
    {"level" : 9, "resolution" : 305.74811314055756, "scale" : 1155581.108577},
    {"level" : 10, "resolution" : 152.87405657041106, "scale" :  577790.554289},
    {"level" : 11, "resolution" : 76.43702828507324, "scale" : 288895.277144},
    {"level" : 12, "resolution" : 38.21851414253662, "scale" : 144447.638572},
    {"level" : 13, "resolution" : 19.10925707126831, "scale" : 72223.819286},
    {"level" : 14, "resolution" : 9.554628535634155, "scale" : 36111.909643},
    {"level" : 15, "resolution" : 4.77731426794937, "scale" : 18055.954822},
    {"level" : 16, "resolution" : 2.388657133974685, "scale" : 9027.977411},
    {"level" : 17, "resolution" : 1.1943285668550503, "scale" : 4513.988705},
    {"level" : 18, "resolution" : 0.5971642835598172, "scale" : 2256.994353},
    {"level" : 19, "resolution" : 0.29858214164761665, "scale" : 1128.497176},
    {"level" : 20, "resolution" : 0.1492910708238083, "scale" : 564.248588},
    {"level" : 21, "resolution" : 0.0746455354119042, "scale" : 282.124294}
    ];
    map = new Map("map",{
     lods: lods,
     center:[100.543623,13.703039],
     zoom: 18,
                                        maxZoom: 19,
     fadeOnZoom: true
    });


On this way user can't zoom anymore at level 19, but My map concept is outdoor layer and indoor layer that
I will limit user to zoom at level 19 because level 0 - 19 is outdoor layer, If user need to zoom in indoor layer(level 20 - 21).
User must click something like symbol or button for zoom in to indoor layer.

so I need to set maxZoom again after click symbol or button. but i can't find the way to set it.
I only found method like getMaxZoom(). but i don't found method setMaxZoom() or something like this.

Thanks for helps.
0 Kudos
2 Replies
AnthonyGiles
Frequent Contributor
Noppadon,

The problem I think you will run into trying to use the ZoomStart event is that the map values have not change yet so you cannot check to see if the zoom level is past level 18. Using the ZoomEnd you get the updated values but you end up with this bouncing effect where the map zooms in then jumps back out. Have you tried looking at the zoomDuration attribute which controls the refresh of the map.

You could try setting this to zero (to stop the map refreshing) before your check then set it back after this way the user may not see the zoom in and out.

https://developers.arcgis.com/javascript/jssamples/mapconfig_smoothzoom.html

Just a thought that may work

Regards

Anthony
0 Kudos
NoppadonHimananto
New Contributor II
Noppadon,

The problem I think you will run into trying to use the ZoomStart event is that the map values have not change yet so you cannot check to see if the zoom level is past level 18. Using the ZoomEnd you get the updated values but you end up with this bouncing effect where the map zooms in then jumps back out. Have you tried looking at the zoomDuration attribute which controls the refresh of the map.

You could try setting this to zero (to stop the map refreshing) before your check then set it back after this way the user may not see the zoom in and out.

https://developers.arcgis.com/javascript/jssamples/mapconfig_smoothzoom.html

Just a thought that may work

Regardsit

Anthony


Thanks for your helps, Anthony. After set ZoomDuration to 0, the result is better but it still has some flash in milliseconds.

I found the issues that if user quickly repeatedly scroll mouse-wheel to zoom on over limit layer, then it will trigger to event map zoom many times.
Then map will zooms in then jumps back out and sometimes they will crash or some graphics isn't immediately redraw.(only if user quickly and repeatedly scroll mouse-wheel too much)

In real, user may not do this things. but I still need to clear this issue out. So I think I need to completely block/disable zoom-In on limited level. Like the map that zoom reach to max level, at that level if user zoom more . it will not have any action. and If user want to zoom more, user must click some symbol or button to unlock limited max zoom or receive permission to zoom more to level 20,21.

Thanks again.
0 Kudos