{"id":186,"date":"2007-09-17T08:00:26","date_gmt":"2007-09-17T11:00:26","guid":{"rendered":"http:\/\/www.fernandoquadro.com.br\/html\/2007\/09\/17\/criando-um-formato-de-saida-no-geoserver-parte-1\/"},"modified":"2009-10-06T00:08:56","modified_gmt":"2009-10-06T03:08:56","slug":"criando-um-formato-de-saida-no-geoserver-parte-1","status":"publish","type":"post","link":"https:\/\/www.fernandoquadro.com.br\/html\/2007\/09\/17\/criando-um-formato-de-saida-no-geoserver-parte-1\/","title":{"rendered":"Criando um formato de sa\u00edda no GeoServer &#8211; Parte 1"},"content":{"rendered":"<p>Um formado de sa\u00edda \u00e9 como o GeoServer responde a uma requisi\u00e7\u00e3o de dados. Por padr\u00e3o, uma requisi\u00e7\u00e3o getFeature retorna a(s) feature(s) em GML. Por\u00e9m o GeoServer pode utilizar tamb\u00e9m <a href=\"http:\/\/www.fernandoquadro.com.br\/html\/2007\/09\/05\/formatos-de-saida-do-geoserver\/\" target=\"_blank\">outros formatos<\/a> para estar respondendo as suas solicita\u00e7\u00f5es.<\/p>\n<p>Para especificar qual sa\u00edda voc\u00ea deseja receber do GeoServer, basta apenas passar o argumento outputformat=MeuTipo na URL.<\/p>\n<p>[source language=&#8221;:HTML&#8221;]<br \/>\nhttp:\/\/localhost:8080\/geoserver\/wfs?<br \/>\nrequest=getfeature&amp;<br \/>\nservice=wfs&amp;<br \/>\nversion=1.0.0&amp;<br \/>\ntypename=states&amp;<br \/>\noutputformat=SHAPE-ZIP<br \/>\n[\/source] <\/p>\n<p>A partir daqui eu vou subentender que voc\u00ea \u00e9 um usu\u00e1rio que tem uma certa experi\u00eancia na linguagem Java, principalmente utilizando a classe java.IO.OutputStream.<\/p>\n<p>Neste tutorial criaremos dois arquivos e modificaremos um, veja:<\/p>\n<p>&#8211; Criar MyFormatFeatureResponseDelegate.java<br \/>\n&#8211; Criar MyFormatFeatureResponseDelegateFactory.java<br \/>\n&#8211; Alterar org.vfny.geoserver.wfs.FeatureResponseDelegateProducerSpi<\/p>\n<p><strong>PASSO 1:<\/strong> Criando MyFormatFeatureResponseDelegate.java <\/p>\n<p>No pacote org.vfny.geoserver.wfs.responses, cie sua classe MyFormatFeatureResponseDelegate.java. Ela deve implementar a interface FeatureResponseDelegate:<\/p>\n<p>[source language=&#8221;:Java&#8221;]<br \/>\npublic interface FeatureResponseDelegate<br \/>\n{<br \/>\n    boolean canProduce(String outputFormat);<\/p>\n<p>    void prepare(String outputFormat,<br \/>\n                     GetFeatureResults results)<br \/>\n                     throws IOException;<\/p>\n<p>    String getContentType(GeoServer gs);<\/p>\n<p>    String getContentEncoding();<\/p>\n<p>    void encode(OutputStream output)<br \/>\n           throws ServiceException, IOException;<br \/>\n}<br \/>\n[\/source]<\/p>\n<p>Crie o atributo results que deve ser do tipo GetFeatureResults.<\/p>\n<p>[source language=&#8221;:Java&#8221;]<br \/>\nprivate GetFeatureResults results;<br \/>\n[\/source]<\/p>\n<p>Este \u00e9 um m\u00e9todo muito simples. Ele verifica se o formato passado \u00e9 suportado pelo GeoServer, e retorna verdadeiro, caso a afirma\u00e7\u00e3o esteja correta. Veja o exemplo do GML:<\/p>\n<p>[source language=&#8221;:Java&#8221;]<br \/>\npublic boolean canProduce(String outputFormat)<br \/>\n{<br \/>\n    return &quot;GML2&quot;.equalsIgnoreCase(outputFormat)<br \/>\n        || &quot;GML2-GZIP&quot;.equalsIgnoreCase(outputFormat);<br \/>\n}<br \/>\n[\/source]<\/p>\n<p>O m\u00e9todo prepare \u00e9 chamado antes de qualquer sa\u00edda ser processada. Aqui voc\u00ea ter\u00e1 a chance de verificar poss\u00edveis erros.<br \/>\nAqui est\u00e1 um exemplo da classe ShapeFeatureResponseDelegate:<\/p>\n<p>[source language=&#8221;:Java&#8221;]<br \/>\npublic void prepare(String outputFormat, GetFeatureResults results)<br \/>\n     throws IOException<br \/>\n    {<br \/>\n        this.results = results;<\/p>\n<p>        if (results == null) {<br \/>\n            throw new IllegalStateException(<br \/>\n                &quot;It seems prepare() has not succeed. &lt;results&gt; is null&quot;);<br \/>\n        }<\/p>\n<p>        tempDir = System.getProperty(&quot;java.io.tmpdir&quot;);<\/p>\n<p>        if (tempDir == null) {<br \/>\n        \tthrow new NullPointerException(&quot;<br \/>\n             &lt;tempDir&gt; is null. &quot; +<br \/>\n        \t&quot;There is a problem with the<br \/>\n              java.io.tempdir directory.&quot;);<br \/>\n        }<br \/>\n    }<br \/>\n[\/source]<\/p>\n<p>Crie tamb\u00e9m o m\u00e9todo getContentType:<\/p>\n<p>[source language=&#8221;:Java&#8221;]<br \/>\npublic String getContentType(GeoServer gs) {<br \/>\n      return gs.getMimeType();<br \/>\n}<br \/>\n[\/source]<\/p>\n<p>O m\u00e9todo getContentEncoding(), retornar\u00e1 uma String, e indicar\u00e1 qual o formato da sa\u00edda dos dados. Caso n\u00e3o haja um tipo de sa\u00edda ele deve retornar <strong>null<\/strong>. Aqui est\u00e1 um exemplo da classe ShapeFeatureResponseDelegate:<\/p>\n<p>[source language=&#8221;:Java&#8221;]<br \/>\npublic String getContentEncoding() {<br \/>\n    return &quot;zip&quot;;<br \/>\n}<br \/>\n[\/source]<\/p>\n<p>\u00c9 no m\u00e9todo encode(OutputStream output) onde a sa\u00edda ocorre, pois todos os dados s\u00e3o escritos no OutputStream. Eu n\u00e3o posso entrar em demasiado detalhe de como voc\u00ea deve fazer aqui, porque vai depender de seu formato da sa\u00edda. Mas voc\u00ea deve verificar como \u00e9 realizado nos formatos da sa\u00edda Shapefile e GML.<\/p>\n<p>Fonte: <a href=\"http:\/\/www.geoserver.org\">GeoServer<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Um formado de sa\u00edda \u00e9 como o GeoServer responde a uma requisi\u00e7\u00e3o de dados. Por padr\u00e3o, uma requisi\u00e7\u00e3o getFeature retorna a(s) feature(s) em GML. Por\u00e9m o GeoServer pode utilizar tamb\u00e9m outros formatos para estar respondendo as suas solicita\u00e7\u00f5es. Para especificar&#8230; <a class=\"more-link\" href=\"https:\/\/www.fernandoquadro.com.br\/html\/2007\/09\/17\/criando-um-formato-de-saida-no-geoserver-parte-1\/\">Continue Reading &rarr;<\/a><\/p>\n","protected":false},"author":275,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,24,6],"tags":[208,223],"class_list":["post-186","post","type-post","status-publish","format-standard","hentry","category-geoserver","category-gis","category-tecnologia","tag-geoserver","tag-gis"],"_links":{"self":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/186","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/users\/275"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/comments?post=186"}],"version-history":[{"count":1,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/186\/revisions"}],"predecessor-version":[{"id":2989,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/posts\/186\/revisions\/2989"}],"wp:attachment":[{"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/media?parent=186"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/categories?post=186"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fernandoquadro.com.br\/html\/wp-json\/wp\/v2\/tags?post=186"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}