quarta-feira, 13 de janeiro de 2010

Alguns comandos (sql) Postgis

meu_DB=# SELECT gid, AsText(the_geom) AS the_geom, name FROM bc_roads;

gid | the_geom | name
-----+---------------------------------------------------------------------------------------+-------------
1 | MULTILINESTRING((1205902.3 460882.2,1205906.3 460789.7)) | No 1 Rd
2 | MULTILINESTRING((1205906.3 460789.7,1205907.3 460776.4)) | No 1 Rd
3 | MULTILINESTRING((1205907.3 460776.4,1205913.6 460638.8)) | No 1 Rd
4 | MULTILINESTRING((1205913.6 460638.8,1205919.6 460513.4)) | No 1 Rd
5 | MULTILINESTRING((1205919.6 460513.4,1205920.8 460482)) | No 1 Rd
6 | MULTILINESTRING((1211706.8 462048.2,1211710.3 461877)) | Seaham Cres
7 | MULTILINESTRING((1212105 462099.5,1212160.1 462102.5)) | Seahaven Pl
(7 registros)


Porém, haverá momentos em que restrições serão necessárias para reduzir o número de campos retornados. No caso de restrições baseadas em atributos, apenas use a mesma sintaxe normal de SQL com uma tabela não espacial. No caso de restrições espaciais, os operadores seguintes são disponíveis/úteis:

&& Este operador diz se o retângulo envolvente (bounding box) de uma geometria intersecta o retângulo envolvente de outra.

~= Estes operadores testam se duas geometrias são geometricamente idênticas. Por exemplo, se "POLYGON((0 0,1 1,1 0,0 0))" é igual à "POLYGON((0 0,1 1,1 0,0 0))" (nesse caso é!).

= Este operador é um pouco mais "ingênuo", e só testa se o retângulo envolvente (bounding box) das geometrias é o mesmo.

Logo, você pode usar estes operadores em consultas. Note que ao especificar geometrias e retângulos na linha de comando SQL, você tem que transformar as representações de caracteres (string) explicitamente em geometrias usando a função "GeometryFromText () ". Por exemplo:

SELECT name FROM bc_roads
WHERE the_geom ~= GeomFromText('MULTILINESTRING((1212105 462099.5,1212160.1 462102.5))',-1);

A consulta anterior devolveria o único registro da tabela "bc_roads" no qual a geometria era igual aquele valor.

Ao usar o operador "&& ", você pode especificar tanto um retângulo (BOX3D) como característica de comparação como uma geometria. Quando você especifica uma geometria é o seu retângulo envolvente (bounding box) que será usado para a comparação.

SELECT name FROM bc_roads
WHERE the_geom && GeomFromText('POLYGON((1212105 462099.5,1212160.1 462102.5, 1212105 462099.5))',-1);

Então, a consulta anterior usará o retângulo envolvente do polígono para propósitos de comparação.

A consulta espacial mais comum provavelmente será uma consulta "frame-based", usada por um software cliente, como um visualizador de dados ou servidor de mapas na web, é obter o "map-frame" (representação gráfica - figura) para exibição. Usando um objeto "BOX3D" para o "frame", essa consulta iria ser como demonstrado abaixo:

SELECT AsText(the_geom) AS the_geom
FROM bc_roads
WHERE the_geom && SetSRID('BOX3D(1212105 462099.5,1212160.1 462102.5)'::box3d,-1);

Note que o uso do SRID, especifica a projeção do BOX3D. O valor -1 é usado para indicar que nenhum SRID é especificado.