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

📄 wmsrequests.java

📁 电子地图服务器,搭建自己的地图服务
💻 JAVA
字号:
/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved.
 * This code is licensed under the GPL 2.0 license, availible at the root
 * application directory.
 */
package org.geoserver.wms.util;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.geoserver.ows.util.KvpUtils;
import org.geotools.map.MapLayer;
import org.geotools.styling.Style;
import org.vfny.geoserver.global.GeoServer;
import org.vfny.geoserver.global.MapLayerInfo;
import org.vfny.geoserver.util.Requests;
import org.vfny.geoserver.wms.WMSMapContext;
import org.vfny.geoserver.wms.requests.GetMapRequest;
import org.vfny.geoserver.wms.requests.WMSRequest;

import com.vividsolutions.jts.geom.Envelope;

/**
 * Utility class for creating wms requests.
 *
 * @author Justin Deoliveira, The Open Planning Project, jdeolive@openplans.org
 * @see Requests
 */
public class WMSRequests {
    /**
     * Returns the base url for a wms request, something of the form:
     * <pre>&lt;protocol>://&lt;server>:&lt;port>/&lt;context>/wms</pre>
     *
     * @param request The request.
     * @param geoServer GeoServer configuration.
     *
     * @return The base for wms requests.
     */
    public static String getBaseUrl( HttpServletRequest request, GeoServer geoServer ) {
        String baseUrl = Requests.getBaseUrl( request, geoServer );
        baseUrl = Requests.appendContextPath(baseUrl, "wms" );
        
        return baseUrl;
    }

    /**
     * Returns the base url for a wms request, something of the form:
     * <pre>&lt;protocol>://&lt;server>:&lt;port>/&lt;context>/wms</pre>
     *
     * @param req The wms request.
     * 
     * @return The base for wms requests.
     */
    public static String getBaseUrl( WMSRequest request ) {
        return getBaseUrl( request.getHttpServletRequest(), request.getGeoServer() );  
    }
    
    /**
     * Returns the base url for a wms request, something of the form:
     * <pre>&lt;protocol>://&lt;server>:&lt;port>/&lt;context>/wms</pre>
     * 
     * @param map A wms map context.
     *
     * @return The base for wms requests.
     */
    public static String getBaseUrl( WMSMapContext map ) {
        return getBaseUrl( map.getRequest() );
    }

    /**
     * Encodes the url of a GetMap request pointing to a tile cache if one
     * exists.
     * <p>
     * The tile cache location is determined from {@link GeoServer#getTileCache()}.
     * If the above method returns null this method falls back to the behaviour
     * of {@link #getGetMapUrl(WMSMapContext, MapLayer, Envelope, String[])}.
     * </p>
     * <p>
     * If the <tt>layer</tt> argument is <code>null</code>, the request is
     * made including all layers in the <tt>mapContexT</tt>.
     * </p>
     * <p>
     * If the <tt>bbox</tt> argument is <code>null</code>. {@link WMSMapContext#getAreaOfInterest()}
     * is used for the bbox parameter.
     * </p>
     *
     * @param req The getMap request.
     * @param layer The Map layer, may be <code>null</code>.
     * @param bbox The bounding box of the request, may be <code>null</code>.
     * @param kvp Additional or overidding kvp parameters, may be <code>null</code>
     *
     * @return The full url for a getMap request.
     */
    public static String getTiledGetMapUrl(GetMapRequest req, MapLayer layer, Envelope bbox, String[] kvp) {
        String baseUrl = Requests.getTileCacheBaseUrl(req.getHttpServletRequest(),
                    req.getGeoServer());
        
        if ( baseUrl == null ) {
            return getGetMapUrl( req, layer, bbox, kvp );

        }
        
        return getGetMapUrl( baseUrl, req, layer.getTitle(),layer.getStyle().getName(), bbox, kvp );
    }

    /**
     * Encodes the url of a GetMap request.
     * <p>
     * If the <tt>layer</tt> argument is <code>null</code>, the request is
     * made including all layers in the <tt>mapContexT</tt>.
     * </p>
     * <p>
     * If the <tt>bbox</tt> argument is <code>null</code>. {@link WMSMapContext#getAreaOfInterest()}
     * is used for the bbox parameter.
     * </p>
     *
     * @param req The getMap request
     * @param layer The Map layer, may be <code>null</code>.
     * @param bbox The bounding box of the request, may be <code>null</code>.
     * @param kvp Additional or overidding kvp parameters, may be <code>null</code>
     *
     * @return The full url for a getMap request.
     */
    public static String getGetMapUrl(GetMapRequest req, MapLayer layer, Envelope bbox, String[] kvp) {
        //base url
        String baseUrl = getBaseUrl( req );
    
        String layerName = layer != null ? layer.getTitle() : null;
        String style = layer != null ? layer.getStyle().getTitle() : null;
        
        return getGetMapUrl( baseUrl, req, layerName,style, bbox, kvp );
    }

    /**
     * Encodes the url of a GetMap request.
     * <p>
     * If the <tt>layer</tt> argument is <code>null</code>, the request is
     * made including all layers in the <tt>mapContexT</tt>.
     * </p>
     * <p>
     * If the <tt>style</tt> argument is not <code>null</code> and the <tt>layer</tt>
     * argument is <code>null</code>, then the default style for that layer 
     * is used.
     * </p>
     * <p>
     * If the <tt>bbox</tt> argument is <code>null</code>. {@link WMSMapContext#getAreaOfInterest()}
     * is used for the bbox parameter.
     * </p>
     *
     * @param req The getMap request
     * @param layer The layer name, may be <code>null</code>.
     * @param style The style name, may be <code>null</code>
     * @param bbox The bounding box of the request, may be <code>null</code>.
     * @param kvp Additional or overidding kvp parameters, may be <code>null</code>
     *
     * @return The full url for a getMap request.
     */
    public static String getGetMapUrl(GetMapRequest req, String layer, String style, Envelope bbox, String[] kvp) {
        //base url
        String baseUrl = getBaseUrl( req );
    
        return getGetMapUrl( baseUrl, req, layer, style, bbox, kvp );
    }
    
    /**
     * Encodes the url of a GetLegendGraphic request.
     *
     * @param req The wms request.
     * @param layer The Map layer, may not be <code>null</code>.
     * @param kvp Additional or overidding kvp parameters, may be <code>null</code>
     *
     * @return The full url for a getMap request.
     */
    public static String getGetLegendGraphicUrl( WMSRequest req, MapLayer layer, String[] kvp ) {
        //parameters
        HashMap params = new HashMap();

        params.put("service", "wms");
        params.put("request", "GetLegendGraphic");
        params.put("version", "1.1.1");
        params.put("format", "image/png");
        params.put("layer", layer.getTitle());
        params.put("style", layer.getStyle().getName());
        params.put("height", "20");
        params.put("width", "20");

        //overrides / additions
        for (int i = 0; (kvp != null) && (i < kvp.length); i += 2) {
            params.put(kvp[i], kvp[i + 1]);
        }

        return encode(getBaseUrl(req),params);    

    }

    /**
     * Helper method for encoding GetMap request.
     *
     */
    static String getGetMapUrl( String baseUrl, GetMapRequest req, String layer, String style, Envelope bbox, String[] kvp ) {
        //parameters
        HashMap params = new HashMap();

        params.put("service", "wms");
        params.put("request", "GetMap");
        params.put("version", "1.1.1");

        params.put( "format", req.getFormat() );
        
        StringBuffer layers = new StringBuffer();
        StringBuffer styles = new StringBuffer();
        
        if ( layer != null ) {
             layers.append( layer );
             if ( style != null ) {
                 styles.append( style );
             }
             else {
                 //use default for layer
                 for ( int i = 0; i < req.getLayers().length; i++ ) {
                     if ( layer.equals( req.getLayers()[i].getName() ) ) {
                         styles.append( req.getLayers()[i].getDefaultStyle().getName() );
                     }
                 }
             }
        }
        else {
            //no layer specified, use layers+styles specified by request
            for ( int i = 0; i < req.getLayers().length; i++ ) {
                MapLayerInfo mapLayer = req.getLayers()[ i ];
                Style s = (Style) req.getStyles().get( 0 );
                
                layers.append( mapLayer.getName() ).append( "," );
                styles.append( s.getName() ).append( "," );   

            }

            layers.setLength(layers.length() - 1);
            styles.setLength(styles.length() - 1);
        }

        params.put("layers", layers.toString());
        params.put("styles", styles.toString());

        //filters, we grab them from the original raw kvp since re-encoding 
        // them from objects is kind of silly
        if (layer != null) {
            //only get filters for hte layer
            int index = 0;
            for ( ; index < req.getLayers().length; index++) {
                if ( req.getLayers()[index].getName().equals( layer ) ) {
                    break;
                }
            }
            
            if ( req.getRawKvp().get("filter") != null ) {
                //split out the filter we need
                List filters = KvpUtils.readFlat((String)req.getRawKvp().get("filter"),"()");
                params.put( "filter", filters.get(index) );
            }
            else if ( req.getRawKvp().get("cql_filter") != null ) {
                //split out the filter we need
                List filters = KvpUtils.readFlat((String)req.getRawKvp().get("cql_filter"),"|");
                params.put( "cql_filter", filters.get(index) );
            }
            else if ( req.getRawKvp().get("featureid") != null  ) {
                //semantics of feautre id slightly different, replicate entire value
                params.put("featureid", req.getRawKvp().get("featureid"));
            }
        
        }
        else {
            //include all
            if ( req.getRawKvp().get("filter") != null ) {
                params.put("filter",req.getRawKvp().get("filter") );
            }
            else if ( req.getRawKvp().get("cql_filter") != null ) {
                params.put("cql_filter",req.getRawKvp().get("cql_filter") );
            }
            else if (req.getRawKvp().get("featureid") != null  ) {
                params.put("featureid", req.getRawKvp().get("featureid"));
            }
        }
        
        //image params
        params.put("height", String.valueOf(req.getHeight()));
        params.put("width", String.valueOf(req.getWidth()));
        params.put( "transparent", ""+req.isTransparent() );
        
        //bbox
        if (bbox == null) {
            bbox = req.getBbox();
        }
        if (bbox != null) {
            params.put("bbox", encode(bbox));    
        }
        
        //srs
        params.put( "srs", req.getSRS() );
        
        //format options
        if ( req.getFormatOptions() != null && !req.getFormatOptions().isEmpty()) {
            params.put( "format_options", encodeFormatOptions(req.getFormatOptions()));
        }
        
        //overrides / additions
        for (int i = 0; (kvp != null) && (i < kvp.length); i += 2) {
            params.put(kvp[i], kvp[i + 1]);
        }

        return encode(baseUrl, params);
    }

    /**
     * Encodes a map of formation options to be used as the value in a kvp.
     * 
     * @param formatOptions The map of formation options.
     * 
     * @return A string of the form 'key1:value1,value2;key2:value1;...'
     *
     */
    public static String encodeFormatOptions( Map formatOptions ) {
        StringBuffer sb = new StringBuffer();
        for ( Iterator e = formatOptions.entrySet().iterator(); e.hasNext(); ) {
            Map.Entry entry = (Map.Entry) e.next();
            String key = (String) entry.getKey();
            Object val = entry.getValue();
            
            sb.append( key ).append( ":" );
            if ( val instanceof Collection ) {
                Iterator i = ((Collection)val).iterator();
                while( i.hasNext() ) {
                    sb.append( i.next() ).append( "," );
                }
                sb.setLength(sb.length()-1);
            }
            else if ( val.getClass().isArray() ) {
                int len = Array.getLength( val );
                for ( int i = 0; i < len; i++ ) {
                    Object o = Array.get( val, i );
                    if ( o != null ) {
                        sb.append( o ).append( "," );
                    }
                }
                sb.setLength(sb.length()-1);
            }
            else {
                sb.append( val.toString() );
            }
            sb.append( ";" );
        }
        
        sb.setLength( sb.length() );
        return sb.toString();
    }
    
    /**
     * Helper method to encode an envelope to be used in a wms request.
     */
    static String encode(Envelope box) {
        return new StringBuffer().append(box.getMinX()).append(",").append(box.getMinY()).append(",")
                                 .append(box.getMaxX()).append(",").append(box.getMaxY()).toString();
    }

    /**
     * Helper method for encoding a baseurl and some kvp params into a single
     * url.
     *
     * @param baseUrl The base url of the encoded request.
     * @param kvp The key value pairts of the request.
     *
     * @return The full request url.
     */
    static String encode(String baseUrl, Map kvp) {
        StringBuffer query = new StringBuffer();
      
        for (Iterator e = kvp.entrySet().iterator(); e.hasNext();) {
            Map.Entry entry = (Map.Entry) e.next();
            query.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
        }

        query.setLength(query.length() - 1);
        return Requests.appendQueryString( baseUrl, query.toString() );
    }
}

⌨️ 快捷键说明

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