Ferramentas do usuário

Ferramentas do site


queries_uteis_em_spatialite

Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Ambos lados da revisão anteriorRevisão anterior
Próxima revisão
Revisão anterior
queries_uteis_em_spatialite [2018/05/07 17:41] 200.135.93.145queries_uteis_em_spatialite [2019/08/30 18:13] (atual) – [Juntar várias camadas escolhendo quais campos] 150.162.179.77
Linha 1: Linha 1:
 +====Juntar várias camadas escolhendo quais campos====
 +
 +Bom para consolidar em uma camada só várias informações provenientes de diversas camadas ou tabelas.
 +
 +<code sql>
 +-- Apaga a tabela - só é necessário depois da primeira vez
 +DROP TABLE "censo_2010_dados_consolidados";
 +
 +-- Cria uma nova tabela
 +CREATE TABLE "censo_2010_dados_consolidados" AS 
 +SELECT 
 +a.*,b."c-end 1000" as "CrimesPor1000Enderecos",
 +c."c-pop-1000" as "CrimesPor1000Habitantes",
 +e."porcresid" as "PorcentagemResidencial",
 +e."porccomerc" as "PorcentagemComercial",
 +e."porcnresid" as "PorcentagemNaoResidencial",
 +e."ginisimpso" as "GiniSimpson",
 +e."ginitd" as "GiniSimpsonTD",
 +f."shannon" as "Shannon",
 +f."shannonNormalized" as "ShannonNormalizada",
 +f."usos_diferentes1" as "RiquezaDeUsosGerais"
 +
 +-- Define quais tabelas serão usadas e cria apelidos para elas (a, b, c, ...)
 +FROM
 +"setores_acf_2010_medidas_basicas" as a,
 +"ACF_Base CNEFE_Crimes por endereço" as b,
 +"Crimes por setor censitário_ACF" as c,
 +"ACF_setores_censitarios_2010+tamanho_quadras" as d,
 +"ACF_Base CNEFE_Diversidade" as e,
 +"census_tracts_cnefe_ACF" as f
 + 
 +-- estabelece a condicao para o join
 +WHERE a.codsetor = b.codsetor and a.codsetor = c.codsetor and a.codsetor = d.codsetor and a.codsetor = e.codsetor and a.codsetor = f.idSetor;
 +
 +-- A nova camada criada não reconhecerá a geometria. Esse comando resolve o problema
 +SELECT RecoverGeometryColumn("censo_2010_dados_consolidados", "geom", 31982, 'MULTIPOLYGON','XY');
 +</code>
 ====Juntar duas camadas que se interseccionam==== ====Juntar duas camadas que se interseccionam====
 Essa query permite passar os atributos (colunas) de uma camada para outra com base na intersecção entre os elementos, isto é, os atributos de um elemento serão passadas para os elementos da outra camada (tabela) que eles interceptam. Essa query permite passar os atributos (colunas) de uma camada para outra com base na intersecção entre os elementos, isto é, os atributos de um elemento serão passadas para os elementos da outra camada (tabela) que eles interceptam.
Linha 5: Linha 42:
  
 <code sql> <code sql>
-SELECT -- determina os campos que se quer manter na nova camada+-- determina os campos que se quer manter na nova camada 
 +SELECT 
 [nome do campo 1], [nome do campo 1],
 [nome do campo 2] , [nome do campo 2] ,
Linha 11: Linha 49:
 [nome do campo com a geometria que se deseja manter na nova camada ou tabela] -- inclui a geometria de uma das camadas [nome do campo com a geometria que se deseja manter na nova camada ou tabela] -- inclui a geometria de uma das camadas
  
 +-- primeira tabela usada como referência para o JOIN
 FROM FROM
 [nome da camada / tabela 1] [nome da camada / tabela 1]
  
 +-- JOIN com a camada 2 - define também o tipo de JOIN
 LEFT JOIN  [nome da camada / tabela 2] LEFT JOIN  [nome da camada / tabela 2]
  
 +-- Estabelece a condição para unir ou não as linhas. Neste caso, o requisito é espacial
 ON ST_Intersects([nome da camada / tabela 1].[campo da geometria], [nome da camada / tabela 2].[campo da geometria]); ON ST_Intersects([nome da camada / tabela 1].[campo da geometria], [nome da camada / tabela 2].[campo da geometria]);
 </code> </code>
Linha 30: Linha 71:
 O LEFT JOIN faz a união e mantém **todas** as linhas da primeira tabela. No caso, as que não atendem ao critério terão valores nulos nas colunas que vêm da outra tabela.  O LEFT JOIN faz a união e mantém **todas** as linhas da primeira tabela. No caso, as que não atendem ao critério terão valores nulos nas colunas que vêm da outra tabela. 
  
-O ST_Intersects indica qual é o critério para saber se duas linhas serão unidas em uma só ou não. Ele precisa de dois argumentos: o campo da geometria da camada 1 e o campo da geometria da camada 2.+O ST_Intersects indica qual é o critério para saber se duas linhas serão unidas em uma só ou não. Ele precisa de dois argumentos: o campo da geometria da camada 1 e o campo da geometria da camada 2. Veja algumas outras opções de análises espaciais [[Spatialite - Critérios para Spatial Join|aqui]]. (falta acrescentar)
  
 Sobre o campo da geometria, ver a explicação contida aqui para saber qual nome subtituir na query acima: [[Spatialite - Campos da geometria]] Sobre o campo da geometria, ver a explicação contida aqui para saber qual nome subtituir na query acima: [[Spatialite - Campos da geometria]]
  
 Depois que a query estiver pronta com os nomes dos campos corretos, é só clicar em "Executar". Depois disso, clicar em "Criar uma vista", selecionar a coluna de geometria, e depois clicar em "Garregar agora!". Depois que a query estiver pronta com os nomes dos campos corretos, é só clicar em "Executar". Depois disso, clicar em "Criar uma vista", selecionar a coluna de geometria, e depois clicar em "Garregar agora!".
 +
 +====Juntar três camadas que se interseccionam====
 +
 +Em caso de dúvida, leia primeiro a seção anterior, que explica como juntar duas camadas. O método a seguir faz apenas uma extensão.
 +
 +<code sql>
 +-- determina os campos que se quer manter na nova camada
 +SELECT 
 +tabela1.[nome do campo 1],
 +avg(tabela1.[nome do campo 2]) as [nome do campo na nova tabela], -- tira a média
 +sum (tabela2.[nome do campo 3]) as [nome do campo na nova tabela], -- faz a soma
 +tabela2.[nome do campo 3] , 
 +tabela1.[nome do campo com a geometria que se deseja manter na nova camada ou tabela] -- inclui a geometria de uma das camadas
 +
 +-- primeira tabela usada como referência para o JOIN
 +FROM
 +[tabela 1]
 +
 +-- JOIN com a camada 2 - define também o tipo de JOIN (INNER JOIN mantém apenas os elementos comuns às duas tabelas
 +INNER JOIN  [nome da camada / tabela 2]
 +
 +-- Estabelece a condição para unir ou não as linhas. Neste caso, o requisito é espacial
 +ON ST_Intersects([tabela 1].[campo da geometria], [tabela 2].[campo da geometria]);
 +
 +INNER JOIN  [nome da camada / tabela ]
 +ON ST_Intersects([tabela 2].[campo da geometria], [tabela 3].[campo da geometria]);
 +
 +-- Agrupa os resultados pelo id da tabela desejada
 +GROUP BY tabela1.id
 +
 +</code>
 +
 +As únicas diferenças são:
 +  * Há mais um INNER JOIN depois do primeiro JOIN. O resultado do primeiro JOIN é imediatamente unido com a outra tabela.
 +  * O GROUP BY, ao final, diz ao computador para agrupar os resultados para cada um dos elementos da tabela 1. Isso é necessário porque esses elementos podem cruzar com mais de um elemento da tabela2, por exemplo, e estamos pedindo  para tirar a média nesse caso. Assim, ele precisa saber quais valores considerar na média. Se não colocarmos nada, ele soma todos os elementos da tabela 1 e divide pela quantidade. Determinando que é pelo id, ele soma para cada elemento da tabela 1 e divide pela quantidade.
 +
 +====Agregar informações de pontos por polígonos====
 +
 +Uma primeira operação detecta dentro de qual polígono o ponto está e preenche uma coluna na camada de pontos com o código do setor:
 +
 +<code sql>
 +-- Atribui o código do setor a cada registro (linha) de lote. Limite aos Lotes particulares apenas.
 +create table [nome_da_nova_tabela] as 
 +
 +-- Pega todos os campos da tabela (camada) de pontos
 +Select [tabela dos pontos].*, codsetor
 +
 +from [tabela dos pontos] 
 +
 +-- Spatial join baseado na posição: centroides dentros dos polígonos dos setores
 +join [tabela dos setores]
 +
 +on st_within([tabela dos pontos].[campo da geometria], [tabela dos setores].[campo da geometria])
 +
 +-- Caso deseje restringir as linhas que serão mantidas na nova tabela
 +where [coluna]="Alguma coisa"
 +</code>
 +
 +Em seguida, usamos a camada de pontos para agregar por setores, usando o código inserido no passo anterior:
 +
 +<code sql>
 +
 +-- Com as informações dos setores nas linhas, faz a agregação por setores
 +create table [nova_tabela] as 
 +
 +Select
 +codsetor, -- id do polígono
 +-- Soma
 +sum([coluna a ser somada]) as [nome_da_nova_coluna],
 +
 +-- Soma com uma condição em outra coluna
 +sum(case when [outra_coluna]='algum valor' then [coluna a ser somada] else 0 end ) as [nome_da_nova_coluna]
 +
 +from [tabela criada no passo anterior]
 +
 +group by codsetor
 +
 +</code>
 +
 +====Agregar SQL====
 +
 +Quando precisar calcular a média ponderada: https://stackoverflow.com/questions/42586178/sql-server-weighted-average-group-by
queries_uteis_em_spatialite.1525714915.txt.gz · Última modificação: (edição externa)

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki