Um formado de saída é como o GeoServer responde a uma requisição de dados. Por padrão, uma requisição getFeature retorna a(s) feature(s) em GML. Porém o GeoServer pode utilizar também outros formatos para estar respondendo as suas solicitações.

Para especificar qual saída você deseja receber do GeoServer, basta apenas passar o argumento outputformat=MeuTipo na URL.

[source language=”:HTML”]
http://localhost:8080/geoserver/wfs?
request=getfeature&
service=wfs&
version=1.0.0&
typename=states&
outputformat=SHAPE-ZIP
[/source]

A partir daqui eu vou subentender que você é um usuário que tem uma certa experiência na linguagem Java, principalmente utilizando a classe java.IO.OutputStream.

Neste tutorial criaremos dois arquivos e modificaremos um, veja:

– Criar MyFormatFeatureResponseDelegate.java
– Criar MyFormatFeatureResponseDelegateFactory.java
– Alterar org.vfny.geoserver.wfs.FeatureResponseDelegateProducerSpi

PASSO 1: Criando MyFormatFeatureResponseDelegate.java

No pacote org.vfny.geoserver.wfs.responses, cie sua classe MyFormatFeatureResponseDelegate.java. Ela deve implementar a interface FeatureResponseDelegate:

[source language=”:Java”]
public interface FeatureResponseDelegate
{
boolean canProduce(String outputFormat);

void prepare(String outputFormat,
GetFeatureResults results)
throws IOException;

String getContentType(GeoServer gs);

String getContentEncoding();

void encode(OutputStream output)
throws ServiceException, IOException;
}
[/source]

Crie o atributo results que deve ser do tipo GetFeatureResults.

[source language=”:Java”]
private GetFeatureResults results;
[/source]

Este é um método muito simples. Ele verifica se o formato passado é suportado pelo GeoServer, e retorna verdadeiro, caso a afirmação esteja correta. Veja o exemplo do GML:

[source language=”:Java”]
public boolean canProduce(String outputFormat)
{
return "GML2".equalsIgnoreCase(outputFormat)
|| "GML2-GZIP".equalsIgnoreCase(outputFormat);
}
[/source]

O método prepare é chamado antes de qualquer saída ser processada. Aqui você terá a chance de verificar possíveis erros.
Aqui está um exemplo da classe ShapeFeatureResponseDelegate:

[source language=”:Java”]
public void prepare(String outputFormat, GetFeatureResults results)
throws IOException
{
this.results = results;

if (results == null) {
throw new IllegalStateException(
"It seems prepare() has not succeed. <results> is null");
}

tempDir = System.getProperty("java.io.tmpdir");

if (tempDir == null) {
throw new NullPointerException("
<tempDir> is null. " +
"There is a problem with the
java.io.tempdir directory.");
}
}
[/source]

Crie também o método getContentType:

[source language=”:Java”]
public String getContentType(GeoServer gs) {
return gs.getMimeType();
}
[/source]

O método getContentEncoding(), retornará uma String, e indicará qual o formato da saída dos dados. Caso não haja um tipo de saída ele deve retornar null. Aqui está um exemplo da classe ShapeFeatureResponseDelegate:

[source language=”:Java”]
public String getContentEncoding() {
return "zip";
}
[/source]

É no método encode(OutputStream output) onde a saída ocorre, pois todos os dados são escritos no OutputStream. Eu não posso entrar em demasiado detalhe de como você deve fazer aqui, porque vai depender de seu formato da saída. Mas você deve verificar como é realizado nos formatos da saída Shapefile e GML.

Fonte: GeoServer