União PostGIS entre duas tabelas, preservando atributos

8

Estou tentando unir as fronteiras dos níveis superior e inferior do nível do Estado dos EUA de maneira a gerar uma tabela PostGIS com os nomes dos níveis superior e inferior para cada forma.

No meu exemplo abaixo, Ué um conjunto de dados e tem uma coluna com linhas UAe UB. Lé um outro conjunto de dados e tem LA, LBe LC. Quando Luno as formas, devo obter as mesmas formas, mas o novo conjunto de dados unido possui as duas colunas de dados.

insira a descrição da imagem aqui

Edit : Minha imagem de exemplo acima é muito ruim. As respostas até agora foram relacionadas à consulta dos dados, assumindo que a geometria está disponível. Isso é importante, mas está pulando a parte mais confusa da minha pergunta. Um exemplo melhor:

imagem

A forma amarela é de U, a forma laranja é de L. Observe que eles se sobrepõem, mas algumas partes dos polígonos não estão completamente contidas em outra forma (como no meu exemplo, onde LBe LCestão completamente dentro UB).

A pergunta que eu estava tentando fazer é cortar corretamente as duas camadas para que o conjunto de dados resultante não tenha sobreposições. Veja, por exemplo, esta postagem na lista de discussão que se aproxima, mas não funciona.

magneticMonster
fonte
1
Comentário lateral: chamar isso de "união", que é o termo ESRI para a operação, será confuso para o pessoal do PostGIS, pois a função ST_Union faz o oposto disso (que a ESRI chama de "dissolver") e funde os recursos. Um termo neutro do fornecedor pode ser "sobreposição".
Paul Ramsey
Eu acho que a minha pergunta é muito semelhante a este que já foi feita e muito bem atendida.
magneticMonster

Respostas:

5

Sem saber o nome da sua coluna, este é o meu melhor palpite. (Eu não tive a chance de testar, por isso pode não estar exatamente correto.) Espero que você possa identificar os nomes das colunas que usei. Supondo que L é um subconjunto de U:

SELECT l.id AS l_id, u.ab AS uab, l.abc AS labc, ST_Intersection(u.geom, l.geom) AS geom
  FROM u, l
  WHERE ST_Intersects(ST_PointOnSurface(l.geom), u.geom);
Scro
fonte
2
Isso está correto, consulte também gis.stackexchange.com/a/31562/457 para obter um ajuste de desempenho nessa abordagem.
Paul Ramsey
Isso é perfeito depois que eu tiver as formas geradas, mas primeiro preciso criar as formas unidas. Meu desenho de exemplo não é o melhor em demonstrar isso, mas preciso cortar as geometrias para que não haja sobreposições primeiro.
magneticMonster
Eu acho que você não leu o SQL de perto o suficiente, está gerando novas formas que consistem apenas nas áreas compartilhadas. A saída desta consulta não possui recursos sobrepostos.
Paul Ramsey
Você está absolutamente certo, Paul - acho que quis comentar a resposta de Nicklas abaixo.
magneticMonster
1

A resposta depende de quão limpos e consistentes são os seus dados. Se você pode assumir que o centróide da tabela L pode ser encontrado dentro do polígono correspondente na tabela U, você pode escrever algo como:

SELECT * FROM U INNER JOIN L ON ST_Intersects(L.Centroid(geom),U.geom);

Então você deve conseguir o que deseja. Se você usar toda a geometria em vez do centróide de L, obterá muitas correspondências estranhas.

HTH

Nicklas

Nicklas Avén
fonte
Observe que a função Centroid não garante um ponto dentro do polígono. ST_PointOnSurface faz.
Scro
@ Scro você está absolutamente certo. Senhorita de mim.
Nicklas Avén 8/03/2013