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

📄 wfsclient.java

📁 esri的ArcGIS Server超级学习模板程序(for java)
💻 JAVA
字号:
package com.esri.solutions.jitk.datasources.ogc.wfs;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.PipedInputStream;
import java.util.Map;

import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.log4j.Logger;

import com.esri.solutions.jitk.datasources.exceptions.NetworkConnectionException;
import com.esri.solutions.jitk.datasources.exceptions.RequestBuildingException;
import com.esri.solutions.jitk.datasources.exceptions.ResponseParsingException;
import com.esri.solutions.jitk.datasources.ogc.filters.Filter;
import com.esri.solutions.jitk.datasources.ogc.filters.IFilter;
import com.esri.solutions.jitk.datasources.ogc.filters.WithinClause;
import com.esri.solutions.jitk.datasources.ogc.gml.GMLEnvelope;
import com.esri.solutions.jitk.datasources.ogc.wfs.parsing.DescribeFeaturesResponseParser;
import com.esri.solutions.jitk.datasources.ogc.wfs.parsing.FeatureCollectionParser;
import com.esri.solutions.jitk.datasources.ogc.wfs.parsing.WFSCapabilitiesResponseParser;
import com.esri.solutions.jitk.datasources.w3c.http.HTTPXMLStreamOpener;

public class WFSClient implements IWFSClient {
	private static final Logger _logger = Logger.getLogger(WFSClient.class);
	protected WFSUrlBuilder _urlBuilder;
	
	public WFSClient(String serviceUrl) {
		_urlBuilder = new WFSUrlBuilder(serviceUrl);
	}
	
	public String getURL() {
		return _urlBuilder.getURL();
	}
	
	public WFSCapabilities getCapabilities() 
		throws NetworkConnectionException, ResponseParsingException {
		WFSCapabilities cap = null;
		InputStream is = null;
		
		try {
			HTTPXMLStreamOpener streamOpener = new HTTPXMLStreamOpener();
			is = streamOpener.openHttpGetStream(_urlBuilder.getCapabilitiesUrl());
			WFSCapabilitiesResponseParser responseParser = new WFSCapabilitiesResponseParser();
			cap = responseParser.parse(is);
		}
		catch (Exception ex) {		
			if (is != null) {
				throw new ResponseParsingException(ex.getMessage(), ex.getCause());
			}
			else {
				throw new NetworkConnectionException(ex.getMessage(), ex.getCause());
			}
		}
		
		return cap;
	}
	
	public WFSFeatureDescriptions describeFeatures(Map<String, FeatureTypeDescription> ftd)
		throws NetworkConnectionException, ResponseParsingException {
		WFSFeatureDescriptions fd = null;
		InputStream is = null;
		
		try {
			HTTPXMLStreamOpener streamOpener = new HTTPXMLStreamOpener();
			is = streamOpener.openHttpGetStream(_urlBuilder.describeFeatureTypeUrl());
			DescribeFeaturesResponseParser responseParser = new DescribeFeaturesResponseParser();
			responseParser.setFeatureTypeDescriptions(ftd);
			fd = responseParser.parse(is);
		}
		catch (Exception ex) {
			_logger.warn("Could not perform describeFeature Request", ex);
			
			if (is != null) {
				throw new ResponseParsingException(ex.getMessage(), ex.getCause());
			}
			else {
				throw new NetworkConnectionException(ex.getMessage(), ex.getCause());
			}			
		}
		
		return fd;
	}
	
