Geotools使用FeatureJSON类将一个特性集合数组写入同一个json文件中



我想用地理工具实现getfeatureinfo,我已经写了代码,使用x、y和缓冲区参数在给定的bbox中获取给定的特征信息,我的问题是,当点击的区域包含多个层时,它会返回一个特征集合列表,而不是在地图中使用一个层时返回一个特征集合。所以我的问题在于,对于featureJSON类,它只能编码一个特征集,那么,如何让featureJSON类编写一个具有不同模式或功能类型的多功能集合,另一个问题是,哪里还有其他类可以完成这项工作,而不是使用featureJSON类进行编码?这里是我的getFeatureInfo方法:

@Override
public List<SimpleFeatureCollection> getFeatureInfo(GetFeatureInfoRequest request) throws IOException {
double x1, y1, x2, y2;
int width, height, i, j;
try {
x1 = Double.parseDouble(request.getBbox()[0]);
y1 = Double.parseDouble(request.getBbox()[1]);
x2 = Double.parseDouble(request.getBbox()[2]);
y2 = Double.parseDouble(request.getBbox()[3]);
width = request.getWidth();
height = request.getHeight();
i = request.getX();
j = request.getY();
} catch (Exception e) {
log.error(e.getMessage());
return null;
}
// Calculate the map coordinates of the selected area
double cx1, cy1, cx2, cy2;
cx1 = x1 * (width - i + 0.5 + request.getBuffer()) / width + x2 * (i - 0.5 - request.getBuffer()) / width;
cx2 = x1 * (width - i + 0.5 - request.getBuffer()) / width + x2 * (i - 0.5 + request.getBuffer()) / width;
cy1 = y1 * (j - 0.5 + request.getBuffer()) / height + y2 * (height - j + 0.5 - request.getBuffer()) / height;
cy2 = y1 * (j - 0.5 - request.getBuffer()) / height + y2 * (height - j + 0.5 + request.getBuffer()) / height;
ReferencedEnvelope clickArea = new ReferencedEnvelope(cx1, cx2, cy1, cy2, DefaultGeographicCRS.WGS84);
List<Layer> mapLayers = request.getMap().getLayers();
mapLayers.sort(new Comparator<Layer>() {
@Override
public int compare(Layer o1, Layer o2) {
return (int) (o1.getOrder() - o2.getOrder());
}
});
List<SimpleFeatureCollection> results = new ArrayList<>(mapLayers.size());
Filter filter = ff.bbox(ff.property("geom"), clickArea);
for (Layer layer : mapLayers) {
postgisDataStore.addVirtualTable(layer.getSlug(), layer.getSqlQuery());
SimpleFeatureSource featureSource = postgisDataStore.getFeatureSource(layer.getSlug());
SimpleFeatureCollection fc = featureSource.getFeatures(filter);
results.add(fc);
}
return results;
}

之后,我用featureJSON:编写了我的功能集合列表

GetFeatureInfoRequest featureInfoRequest = buildGetFeatureInfoRequest(request);
List<SimpleFeatureCollection> fc = getMapService.getFeatureInfo(featureInfoRequest);
OutputStream os = response.getOutputStream();
FeatureJSON featureJson = new FeatureJSON();
for (SimpleFeatureCollection collection : fc) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
featureJson.writeFeatureCollection(collection, outputStream);
outputStream.writeTo(os);
outputStream.close();
}
os.flush();
os.close();

您需要从集合中提取特征,并在导出它们之前将它们连接在一起。所以类似于:

ArrayList<SimpleFeature> features = new ArrayList<>();
for (SimpleFeatureCollection collection : fc) {
try(SimpleFeatureIterator itr = collection.features()){
while(itr.hasNext()){
features.add(itr.next());
}
}
}
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
featureJson.writeFeatureCollection(DataUtilities.collection(features), outputStream);
outputStream.writeTo(os);
outputStream.close();
os.flush();
os.close();

最新更新