Como obter o equivalente ao Dissolve do ArcGIS for Desktop usando ST_Union?

11

Estou tentando obter um equivalente à ferramenta Dissolve do ArcGIS for Desktop usando ST_Union do PostGIS, mas parece que não estou obtendo o resultado esperado.

Eu tenho uma tabela que tem certos atributos com a geometria de polígono. (como FID, Locstat, Loccnt, Shape)

Aqui está a minha consulta:

SELECT c.fid, ST_Union(c.boundaryshape) FROM c Group by c.fid,c.boundaryshape;
Dhams
fonte
1
Você pode explicar quais resultados você espera e o que está obtendo? Em execução: SELECT AsText (ST_Union ...) FROM ... pode ajudar a encontrar o erro.
Micha
Na tabela eu tenho 6842 registros, de acordo com os resultados do ArcGIS, devo obter 1683 registros, onde, usando a consulta, estou obtendo 6842 registros. Eu também tentei ST_Aggr_Union, que me fornece 742 registros com a geometria nula múltipla.
Dhams

Respostas:

14

É provável que seu problema seja devido ao que você incluiu no grupo por campo.

ST_UNION é uma função agregada, o que significa que está se dissolvendo com base no que você especifica como GROUPparâmetro.

Aqui está o que você digitou:

SELECT c.fid, ST_Union(c.boundaryshape) FROM c Group by c.fid,c.boundaryshape;

De acordo com isso, você está agrupando por seu fid, que provavelmente é um identificador exclusivo, e também por boundaryshape, que é a geometria. O problema é que é altamente improvável que os recursos que compartilham um ID exclusivo tenham geometrias idênticas. Portanto, ST_Unionprovavelmente terminará com algo como o seguinte:

Input:   
fid     boundaryshape  
1         11  
1         12  
1         11  
1         13  
2         12  
2         13  
2         12  
3          5  
3          2  
3          4  

Output:  
fid     boundaryshape  
1        (11 + 11)  
1        12  
1        13  
2        (12 + 12)  
2        13  
3        2  
3        4  
3        5

Nesse caso, você deve se dissolver apenas com base no seu identificador exclusivo, a menos que você tenha um número de geometrias duplicadas com o mesmo fid, do qual está tentando se livrar. Mesmo nessa situação, você só precisa agrupar com base em fid, e a união cuidará da duplicação da geometria.

Eu tentaria o seguinte:

SELECT c.fid, ST_Union(c.boundaryshape) FROM c GROUP BY c.fid;

Isso deve fornecer o resultado desejado da dissolução de todos os recursos com base no atributo comum fid.

Aqui está o documento de ajuda no site PostGIS: ST_Union

Veja o primeiro exemplo listado na parte inferior e observe que ele não inclui a geometria no grupo por seção.

Get Spatial
fonte
1
Em alguns casos, é melhor ajustar geometrias à grade antes de fazer a união: SELECT ST_Union (ST_SnapToGrid (geom, 0.0001)) FROM grupo geo_area por level_identifier;
Maxim Eliseev 24/10