	public FeatureCollection getFeatures(IQuery query, int maxFeatures) 
		throws NetworkConnectionException, ResponseParsingException, RequestBuildingException {
		FeatureCollection fc = null;
		InputStream is = null;
		PostMethod pm = null;
		Exception caughtException = null;
		PipedInputStream pin = null;
		
		try {	
			WFSGetFeaturesRequest gfr =  new WFSGetFeaturesRequest();
			gfr.setMaxFeatures(maxFeatures);
			gfr.setQuery(query);
			
			if (_logger.isDebugEnabled()) {
				ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
				gfr.toXML(outStream);
				_logger.debug("Get Features Request: " + outStream.toString());
				outStream.close();
			}
			
			// Convert input stream to output stream
			ByteArrayOutputStream out = new ByteArrayOutputStream();
			gfr.toXML(out);
			ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());

			// Send the request and get a handle to the response stream
			HTTPXMLStreamOpener streamOpener = new HTTPXMLStreamOpener();
			String postUrl = _urlBuilder.getFeatureUrl();
			pm = streamOpener.openHttpPostStream(postUrl, in);
			
			_logger.debug("Get Features Response: " + pm.getResponseBodyAsString());
			is = pm.getResponseBodyAsStream();
			
			FeatureCollectionParser fcp = new FeatureCollectionParser();
			fc = fcp.parse(is);
		}
		catch (Exception ex) {
			caughtException = ex;
			_logger.error("Could not perform getFeature Request", ex);
		}
		finally {
			if (pm != null) {
				pm.releaseConnection();
			}
			
			if (caughtException != null) {
				if (pin == null) {
					throw new RequestBuildingException(caughtException.getMessage(), caughtException.getCause());
				}
				else if (pm == null){
					throw new NetworkConnectionException(caughtException.getMessage(), caughtException.getCause());
				}
				else if (fc == null) {
					throw new ResponseParsingException(caughtException.getMessage(), caughtException.getCause()); 
				}
			}
		}
		
		return fc;		
	}
	
	public static void main(String[] args) {        
		WFSClient wfsClient = new WFSClient("http://williani370:8399/arcgis/services/WfsTest/MapServer/WFSServer");
		WFSCapabilities caps = null;
		
		try {
			caps = wfsClient.getCapabilities();
		}
		catch (NetworkConnectionException ex) {
			_logger.error("NetworkConnectionException", ex);
			return;
		}
		catch (ResponseParsingException ex) {
			_logger.error("ResponseParsingException", ex);
			return;
		}
		
		String title = caps.getServiceIdentification().getTitle();
		
		_logger.debug("Service Title: " + title);
		
		for (FeatureTypeDescription ft : caps.getFeatureTypes()) {
			_logger.debug("FeatureType name: " + ft.getName());
			_logger.debug("FeatureType title: " + ft.getTitle());
			_logger.debug("FeatureType SRS: " + ft.getDefaultSrs());
		}
		
		WFSFeatureDescriptions fd = null;
		
		try {
			fd = wfsClient.describeFeatures(caps.getFeatureTypesAsMap());
		}
		catch (Exception ex) {
			_logger.error("Could not perform descripbe features request");
			return;
		}
		
		Map<String, FeatureType> fts = fd.getFeatureTypes();
		
		for (FeatureType ft : fts.values()) {
			_logger.debug("FeatureType Description for " + ft.getName());
			
			for (FeatureElement fe : ft.getFeatureElements()) {
				_logger.debug("--Name: " + fe.getName());
				_logger.debug("--Type: " + fe.getXsdType());
				_logger.debug("--Min: " + fe.getMinOccurances());
			}
		}
		
		FeatureTypeDescription ftd = caps.getFeatureTypes().get(1);
		FeatureType ft = fts.get(ftd.getTitle());
		String shapeFieldName = ft.getShapeElement().getName();
		
		GMLEnvelope gmlEnv = new GMLEnvelope();
		gmlEnv.setMaxX("71.4062353532711");
		gmlEnv.setMaxY("-66.9692710360024");
		gmlEnv.setMinX("18.9247817993165");
		gmlEnv.setMinY("-178.217598362366");
		
		WithinClause wc = new WithinClause();
		wc.setGMLGeometry(gmlEnv);
		wc.setShapePropertyName(shapeFieldName);
		
		IFilter filter = new Filter();
		filter.pushClause(wc);
		
		IQuery query = new Query();
		query.setFilter(filter);
		query.setTypeName(ftd.getName());
		
		FeatureCollection fc = null;
		try {
			fc = wfsClient.getFeatures(query, 100);
		}
		catch (Exception ex) {
			_logger.error("Could not perform get features request");
			return;
		}
		
		for (FeatureMember fm : fc.getFeatureMembers()) {
			_logger.debug("Name: Shape - Value: ");
			fm.getShapeField().print();
			
			for (FeatureField ff : fm.getFeatureFields().values()) {
				_logger.debug("Name: " + ff.getName() + " - Value: " + ff.getValue());
			}
		}
	}
}

⌨️ 快捷键说明

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