📄 mapservicepreviewservlet.java
字号:
package com.esri.solutions.jitk.web.tasks.resources;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import com.esri.adf.web.data.geometry.WebExtent;
import com.esri.solutions.jitk.datasources.exceptions.ClientNotFoundException;
import com.esri.solutions.jitk.datasources.exceptions.WCSException;
import com.esri.solutions.jitk.datasources.ogc.wcs.IWCSClient;
import com.esri.solutions.jitk.datasources.ogc.wcs.WCSClientFactory;
import com.esri.solutions.jitk.datasources.ogc.wcs.WCSHTTPClientBase;
import com.esri.solutions.jitk.datasources.ogc.wcs.info.WCSBoundingBox;
import com.esri.solutions.jitk.datasources.ogc.wcs.info.WCSCapabilities;
import com.esri.solutions.jitk.datasources.ogc.wcs.info.WCSCoverageInfo;
import com.esri.solutions.jitk.datasources.ogc.wms.InputStreamConverter;
import com.esri.solutions.jitk.datasources.ogc.wms.WMSCapabilities;
import com.esri.solutions.jitk.datasources.ogc.wms.WMSClient;
import com.esri.solutions.jitk.datasources.ogc.wms.XMLAttributeFinder;
import com.esri.solutions.jitk.web.wcs.data.ImageFormatConverter;
@SuppressWarnings("deprecation")
public class MapServicePreviewServlet extends HttpServlet {
private static final long serialVersionUID = 2191318699906679355L;
private static Logger _logger = LogManager.getLogger(MapServicePreviewServlet.class.getName());
private static final String DEFAULT_IMAGE = "com/esri/solutions/jitk/web/tasks/images/pixel.gif";
private static final int WIDTH = 400;
private static final int HEIGHT = 200;
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
private String getBbox(WebExtent extent, int dimension) {
StringBuffer ext = new StringBuffer();
ext.append(extent.getMinX() + ",");
ext.append(extent.getMinY() + ",");
ext.append(extent.getMaxX() + ",");
ext.append(extent.getMaxY());
if(dimension == 3) {
ext.append(",0,0");
}
return ext.toString();
}
private WebExtent getWebExtent(WCSCapabilities wcsCapabilities, String coverageName, String epsgId){
WCSBoundingBox bbox = wcsCapabilities.getDefaultBoundingBox(coverageName, epsgId);
if(bbox != null) {
bbox.reaspect(WIDTH, HEIGHT);
return new WebExtent(bbox.getMinX(), bbox.getMinY(), bbox.getMaxX(), bbox.getMaxY());
}
return null;
}
protected WCSCoverageInfo getWCSCoverageInfo(WCSCapabilities wcsCapabilities, String coverage) throws ClientNotFoundException, WCSException {
if(coverage != null && coverage.length() > 0 && wcsCapabilities != null && wcsCapabilities.getCoverageInfos().containsKey(coverage)) {
IWCSClient wcsClient = WCSClientFactory.getInstance(wcsCapabilities.getVersion());
List<WCSCoverageInfo> infos = wcsClient.describeCoverage(wcsCapabilities.getDescribeCoverageURL(), new String[] {coverage});
if(infos != null) {
for(Iterator<WCSCoverageInfo> i = infos.iterator(); i.hasNext();) {
WCSCoverageInfo info = i.next();
if(info.getId().equalsIgnoreCase(coverage)) {
return info;
}
}
}
}
return null;
}
private byte[] getWcsImage(HttpServletRequest request) {
String url = request.getParameter("url");
String coverage = request.getParameter("coverage");
try {
WCSCapabilities wcsCapabilities = new WCSHTTPClientBase().getCapabilities(url);
WCSCoverageInfo info = getWCSCoverageInfo(wcsCapabilities, coverage);
if(info != null) {
wcsCapabilities.getCoverageInfos().put(coverage, info);
} else {
throw new NullPointerException("WCS DescribeCoverage request failed for coverage id=" + coverage);
}
String epsgId = wcsCapabilities.getDefaultProjectionId(coverage);
if(epsgId == null) {
throw new NullPointerException("Coverage default spatial reference is invalid.");
}
String format = wcsCapabilities.getDefaultFormat(coverage);
if(format == null) {
throw new NullPointerException("Coverage format is not supported.");
}
int dimension = wcsCapabilities.getDefaultDimension(coverage);
IWCSClient wcsClient = WCSClientFactory.getInstance(wcsCapabilities.getVersion());
InputStream is = ImageFormatConverter.toRGBStream( wcsClient.getCoverage(wcsCapabilities.getGetCoverageURL(),
coverage, epsgId, getBbox(getWebExtent(wcsCapabilities, coverage, epsgId), dimension),
HEIGHT, WIDTH, format), format);
return new InputStreamConverter().toByteArray(is);
} catch(Exception e) {
_logger.warn("Unable to preview wcs map", e);
}
return null;
}
private byte[] loadImage(URL url) throws Exception {
InputStream is = url.openStream();
InputStreamConverter isc = new InputStreamConverter();
return isc.toByteArray(is);
}
protected byte[] getWmsImage(HttpServletRequest request) throws Exception {
WMSClient wmsClient = new WMSClient(request.getParameter("url"));
WMSCapabilities wmsCap = wmsClient.getCapabilities();
return wmsClient.getMapOverview(wmsCap, WIDTH, HEIGHT);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {
try {
String mode = request.getParameter("mode");
byte[] data = null;
if (mode.indexOf("AIMS") >= 0) {
String username = request.getParameter("user");
String password = request.getParameter("pswd");
if((username != null) && username.equalsIgnoreCase("null")) {
username = null;
}
if((password != null) & password.equalsIgnoreCase("null")) {
password = null;
}
String service = request.getParameter("service");
String host = request.getParameter("host");
String port = request.getParameter("port");
AIMSClient imsClient = new AIMSClient(host, new Integer(port).intValue(), username, password);
byte[] xml = imsClient.getMap(service, WIDTH, HEIGHT);
if (xml != null) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputStream is = new ByteArrayInputStream(xml);
Document doc = db.parse(is);
XMLAttributeFinder xmlAttrFinder = new XMLAttributeFinder();
String url = xmlAttrFinder.findAttribute("OUTPUT", "url", doc.getDocumentElement());
data = loadImage(new URL(url));
} else {
_logger.warn("ArcIMS request failed, loading default image preview");
}
}
if (mode.indexOf("WMS") >= 0) {
data = getWmsImage(request);
}
if (mode.indexOf("WCS") >= 0) {
data = getWcsImage(request);
}
if (mode.indexOf("AGSLocal") >= 0) {
String host = request.getParameter("host");
String domain = request.getParameter("domain");
String user = request.getParameter("user");
String pswd = request.getParameter("pswd");
String svrObj = request.getParameter("svrObj");
String encryptedStr = request.getParameter("encrypted");
boolean encrypted = false;
if (encryptedStr.trim().equalsIgnoreCase("true")) {
encrypted = true;
}
AGSLocalClient agsClient = new AGSLocalClient();
data = agsClient.getAGSMap(host, domain, user, pswd, svrObj, encrypted, WIDTH, HEIGHT);
}
if (mode.indexOf("AGSInternet") >= 0) {
String url = request.getParameter("url");
AGSWSClient agsClient = new AGSWSClient();
data = agsClient.getAGSWSMap(url, WIDTH, HEIGHT);
}
if (data == null){
String noPreviewImage = this.getInitParameter("noPreviewAvailableImage");
if(noPreviewImage == null) {
noPreviewImage = DEFAULT_IMAGE;
}
data = new InputStreamConverter().toByteArray(this.getClass().getClassLoader().getResourceAsStream(noPreviewImage));
}
ServletOutputStream out = response.getOutputStream();
out.write(data);
out.flush();
out.close();
} catch (Exception e) {
_logger.warn("unable to preview map", e);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -