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

📄 kmlreflector.java

📁 电子地图服务器,搭建自己的地图服务
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* 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.vfny.geoserver.wms.servlets;

import com.vividsolutions.jts.geom.Envelope;

import org.geoserver.ows.util.KvpUtils;
import org.geoserver.ows.util.RequestUtils;
import org.geoserver.platform.GeoServerExtensions;
import org.geotools.styling.Style;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.vfny.geoserver.Response;
import org.vfny.geoserver.ServiceException;
import org.vfny.geoserver.config.WMSConfig;
import org.vfny.geoserver.global.GeoServer;
import org.vfny.geoserver.global.MapLayerInfo;
import org.vfny.geoserver.global.WMS;
import org.vfny.geoserver.util.requests.readers.KvpRequestReader;
import org.vfny.geoserver.util.requests.readers.XmlRequestReader;
import org.vfny.geoserver.wms.requests.GetKMLReflectKvpReader;
import org.vfny.geoserver.wms.requests.GetMapRequest;
import org.vfny.geoserver.wms.responses.GetMapResponse;
import org.vfny.geoserver.wms.responses.map.kml.KMLMapProducerFactory;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * This class takes in a simple WMS request, presumably from Google Earth, and
 * produces a completed WMS request that outputs KML/KMZ. To map a request to
 * this, simple pass a "layers=myLayer" parameter to "wms/kml_reflect":
 * <b>http://localhost:8080/geoserver/wms/kml_reflect?layers=states<b>
 * No extra information, such as styles or EPSG code need to be passed.
 * A request to kml_reflect will return a network link for each layer
 * passed in. Each network layer makes a full WMS request with these
 * default values:
 * - smart KMZ output (vector or raster output)
 * - KMScore value of 30
 * - Image size of 1024x1024
 * - Full attribution on vector features
 * - WMS version 1.0.0
 * - Transparent
 *
 *
 * @author Brent Owens
 * 
 * @deprecated use {@link org.vfny.geoserver.wms.responses.map.kml.KMLReflector}.
 *
 */
public class KMLReflector extends WMService {
    private static Logger LOGGER = org.geotools.util.logging.Logging.getLogger("org.vfny.geoserver.wms.servlets");
    final String KML_MIME_TYPE = "application/vnd.google-earth.kml+xml";
    final String KMZ_MIME_TYPE = "application/vnd.google-earth.kmz+xml";

    // Values for the prepared WMS request. Later move these to web.xml server config
    final int KMSCORE = 50;
    final int REFRESH = 1;
    final boolean KMATTR = true;
    final boolean TRANSPARENT = true;
    final int WIDTH = 1024;
    final int HEIGHT = 1024;
    final String VERSION = "1.0.0";
    final String SRS = "EPSG:4326";
    final String DEFAULT_BBOX = "-180,-90,180,90";

    public KMLReflector() {
        super("kml_reflect", null);
    }

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        setWMS((WMS) config.getServletContext().getAttribute(WMS.WEB_CONTAINER_KEY));
    }

    protected Response getResponseHandler() {
        ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(getServletContext());

        //return new GetMapResponse(config);
        return new GetMapResponse(getWMS(), context);
    }

    protected KvpRequestReader getKvpReader(Map params) {
        return new GetKMLReflectKvpReader(params, this);
    }

    protected XmlRequestReader getXmlRequestReader() {
        /**
        * @todo Implement this org.vfny.geoserver.servlets.AbstractService
        *       abstract method
        */
        throw new java.lang.UnsupportedOperationException(
            "Method getXmlRequestReader() not yet implemented.");
    }

    /**
     * This will create a <folder> with <networklinks>, one network link
     * for each layer.
     * The only mandatory parameter is "layers" with the layer names.
     * Styles is optional, and so are all other parameters such as:
     * KMScore
     * KMAttr
     * Version
     * Width
     * Height
     * SRS
     *
     * The result is written to the buffered output stream.
     */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        //set to KML mime type, so GEarth opens automatically
        response.setContentType(KMLMapProducerFactory.MIME_TYPE);

        // the output stream we will write to
        BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());

        Map requestParams = new HashMap();
        String paramName;
        String paramValue;

        // gather the parameters
        for (Enumeration pnames = request.getParameterNames(); pnames.hasMoreElements();) {
            paramName = (String) pnames.nextElement();
            paramValue = request.getParameter(paramName);
            requestParams.put(paramName.toUpperCase(), paramValue);
        }

        // Some settings for network links don't pass in a bounding box, so we will
        // supply one in that case that covers the whole world (pray your data isn't big and
        // the KMScore value isn't large)
        if (!requestParams.containsKey("BBOX")) {
            requestParams.put("BBOX", DEFAULT_BBOX);
        }

        KvpRequestReader requestReader = getKvpReader(requestParams);

        GetMapRequest serviceRequest;

        try {
            serviceRequest = (GetMapRequest) requestReader.getRequest(request);
        } catch (ServiceException e) {
            e.printStackTrace();

            return;
        }

        final MapLayerInfo[] layers = serviceRequest.getLayers();
        LOGGER.info("KML NetworkLink sharing " + layers.length + " layer(s) created.");

        Style[] styles = null;

        if ((serviceRequest.getStyles() != null) && !serviceRequest.getStyles().isEmpty()) {
            styles = (Style[]) serviceRequest.getStyles().toArray(new Style[] {  });
        }

        // fill in our default values for the request if the user didn't pass the value in
        if (!requestParams.containsKey("TRANSPARENT")) {
            serviceRequest.setTransparent(TRANSPARENT);
        }

        if (!requestParams.containsKey("KMATTR")) {
            serviceRequest.setKMattr(KMATTR);
        }

        if (!requestParams.containsKey("KMSCORE")) {
            serviceRequest.setKMScore(KMSCORE);
        }

        if (!requestParams.containsKey("WIDTH")) {
            serviceRequest.setWidth(WIDTH);
        }

        if (!requestParams.containsKey("HEIGHT")) {
            serviceRequest.setHeight(HEIGHT);
        }

        if (!requestParams.containsKey("VERSION")) {
            serviceRequest.setVersion(VERSION);
        }

        List filters = null;
        String filterKey = null;
        if (requestParams.containsKey("FILTER")) {
                String filter = (String) requestParams.get("FILTER");
                filters = KvpUtils.readFlat(filter, "()");
                filterKey = "filter";
        }
        else if ( requestParams.containsKey("CQL_FILTER")) {
                String filter = (String) requestParams.get("CQL_FILTER");
                filters = KvpUtils.readFlat(filter, "|" );
                filterKey = "cql_filter";
        }
        else if ( requestParams.containsKey("FEATUREID") ) {
                //JD: featureid semantics slightly different then other types of 
                // filters

⌨️ 快捷键说明

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