Capítulo 3. Perguntas Mais Frequentes

Índice

3.1. Que tipo de objetos geométricos eu posso armazenar?
3.2. Como acrescentar um objeto de GIS no banco de dados?
3.3. Como eu construo uma seleção espacial?
3.4. Como fazer seleção espacial rápida em tabelas grandes?
3.5. Porque são descartados os índices PostgreSQL R-Tree?
3.6. Porque usar a função AddGeometryColumn () e todas as funções restante de OpenGIS?
3.7. Qual é o melhor caminho para achar todos os objetos dentro de outro objeto de rádio?
3.8. Como executar uma reprojeção coordenada como parte de uma seleção?
3.1.

Que tipo de objetos geométricos eu posso armazenar?

Você pode armazenar point, linestring, polygon, multipoint, multiline, multipolygon, e coleções geométricas. Estes são especificados Open GIS Well Known Text (com extensões XYZ,XYM,XYZM).

3.2.

Como acrescentar um objeto de GIS no banco de dados?

Primeiro você precisa criar uma tabela com uma coluna de tipo "geometry" para carregar os dados de GIS. Conecte seu banco de dados com psql e execute o comando SQL seguinte:

CREATE TABLE gtest ( ID int4, NAME varchar(20) );
SELECT AddGeometryColumn('', 'gtest','geom',-1,'LINESTRING',2);

Se a adição de coluna de geometria falhar, você provavelmente não carregou as funções e objetos de PostGIS dentro do banco de dados. Veja as instruções de instalação.

Então, você pode inserir uma geometria na tabela, usando inserção de declaração do SQL .
O próprio objeto GIS é formatado usando o formato OpenGIS Consortium "well-known text"

INSERT INTO gtest (ID, NAME, GEOM) VALUES (1, 'First Geometry', GeomFromText('LINESTRING(2 3,4 5,6 5,7 8)', -1));

Para mais informação sobre outros objetos GIS, veja referência de objeto..

Para ver os dados de GIS na tabela:

SELECT id, name, AsText(geom) AS geom FROM gtest;

O valor de retorno deverá ser :

 id | name | geom
----+----------------+-----------------------------
1 | First Geometry | LINESTRING(2 3,4 5,6 5,7 8)
(1 row)
3.3.

Como fazer uma seleção espacial?

É o mesmo caminho que constrói outras seleções de banco de dados, como uma combinação SQL de retornos de valores, funções e teste verdadeiro ou falso.

Para fazer uma seleção espacial, existem dois caminhos que são importantes de se manter em mente ao construir sua pergunta: pode fazer um índice espacial; e você faz cálculos enormes em um grande número geometries.

No geral, se quiser usar operadores de interseção (&&) que testa se salto de caixa é de interseção característica.O uso do operador && é útil porque se um índice espacial está disponível à velocidade acima do teste, o operador && fará uso disto. Isto pode fazer as seleções muito mais rápida.

Note que o salto de caixas usou a seleção que deve ser declarada explicitamente como um box3d que usa o ":: box3d" que lança a operação.

Poderá também fazer uso de funções espaciais, como Distance(), Intersects(), Contains() e Within(), entre outros, e obterá resultados abaixo de suas buscas.

A maior seleção espatial incluem ambos um teste posicionado e um teste de função spatial. O teste do índice serve para limitar o número de retornos, somente eles que podem se encontrar com a condição do interesse. As funções espaciais são então para uso de teste de condição exata.

