Geometry type in SQL
From GeoBox
Contents |
Spatial queries
Some links:
Geometries PostGIS ver. 1.5 Quick Guide - Cheatsheet
Exercícios
Quantos MacDonalds têm McDrive?
SELECT COUNT(*) FROM mcdonalds WHERE extra LIKE 'McDrive%'
Quantos McDonalds estão (pelo nome) em shoppings?
SELECT nome, morada FROM mcdonalds WHERE nome ilike '%shop%'
Selecionar os McDonalds com Braga no nome
SELECT * FROM mcdonalds WHERE nome ilike '%braga%';
Coordenadas dos restaurantes anteriores:
SELECT wkb_geometry FROM mcdonalds WHERE nome ilike '%braga%';
Como as coordenadas estão num formato binário, para se poderem ler é necessário usar uma função st_astext:
SELECT st_astext(wkb_geometry) FROM mcdonalds WHERE nome ilike '%braga%';
Descubra, por exemplo, com o Google Maps, as coordenadas aproximadas de sua casa. Que sejam: -8.751404 40.612153
Para converter as mesmas para o sistema de coordenadas oficial de Portugal, use uma query:
SELECT astext(ST_transform(st_geometryfromtext('POINT(-8.751404 40.612153)',4326),3763));
Em alternativa, pode fazer a mesma conversão na linha de comandos:
echo -8.751404 40.612153 | cs2cs +init=epsg:4326 +to +init=epsg:3763
Sabendo que a minha casa é em: 'POINT(-24034 209179)'.
Qual a distância ao McDonals 'Braga I'
SELECT nome, st_distance(wkb_geometry, ST_GeomFromText('POINT(-22518 208748)',3763)) FROM mcdonalds WHERE nome = 'Braga I'
Quais os mcdonalds mais próximos da minha casa?
SELECT nome, st_distance(wkb_geometry, ST_GeomFromText('POINT(-22518 208748)',3763)) AS distancia FROM mcdonalds ORDER BY distancia
A menos de 5km?
SELECT nome, st_distance(wkb_geometry, ST_GeomFromText('POINT(-22518 208748)',3763)) FROM mcdonalds WHERE st_distance(wkb_geometry, ST_GeomFromText('POINT(-22518 208748)',3763)) < 5000;
Buffer à volta dos Macs
CREATE TABLE cheeseburger AS SELECT ogc_fid, nome, st_buffer(wkb_geometry, 750) FROM mcdonalds
Exercícios com joins
Qual o código portal de minha casa?
SELECT cp4 FROM cttshapefile WHERE st_contains(cttshapefile.the_geom, ST_GeomFromText('POINT(-22518 208748)',3763))
ou, usando as coordenadas em WGS84
SELECT cp4 FROM cttshapefile WHERE st_contains(the_geom, ST_transform(st_geometryfromtext('POINT(-8.751297 40.612332)',4326),3763) )
Quantos McDonalds existem em lugares cujo código postal começa por 4.
SELECT nome, cp4 FROM mcdonalds, cttshapefile WHERE st_contains(cttshapefile.the_geom, mcdonalds.wkb_geometry) AND cp4 LIKE '4%'
Creating a new table
CREATE TABLE hamburguer AS SELECT ogc_fid, nome, st_buffer(wkb_geometry, 1000) AS wkb_geometry FROM mcdonalds
Encontrar diferenças entre os códigos postais dos restaurantes em relação à tabela dos CTT.
SELECT nome, SUBSTRING(codpostal,1,4), cp4 FROM mcdonalds, cttshapefile WHERE st_contains(the_geom, wkb_geometry) AND SUBSTRING(codpostal,1,4) != cp4
Metadados
SELECT * FROM spatial_ref_sys WHERE srid = '20790' OR srid = '3763'; SELECT COUNT(*) FROM spatial_ref_sys;
Visualizar a tabela mcdonalds no Google earth
ogr2ogr -s_srs EPSG:3763 -t_srs EPSG:4326 -f "KML" mcdonalds.kml PG:"host=localhost user=geobox dbname=geotuga password=geobox" "mcdonalds"
Importação de uma shapefile
Obter a shapefile a partir de http://sniamb.apambiente.pt/webatlas. Existe uma cópia disponível em: c_albufeiras.zip
Utilizar o Q-GIS, extensão PostGIS Manager. No PostGIS Manager, já deverá estar ligado à base de dados geotuga. Para importar uma shapefile, use o menu Data -> Load data from shapefile.
File:Load shapefile to PostGIS.png
Confirmar que a tabela geometry_columns foi devidamente actualizada.
Importação de uma shapefile (com erros!)
Entrar em http://sniamb.apambiente.pt/webatlas/ e escolher o tema IV. Ambiente Humano e depois Turismo (Recursos).
Nos metadados, procurar o Sistema de Referência.
| Código: | 20790 - Lisbon (Lisbon) / Portuguese National Grid |
| Autoridade: | EPSG |
Se tentar importar esta tabela, dá-lhe o seguinte erro:
DB Error An error occured when executing a query new row for relation "rec_tur" violates check constraint "enforce_geotype_the_geom"
Este erro surge porque ao ser criada a tabela para onde vai ser carregada a shapefile, são também criadas 4 contrições e uma desses constrições não permite que os dados sejam inseridos. Portanto, a resolução deste problema passa pela importação da shapefile de uma forma ligeiramente diferente.
Faz-se em duas partes:
Primeira Parte
- No diálogo "Load data to PostGIS", preencher tudo como anteriormente, mas nas "Action", em vez de usar a opção pré-definida "Create new table", escolher antes "Create table only, don't add data"
- No pgAdmin, pode verificar que a tabela foi criada, mas sem dados nenhuns.
- No pgAdmin, eliminar a contrição "enforce_geotype_the_geom"
Segunda Parte
- No diálogo "Load data to PostGIS", preencher tudo como anteriormente, mas nas "Action" escolha agora "Append data into table"
- No pgAdmin, pode verificar que a tabela já tem dados.
Queries sobre a tabela rec_tur
Contabilizar os recursos importados
SELECT COUNT(*) FROM rec_tur
Contabilizar apenas museus
SELECT COUNT(*) FROM rec_tur WHERE rec_turist = 'Museu'
Ver que tipo de recursos existem
SELECT DISTINCT rec_turist FROM rec_tur
Contabilizar o número de recursos por cada tipo
SELECT COUNT(*), rec_turist FROM rec_tur GROUP BY rec_turist ORDER BY COUNT(*) DESC
Calcular os recursos a menos de 5km da minha casa
SELECT rec_turist, st_distance(the_geom, ST_transform(st_geometryfromtext('POINT(-8.751404 40.612153)',4326),20790) ) FROM rec_tur WHERE st_distance(the_geom, ST_transform(st_geometryfromtext('POINT(-8.751404 40.612153)',4326),20790) ) < 5000
Inserir um novo registo na tabela rec_tur
INSERT INTO rec_tur (simbolo, rec_turist, the_geom) VALUES (0, 'Casa do Jorge', ST_transform(st_geometryfromtext('POINT(-8.751404 40.612153)',4326),20790))
Relacionar a tabela rec_tur com os códigos postais
SELECT rec_turist, cp4 FROM rec_tur, cttshapefile WHERE st_contains(cttshapefile.the_geom, st_transform(rec_tur.the_geom, 3763)) AND cp4 LIKE '38%'
Queries no Q-GIS sobre a tabela rec_tur
Abrir no Q-GIS
Fazer query: "rec_turist" = 'Museu'

