📄 kmlreflector.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.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 + -