Os padrões WMS e WFS do consórcio OGC – Open Geospatial Consortium

Publicado: 20/09/2012 em Programação, Serviços IP
Tags:

1- Introdução

Neste post trataremos de dois padrões definidos pela OGC: WMS e WFS.  Daremos vários exemplos da utilização destas requisições. Antes de tratar estes padrões, é importante estar ciente da especificação  de URL (IETF RFC 2396) que reserva alguns caracteres específicos com significados especiais. Estaremos utilizando estas definições ao longo deste post. Esta norma internacional explicitamente reserva vários destes caracteres para uso na parte de consulta de pedidos WMS e WFS, conforme abaixo:

Character Uso Reservado
? Separador indicando início da sequência de consulta
& Separador entre parametros na sequência de consulta
= Separador entre nome e valor do parâmetro
, Separador entre valores individuais em uma lista de parâmetros (tais como BBOX, LAYERS e STYLES na solicitação GetMap).
+ Representação abreviada de um espaço.

Outro aspecto, é que na internet é necessário enviar caracteres de um computador a outro, inclusive um conjunto de caracteres especiais. No entanto, uma URL não podem conter caracteres especiais. Além disso, certos caracteres são reservados pois têm um significado (o slash permite especificar um subdirectório, os caracteres & e ? servem para o envio de dados por formulários, e assim por diante). Por último, as URL podem ser incluídas num documento HTML, o que torna difícil a inserção de caracteres como < ou > na URL. É por isso que uma codificação especial se torna necessária!

A codificação consiste em substituir os caracteres especiais pelo carácter   %   acompanhado do código ASCII do caracter a codificar em notação hexadecimal.

Vejamos alguns exemplos:

Espaço %20
% %25
& %26
, %2C
/ %2F
= %3D
: %3A
? %3F

2- WMS
WMS – O padrão OpenGIS “Web Map Service Interface” (WMS) fornece uma interface simples HTTP para solicitações de imagens de mapas geo-registradas de uma ou mais bases de dados geoespaciais distribuídas. Ou seja, é um protocolo para servir imagens de mapas (PNG, JPEG ou GIF) georreferenciadas através da Internet que são geradas por um servidor de mapas utilizando dados de um banco de dados GIS. O pedido WMS define a(s) camada(s) geográfica(s) e a área de interesse para ser processado. A resposta à solicitação é uma ou mais imagens geo-registradas de mapas (retornado como JPEG, PNG, etc) que podem ser exibidas em um navegador (“browser”).

Clientes WMS podem requisitar imagens de múltiplos servidores WMS, e combiná-las em uma única imagem para o usuário. O padrão garante que estas imagens podem ser superpostas uma sobre as outras. Também é possível consultar os atributos dos elementos que compõem os mapas. A especificação fora desenvolvida e publicada pela primeira vez pelo Consórcio Geoespacial Aberto (OGC) em 1999.

WMS especifica um número de diferentes tipos de requisições (operações), umas mandatórias e outras opcionais. Operações obrigatórios em qualquer servidor WMS: GetCapabilities e GetMap. Operações que os provedores de serviços WMS podem opcionalmente suportarem (entre outras): GetFeatureInfo, DescribeLayer e GetLegendGraphic.

2.1- GetCapabilities (operação obrigatória)
GetCapabilities – retorna parametros sobre o WMS e os “layers” disponíveis.

O objetivo da operação GetCapabilities é a obtenção de metadados de serviço, o qual é uma descrição “machine-readable” (e “human-readable”) dos conteúdos do servidor de informações e as solicitações possíveis de parâmetros com valores. Quando invocado em um WMS, a resposta a um pedido GetCapabilities é um documento XML que contém metadados de serviço formatado de acordo com um esquema XML padronizado.

Exemplo:
http://192.168.1.101:8080/geoserver/wms?service=wms&version=1.1.1&request=GetCapabilities

