📄 kmltransformer.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.responses.map.kml;
import com.vividsolutions.jts.geom.Envelope;
import org.geotools.data.DataUtilities;
import org.geotools.data.DefaultQuery;
import org.geotools.data.FeatureSource;
import org.geotools.data.Query;
import org.geotools.data.crs.ReprojectFeatureResults;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.feature.AttributeType;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.FeatureType;
import org.geotools.feature.GeometryAttributeType;
import org.geotools.filter.BBoxExpression;
import org.geotools.filter.IllegalFilterException;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.map.MapLayer;
import org.geotools.referencing.CRS;
import org.geotools.renderer.lite.RendererUtilities;
import org.geotools.xml.transform.TransformerBase;
import org.geotools.xml.transform.Translator;
import org.opengis.filter.Filter;
import org.opengis.filter.FilterFactory;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.vfny.geoserver.global.MapLayerInfo;
import org.vfny.geoserver.wms.WMSMapContext;
import org.vfny.geoserver.wms.requests.GetMapRequest;
import org.xml.sax.ContentHandler;
import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.transform.Transformer;
public class KMLTransformer extends TransformerBase {
/**
* logger
*/
static Logger LOGGER = org.geotools.util.logging.Logging.getLogger("org.geoserver.kml");
/**
* Factory used to create filter objects
*/
FilterFactory filterFactory = (FilterFactory) CommonFactoryFinder.getFilterFactory(null);
private static final CoordinateReferenceSystem WGS84;
static {
try {
WGS84 = CRS.decode("EPSG:4326");
} catch(Exception e) {
throw new RuntimeException("Cannot decode EPSG:4326, the CRS subsystem must be badly broken...");
}
}
/**
* Flag controlling wether kmz was requested.
*/
boolean kmz = false;
public KMLTransformer() {
setNamespaceDeclarationEnabled(false);
}
public Translator createTranslator(ContentHandler handler) {
return new KMLTranslator(handler);
}
public void setFilterFactory(FilterFactory filterFactory) {
this.filterFactory = filterFactory;
}
public void setKmz(boolean kmz) {
this.kmz = kmz;
}
protected class KMLTranslator extends TranslatorSupport {
public KMLTranslator(ContentHandler handler) {
super(handler, null, null);
}
public void encode(Object o) throws IllegalArgumentException {
start("kml");
WMSMapContext mapContext = (WMSMapContext) o;
GetMapRequest request = mapContext.getRequest();
MapLayer[] layers = mapContext.getLayers();
//if we have more than one layer ( or a legend was requested ),
//use the name "GeoServer" to group them
boolean group = (layers.length > 1) || request.getLegend();
if (group) {
StringBuffer sb = new StringBuffer();
for ( int i = 0; i < layers.length; i++ ) {
sb.append( layers[i].getTitle() + "," );
}
sb.setLength(sb.length()-1);
start("Document");
element("name", sb.toString() );
}
//for every layer specified in the request
for (int i = 0; i < layers.length; i++) {
//layer and info
MapLayer layer = layers[i];
MapLayerInfo layerInfo = mapContext.getRequest().getLayers()[i];
//was a super overlay requested?
if (mapContext.getRequest().getSuperOverlay()) {
//encode as super overlay
encodeSuperOverlayLayer(mapContext, layer);
} else {
//figure out which type of layer this is, raster or vector
if (layerInfo.getType() == MapLayerInfo.TYPE_VECTOR || layerInfo.getType() == MapLayerInfo.TYPE_REMOTE_VECTOR) {
//vector
encodeVectorLayer(mapContext, layer);
} else {
//encode as normal ground overlay
encodeRasterLayer(mapContext, layer);
}
}
}
//legend suppoer
if (request.getLegend()) {
//for every layer specified in the request
for (int i = 0; i < layers.length; i++) {
//layer and info
MapLayer layer = layers[i];
encodeLegend(mapContext, layer);
}
}
if (group) {
end("Document");
}
end("kml");
}
/**
* Encodes a vector layer as kml.
*/
protected void encodeVectorLayer(WMSMapContext mapContext, MapLayer layer) {
//get the data
FeatureSource featureSource = layer.getFeatureSource();
FeatureCollection features = null;
try {
features = loadFeatureCollection(featureSource, layer, mapContext);
} catch (Exception e) {
throw new RuntimeException(e);
}
//calculate scale denominator
// we do not actually know what the size of the image will be so
// our best guess is 800x600
double scaleDenominator = 1;
try {
scaleDenominator =
RendererUtilities.calculateScale(mapContext.getAreaOfInterest(), 800, 600, null);
}
catch( Exception e ) {
LOGGER.log( Level.WARNING, "Error calculating scale denominator", e );
}
LOGGER.fine( "scale denominator = " + scaleDenominator );
//was kmz requested?
if (kmz) {
//calculate kmscore to determine if we shoud write as vectors
// or pre-render
int kmscore = mapContext.getRequest().getKMScore();
boolean useVector = useVectorOutput(kmscore, features.size());
if (useVector) {
//encode
KMLVectorTransformer tx = createVectorTransformer(mapContext, layer);
initTransformer(tx);
tx.setScaleDenominator(scaleDenominator);
tx.createTranslator(contentHandler).encode(features);
} else {
KMLRasterTransformer tx = createRasterTransfomer(mapContext);
initTransformer(tx);
//set inline to true to have the transformer reference images
// inline in the zip file
tx.setInline(true);
tx.createTranslator(contentHandler).encode(layer);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -