I want to implement getfeatureinfo with geotools ,
i already writed the code to get a given feature info in a given bbox ,using x,y and buffer parameters,my probleme is that when the clicked area contain multiple layers it will return a list of feature collection instead of one feature collection when using one layer in the map.so my probleme is with the featureJSON class it can encode one feature collection only ,so how to make featureJSON class write a multiple feature collection with different schemas or feature types ,another question is where there is any other class that can do the job rather encoding with FeatureJSON class?
Here my getFeatureInfo method:
@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;
}
After that i write my feature collection list with 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();
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…