Neste exemplo existem três parâmetros que estão sendo passados ​​para o servidor WMS: service (= wms), version (= 1.1.1) e request (= GetCapabilities).

O padrão WMS requer que os pedidos sempre incluam estes três parâmetros. O parâmetro “service” informa ao servidor WMS que se trata de um pedido WMS. O parâmetro “version” refere-se a qual versão do WMS está sendo solicitado. O parâmetro “request” especifica a operação, neste caso GetCapabilities.

A resposta é um documento XML de “Capabilities” que é uma descrição detalhada do serviço WMS. Ele contém três seções principais: “service”, “request” e “layer”:

  • Service     Contém os metadados do serviço tais como “service name”, “keywords”, e informações de contato da organização responsável pelo serviço.
  • Request     Descreve as operações que o serviço WMS provê, os parâmetros e os formatos de saída para cada operação.
  • Layer         Lista de sistema de coordenadas disponíveis e dos “layers”. No GeoServer, “layers” são descritos na forma “namespace:layer”. Cada “layer” provê metadados tais como “title”, “abstract”, “srs”, “LatLonBoundingBox”, “keywords” e outros.

2.2- GetMap (operação obrigatória)
GetMap – de acordo com os parâmetros fornecidos, retorna uma imagem do mapa

As operações GetMap requer que o servidor gere um mapa. Ao receber um pedido GetMap, o servidor WMS satisfaz o pedido ou emite uma exceção de serviço. A resposta a um pedido válido GetMap será um mapa da camada solicitada de informações espacialmente referenciada, no estilo desejado, e possuindo o sistema de referência de coordenadas especificado, caixa delimitadora, tamanho, formato e transparência.

Os parâmetros fundamentais especificam uma ou mais camadas e estilos para aparecerem no mapa, uma caixa delimitadora para a extensão de mapa, um sistema de referência espacial, e uma largura, altura e formato para a saída. As informações necessárias para especificar valores para os parâmetros tais como “layers”, “styles” e “srs” podem ser obtidas a partir do documento “Capabilities”.

Exemplos:
http://192.168.1.101:8080/geoserver/wms/?LAYERS=pdadgeo&TRANSPARENT=true&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application/vnd.ogc.se_inimage&FORMAT=image/png&SRS=EPSG:900913&BBOX=-5322463.1526,-1800244.88985,-5283327.394125,-1761109.131375&WIDTH=256&HEIGHT=256

http://192.168.0.105:8080/geoserver/wms?service=WMS&version=1.1.0&request=GetMap&layers=topp:states&styles=&bbox=-124.73142200000001,24.955967,-66.969849,49.371735&width=780&height=330&srs=EPSG:4326&format=application/openlayers

2.3- DescribeLayer (operação opcional)
DescribeLayer – indica ao WFS ou WCS a obter informações adicionais sobre a camada.
Exemplo de requisição:
http://192.168.1.101:8080/geoserver/wms?service=wms&version=1.1.1&request=DescribeLayer&Layers=pdadgeo

2.4 GetFeatureInfo (operação opcional)
A operação GetFeatureInfo solicita os dados espaciais e de atributos para as “features” das imagens dos mapas que foram fornecidos através dos pedidos de mapas anteriores. O caso de uso comum para GetFeatureInfo é aquele em que um usuário vê a resposta de um pedido de Mapa e escolhe um ponto (I,J) no mapa para o qual deseja obter mais informações. O funcionamento básico fornece a capacidade para um cliente especificar sobre qual “pixel” está sendo requisitado, qual(is) “layer(s)” que deve(m) ser investigada(s), e que formato da informação que deverá ser retornado. Devido ao protocolo WMS ser “stateless”, o pedido GetFeatureInfo deve indicar para o WMS qual o mapa que o usuário está visualizando através da inclusão da maioria dos parâmetros originais da solicitação “GetMap” (todos, mas a VERSÃO e PEDIDO). A partir do contexto da informação espacial (BBOX, CRS, largura, altura) no pedido GetMap, juntamente com a posição I,J da escolha do usuário, o WMS pode (possivelmente) retornar mais informações sobre essa posição.

Ela é semelhante à operação WFS “GetFeature” e, no caso do GeoServer que oferece também um serviço WFS, recomenda-se usar este padrão em vez da GetFeatureInfo. No entanto, “GetFeatureInfo” tem uma vantagem: já que esta solicitação usa um valor de pixel (x, y) a partir de uma imagem WMS anterior, isto faz com que seja mais fácil de utilizá-la por um usuário inicial que ainda não é capaz de executar o referenciamento geográfico verdadeiro. “GetFeatureInfo” é suportada apenas para aquelas camadas em que o atributo “queryable” = “1″ (verdadeiro) foi definido ou herdado.

Parâmetros da solicitação GetFeatureInfo:

Parâmetro Requerido? Descrição
service S Service name. Value is WMS.
version S Service version. Valores possíveis: 1.0.0, 1.1.0, 1.1.1, 1.3
request S Operation name. Value is GetFeatureInfo
layers S Ver Operação GetMap
styles S Ver Operação GetMap
srs ou crs S Ver Operação GetMap
bbox S Ver Operação GetMap
width S Ver Operação GetMap
height S Ver Operação GetMap
query_layers S Lista separa por vírgulas de um ou mais “layers para requisição
info_format N Formato para resposta de informação do “feature”
feature_count N Número máximo de “features” para retornar. Default é 1
x ou i S Ordenada X do ponto do mapa requerido, em pixels. 0 é o lado esquerdo. “i” é o parâmetro chave usado no WMS 1.3.0
y ou j S Ordenada Y do ponto do mapa requerido, em pixels. 0 é topo. “j” é o parâmetro chave usado no WMS 1.3.0
exceptions N Formato no qual as exceções são reportadas. O formato default é XML (application/vnd.ogc.se_xml)

Exemplos:
http://192.168.0.105:8080/geoserver/wms?REQUEST=GetFeatureInfo&EXCEPTIONS=application/vnd.ogc.se_xml&BBOX=-139.848709,18.549282,-51.852562,55.77842&SERVICE=WMS&INFO_FORMAT=text/html&QUERY_LAYERS=topp:states&FEATURE_COUNT=50&Layers=topp:states&WIDTH=780&HEIGHT=330&format=image/png&styles=&srs=EPSG:4326&version=1.1.1&x=362&y=213

http://192.168.1.102:8085/geoserver/pdadgeo/wms?SERVICE=WMS&version=1.1.1&REQUEST=GetFeatureInfo&Layers=pdadgeo:pdad_poligono&styles=&srs=EPSG:4674&BBOX=-48.358333,-16.090134,-47.239663,-15.460166&WIDTH=586&HEIGHT=330&QUERY_LAYERS=pdadgeo:pdad_poligono&INFO_FORMAT=text/html&FEATURE_COUNT=50&x=152&y=231&EXCEPTIONS=application/vnd.ogc.se_xml&format=image/png

3- WFS
WFS – “Web Feature Service Interface Standard” é um padrão que se refere ao envio e recebimento de dados geoespaciais através de HTTP. Fornece uma interface que permite solicitações de características geográficas através da web usando independentes plataformas. O GML (baseado em XML) fornece o padrão de codificação de carga para transportar as características geográficas, mas outros formatos como shapefiles também podem servir para o transporte. A especificação fora desenvolvida e publicada pelo Consórcio Geoespacial Aberto (OGC) e a versão atual do WFS é de 2.0 (liberada em novembro/2010).

Em vez de simplesmente ser capaz de olhar para a imagem do mapa, o poder está nas mãos do usuário para determinar como visualizar os dados brutos geográficas e os atributos. Os dados também podem ser transferidos, posteriormente analisados ​​e combinados com outros dados. As capacidades transacionais do WFS permitem aplicações de mapas colaborativos. Em suma, WFS é o que permite abrir os dados espaciais.

A WFS pode ser dividida em duas partes:
a) a WFS básica, que permite a consulta e recuperação de recursos;
b) a “Web Feature Service Transacional” (WFS-T), que permite adicionalmente a criação, exclusão e atualização de recursos.

Operações:
O WFS permite as seguintes operações:

GetCapabilities Pedido para um servidor WFS fornecer quais operações e serviços (“capacidades”) que estão sendo oferecidos por este servidor
DescribeFeatureType Solicita informações sobre um determinado “FeatureType” antes de solicitar os dados reais. Especificamente, DescribeFeatureType solicita uma lista de características e atributos para o determinado “FeatureType”, ou uma lista dos “featuretypes” disponíveis
GetFeature Recupera o dado atual, incluindo a geometria e valores dos atributos
LockFeature Impede que um tipo de feição seja editada. Na prática é pouco utilizada. A operação é teoricamente útil em conjunto com as transações, onde os usuários poderiam “trancar” uma área do mapa que estariam editando, para garantir que outros usuários não façam sua edição simultânea
Transaction Edita “Featuretypes” existentes através da criação, atualização e exclusão. A operação de Transação realiza edições de dados reais que estão fornecidos pelo WFS. Uma transação pode adicionar, modificar e remover feições. Cada transação consiste de zero ou mais inserções, atualizações e exclusões de elementos
GetGMLObject Recupera instâncias de elemento através XLinks que se referem a suas identificações XML (XML IDs). Trata-se de uma operação que é pouco utilizada em aplicações práticas

3.1 Sequências de Comandos

Exemplificando através de uma sequência de comandos,  como extrair informações através do serviço WFS de um servidor.

ETAPA-1: Solicitar o documento “capabilities” do servidor WFS, utilizando o comando GetCapabilities:
Através do navegador, solicitar:
http://endereço-servidor:8080/geoserver/wfs?service=wfs&version=1.1.0&request=GetCapabilities
Onde:
service: obrigatório;
version: obrigatório;
request: obrigatório.
A resposta será composta de 5 componentes principais:

Componente Descrição
ServiceIdentification Contém as informações básicas do headerpara a requisição, tal como o Title e ServiceType. O ServiceType indica qual a version(s) do WFS são suportadas.
ServiceProvider Provê informações de contato sobre a companhia que publicou o serviço WFS service.
OperationsMetadata Descreve as operações que o servidor WFS suporta e os parâmetros para cadqa operação.
FeatureTypeList Lista os tipos de features publicadas através do servidor WFS. Feature types são lsitadas no formato namespace:featuretype. A projeção default da feature type é também listada, junto com o bounding box para os dados na projeção indicada.
Filter_Capabilities Lista dos filtros, ou expressões, que estão disponíveis para comporem os predicados da queries, por exemplo, SpatialOperators (tais como Equals, Touches) e ComparisonOperators (tais como LessThan, GreaterThan). Os filtros por si só não estão incluídos no documento GetCapabilities.

Vamos transcrever parte de uma possível resposta:

<ows:ServiceIdentification></ows:ServiceIdentification>
   <ows:Keywords>
      <ows:Keyword>WFS</ows:Keyword>
      <ows:Keyword>WMS</ows:Keyword>
      <ows:Keyword>GEOSERVER</ows:Keyword>
   </ows:Keywords>
<ows:ServiceProvider></ows:ServiceProvider>
<ows:OperationsMetadata></ows:OperationsMetadata>
   <ows:Parameter name="outputFormat">
      <ows:Value>text/xml; subtype=gml/3.1.1</ows:Value>
      <ows:Value>GML2</ows:Value>
      <ows:Value>SHAPE-ZIP</ows:Value>
      <ows:Value>application/gml+xml; version=3.2</ows:Value>
      <ows:Value>application/json</ows:Value>
      <ows:Value>csv</ows:Value>
      <ows:Value>gml3</ows:Value>
      <ows:Value>gml32</ows:Value>
      <ows:Value>json</ows:Value>
      <ows:Value>text/xml; subtype=gml/2.1.2</ows:Value>
      <ows:Value>text/xml; subtype=gml/3.2</ows:Value>
   </ows:Parameter>
<FeatureTypeList>
   <FeatureType>
      <Name>cdes:31RA_df</Name>
      <Title>31RA_df</Title>
      <Abstract/>
      <ows:Keywords>
         <ows:Keyword>31RA_df</ows:Keyword>
         <ows:Keyword>features</ows:Keyword>
      </ows:Keywords>
      <DefaultSRS>urn:x-ogc:def:crs:EPSG:4674</DefaultSRS>
      <ows:WGS84BoundingBox>
         <ows:LowerCorner>-48.28579106824511 -16.050264262141752</ows:LowerCorner>
         <ows:UpperCorner>-47.3083869870584 -15.500255152876496</ows:UpperCorner>
      </ows:WGS84BoundingBox>
   </FeatureType>
   <FeatureType>
      <Name>cdes:ride_df</Name>
      <Title>ride_df</Title>
      <Abstract/>
      <ows:Keywords>
         <ows:Keyword>features</ows:Keyword>
         <ows:Keyword>ride_df</ows:Keyword>
      </ows:Keywords>
      <DefaultSRS>urn:x-ogc:def:crs:EPSG:4674</DefaultSRS>
      <ows:WGS84BoundingBox>
         <ows:LowerCorner>-49.229433 -17.35539596946215</ows:LowerCorner>
         <ows:UpperCorner>-46.20471408000001 -14.536028969541004</ows:UpperCorner>
      </ows:WGS84BoundingBox>
   </FeatureType>
</FeatureTypeList>
<ogc:Filter_Capabilities></ogc:Filter_Capabilities>

ETAPA-2: solicitar o esquema (GML) de municipios da Ride-DF (tipo ride_df) através do comando DescribeFeatureType:

http://endereço-servidor:8080/geoserver/wfs?service=wfs&version=1.1.0&request=DescribeFeatureType&typeName=cdes:ride_df
Uma possível resposta teria o seguinte aspecto:

<xsd:complexType name="ride_dfType">
   <xsd:complexContent>
      <xsd:extension base="gml:AbstractFeatureType">
         <xsd:sequence>
            <xsd:element maxOccurs="1" minOccurs="0" name="__gid" nillable="true" type="xsd:double"/>
            <xsd:element maxOccurs="1" minOccurs="0" name="geocodigo" nillable="true" type="xsd:double"/>
            <xsd:element maxOccurs="1" minOccurs="0" name="nome" nillable="true" type="xsd:string"/>
            <xsd:element maxOccurs="1" minOccurs="0" name="uf" nillable="true" type="xsd:string"/>
            <xsd:element maxOccurs="1" minOccurs="0" name="latitude" nillable="true" type="xsd:string"/>
            <xsd:element maxOccurs="1" minOccurs="0" name="longitude" nillable="true" type="xsd:string"/>
            <xsd:element maxOccurs="1" minOccurs="0" name="populacao" nillable="true" type="xsd:double"/>
            <xsd:element maxOccurs="1" minOccurs="0" name="the_geom" nillable="true" type="gml:MultiSurfacePropertyType"/>
         </xsd:sequence>
      </xsd:extension>
   </xsd:complexContent>
</xsd:complexType>
<xsd:element name="ride_df" substitutionGroup="gml:_Feature" type="cdes:ride_dfType"/>

ETAPA-3: de posse do esquema do tipo ride_df, solicitar as feições (uma ou mais) através do comando GetFeature:
a) Forma Geral
http://endereço-servidor:8080/geoserver/wfs?service=wfs&version=1.1.0&request=GetFeature&typeName=cdes:ride_df&maxFeature=1&propertyName=*

b) Forma Específica
Já tendo identificado os filtros necessários pelo comando anterior (Forma Geral), executar um comando como este para obter uma resposta semelhante a abaixo:


<cdes:ride_df gml:id="ride_df.2">
   <cdes:__gid>2.0</cdes:__gid>
   <cdes:geocodigo>5200100.0</cdes:geocodigo>
   <cdes:nome>Abadiânia</cdes:nome>
   <cdes:uf>GO</cdes:uf>
   <cdes:latitude>-16.204</cdes:latitude>
   <cdes:longitude>-48.707</cdes:longitude>
   <cdes:populacao>15693.0</cdes:populacao>
   <cdes:the_geom>
      <gml:MultiSurface srsDimension="2" srsName="urn:x-ogc:def:crs:EPSG:4674">
         <gml:surfaceMember>
            <gml:Polygon srsDimension="2">
               <gml:exterior>
                  <gml:LinearRing srsDimension="2">
                     <gml:posList>
                        -16.134024959999998 -48.939417 -16.08650901 -48.91363308 -16.053993 -48.902214959999995 ....
                          ......
                        -16.134024959999998 -48.939417 -16.134024959999998 -48.939417 -16.134024959999998 -48.939417
                     </gml:posList>
                  </gml:LinearRing>
               </gml:exterior>
            </gml:Polygon>
         </gml:surfaceMember>
      </gml:MultiSurface>
   </cdes:the_geom>
</cdes:ride_df>

3.2 Outros exemplos de comandos

3.2.1- GetCapabilities
Exemplo:
http://www.example.com/geoserver/wfs?service=wfs&version=1.1.0&request=GetCapabilities

3.2.2- DescribeFeatureType
Exemplo:
http://www.example.com/geoserver/wfs?service=wfs&version=1.1.0&request=DescribeFeatureType

3.2.3- GetFeature
Exemplos:
http://www.example.com/geoserver/wfs?service=wfs&version=1.1.0&request=GetFeature&typeName=namespace:featuretype
http://www.example.com/geoserver/wfs?service=wfs&version=1.1.0&request=GetFeature&typeName=namespace:featuretype&featureID=feature
http://www.example.com/geoserver/wfs?service=wfs&version=1.1.0&request=GetFeature&typeName=namespace:featuretype&maxFeatures=N
http://www.example.com/geoserver/wfs?service=wfs&version=1.1.0&request=GetFeature&typeName=namespace:featuretype&maxFeatures=N&sortBy=property
http://www.example.com/geoserver/wfs?service=wfs&version=1.1.0&request=GetFeature&typeName=namespace:featuretype&maxFeatures=N&sortBy=property+D
http://www.example.com/geoserver/wfs?service=wfs&version=1.1.0&request=GetFeature&typeName=namespace:featuretype&propertyName=property
http://www.example.com/geoserver/wfs?service=wfs&version=1.1.0&request=GetFeature&typeName=namespace:featuretype&featureID=feature&propertyName=property
http://www.example.com/geoserver/wfs?service=wfs&version=1.1.0&request=GetFeature&typeName=namespace:featuretype&featureID=feature&propertyName=property1,property2
http://www.example.com/geoserver/wfs?service=wfs&version=1.1.0&request=GetFeature&typeName=namespace:featuretype&bbox=a1,b1,a2,b2

Links:
1- OGC: Especificação WMS
2- OGC: Especificação WFS
3- GeoServer: WMS reference

Anúncios
comentários
  1. Ótimo post, parabéns!

  2. Eduardo Lopes disse:

    Boa tarde Albuquerque, tudo tranquilo? Primeiramente quero te parabenizar pelo material que você disponibiliza.

    Eu to com um problema e se possível gostaria da sua opinião. Tenho um banco de dados no postGIS e preciso jogar ele pro OpenGeo Explorer. Criando uma store e publicando as tabelas, não está dando certo.

    Pensei em criar um servidor wfs-t e puxar os dados dele. Como eu faço isso ?

    Abraço.

Deixe um comentário, pois isto é muito motivante para continuarmos este trabalho

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s