SELECT id, the_geom FROM thetable
WHERE
the_geom && 'POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'
AND
Contains(the_geom,'POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))';
3.4.

Como fazer seleção espacial rápida em tabelas grandes?

Seleções rápidas em tabelas grandes é uma finalidade da existência propriamente de bancos de dados espaciais (junto com suporte transacional), tendo assim, a importância de um bom índice.

Para construir um índice espacial em uma tabela com uma coluna geometrica, use a função
"CREATE INDEX" como segue:

CREATE INDEX [indexname] ON [tablename]
USING GIST ( [geometrycolumn] );

A opção "USING GIST" informa ao servidor para usar um índice GiST (Generalized Searche Tree).

Nota

Índices GiST são assumidos para quem não sabe o que fazer com o dado. Índices para esses dados soltos, chamado tambem de índices lossy, usa um objeto "proxy" (no caso espacial, uma caixa delimitada) para construir o índice.

Deverá também assegurar-se de que se a seleção de PostgreSQL tiver muita informação sobre seu índice para fazer decisões racionais, quando usá-lo. Para fazer isto, você tem que pegar estatísticas em suas tabelas geométricas.

Para versões de PostgreSQL 8.0.x e superiores, rode o comando VACUUM ANALYZE.

Para versões de PostgreSQL 7.4.x e inferiores, rode o comando SELECT UPDATE_GEOMETRY_STATS().

3.5.

Porque são descartados os índices PostgreSQL R-Tree?

Versões anteriores de PostGIS usaram os índices PostgreSQL R-Tree. Porém, PostgreSQL R-Trees tem sido descartado completamente desde a versão 0.6, e índices espaciais são proporcionados com esquema R-Tree-over-GiST.

Nossos testes mostraram velocidade de procura para R-Tree nativa e GiST serem comparáveis. PostgreSQL R-Trees nativo tem duas limitações que os fazem indesejáveis para o uso com características GIS (nota-se que estas limitações são devido a atual implementação de PostgreSQL R-Tree nativa, não o conceito de R-Tree em geral):

  • índices R-Tree em PostgreSQL não podem controlar características que são de tamanhos maiores que 8K. Índices GiST podem, usando-se o "lossy" de substituição a caixa delimitada para característica própria.

  • índices R-Tree em PostgreSQL não são nenhuma "null safe" (sem segurança), assim construindo um índice em uma coluna de geometria que contenha geometrias nulas falharão.
3.6.

Porque usar a função AddGeometryColumn () e todas as funções restante de OpenGIS?

Se você não quer usar funções de suporte OpenGIS, não use. Simplesmente crie tabelas com versões mais velhas dentro, definindo suas colunas de geometria na declaração do CREATE . Todas suas geometrias terão SRIDs de valor -1, e os meta-dados de tabelas OpenGIS não serão preenchidas corretamente. Porém, isto vai causar falhas na maioria das aplicações baseadas em PostGIS, e geralmente é sugerido que você use AddGeometryColumn () para criar tabelas de geometrias.

Mapserver é uma aplicação que faz uso dos meta-dados de geometry_columns. Especificamente, Mapserver pode usar o SRID da coluna de geometria para fazer características de reprojeções rápidas dentro da correta projeção de mapa.

3.7.

Qual é o melhor caminho para achar todos os objetos dentro de outro objeto de rádio?

Para se usar o banco de dados eficientemente, é melhor fazer uma seleção de rádio com qual combina o teste de rádio com um teste de caixa de salto: o teste de caixa delimitada usa o índice espacial, enquanto um subconjunto de dados de acesso rápido, com o qual o teste de rádio é aplicado.

A função Expand() é uma maneira acessível de ampliar um salto de caixa para permitir uma busca do índice de uma região do interesse. A combinação de uma cláusula do índice do acesso rápido e de um teste exato mais lento da distância, fornece a melhor combinação da velocidade e da precisão para esta seleção.

Por exemplo, procurar todos os objetos com 100 metros de POINT(1000 1000) a seleção a seguir trabalharia bem:

SELECT *
FROM GEOTABLE
WHERE
GEOCOLUMN && Expand(GeomFromText('POINT(1000 1000)',-1),100)
AND
Distance(GeomFromText('POINT(1000 1000)',-1),GEOCOLUMN) < 100;
3.8.

Como executar uma reprojeção coordenada como parte de uma seleção?

Para executar uma reprojeção, a fonte e sistemas de coordenada de destino devem ser definidos dentro da tabela SPATIAL_REF_SYS, e as geometrias que são reprojetadas já devem ser usadas em atribuição do SRID. Uma vez isso terminado, uma reprojeção
é tão simples quanto recorrer ao destino desejado SRID.

SELECT Transform(GEOM,4269) FROM GEOTABLE;