⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scalesliderphaselistener.java

📁 esri的ArcGIS Server超级学习模板程序(for java)
💻 JAVA
字号:
package com.esri.solutions.jitk.web.event;


import com.esri.adf.web.data.WebContext;
import com.esri.adf.web.data.WebMap;
import com.esri.adf.web.data.geometry.GeometryUtil;
import com.esri.adf.web.data.geometry.WebExtent;
import com.esri.adf.web.faces.component.MapControl;
import com.esri.adf.web.faces.renderkit.xml.ajax.AJAXResponseRenderer;
import com.esri.adf.web.faces.renderkit.xml.ajax.AJAXUtil;

import java.util.Map;
import java.util.Vector;
import org.apache.log4j.Logger;
import javax.faces.component.UIComponent;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import org.w3c.dom.Document;

public class ScaleSliderPhaseListener implements PhaseListener {
	private static final long serialVersionUID = 200868259665049368L;
	private static Logger _logger = Logger.getLogger(ScaleSliderPhaseListener.class.getName());

	//Parameter names expected in request
	static final String MAP_ZOOM = "mapZoom";
	static final String FORM_ID = "formId";
	static final String MAP_ID = "mapId";
	static final String FACTOR = "factor";

	/**
	 * This PhaseListener must be executed in the JSF's Restore View phase
	 */
	public PhaseId getPhaseId() {
		return PhaseId.APPLY_REQUEST_VALUES;
	}

	public void beforePhase(PhaseEvent phaseEvent) {
	}
 
	/**
	 * Process functionality based on request parameters
	 */
	public void afterPhase(PhaseEvent phaseEvent) {
	    FacesContext facesContext = phaseEvent.getFacesContext();
	    ExternalContext externalContext = facesContext.getExternalContext();
	    
	    @SuppressWarnings("unchecked")
	    Map paramMap = externalContext.getRequestParameterMap();

	    //Verify if request is to be processed by this PhaseListener
	    if (!MAP_ZOOM.equals((String) paramMap.get(MAP_ZOOM))) {
	    	return;
		}
	    IScaleSliderConfig ssb = (IScaleSliderConfig) facesContext.getApplication().createValueBinding("#{scaleSliderBB}").getValue(facesContext);
	    double minScale_ = Math.round(ssb.getMinScale());
	    
	    try {	    	    
	    	//Get Form from view
	    	UIComponent form = facesContext.getViewRoot().findComponent((String) paramMap.get(FORM_ID));
	
	    	//Get MapControl
	    	MapControl mapControl = (MapControl) form.findComponent((String) paramMap.get(MAP_ID));
	    	WebMap webMap = mapControl.getWebMap();
	    	WebContext webContext = webMap.getWebContext();

		    //Set event source as map, since operation is to be performed on the map
		    Vector<String> eventSources = new Vector<String>();
		    eventSources.add(mapControl.getId());
		    AJAXResponseRenderer ajaxRenderer = new AJAXResponseRenderer(facesContext, eventSources, form);
	
		    //Get, expand and set map's extent					
		    WebExtent webExtent = webMap.getCurrentExtent();
		    WebExtent fullExtent = webMap.getFullExtent();
			double currentMapScale =  webMap.getMapScale();
		    double mapScale = Double.parseDouble((String) paramMap.get(FACTOR));
			double scaleFactor = mapScale / currentMapScale; 	
			
			com.esri.solutions.jitk.web.data.geometry.WebExtent newExtent = 
				new com.esri.solutions.jitk.web.data.geometry.WebExtent(webExtent); 
			newExtent.expand(scaleFactor);
			
			//Do not scale the map to an extent that is not supported by the horizon of the 
			//coordinate system, i.e. full extent
		    
			if (GeometryUtil.inside(newExtent, fullExtent)) {
				_logger.debug("Next extent " + newExtent + " within full extent " + fullExtent+ ", scaling");				
				webExtent.expand(scaleFactor);
			  			
			} else {				
				_logger.debug("Next extent " + newExtent + " NOT within full extent " + fullExtent+ ", NOT scaling");
				//double mapScale_ = 
				WebExtent extent_ = getMaxAllowedScale(minScale_, mapScale , currentMapScale, newExtent, fullExtent);
				webMap.setCurrentExtent(extent_); //webMap.setMapScale(mapScale_);				
				
			}
			 webContext.refresh();						 
			 Document doc = ajaxRenderer.renderResponse(facesContext);						
		    //initialize response
		    AJAXUtil.writeResponse(facesContext, doc);
	    } catch (Exception e) {
	    	_logger.error("Unable to render xml", e);
	    } finally {
	    	//notify Faces Lifecycle
	    	facesContext.responseComplete();
	    }
	}
	
	protected WebExtent getMaxAllowedScale(double minScale, double newMapScale, double currentScale, com.esri.solutions.jitk.web.data.geometry.WebExtent currentExtent, WebExtent fullExtent) {
		double newScale = currentScale;
		double scaleFactor=1.0;
		com.esri.solutions.jitk.web.data.geometry.WebExtent newExtent=currentExtent;
		
		try {
			while(newMapScale > currentScale) {		  
				// decrement current scale by a factor (minscale == 15000)
				newScale = newMapScale - minScale;
		  
				// calculate scale factor 
				scaleFactor = (newScale/newMapScale);
		 
				// calculate new web extent
				newExtent = new com.esri.solutions.jitk.web.data.geometry.WebExtent(currentExtent);
				newExtent.expand(scaleFactor);
	 
				if (GeometryUtil.inside(newExtent, fullExtent)) {
					return newExtent; //return newScale; 
				} 
				newMapScale = newScale;
				currentExtent =new com.esri.solutions.jitk.web.data.geometry.WebExtent(newExtent); 
			}
		} catch(Exception ex) {
			_logger.debug(ex.getMessage()); 
		}
	   
		return newExtent;
	}	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -