Arquivo da tag: geo

Funções Geoespaciais do MS SQL Server 2008

O MS SQL Server 2008 (MSSQL) possui um tipo próprio para guardar geometrias: geometry (tem um geography também, mais útil para representar feições mais extensas).

E ainda implementa os métodos definidos pela OGC.

Isto possibilita operações CRUD sobre o dados georreferenciados, diretamente através de comandos SQL.

Os métodos estáticos, acessíveis através de geometry::NomeDoMétodo(),  são:

E os métodos do objeto geometry:

Estes métodos podem ser chamados da seguinte forma, por exemplo:


SELECT coluna1.STArea() FROM tabela

onde coluna1 é do tipo geometry.

Inserindo registros geoespaciais: ArcSDE e SQL Server

Inserir registros diretamente através de comandos SQL é bem simples. Note que estou usando como tipo de dado geoespacial o GEOMETRY, nativo do SQL Server 2008.

Primeiro  é necessário criar uma tabela no SQL Server e registrá-la junto ao ArcSDE. Isto é bem simples de se realizar utilizando o ArcCatalog (note que também dá para se criar a tabela via SQL e registrá-la no ArcSDE via linha de comando).  Basta entrar no ArcCatalog, conectar-se com sua instância do ArcSDE e clicar com o botão direito no ícone do banco de dados. Depois é só escolher o Feature Class:

Feature Class

Criando um Feature Class

É apresentada então uma caixa de diálogo para criar sua tabela que conterá sua feição. Criei uma tabela chamada MeuFeatureClass. As colunas OBJECTID e SHAPE são criadas por padrão. Adicionei um campo1 e um campo2 também. E escolhi o tipo da geometria como POINT.

Criada a tabela é bem simples de se inserir um registro através de comando SQL:

INSERT INTO
MeuBD.sde.MeuFeatureClass
(OBJECTID, campo1, campo2, shape)
VALUES
(1, valor1, valor2, geometry::STGeomFromText('POINT (-46.616667 -23.533333)', 4674))

O comando acima insere um registro na tabela contendo um ponto localizado no município de São Paulo – SP, usando o SRID 4674 (SIRGAS 2000).

Note que não usamos uma função típica do T-SQL  para transformar o texto dado em uma coordenada válida pro sistema.  Isto me deixou confuso no início, pois eu não encontrava funções geoespaciais no banco de dados. Liste as funções existentes no banco de dados do ArcSDE que oê não encontrará nada relacionado ao sistema geo.

Estas funções ficam disponíveis como métodos da classe e objetos  geometry.  No caso acima, o STGeomFromText é um método estático da classe geometry. Os mundos da Orientação a Objetos e do SQL se mesclam cada vez mais…

SIRGAS 2000

Antes Sistema de Referencia Geocéntrico para America del Sur e agora Sistema de Referencia Geocéntrico para las Américas, o SIRGAS é o sistema de referenciamento espacial padrão do Brasil, definido pelo IBGE.

Seu SRID, num sistema geográfico, é  EPSG:  4674:

GEOGCS["SIRGAS 2000",
    DATUM["Sistema_de_Referencia_Geocentrico_para_America_del_Sur_2000",
        SPHEROID["GRS 1980",6378137,298.257222101,
            AUTHORITY["EPSG","7019"]],
        TOWGS84[0,0,0,0,0,0,0],
        AUTHORITY["EPSG","6674"]],
    PRIMEM["Greenwich",0,
        AUTHORITY["EPSG","8901"]],
    UNIT["degree",0.01745329251994328,
        AUTHORITY["EPSG","9122"]],
    AUTHORITY["EPSG","4674"]]

Na prática o SIRGAS utiliza o mesmo elipsóde de referência do WGS84 – GRS 1980. Veja mais no site da UFRGS. O mesmo ocorre com o posicionamento do elipsóide, com seus centros situando-se bem próximos um do outro.

Isto significa que as medidas dados pelo SIRGAS são quase iguais aos dados pelo WGS84,  onde uma diferença entre as medidas pode ser menor que o erro aproximado de seu instrumento GPS, pois esta diferença está na ordem de centímetros.

Assim, se seu equipamento for antigo é bem provável que ocorram duas coisas:

  • ele não tenha uma precisão tão boa a ponto de se distinguir entre WGS84 e SIRGAS 2000;
  • ele não possua o SIRGAS 2000 em seu rol de referências.

Então use o WGS84 e seja feliz.

Sistema de Referenciamento Espacial

Spatial Reference System,  ou Sistema de Referenciamento Espacial, define como descrever uma posição, uma localização no espaço.

Para determinarmos essa posição precisamos de duas coisas: um ponto de referência e um sistema de coordenadas.

Datum

Para descrever esta localização temos de levar em conta algumas coisas. Primeiro, a Terra não é plana. Verdade. E nem uma bola.  Mas podemos aproximar sua superfície à algumas formas geométricas.  A primeira que vem à mente é a esfera. É boa para se montar globos escolares e pintar os continentes em  bolas de  praia. Mas, como aprendemos na escolinha, a Terra é achatada nos pólos. Mas a aproximação com a esfera serve para qualquer coisa que conte com uma escala pequena.

Globo terrestre

Segue então uma segunda aproximação: um elipsóide ou esferóide. Ou uma esfera achatada.  Esta forma geométrica é bastante utilizada para descrever a superfície do planeta,  parte por facilitar bastante os cálculos envolvidos e parte por se adequar razoavelmente à superfície verdadeira da Terra. Para obter um grau maior de aproximação modificamos os tamanhos dos eixos do elipsóide e também deslocamos seu centro, ajeitando-o com relação à Terra.

Ou seja, se a Terra fosse um esferóide perfeito, todos os pontos de sua superfície iriam tocar nos pontos do esferóide de referência.  Como isso não ocorre, a gente ajeita o esferóide, definindo em que pontos o esferóide toca a superfície do planeta.  Note que definição de pontos tem data de validade, ou pelo menos data de referência, visto que a posição relativa entre os continentes muda com o tempo. Digamos que nosso esferóide toca a superfície do planeta em um ponto específico de Pindamonhangaba e em outro em Paris. Infelizmente estes pontos não corresponderão exatamente ao mesmo local no dia seguinte. Por isso temos nomes como WGS84, SAD69. Os números se referem ao ano .

Esferóide

Uma outra forma é a geóide. A geóide se trata de uma figura geométrica cuja superfície possui sempre a mesma força gravitacional, correspondendo mais ou menos ao nível médio do mar. Uma esfera não rolaria para lado nenhum em cima da superfície de uma geóide. Os cálculos sobre esta figura são mais complicados, mas é uma aproximação bastante útil para analisar a construção de canais, rodovias extensas e redes de água e esgoto.

Geóide

A escolha da figura geométrica, a definição de suas dimensões e o posicionamento desta figura com relação à Terra nos dá o datum (nota: só estou considerando sistema geocêntricos, deixando os topocêntricos de lado).

Espermatozóide

Sistema Geográfico de Coordenadas

Temos um datum. Mas isto não basta. Precisamos de um sistema de coordenadas para localizar o que quer que seja. Para isto temos um Sistema Geográfico de Coordenadas (geographic coordinate system ou GCS), também conhecido como sistema esférico de coordenadas,  que inclui uma unidade de medida angular, um meridiano principal e um datum.

Latitude (φ) e Longitude (λ)

Com o datum, o equador e o meridiano principal, geralmente o de Greenwich, conseguimos um ponto de referência,  onde φ = 0° e λ = 0°,  e o centro do esferóide, a partir do qual todas as medidas são baseadas. Só para constar, a cidade de São Paulo se encontra em 23°33′0″ S, 46°38′0″ W, ou seja, latitude  -23°33′0″ e longitude -46°38′0″.

Sistema de Coordenadas Projetadas

O GCS ajuda a localizar algum ponto. Mas para visualizar o mapa no papel, ou na tela do computador, precisamos levar tudo que está em um objeto 3D em pontos correspondentes em um plano 2D. Isto se chama projeção. A mesma projeção que se ensina nas aulas de matemática da escolinha, mas aplicada em nossos mapas.

Pensando na superfície da Terra, podemos pensar em algumas características:

  • Área
  • Forma
  • Direção
  • Posicionamento relativo
  • Distância
  • Escala

Quando projetamos esta superfície em um plano, podemos preservar algumas delas. Mas não todas. Por isto existem vários tipos de projeção. Cada uma prioriza alguma das propriedades descritas. A mais famosa é a Projeção de Mercator, que privilegia direção e posicionamento relativo.

Projeção de Mercator

A projeção de Mercator é do tipo cilíndrica. Pense em uma bola de tênis enfiada em uma lata de batatas Pringles.  O problema dela é que deforma bastante a área conforme nos afastamos da linha do Equador. É só reparar no tamanho da Ántártica, que não é nem o dobro da do Brasil.

O cilindro em que é projetado o mapa tem seu eixo na mesma direção do eixo de rotação da Terra,  ou seja, o cilindro toca a Terra ao longo da linha do Equador.

Projeção cilíndrica

Isto nos leva à outra projeção importante: o Sistema Universal Transverso de Mercator (UTM). Ele é bastante semelhante à projeção de Mercator tradicional.

As diferenças são que o eixo do cilindro faz 90° com o eixo de rotação da Terra e o próprio cilindro é rotacionado  para obtermos projeções  mais precisas em cada fatia em que o cilindro toca a Terra.

Universal Transverse of Mercator

Estas fatias são então quadriculadas em uma grade. Cada quadrado desta grade forma então um sistema de coordenadas cartesianas, onde a unidade de medida é o metro.

Sistema de Referenciamento Espacial (Spatial Reference System)

E por fim temos o sistema de referencimento espacial, que nada mais é que a descrição de um conjunto que tem tudo que esta aí em cima. Um exemplo:

GEOGCS["SAD69",
    DATUM["South_American_Datum_1969",
        SPHEROID["GRS 1967 (SAD69)",6378160,298.25,
            AUTHORITY["EPSG","7050"]],
        AUTHORITY["EPSG","6618"]],
    PRIMEM["Greenwich",0,
        AUTHORITY["EPSG","8901"]],
    UNIT["degree",0.01745329251994328,
        AUTHORITY["EPSG","9122"]],
    AUTHORITY["EPSG","4618"]]

O que é descrito acima, num formato conhecido como Well Known Text (WKT),  é o sistema SAD 69. Note é descrito o sistema geográfico de coordenadas (GEOGCS) com o datum utilizado,  o meridiano principal – Greenwich e a unidade de medida – degree,  assim como outras informações.  É comum utilizar apenas um número para nos referir a esta referência espacial. Este número, o SRID,  pode ser visto na última linha: EPSG 4618. Muito mais exemplos em SpatialReference.org.

Outro exemplo:

PROJCS["SIRGAS 2000 / UTM zone 23S",
    GEOGCS["SIRGAS 2000",
        DATUM["Sistema_de_Referencia_Geocentrico_para_America_del_Sur_2000",
            SPHEROID["GRS 1980",6378137,298.257222101,
                AUTHORITY["EPSG","7019"]],
            TOWGS84[0,0,0,0,0,0,0],
            AUTHORITY["EPSG","6674"]],
        PRIMEM["Greenwich",0,
            AUTHORITY["EPSG","8901"]],
        UNIT["degree",0.01745329251994328,
            AUTHORITY["EPSG","9122"]],
        AUTHORITY["EPSG","4674"]],
    UNIT["metre",1,
        AUTHORITY["EPSG","9001"]],
    PROJECTION["Transverse_Mercator"],
    PARAMETER["latitude_of_origin",0],
    PARAMETER["central_meridian",-45],
    PARAMETER["scale_factor",0.9996],
    PARAMETER["false_easting",500000],
    PARAMETER["false_northing",10000000],
    AUTHORITY["EPSG","31983"],
    AXIS["Easting",EAST],
    AXIS["Northing",NORTH]]

