📄 getfeature.java
字号:
// all of the geometries, but we'll have to remove them in the
// returned feature type
if(wfs.isFeatureBounding() && meta.getFeatureType().getAttributeType(ati.getName()) instanceof GeometryAttributeType
&& !properties.contains(ati.getName())) {
properties.add(ati.getName());
extraGeometries.add(ati.getName());
}
}
//replace property names
query.getPropertyName().clear();
query.getPropertyName().addAll(properties);
}
//make sure filters are sane
if (query.getFilter() != null) {
final FeatureType featureType = source.getSchema();
ExpressionVisitor visitor = new AbstractExpressionVisitor() {
public Object visit(PropertyName name, Object data) {
// case of multiple geometries being returned
if (name.evaluate(featureType) == null) {
//we want to throw wfs exception, but cant
throw new WFSException("Illegal property name: "
+ name.getPropertyName(), "InvalidParameterValue");
}
return name;
}
;
};
query.getFilter().accept(new AbstractFilterVisitor(visitor), null);
}
org.geotools.data.Query gtQuery = toDataQuery(query, maxFeatures - count, source, request.getVersion());
LOGGER.fine("Query is " + query + "\n To gt2: " + gtQuery);
FeatureCollection features = source.getFeatures(gtQuery);
count += features.size();
// we may need to shave off geometries we did load only to make bounds
// computation happy
if(extraGeometries.size() > 0) {
List residualProperties = new ArrayList(properties);
residualProperties.removeAll(extraGeometries);
String[] residualNames = (String[]) residualProperties.toArray(new String[residualProperties.size()]);
FeatureType targetType = DataUtilities.createSubType(features.getSchema(), residualNames);
features = new FeatureBoundsFeatureCollection(features, targetType);
}
//JD: TODO reoptimize
// if ( i == request.getQuery().size() - 1 ) {
// //DJB: dont calculate feature count if you dont have to. The MaxFeatureReader will take care of the last iteration
// maxFeatures -= features.getCount();
// }
//GR: I don't know if the featuresults should be added here for later
//encoding if it was a lock request. may be after ensuring the lock
//succeed?
result.getFeature().add(features);
}
} catch (IOException e) {
throw new WFSException("Error occurred getting features", e, request.getHandle());
} catch (SchemaException e) {
throw new WFSException("Error occurred getting features", e, request.getHandle());
}
//locking
if (request instanceof GetFeatureWithLockType) {
GetFeatureWithLockType withLockRequest = (GetFeatureWithLockType) request;
LockFeatureType lockRequest = WfsFactory.eINSTANCE.createLockFeatureType();
lockRequest.setExpiry(withLockRequest.getExpiry());
lockRequest.setHandle(withLockRequest.getHandle());
lockRequest.setLockAction(AllSomeType.ALL_LITERAL);
for (int i = 0; i < request.getQuery().size(); i++) {
QueryType query = (QueryType) request.getQuery().get(i);
LockType lock = WfsFactory.eINSTANCE.createLockType();
lock.setFilter(query.getFilter());
lock.setHandle(query.getHandle());
//TODO: joins?
lock.setTypeName((QName) query.getTypeName().get(0));
lockRequest.getLock().add(lock);
}
LockFeature lockFeature = new LockFeature(wfs, catalog);
lockFeature.setFilterFactory(filterFactory);
LockFeatureResponseType response = lockFeature.lockFeature(lockRequest);
result.setLockId(response.getLockId());
}
result.setNumberOfFeatures(BigInteger.valueOf(count));
result.setTimeStamp(Calendar.getInstance());
return result;
}
/**
* Get this query as a geotools Query.
*
* <p>
* if maxFeatures is a not positive value DefaultQuery.DEFAULT_MAX will be
* used.
* </p>
*
* <p>
* The method name is changed to toDataQuery since this is a one way
* conversion.
* </p>
*
* @param maxFeatures number of features, or 0 for DefaultQuery.DEFAULT_MAX
*
* @return A Query for use with the FeatureSource interface
*
*/
public org.geotools.data.Query toDataQuery(QueryType query, int maxFeatures,
FeatureSource source, String wfsVersion) throws WFSException {
if (maxFeatures <= 0) {
maxFeatures = DefaultQuery.DEFAULT_MAX;
}
String[] props = null;
if (!query.getPropertyName().isEmpty()) {
props = new String[query.getPropertyName().size()];
for (int p = 0; p < query.getPropertyName().size(); p++) {
String propertyName = (String) query.getPropertyName().get(p);
props[p] = propertyName;
}
}
Filter filter = (Filter) query.getFilter();
if (filter == null) {
filter = Filter.INCLUDE;
}
//figure out the crs the data is in
CoordinateReferenceSystem crs = (source.getSchema().getDefaultGeometry() != null)
? source.getSchema().getDefaultGeometry().getCoordinateSystem() : null;
// gather declared CRS
CoordinateReferenceSystem declaredCRS = WFSReprojectionUtil.getDeclaredCrs(crs, wfsVersion);
// make sure every bbox and geometry that does not have an attached crs will use
// the declared crs, and then reproject it to the native crs
Filter transformedFilter = WFSReprojectionUtil.normalizeFilterCRS(filter,
source.getSchema(), declaredCRS);
//only handle non-joins for now
QName typeName = (QName) query.getTypeName().get(0);
DefaultQuery dataQuery = new DefaultQuery(typeName.getLocalPart(), transformedFilter, maxFeatures,
props, query.getHandle());
if (crs == null) {
//set to be the server default
try {
crs = CRS.decode("EPSG:4326");
dataQuery.setCoordinateSystem(crs);
} catch (Exception e) {
//should never happen
throw new RuntimeException(e);
}
}
//handle reprojection
CoordinateReferenceSystem target;
if (query.getSrsName() != null) {
try {
target = CRS.decode(query.getSrsName().toString());
} catch (Exception e) {
String msg = "Unable to support srsName: " + query.getSrsName();
throw new WFSException(msg, e);
}
} else {
target = declaredCRS;
}
//if the crs are not equal, then reproject
if (target != null && !CRS.equalsIgnoreMetadata(crs, target)) {
dataQuery.setCoordinateSystemReproject(target);
}
//handle sorting
if (query.getSortBy() != null) {
List sortBy = query.getSortBy();
dataQuery.setSortBy((SortBy[]) sortBy.toArray(new SortBy[sortBy.size()]));
}
//handle version, datastore may be able to use it
if (query.getFeatureVersion() != null) {
dataQuery.setVersion(query.getFeatureVersion());
}
return dataQuery;
}
FeatureTypeInfo featureTypeInfo(QName name) throws WFSException, IOException {
FeatureTypeInfo meta = catalog.getFeatureTypeInfo(name.getLocalPart(),
name.getNamespaceURI());
if (meta == null) {
String msg = "Could not locate " + name + " in catalog.";
throw new WFSException(msg);
}
return meta;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -