sábado, 2 de junho de 2012

Minha cidade no Google Transit?


Minha cidade no Google Transit?

Olá, amigos!
No final de 2007, quando iniciei o processo de busca por um assunto para meu TCC da pós, me deparei com o Google Transit. Na época, eram poucas as cidades que disponibilizavam o serviço junto ao Google. Então pensei, por que não tornar Porto Alegre a primeira cidade do Brasil a estar no Google Transit? Após, obtive as informações deste artigo que exemplifica como especificar os dados de transportes públicos da sua cidade no Google Maps (não vai depender apenas de vocês, é claro, senão Porto Alegre já estaria há muito tempo lá...). Melhor dizendo, este tipo de dado deve ser administrado por órgãos responsáveis da sua cidade, mantendo-os atualizados.

Conhece o Google Transit?

O Google Transit não são as informações sobre o tráfego de veículos da sua cidade não!
O Google Transit é um recurso presente junto ao Google Maps com o objetivo de auxiliar usuários de transportes públicos a obterem os melhores itinerários para uma determinada viagem. Seu funcionamento se compara com a busca por rotas de veículos particulares, porém, leva em consideração linhas e horários pré-definidos pelos órgãos públicos responsáveis pelo transporte urbano.
Na imagem acima podemos ver que funciona exatamente como uma rota "De Carro", inserimos o endereço de origem e destino. Abaixo a primeira diferença: informamos o horário. De início a idéia soa meio confusa, mas tem um objetivo muito importante, visto que os transportes públicos possuem horários de intervalos diferentes de acordo com os períodos do dia. Assim você tem a informação correta da hora em que o ônibus irá passar na parada em frente à sua casa!! Já imaginou? Quem dera, mas a idéia é esta mesmo. O campo de preenchimento do data funciona da mesma maneira, visto que finais de semana e feriados também existem intervalos diferentes nos horários.
Como resultado da busca, temos exemplificado na imagem abaixo:
O Google lhe retorna algumas das possibilidades, que variam desde linhas de ônibus diferentes, baldeações entre ônibus e metrô, dois ônibus, etc. Informa o tempo de cada sequência e o custo, passando para o usuário decidir qual o melhor itinerário.
A imagem abaixo mostra o resultado da rota no mapa, visualmente temos as informações dos trechos a pé, de ônibus e metrô, destacando qual a parada de descida e acesso ao próximo transporte, se existir.
E melhor, o tempo de espera entre as baldeações, como mostra a figura abaixo.
Na descrição da rota, temos informações completas de cada trajeto, com o custo, tempo dos segmentos de parada e detalhes das rotas a pé, para você não se perder nunca.
Bom, talvez você já tenha utilizado o serviço acima e está se perguntando: e aí, como funciona? Vamos ao que interessa...
A maioria das informações abaixo são traduzidas do site oficial (como esse material foi retirado no início de 2008, ainda não existia a tradução para o Português), caso vocês queiram maiores informações e, atualizadas, acessem o link Google Transit Feed Specification (agora traduzido) senão, confiram o artigo abaixo e tenham as mesmas informações e alguns extras.
Cidades que possuem informações de rotas urbanas no Google até o presente momento:
Mas lembro a todos que apenas São Paulo e Belo Horizonte incluem dados quanto a rotas e paradas de ônibus e metrô. As demais cidades encontram apenas as geometrias das linhas de metrô.

Como divulgar

O Google fornece aos órgãos públicos informações quanto ao processo de divulgação destes dados junto ao recurso.
Os seguintes processos devem ser efetuados:
  1. O órgão ou agência responsável pelos dados deve exportar os mesmos como um arquivo ZIP no formato especificado pelo Google Transit Feed, documentado neste mesmo trabalho, disponibilizando-os em um servidor web padrão.
  2. Um e-mail deve ser enviado ao Google notificando a pasta raiz destas informações junto com a conta Google responsável pela manutenção destas informações.
  3. O Google irá recuperar estas informações de acordo com o caminho indicado acima.
  4. O Google adiciona os dados junto aos recursos do Google Transit.
  5. O órgão ou agência provedora dos dados analisa as informações e recorre ao Google caso houver algum problema.
  6. O Google e a empresa prestadora dos dados entram em comum acordo quanto à divulgação das informações.
  7. Os dados são inclusos junto ao Google.com.
  8. O Google passa a atualizar as informações junto ao Google Transit sempre que houver uma nova atualização dos dados no Servidor Web Padrão da empresa prestadora dos dados.

Definições

Algumas definições utilizadas neste artigo:
  • Field Required (Campo exigido): Os campos descritos como Field Required devem ser incluídos obrigatoriamente, sendo fornecido um valor para cada registro. Alguns campos obrigatórios permitem a inclusão de campos com strings de valor vazio. Para inserir uma string vazia, basta omitir qualquer texto entre as vírgulas dentro do campo. Lembre-se que 0 é interpretado como uma cadeira de valor, e não como uma string vazia.
  • Field Optional (Campo opcional): Os campos descritos como Field Optional podem ser omitidos do documento. Caso você optar pela inclusão destes dados, cada registro deve possuir um valor para a coluna referenciada. Da mesma forma que o campo Field Required, alguns campos permitem a inclusão de strings vazias, seguindo o mesmo processo de omitir qualquer texto entre as vírgulas presentes para o campo.
  • Dataset Unique: O campo descrito como Dataset Unique representa um índice único, que representa uma entidade distinta no interior de uma coluna. Por exemplo, se em uma rota é atribuído o ID 1A, então a nenhuma outra rota será possível utilizar o identificador 1A.

Requisitos

O Google Transit aceita os feeds com os seguintes arquivos:
Agency.txt
Classificação: Field Required
Contém informações quanto a um ou mais órgãos de trânsito que fornecem os dados.
Stops.txt
Classificação: Field Required
Este arquivo contém informações sobre os locais de embarque e desembarque de veículos individuais. (pontos de ônibus/paradas).
Routes.txt
Classificação: Field Required
Contém informações sobre rotas de trânsito das empresas. Uma rota é a seqüência de duas ou mais paradas.
Trips.txt
Classificação: Field Required
Este arquivo contém informações quanto ao serviço regular (direção e freqüência) de uma rota específica.
Stop_times.txt
Classificação: Field Required
Contém a lista de vezes que um veículo chega a parar ao longo de uma rota.
Calendar.txt
Classificação: Field Required
Este arquivo define as categorias de serviços. Cada categoria de serviço indica quando começa e termina, assim como os dias que o serviço está disponível.
Calendar_dates.txt
Classificação: Field Optional
Este arquivo listas de exceções para o serviço calendar.txt. Se calendar_dates.txt incluir todas as datas de serviço, este arquivo pode ser especificado em vez de calendar.txt.
Fare_atributes.txt
Classificação: Field Optional
Este arquivo define as informações quanto à tarifação para as rota de uma organização de trânsito.
Fare_rules.txt
Classificação: Field Optional
Define as regras para a tarifação de uma rota presente em uma organização de trânsito.
Shapes.txt
Classificação: Field Optional
Este arquivo define as regras para a elaboração de linhas em um mapa para a representação das rotas de uma determinada organização de trânsito.
Frequencies.txt
Classificação: Field Optional
Define o avanço (tempo entre as viagens) para rotas com freqüência variável de serviço.

Requisitos dos Arquivos

Os requisitos seguintes aplicam-se à forma e ao conteúdo de seus arquivos:
  • Todos os arquivos presentes no Google Transit Feed Spec (GTGS) devem ser salvos como texto delimitador por vírgula.
  • A primeira linha dos arquivos deve conter o nome referente à coluna. Cada componente corresponde a definições presentes nas definições deste trabalho.
  • Todos os campos são case-sensitive.
  • Os campos de valores não podem conter tabs ou novas linhas.
  • Campos de valores que contenham aspas ou vírgulas devem ser incluídos entre aspas. Além disso, cada aspas no campo valor deve ser precedida de uma aspas.
  • Campo Valor Original: Contém "aspas", vírgulas e texto.
  • Campo Valor em um arquivo CVS: "Contém" ""aspas"", vírgulas e texto"
  • Os campos de valores não devem conter tags HTML ou comentários.
  • Os arquivos devem ser codificados em UTF-8 para suportar todos os caracteres Unicode.
  • Nomeie seus feeds usando as seguintes convenções:
- agency.txt
- stops.txt
- routes.txt
- trips.txt
- stop_times.txt
- calendar.txt
- calendar_dates.txt
- fare_rules.txt
- fare_attributes.txt
- shapes.txt
- frequencies.txt
  • Compacte os arquivos de seu Feed como Zip. Nomeie o arquivo zipado como google_transit.zip. Poste o arquivo em um diretório denominado de AAAAMMDD, representando a ultima data de atualização das informações.

Atualizando seus Feeds

Orientações quanto à atualização dos arquivos:
  •  Você pode postar simultâneos arquivos compactados (zip), contanto que cada arquivo contenha todos os dados para um único e determinado período. Em outras palavras, os arquivos não podem conter dados relativos a sobreposição de datas de serviços.
  •  Cada arquivo deverá residir em um diretório diferente no seu servidor.
  •  Quanto o Google recuperar um novo arquivo, este irá sobrescrever todos os dados armazenados previamente para a sua agência. Pede-se que você assegure-se que seus arquivos de dados forneçam um serviço completo quanto ao período ao qual se destina. Como visto no item anterior, você pode fornecer diversos arquivos zipados, desde que os mesmos não contenham sobreposições de datas de serviços.

Requisitos para a publicação de seus Feeds ao Google Maps

  •  A empresa responsável pela divulgação das informações terá de fornecer a URL do Feed. O Google pode fazer o download dos Feeds utilizando HTTP ou HTTPS. Também é necessário fornecer um login e senha, se for necessária a recuperação e alimentação das informações.
  •  A equipe de TI/Redes deve ter ciência que o Google periodicamente recupera dados a partir do Servidor Web Padrão informado pela empresa prestadora dos dados de trânsito, de modo que qualquer alteração quanto a permissão de arquivos, blocos ou caminho dos arquivos pode acarretar na quebra do processo de coleta de dados.

Desafios

Embora a participação no Google Transit e o licenciamento quanto a ferramenta GoogleTransitDataFeed sejam gratuitos, é provável que a empresa prestadora dos dados de transporte irá encontrar uma série de desafios na integração entre a ferramenta e sua base de dados, implicando em um significativo esforço.
Um dos grandes desafios é quanto a qualidade das informações quanto ao sistema de trânsito. Caso os dados já estejam sendo utilizados em alguma aplicação que represente a localização automática de veículos, ou controle de frotas, é bem provável que o nível da qualidade das informações seja grande o suficiente para alimentar o Google Transit sem o adicional de muitos esforços. Por outro lado, caso a qualidade das informações seja relativamente baixo, é bem provável que alguns desafios e esforços venham a ser necessários ao longo do projeto.

Possíveis desafios

  • Aquisição de dados básicos: O Google Transit exige que todos os pontos de paradas sejam geocodificados (coordenadas mapeadas através de GPS ou Geocoding). O que significa que um trabalho de campo seja necessário para a coleta destas informações junto a cada ponto de parada, obtendo informações completas junto aos mesmos.
  • Dados consistentes e completos: As rotas dos transportes públicos devem possuir dados consistentes, isto é, os pontos de paradas mapeados ao longo de um percurso devem corresponder à realidade das rotas.
  • Formato Proprietário dados: O formato dos dados deve ser aberto, permitindo ao Google normaliza-los de acordo com determinados padrões abertos existentes.
Abaixo, uma breve descrição de cada arquivo e suas respectivas colunas.
Dica: O Google disponilbiliza um Feed de exemplo, não deixem de acessar este link para uma melhor visualização das informações a seguir: Demo Transit Authority

Agency.txt

Exemplo
agency_id, agency_name, agency_url, agency_timezone
FunBus, The FunBus, http://www.thefunbus.org, America / Los Angeles

Calendar.txt

Exemplo
service_id,monday,tuesday,wednesday,thursday,friday,saturday,sunday,start_date,end_date
WE,0,0,0,0,0,1,1,20060701,20060731
WD,1,1,1,1,1,0,0,20060701,20060731

Calendar_dates.txt

Exemplo
O exemplo abaixo mostra uma exceção para o serviço de transporte no natal do ano de 2007. Na terça-feira, 25 de dezembro de 2007, o serviço regular (service_id = WD) é interrompido (exception_type = 2). Por outro lado, é executado um outro serviço identificado como WE (service_id = WE) na data especificada.
service_id,date,exception_type
WD,20060703,2
WE,20060703,1

Fare_atributes.txt

Exemplo
fare_id,price,currency_type,payment_method,transfers,transfer_duration
1,0.00,USD,0,0,0
2,0.50,USD,0,0,0
3,1.50,USD,0,0,0
4,2.00,USD,0,0,0
5,2.50,USD,0,0,0

Fare_rules.txt

Exemplo
fare_id,route_id,origin_id,destination_id,contains_id
a,TSW,1,1,
a,TSE,1,1,
a,GRT,1,1,
a,GRJ,1,1,
a,SVJ,1,1,
a,JSV,1,1,
a,GRT,2,4,
a,GRJ,4,2,
b,GRT,3,3,
c,GRT,,,6

Shapes.txt

Exemplo
shape_id,shape_pt_lat,shape_pt_lon,shape_pt_sequence,shape_dist_traveled
A_shp,37.61956,-122.48161,1,0
A_shp,37.64430,-122.41070,2,6.8310
A_shp,37.65863,-122.30839,3,15.8765

Stop_times.txt

Exemplo
trip_id,arrival_time,departure_time,stop_id,stop_sequence,pickup_type,dropoff_type
AWE1,0:06:10,0:06:10,S1,1,0,0,0
AWE1,,,S2,2,0,1,3
AWE1,0:06:20,0:06:30,S3,3,0,0,0
AWE1,,,S5,4,0,0,0
AWE1,0:06:45,0:06:45,S6,5,0,0,0
AWD1,0:06:10,0:06:10,S1,1,0,0,0
AWD1,,,S2,2,0,0,0
AWD1,0:06:20,0:06:20,S3,3,0,0,0
AWD1,,,S4,4,0,0,0
AWD1,,,S5,5,0,0,0
AWD1,0:06:45,0:06:45,S6,6,0,0,0

Stops.txt

Exemplo
stop_id,stop_name,stop_desc,stop_lat,stop_lon,stop_url
S1,Mission St. & Silver Ave.,The stop is located at the southwest corner of the intersection.,37.728631,-122.431282
S2,Mission St. & Cortland Ave.,The stop is located 20 feet south of Mission St.,37.74103,-122.422482
S3,Mission St. & 24th St.,The stop is located at the southwest corner of the intersection.,37.75223,-122.418581
S4,Mission St. & 21st St.,The stop is located at the northwest corner of the intersection.,37.75713,-122.418982
S5,Mission St. & 18th St.,The stop is located 25 feet west of 18th St.,37.761829,-122.419382
S6,Mission St. & 15th St.,The stop is located 10 feet north of Mission St.,37.766629,-122.419782

Trips.txt

Exemplo
route_id,service_id,trip_id,trip_headsign,block_id
A,WE,AWE1,Downtown,1
A,WE,AWE2,Downtown,2

Diagrama ER

Extras

Ainda na página do Feed Specifications do Google, você tem acesso a softwares que auxiliam na visualização dos feeds. No canto esquerdo do site possui o menu "Para desenvolvedores de feeds" o item "Ferramentas de feed GTFS de software livre".
Aconselho uma aplicação: transitfeed-windows-binary.
Desenvolvida na linguagem Python, é muito útil para validar os seus feeds criados e através do schedule_viewer, visualizar os pontos de paradas no mapa, como podemos ver na figura abaixo.

Concluindo

Ferramentas como o Google Transit facilitam as empresas e orgãos públicos a disponibilizar as informações sem se preocupar com infra-estrutura e manutenção das aplicações, tendo apenas como "trabalho" manter atualizada suas bases de dados com os itinerários e horários das linhas urbanas. Existem ferramentas muito semelhantes, criadas muito antes do Google Transit, como por exemplo o "Como vou de Ônibus" da BHTrans (a mesma empresa que fornece os feeds de Belo Horizonte para o Google. No site BHTRANS podemos mais ter conhecimento do ótimo trabalho que essa empresa de transporte presta na cidade de BH. Fiquei impressionado com a qualidade das informações e o trabalho prestado.
Espero que todos os órgãos e empresas responsáveis tenham acesso a este tipo de informação, como o Google Transit, e se conscientizem quanto a facilidade para se disponibilizar este tipo de informação que é, sem dúvida nenhuma, muito importante para a população.

Sistemas de Informação Geográfica


Sistemas de Informação Geográfica

Olá, amigos, estou de volta ao iMasters e espero que consiga continuar a destinar uma parte do meu tempo transmitindo o pouco que sei deste universo. Como as idas e vindas da vida me direcionaram para o caminho do Geoprocessamento, nada mais justo que voltar ao iMasters para compartilhar o que venho estudando nos últimos anos.
Acredito que muitas pessoas que estão lendo este meu artigo não tenham conhecimento do conceito Geoprocessamento. Pois bem, não fiquem com vergonha de comentar a respeito pois até alguns anos atrás, quando ingressei nesta área, também não a conhecia.
As informações abaixo estão presentes no meu trabalho de conclusão da pós-graduação, a mesma se encontra junto às fontes no final do artigo.

Vamos ao conceito....

geoprocessamento surgiu devido ao elevado crescimento das tecnologias aplicadas a softwares e hardwares para gerenciamento de informações, processamento de dados e imagens geográficas. O objetivo era automatizar parte do processamento de dados com características espaciais, diminuindo custos de produção e manutenção de mapas. Processo que anteriormente era totalmente manual, a produção de mapas se restringia a papéis com um custo elevado, principalmente levando em consideração os aspectos de armazenamento e atualização.
Diversas tentativas de automatizar parte do processamento de dados espaciais aconteceram nos Estados Unidos e Inglaterra, por volta dos anos 50. Devido à precariedade da informática na época, estes sistemas não são classificados como sistemas de informação.
Os primeiros sistemas de informação geográfica surgiram na década de 60, no Canadá, resultado de um esforço governamental para criar um inventário de recursos naturais. Nos anos 70, novos e mais acessíveis recursos de hardware tornaram viáveis o desenvolvimento de sistemas comerciais.
Os sistemas de informação geográfica constituem hoje uma poderosa ferramenta dentro deste conjunto, com o intuito de coletar, armazenar, analisar e disponibilizar informações que auxiliam muitas vezes na tomada de decisão.
Os sistemas de informação geográfica realizam o tratamento computacional de dados geográficos e recuperam informações, não apenas com base em suas características alfanuméricas, mas também através de sua localização espacial. Estes sistemas oferecem uma visão diferenciada de seu ambiente de trabalho através de localizações geográficas. A geometria e os atributos dos dados de um GIS devem ser georreferenciados, isto quer dizer que estão localizados na superfície terrestre e representados em uma projeção cartográfica.
A superfície curva da terra é representada em mapas confeccionados sobre uma folha de papel, ou seja, uma superfície plana. Inevitavelmente, provoca distorções entre a realidade e sua representação. As projeções cartográficas são métodos matemáticos através dos quais a superfície curva da terra é representada sobre uma superfície plana.
Existem diferentes projeções geográficas, cada método é capaz de representar e preservar diferentes propriedades espaciais: áreas, direção, distância e forma.
Algumas das projeções mais utilizadas são: projeção cônica de Lambert, projeção UTM (Universal Transverse Mercator) e projeção plana.
Projeções Geográficas
Projeções Geográficas

Sensoriamento Remoto

É a ciência e a arte de se obter informações sobre objetos, área ou fenômenos, através da análise dos dados adquiridos por um dispositivo que não esteja em contato com o objeto, área ou fenômeno sob investigação.
Por volta da década de 80, a utilização de GIS tornou-se comum em universidades, empresas e agências governamentais. Atualmente, é utilizado em grande escala em diversos setores para as mais diversas aplicações. A diversidade do uso de aplicações fez surgir diversas definições: Um conjunto manual ou computacional de procedimentos utilizados para armazenar e manipular dados georeferenciados; Um banco de dados indexados espacialmente, sobre o qual opera um conjunto de procedimentos para responder a consultas sobre entidades espaciais; Um conjunto poderoso de ferramentas para coletar, armazenar, recuperar, transformar e visualizar dados sobre o mundo real; Um sistema de suporte à decisão que integra dados referenciados espacialmente num ambiente de respostas a problemas.

Dados Geográficos

Os dados georreferenciados são informações que possuem atributos relacionados à sua localização geográfica dentro de um sistema de coordenadas. A obtenção destes dados, na maioria das vezes, é feita através de fontes brutas, ou seja, as aplicações trabalham com entidades ou objetos físicos distribuídos geograficamente e com formas diversas, por exemplo montanhas, ruas, lotes, rios, etc, o que torna o processo de obtenção de dados uma tarefa árdua e muito importante para o desenvolvimento e qualidade de um sistema. Os sistemas de informação geográfica podem ser compostos por informações de diversas fontes, por exemplo, digitalização de mapas, aerofotogrametria, sensoriamento remoto, levantamento de campo.

Fontes e Qualidade dos Dados

A fonte de dados de uma aplicação de geoprocessamento possui uma complexidade superior quando comparada com a maioria das aplicações convencionais. A entrada dos dados não se limita apenas a simples operações de inserção, devido à manipulação de informações gráficas e à natureza das fontes de dados dessas aplicações.
O produto resultante dos processos de coleta de dados mencionados anteriormente (fotogrametria, sensoriamento remoto e levantamento de campo) são as verdadeiras fontes de dados utilizadas nos sistemas de informação geográfica.
Atualmente, os mapas são as principais fontes de dados e o levantamento de campo o principal processo de coleta de dados, porém em um futuro próximo, a aerofotogrametria e o sensoriamento remoto devem tornar-se a tecnologia predominante de coleta de dados georeferenciados.
O processo de coleta de informações é um tanto quanto custoso e manual, mas é necessário e demasiadamente importante. Através destas informações, são executadas as análises e tomadas decisões futuras. A qualidade dos dados está diretamente associada com o posicionamento correto de um objeto e a veracidade das análises utilizadas em cima deste mapeamento. Qualquer erro na padronização dos dados com relação à projeção utilizada, escala e/ou sistema de coordenadas, pode influenciar no resultado de uma tomada de decisão.
Acurácia é definida como a estimativa dos valores serem verdadeiros, ou a probabilidade de uma predição estar correta. Os erros são inevitáveis dentro de um grau, por isso o principal objetivo é identificá-los e gerenciá-los.
Por exemplo, ao mapear uma residência presente em um logradouro, podemos classificar este ponto de acordo com a certeza que temos desta informação. Algumas classificações: local correto; algum lugar do logradouro; algum lugar do bairro; ponto central da cidade.
A acurácia dos dados é muito importante para que os usuários confiem no sistema. Dados com erros significativos podem afetar os resultados de análises por diversos anos, antes de serem descobertos.

Armazenamento e tipo de representações de dados

Vive-se em um mundo muito complexo, onde os recursos computacionais disponíveis são insuficientes para representá-lo na otimalidade. Sendo assim, algumas das formas de simplificação da realidade são necessárias para a obtenção possível dos elementos presentes no dia-a-dia para a representação gráfica dos elementos. A esse processo de simplificação da realidade nomeia-se de abstração, que nada mais é do que a técnica básica para a modelagem conceitual de dados geográficos.
Atualmente, a arquitetura mais empregada na construção dos sistemas de informação geográfica é composta de um SGBD relacional, responsável pela gerência dos atributos não-gráficos, juntamente a um componente responsável pelo gerenciamento dos atributos espaciais.
Existem diversas formas de representações, entre elas: ponto, linha, polígono, nó de rede, arco unidirecional, arco bidirecional, isolinhas, tesselação, amostrar, subdivisão planar, rede triangular irregular, etc.
Dados do tipo ponto
Um ponto nada mais é que um par ordenado de coordenadas espaciais, normalmente representado como (x,y). Esta definição não contempla a existência de pontos tridimensionais, os quais utilizam-se de uma nova coordenada (z) para a representação de uma grandeza qualquer.
Sem dúvida, esta é a forma mais simples de representar um objeto geográfico, permitindo a indicação da sua localização.
Exemplo de um dado ponto no formato STRING em um banco de dados espacial:POINT(-51.323212333, -29.22323332233).
Dados do tipo linha
Uma linha é um conjunto sequencial de pontos interligados por segmentos. Esta representação é usada para representar objetos em que o comprimento é sempre muito superior à largura, como por exemplo estradas e rios. Para se aproximar da realidade, uma curva em uma estrada é necessária a utilização de diversos pontos, pois a quantidade de vértices (pontos) muitas vezes representa a qualidade da informação.
Diversos elementos são representados utilizando-se linhas. Quando se trata de aplicações urbanas, elementos físicos como cercas, grades, muros, meio-fios e outros elementos são representados através de linhas.
Dados do tipo polígono
Um polígono tem como definição ser uma região do plano limitada por uma linha poligonal fechada. São segmentos de retas onde cada reta intersecta exatamente com os outros dois extremos.
São utilizados geralmente na representação de edifícios, lotes, lagos, praças, parques, piscinas, casas, calçadas entre outros.

Modelos de representações de dados espaciais

Dentre as diversas formas existentes, duas abordagens são amplamente utilizadas para a representação dos dados espaciais: a estrutura matricial (raster) e a estrutura vetorial.
Em uma representação matricial, a área estudada é dividida em uma grade regular de células retangulares. Cada célula armazena o valor que corresponde ao tipo de entidade que é encontrada naquela posição.
Na estrutura vetorial, os fenômenos geográficos são representados por um objeto de identificação própria, do tipo ponto, linha, polígono ou um objeto complexo. Sua posição é definida de acordo com a sua localização no espaço, definido junto a um sistema de coordenadas. Os objetos vetoriais não necessitam preencher todo o espaço, diferentemente da representação matricial, onde, obrigatoriamente, todas as posições devem estar referenciadas na base de dados.
Estruturas Vetoriais
Estruturas vetoriais são bastante utilizadas por outros meios além dos sistemas de informação geográfica. Sistemas CAD e outras ferramentas de desenho e manipulação de imagem utilizam-se de representações vetoriais. Nos projetos de engenharia, é muito comum a sua utilização, porém, na maioria das vezes, o que difere é o não uso de um sistema de coordenadas ajustado à superfície da Terra, presente em um GIS.
Shapefiles
Shapefiles são arquivos no formato vetorial com o objetivo de salvar localizações geométricas e informações com relação aos atributos associados. Foi criado no final de 1997, pela ESRI para a utilização no produto ArcView.
Uma shapefile lida com entidades geográficas singulares e suporta pontos, linhas e polígonos. Tem grandes vantagens sobre outras codificações como rapidez, menor espaço em disco e é facilmente editável.
Este formato possui uma descrição completa junto ao site da ESRI. Diversos softwares utilizam-se deste formato para a manipulação de arquivos, tanto comerciais como open source (uDig, gvSIG, Quantum GIS, entre outros).

Simple Feature Specification para SQL

Como visto anteriormente, a arquitetura mais empregada na construção dos sistemas de informação geográfica é composta de um SGBD relacional juntamente a um componente responsável pelo gerenciamento dos atributos espaciais. Isso possibilitou a construção de ambientes centralizados para o armazenamento das informações.
Para impedir que cada SGBD criasse a sua maneira de armazenas estas informações, foram criadas normas com o objetivo de controlar e padronizar estas informações.
As normas OpenGIS (Open Geodata Interoperability Specification), desenvolvidas pelo OGC, definem especificações que permitem a comunicação, execução e/ou transferência dos dados entre diferentes bases de dados, sem que tenha que se preocupar com as características específicas de cada unidade, no processamento de dados geográfico.
Destaca-se ainda que a concretização do OpenGIS para SQL, nomeada de Simples Feature Specification for SQL (SFS), define um esquema SQL normalizado com suporte às três operações citadas no parágrafo anterior, através da API do ODBC (Open Database Connectivity).
Existem alguns SGBD que permitem o tratamento de dados geográficos. Todos utilizam-se de extensões junto aos SGBDs para o gerenciamento dos dados geográficos. São eles: Oracle Spatial: extensão espacial desenvolvida sobre o SGBD Oracle; DB2 Spatial Extender: extensão espacial que permite o armazenamento de informações geográficas em bases de dados DB2; PostGIS: extensão espacial, não proprietária, que atua junto ao SGBD PostgreSQL. Primeiro SGBD de código aberto a trabalhar com um módulo específico para o tratamento de dados geográficos; MySQL: foi adicionado um novo tipo de dado (geometry) para as colunas da base de dados com o intuito de guardar as informações geométricas, a partir da versão 4.1.

Fontes

ANTENUCCI, J.C.; BROWN, K.; CROSWELL, P.L.; et al. Geographic Information Systems: A guide to the technology. Van Nostrand Reinhold, 1991.
ARONOF, S. Geographic Information Systems: a management perspective. Canada: WDL Publications, 1989.
CAMARA, Gilberto. Análise de Arquiteturas para Bancos de Dados Geográficos Orientados-a-Objetos. Dissertação (Tese de Doutorado). São José dos Campos, SP: USP, 1994.
FILHO, L. Jugurta; Projeto de Banco de Dados para Sistemas de Informação Geográfica. Universidade Federal de Viçosa. 2001.
GRUPE, Fritz H. Geographic Information Systems: A Case Study. In: Data Base Management. Boston: AUERBACH, 1992.
LILLESAND, T.; Kiefer, R.W. Remote Sensing and Image Interpretation 2.ed. New York; John Wiley Sons, 1987.
RECKZIEGEL, M. WebSite : http://sites.google.com/site/mauricioreckziegel/

O estado da Segurança Web


O estado da Segurança Web

Com o avanço e a popularização da Internet, vivemos em constante desenvolvimento e conseqüentemente em um grande aprimoramento das tecnologias utilizadas neste meio. Como conseqüência, muitas destas tecnologias utilizadas há poucos anos atrás são substituídas rapidamente por novos padrões que surgem no mercado. Resultado disto também se demonstra na questão da segurança das informações e o foco que ela segue.
No artigo "The State of Web Security", Mike Andrews demonstra que a maioria dos ataques na década de 90 visava às redes e, nos dias de hoje, a maioria se concentra em aplicações que funcionam no alto delas.
A pressa em ganhar o mercado, lançar uma aplicação altamente inovadora faz com que grandes empresas pequem na segurança de suas aplicações, permitindo que hackers e criminosos vasculhem por vulnerabilidades e detectem em um curto espaço de tempo.
Devido a este fato, grandes empresas buscam iniciativas, através de projetos, muitos delesopen-source, com o intuito de conscientizar as mesmas a seguirem um padrão de desenvolvimento e testes das aplicações, buscando uma melhoria neste processo, porém, estamos longe ainda de uma padronização para a segurança no fluxo das informações na Web.
Quanto às ferramentas de testes, o artigo também salienta sobre a utilização das mesmas, citando que da mesma maneira que podemos usar para fins a favor do desenvolvimento de nossos softwares, qualquer pessoa, até mesmo de forma criminosa, poderia usar a mesma para vasculhar vulnerabilidades nas aplicações.
Concluindo, sem dúvida a Web tem se firmado como a plataforma dominante no desenvolvimento de aplicações nos últimos anos. Com o surgimento de novas tecnologias e constantes atualizações, tornando ainda o fluxo de dados e a confiabilidade das informações discutíveis em primeiro momento. Tecnologias como XML têm se demonstrado com grande futuro, porém, a contribuição da comunidade na implementação de padrões de segurança ainda são esperados. Através destas novas tecnologias, muitas outras surgem com o intuito de facilitar o desenvolvimento das aplicações, como o AJAX e os Web Services. Através da padronização do XML, estas facilitam o desenvolvimento e execução das aplicações tanto no cliente, como na comunicação de plataformas heterogêneas de forma transparente, nesta mesma ordem.
Porém, a segurança ainda necessita de aprimoramentos e acredito que o desenvolvimento na plataforma Web esteja apenas no começo, e em poucos anos novas tecnologias irão surgir, dando um foco a novos padrões de comunicação e segurança no fluxo das informações.
Figure 1.
Figura 01.
A) Vulnerabilidades em softwares divulgadas no mês de maio/2006.
B) Os tipos atuais de vulnerabilidades em aplicações Web.
(Fonte: SecurityFocus.com)
Fonte:
Mike Andrews, "The State of Web Security," IEEE Security & Privacy, vol. 4, no. 4, July/August 2006, pp. 14-15.
Mike Andrews is a senior consultant at Foundstone, specializing in software security with a main focus on Web-based systems. He has a PhD in computer science from the University of Kent at Canterbury, UK. He is the coauthor of How to Break Web Software (Addison-Wesley, 2006).