Neste caso é descrito um sistema de coordenadas projetadas (PROJCS), o que requer, além das informações previstas para o GEOGCS, qual o tipo de projeção – Transverse Mercator – e localização do ponto de referência  que determina o origem do sistema de medidas, no caso  em metros.  O srid é 31983.

Ao invés de passar toda estas informações para alguém, basta informar o SRID.  Finalmente sabemos de onde vem o tal SRID que popula nossos banco de dados geográficos, e que devemos passar como parâmetro para as APIs Geo deste  mundão esferóide afora.

ArcSDE e MS SQL Server 2008

O ArcSDE é um produto da ESRI que consiste-se em uma camada sobre bancos de dados relacionais, tornando-os capazes, se já não forem, de manipular informações geograficamente referenciadas, ou dados geo.

O MS SQL Server 2008 é o banco de dados relacionais da Microsoft.

A versão mais recente do ArcSDE, a 9.3, tornou possível utilizar o tipo de geometria nativa: o ‘GEOMETRY’ . Mas como configurar o sistema de forma a utilizá-lo?

Existe uma entrada no banco de dados que deve ser alterada. Ela se encontra na tabela sde.db_tune. Dê uma xeretada para verifcar seu conteúdo:

SELECT *
FROM sde.dbtune
WHERE
    keyword like 'DEFAULTS'    AND
    parameter_name like 'GEOMETRY_STORAGE'

A entrada que deve ser alterada é esta:

UPDATE sde.dbtune
SET config_string = 'GEOMETRY'
WHERE
    keyword like 'DEFAULTS'    AND
    parameter_name like 'GEOMETRY_STORAGE'

A listagem de tipos disponíneis em seus respectivos sistema pode ser obtido no help do ArcSDE.

SIG – Sistema de Informação Geográfica

imageUm SIG trata-se de um Sistema de Informação Geográfica, ou também Sistema de Informação Geoespacial.

Dois sistemas livres amplamente utilizados são o MapServer e o GeoServer. Conheço um pouco (bem pouco, na verdade) o MapServer e desconheço o outro. Minha intenção é documentar, nesta página, todo o processo para a instalação e configuração de ambos.

O MapServer é um WMS que roda como cgi, mas possui alguns módulos que dão suporte a algumas linguagens, como o PHP, e rodar diretamente do servidor Apache.

O GeoServer é uma aplicação java, que por esta razão necessita de um servidor de aplicações java para web. Além disso ele tem a possibilidade de, assim como o MapServer, obter dados a partir do PostGis

O PostgreSQL, ou postgres, é um banco relacional amplamente conhecido e utilizado. O PostGIS é um conjunto de extensões ao postgres que lhe confere a capacidade de realizar cálculos e armazenamento de informações georeferenciadas.

Ambientando-se

Alguns acrônimos e definições

  • OGCOpen Geospatial Consortium – padroniza os tipos de dados utilizados pelos diversos SIGs;
  • WMS – Web Map Service – através de pedidos embutidos em requisições em URLs, um WMS deve prover: metadados sobre o próprio serviço, um mapa geográfico e, opcionalmente, informações sobre itens particulares no mapa;
  • WFS – Web Feature Service – descreve operações sobre dados geográficos e suas características (features, dados que podem ser gerados para se criar mapas geográficos);
  • WCS – Web Coverage Service – agregando os serviços acima, permite a busca e transformações sobre os dados obtidos em uma rede de aplicações geográficas distribuídas;
  • CS-W – Catalog Service Web – padroniza a interface utilizada para consultar os serviços supracitados;
  • SFS – Simple Features – SQL – define como digitalizar informações geográficos, geralmente em um banco de dados relacional (point, linestring, polygon etc.);
  • GML – Geography Markup Language – um XML para transporte de dados geográficos.
  • SRS – Spatial Reference System, no contexto da OGC, são codificados na sintaxe definida pela EPSG (European Petroleum Survey Group). O SRS padrão definido pela OGC é 4326 (WGS84, World Geodetic System, grau decimal).

Vamos agora criar um ambiente de avaliação e desenvolvimento de sistemas SIG dentro do Ubuntu. Primeiro devemos proceder com a instalação dos pacotes postgresql, postgis, postgresql-8.2-postgis, libpostgis-java, sun-java5-bin.

Entre os outros pacotes instalados automaticamente está o proj4, que reúne bibliotecas e programas de conversão de dados.

Bom, após a instalação do Java pode ser necessário configurar a máquina virtual java padrão do sistema. Isto é feito, no Ubuntu, através do comando update-java-alternatives.

GeoServer

O Jetty é um servidor de aplicações java web escrito 100% em java. É conhecido por seu desempenho, em contraste com o ApacheTomcat. Uma opção para rodar o GeoServer é baixar o pacote binário e rodá-lo a partir do servidor Jetty embarcado no próprio GeoServer:

cd /opt
sudo unzip -xvzf geoserver-*-bin.zip
sudo export JAVA_HOME=‘/usr/lib/jvm/java-1.5.0-sun’
sudo export GEOSERVER_HOME=‘/opt/geoserver’
sudo $GEOSERVER_HOME/bin/startup.sh

Aponte seu navegador para http://localhost:8080/geoserver e poderá ver seu servidor GeoServer rodando. Para se entrar na área restrita o nome de usuário é admin e a senha é geoserver.

Outra opção é pegar o pacote war e implantá-lo no ApacheTomcat. Com o Tomcat rodando, entre em sua interface de gerenciamento, provavelmente http://localhost:8180/manager para fazer o deploy. Talvez seja preciso editar as políticas de sistema para que tudo funcione, como pode ser visto no Southern Tip blog.

Caso você tenha shapefiles para testar, recomendo este tutorial.

PostGIS

PostGIS logoNo Ubuntu, após instalar o pacotes referentes ao PostgreSQL e ao PostGIS é preciso executar o seguinte procedimento para criar um template no postgres habilitado a executar funções SIG:

Entre como o usuário postgres:

sudo su - postgres

Crie um banco de dados. Coloque o sufixo template_ para facilitar tua vida:

createdb template_gis

Habilite a linguagem plpgsql para criação de stored procedures:

createlang plpgsql -d template_gis

Alimente o banco com as funções e tabelas de referência do sistema SIG (serão criadas várias funções e inserções no banco, aguarde):

psql template_gis -f /usr/share/postgresql-8.2-postgis/lwpostgis.sql
psql template_gis -f /usr/share/postgresql-8.2-postgis/spatial_ref_sys.sql

Entre no banco criado (isto abrirá um terminal de comandos do postgresql):

psql template_gis

Finalmente transforme o banco criado em um template:

UPDATE pg_database SET datistemplate=‘true’ WHERE datname=‘template_gis’;

Saia do terminal do postgres:

\q

A partir daí pode-se criar novo bancos SIG a partir do nosso template criado. Recomendo a utilização do pgAdmin III (pacote pgadmin3).

Atenção: caso ainda não tenha feito, é preciso criar uma senha para o usuário postgres no próprio banco de dados. Abra um terminal de comando do postgres:

sudo -u postgres psql template1

Altere a senha do usuário postgres:

ALTER USER postgres WITH PASSWORD ‘secret’;
\q

E se for necessário logar no postgres remotamente, isto é, via tcp/ip a partir de outra máquina (útil para separar o banco de dados da aplicação SIG), é preciso editar o arquivo /etc/postgresql/8.2/main/postgresql.conf:

#listen_addresses = 'localhost'
listen_addresses = '*' #isto faz com que o postgres aceite conexões de outros endereços de rede

E o arquivo /etc/postgresql/8.2/main/pg_hba.conf:

#IPv4 local connections:
#qualquer computador com endereço 192.168.0.* se conecta se tiver um usuário configurado no postgres
host  all  all  192.168.0.0/24 md5

GeoServer: Configuração e testes

GeoServer

Para carregar shapefiles siga os passos contidos neste ótimo tutorial. Só houve um problema que ocorreu comigo foi do sistema não encontrar automaticamente o número EPSG (Wikipedia:EPSG). Tive de obter a listagem gerada pelo próprio GeoServer e buscar o número correspondente aos dados.

Shapefiles no PostGIS

Para carregar os shapefiles no postgis é preciso utilizar o programa shp2pgsql, instalado com os pacotes referentes ao postgis:

shp2pgsql -s SRID arquivo.shp nom_tabela > arquivo.sql

Onde SRID é um número que você deve encontrar da seguinte maneira:

  • Abra o arquivo .prj em um editor de texto. Você encontrará algo como:
PROJCS["SAD_1969_UTM_Zone_23S",GEOGCS["GCS_South_American_1969",DATUM["D_South_American_1969",SPHEROID["GRS_1967_Truncated",6378160.0,298.25]]
e
UNIT["Degree",0.0174532925199433]
  • Abra a ferramenta de consulta do PgAdmin III e entre com a seguitne consulta (pode demorar alguns segundos):
select srid, srtext, proj4text from spatial_ref_sys where srtext ILIKE '%SAD_1969%'
  • Anote o srid (no caso 29193) da entrada mais próxima do esperado.

Referência: started with PostGIS http://www.bostongis.com/?content_name=postgis_tut01

Isto criará um arquivo de comandos SQL arquivo.sql. Tive outros problemas ao tentar executar os comandos contidos no arquivo SQL: ele não estava em utf8, e sim em latin1; e o usuário geo_user que criei não tinha as permissões necessárias para criar tabelas no banco.

Bom, como meu banco está em utf8 tive de converter o arquivo SQL com o seguinte comando:

iconv  -f latin1 -t utf8  -o arquivo.sql2  arquivo.sql

Quanto às permissões, é preciso conceder ao usuário em questão acesso à tabela geometry_columns, pois ela controla as colunas com as geometrias (pontos, linhas, polígonos) das demais tabelas no banco em que se deseja guardar informações geográficas. Também é preciso conceder permissões sobre a tabela spatial_ref_sys, que possui os dados geográficos necessários para o funcionamento do SIG.

Após tudo acertado basta executar o seguinte comando para criar uma tabelas contendo os dados geográficos extraídos do shapefile:

psql -d geo_bd_name -U geo_user -f arquivo.sql2

Para configurar o GeoServer siga os passos do seguinte tutorial.

Plugins para acesso a outras fontes de dados podem ser encontrados na página na sourceforge.

ArcSDE como fonte de dados

O ArcSDE é um sistema proprietário desenvolvido pela ESRI que efetua a conexão entre o sistema ArcGIS e diversos SGBDs. O GeoServer pode ser configurado para utilizar o ArcSDE como fonte de dados de suas requisiçõs.

Tutorial de como utilizar o plugin para conexão com o ArcSDE (note que o plugin não funciona no GeoServer 1.6 RC2 ou RC3.

Lembre-se de baixar o pacote com o patch da ESRI ArcSDE e colocar os todos os arquivos jar necessários (é só ver o tutorial) no diretório $GEOSERVER_HOME/webapps/geoserver/WEB_INF/lib/.

OpenLayers

Instalado o GeoServer é preciso pensar: como criar um aplicação PHP com ela? Ok, não é preciso pensar nisso, mas é o que estou me perguntando agora.

A interface com o usuário apresentada pelo GeoServer é baseada na biblioteca de OpenLayers, que se trata de uma biblioteca javascript aberta e livre para criação de sistemas semelhantes ao Google Maps ou ao MS Live Earth.

A configuração e personalização do openlayers exige bastante programação javascript, por isso recomendo a utilização do plugin do Eclipse jseclipse.

Referências