Criptografia em PHP e WebServices


Criptografia em PHP e WebServices

Olá pessoal. Tempo raro este, torna difícil postar novas matérias, mas vamos lá!
Como já vimos, os Web Services utilizam-se do protocolo SOAP para o transporte das mensagens, estas, em XML. Porém, o SOAP não se preocupa nem um pouco com a segurança das informações, muito menos se ela chegou no seu determinado destino. Como visto na matéria SOAP, é um protocolo simples, muito mais que outros protocolos distribuídos.
Segurança
Os principais desafios para a construção de uma arquitetura segura são:
01. Quanto à integridade e confidencialidade, garantindo que os dados transmitidos pelo protocolo SOAP não sejam alterados indevidamente e não possam ser acessados durante o seu transporte por entidades não autorizadas.
02. Quanto à autenticação e autorização, garantindo a identidade da fonte das informações e os acessos aos métodos realizados com a devida permissão dos responsáveis.
03. E, por fim, a análise do conteúdo, garantindo que o conteúdo das mensagens trocadas esteja adequado e que não causará danos ao receptor.
Devido ao uso do protocolo SOAP em sua comunicação, o qual utiliza-se de XML em suas mensagens, ou seja, um arquivo texto perfeitamente legível, onde devemos sem dúvida nenhuma nos precaver e investir na segurança da transmissão dos dados e na autenticação de quem usufrui dos mesmos.
Solução
A idéia desta matéria é construir uma camada simples de criptografia, utilizando-se do OpenSSL para a mesma. Vou criar uma classe e dar um exemplo, tanto para chaves simétricas tanto quanto para chaves assimétricas. Sabem a diferença? Bom, vamos ao começo então.
Criptografia
Segundo HENDRICKS, “A criptografia é a ciência que trata da preservação dos dados privados”. Nada mais é que um texto cifrado, criptografar é o ato de cifrar um determinado texto e decriptografar é fazer o inverso.
Hoje em dia, temos algoritmos capazes de controlar esses processos, através de chaves de criptografia. Existem duas classes desses algoritmos criptográficos baseados em chave:
. Simétricas (chave secreta): Utilizam-se da mesma chave para criptografia e decriptografia
São geralmente muito mais rápidos quando referidos a execução, se comparados aos algoritmos assimétricos, devido às chaves públicas assimétricas serem muito mais extensas.
. Assimétrica (chave pública): utiliza-se de chaves diferentes para a criptografia e para a decriptografia.
As chaves de criptografia assimétricas se tornam um grande aliado quando falamos em segurança dos Web Services. Esta forma de criptografia utiliza uma chave pública relacionada matematicamente à chave privada. Com isso, apenas o dono do par de chaves conhece a chave privada, enquanto a chave pública pode ser livremente distribuída.
Caso queiram saber mais sobre as chaves, favor comentar abaixo da matéria que posso futuramente montar um artigo apenas sobre como são geradas as chaves e toda a questão matemática envolvida e o porquê as chaves assimétricas são tão seguras.
Vamos à Prática
Pessoal, precisamos da extensions OPENSSL no PHP rodando mod_openssl e o OpenSSL instalado.
Para o WINDOWS, recomendo que leiam a matéria Instalando SSL no Apache2 em ambiente Windows do meu colega Leonardo Calado, aqui do iMasters mesmo, muito boa por sinal.
Ensina também a gerar certificados, porém não é necessário para o nosso caso neste primeiro momento, apenas a instalação do OPENSSL em sua máquina.
Criptografia no PHP
Chave Simétrica (clique na imagem para abrir o código em tamanho maior)
Código
Resultado
Chaves Assimétricas
As chaves assimétricas seguem mais ou menos o mesmo padrão, porém a criptografia é feita através da chave pública, que pode ser enviada pela rede e decriptografada com a chave privada.
Devido ao tamanho dos fontes, estarão apenas disponíveis para download abaixo da matéria, abaixo apenas o resultado.
Resultado
Criptografia em WebServices via PHP
Vamos utilizar os mesmos fontes de um outro artigo: Utilizando Web Services em PHP.
Criamos o cliente.php
Linha 11: Passamos a chave simétrica.
Linha 13: Criamos uma função para simplificar o processo de decriptografia.
Linha 31: Acionamos a decriptografia em cima do $result.
No server.php:
Linha 19: Incluimos a classe de criptografia simétrica.
Linha 20: Instanciamos ela.
Linha 23: Passamos a chave simétrica (poderiamos gerar uma nova, mas ela precisa ser identica a chave do cliente).
Linha 25: Seta a chave na classe.
Linha 26: Seta o texto a ser criptografado.
Linha 27: Criptogra o texto.
Linha 28: Pega o texto de forma hexadecimal (É necessário para que os dados circulem no protocolo SOAP).
Resultado
Mensagem de Resposta do SOAP

Resposta
HTTP/1.1 200 OK
Date: Wed, 27 Sep 2006 18:59:46 GMT
Server: Apache/2.0.59 (Win32) mod_ssl/2.0.52 OpenSSL/0.9.8 PHP/5.1.4
X-Powered-By: PHP/5.1.4
X-SOAP-Server: NuSOAP/0.7.2 (1.94)
Content-Length: 552
Connection: close
Content-Type: text/xml; charset=ISO-8859-1
<?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:helloResponse xmlns:ns1="http://tempuri.org"><return xsi:type="xsd:string">aKV17SE6pL6WnkW/FhFcKw4X1LtqHeMdW+e3nr4rLtc=
</return>
</ns1:helloResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>
Como podem ver, a mensagem voltou criptografada.
Podemos fazer o mesmo procedimento utilizando-se das chaves assimétricas, podendo enviar a chave pública junto a mensagem.
Ex.: O cliente passa os paramentos nome e a chave pública, o servidor recebe, gera a mensagem e criptografa com a chave pública recebi e retorna a mensagem para o cliente, que utiliza-se da chave privada para decriptografar a mensagem.
Porém o envio das chaves se torna um processo um tanto quanto "pesado".
Uma saída seria utilizar as chaves assimétricas para a transmissão de chaves simétricas. Ou seja, criptografa-se uma chave simétrica utilizando-se a chave pública assimétrica para uma troca segura de chaves, a partir daí utiliza-se as chaves simétricas entre 2 pontos para uma comunicação segura.
Bom, era isso pessoal, simples e objetivo.
Qualquer dúvida estamos ai.
Abraço.

Web Services e PHP: Google em qualquer site, com a sua cara


Web Services e PHP: Google em qualquer site, com a sua cara.

Olá pessoal. A idéia desta matéria é apresentar como adicionar uma busca do Google num determinado site, com a sua cara. Ou seja, você a montará da maneira como quiser, até mesmo sem o usuário que entrar no site souber que a busca é do Google.
Talvez você ainda não tenha entendido, então, vamos pelo começo. O Google, como sempre, está sempre por dentro de novas tecnologias. Com o surgimento dos Web Services não foi diferente.
Através do site www.google.com/api, temos acesso à API do Google, onde você se cadastra e tem acesso em como utilizar os serviços web disponibilizados pelo Google.
Bom, para quem quiser mais informações, pode acessar o link acima e dar uma estudadinha.
Acredito que, talvez ainda não tenha comentado isto, mas uma das principais idéias dos Web Services é de ser uma aplicação Programador-Programados. Isso quer dizer que, nesse caso, o Google cria a função que atua como servidor e simplesmente te diz como você pode acessá-la.
A resposta desta função será apenas um conjunto de variáveis de texto, onde você receberá esses parâmetros e organizará da maneira que lhe convier, com o seu próprio visual.
Entenderam a idéia da coisa? Um outro exemplo, você possui um e-commerce, e faz envios de mercadoria pelo correio. Bom, como vou calcular o frete?
O site dos correios também lhe fornecem um Web Services para este caso, então você simplesmente criaria um cliente que acessaria o serviço dos correios e retornaria apenas uma variável $valor. Isto permite que você adicione no seu site da maneira que quiser, sem ter que criar frames, etc. etc. etc., acho que nem preciso comentar o ganho disto.
Exemplo simplificado: (estes dados não existem na verdade)
$soapclient = new soapclient(“http://www.correios.com.br/webservice/server.php”,false);
$res = $client->call('checkSW',array('cepOrigem'=>$cepOri,'cepDestino'=>$cepDest));
echo $res;

Neste caso, o server.php iria retornar apenas o cálculo da tarifa entre os dois ceps, e com está variável de retorno, você adicionaria da maneira que quisesse em seu site, respeitando cores, estilos, etc...
Vamos ao Sr. Google:
<?php
// include a API nusoap
// Lembre-se! A extension soap.dll/soap.so deve estar COMENTADA (;soap.ext) no arquivo php.ini
include("nusoap.php");
// instancia a classe Soap Cliente para se conectar ao Server do Google
$soapclient = new soapclient("http://api.google.com/search/beta2");
class clsGoogleApi {
            var $theResultSet; // pega os resultados da busca como dados pelo google api 
            var $theResults=array();
            var $theRowShown=0; // Seta o índice à última fileira mostrada 
            var $theMaxResults; // Seta o parâmetro dado dos resultados máximos ao construtor 
            var $flgError = false; // indica se houver erro ou não 
            var $theSearchQuery; // pergunta para a busca
            var $theEstimatedResultsCount; // número dos resultados encontrou pelo Api
            function clsGoogleApi($search_what,$start,$maxResults) {
                        global $soapclient;
                        $params = array(
                                    'key' => 'tbZF6P1QFHJB23E5zqVwgyytmQPuVkLC',   // chave da licença de Google. Para pegar a sua própria chave, acesse www.google.com/api
                                    'q'   => $search_what,                         // termo da busca 
                                    'start' => $start,                             // apartir do resultado 
                                    'maxResults' => $maxResults,                   // mostrar um total de resultados
                                    'filter' => false,                             // remove resultados similares
                                    'restrict' => '',                              // restrição a determinado assunto
                                    'safeSearch' => false,                         // remover conteúdo adulto
                                    'lr' => '',                                    // retringir a um certo idioma
                                    'ie' => '',                                    // input encoding
                                    'oe' => ''                                     // output encoding
                        );
                        // invocando os métodos do servidor
                        $this->theResultSet=$soapclient->call("doGoogleSearch", $params, "urn:GoogleSearch", "urn:GoogleSearch");
                        $this->theMaxResults=$maxResults;
                        // imprimindo os resultados
                        if ($this->theResultSet['faultstring']) {
                                   echo $this->theResultSet['faultstring']."<br>";
                                   $this->flgError=true;
                        } else  {
                                   $this->flgError=false;
                                   $this->theRowShown=0;
                                   $this->theSearchQuery=$this->theResultSet['searchQuery'];
                                   $this->theEstimatedResultsCount=$this->theResultSet['estimatedTotalResultsCount'];
                                   if (is_array($this->theResultSet['resultElements'])) {
                                               $this->theResults=array();
                                               foreach ($this->theResultSet['resultElements'] as $r) {
                                                           $result["URL"]=$r['URL'];
                                                           $result["cached-size"]=$r['cachedSize'];
                                                           $result["snippet"]=$r['snippet'];
                                                           $result["directory category"]=$r['directoryCategory'];
                                                           $result["related information present"]=$r['relatedInformationPresent'];
                                                           $result["directory title"]=$r['DirectoryTitle'];
                                                           $result["summary"]=utf8_decode($r['summary']);
                                                           $result["title"]=utf8_decode($r['title']);
                                                           $this->theResults[]=$result;
                                               }
                                   }
                        }
            }
           
            function getResultNextItem() {
                        $result=$this->theResults[$this->theRowShown];
                        $this->theRowShown++;
                        if (($this->theRowShown > $this->theMaxResults) or ($this->theRowShown > $this->theEstimatedResultsCount))  {
                                   $result=false;
                        }
                        return $result;
            }
}
?>

Criando um form simples de busca :
<form action="clsgoogleapi.php" method="post" name="form1">
         Palavra/Frase: <input name="palavra" type="text" id="palavra" size="40">
  Resultados por P&aacute;gina:
  <select name="resultados" id="resultados">
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            <option value="5">5</option>
            <option value="6">6</option>
            <option value="7">7</option>
            <option value="8">8</option>
            <option value="9">9</option>
            <option value="10">10</option>
          </select>
          <input type="submit" name="Submit" value="Buscar">
</form>


Pegando os resultados (adicione estas linhas após a classe):
$palavra = $_POST['palavra'];
if(empty($palavra)) $palavra = $_GET['palavra'];
$resultados = $_POST['resultados'];
if(empty($resultados)) $resultados = $_GET['resultados'];
 
$myQuery=new clsGoogleApi($palavra,$inicio,$resultados);
    if ($myQuery->flgError) {
        echo "Error!";
    } else {
                        echo "Buscando por <b>". $myQuery->theSearchQuery."</b> encontrou <b>".$myQuery->theEstimatedResultsCount."</b> resultados<hr>";
                        $item=$inicio;
                        echo "<ul>";
        while ($result=$myQuery->getResultNextItem()) {
                                   $item++;
                                   echo "<li> $item - ".$result["title"]." (<a href=".$result["URL"].">".$result["URL"].")</a><br>".$result["snippet"]."(".$result["cached-size"].")";
        }
                        echo "</ul>";
                       
            }

Personalizando os resultados da busca, com paginação: (desculpem o código, mas esta bem precário, apenas para demonstração)
echo "<a href=busca.php>BUSCAR OUTRA COISA</a><br><br>";
$pagina = $_GET['pagina'];
$palavra = $_POST['palavra'];
if(empty($palavra)) $palavra = $_GET['palavra'];
$resultados = $_POST['resultados'];
if(empty($resultados)) $resultados = $_GET['resultados'];
if($pagina=="") {
            $pagina="1";
}
$inicio=$pagina-1;
$inicio=$resultados*$inicio;
$inicio = (int) $inicio;
$resultados = (int) $resultados;
           
  echo "Página = $pagina<br>Início = $inicio<br>Resultados por páginas = $resultados<br>";    
  $myQuery=new clsGoogleApi($palavra,$inicio,$resultados);
    if ($myQuery->flgError) {
        echo "Error!";
    } else {
                        echo "Buscando por <b>". $myQuery->theSearchQuery."</b> encontrou <b>".$myQuery->theEstimatedResultsCount."</b> resultados<hr>";
                        $item=$inicio;
                        echo "<ul>";
        while ($result=$myQuery->getResultNextItem()) {
                                   $item++;
                                   echo "<li> $item - ".$result["title"]." (<a href=".$result["URL"].">".$result["URL"].")</a><br>".$result["snippet"]."(".$result["cached-size"].")";
        }
                        echo "</ul>";
                       
            }
            $menos=$pagina-1;
            // Calculando página posterior 
            $mais=$pagina+1;
            // Cálculos para a mostragem de páginas 
            $p_ini=$mais-1;
            $p_ini=$resultados*$p_ini;
                       
            echo "<a href='?palavra=$palavra&pagina=$menos&resultados=$resultados'>anterior</a>";
            echo " - ";
            echo "<a href='?palavra=$palavra&pagina=$mais&resultados=$resultados'>proxima</a>";

Resultado:
Ai está o google no meu site com a minha cara, como podem ver ta bem feinho, hehe.
Bom pessoal, desculpem não ter comentado, mas como descrevi no inicio da matéria, o tempo está curto, porém, o código é bem acessivel e fácil de entender, e lembrem-se, qualquer dúvida, www.google.com/api.