Eu tenho muitos objetos de linha. Alguns deles são menores que alguns critérios.
Gostaria de juntar todas as linhas ou segmentos menores de linha menores que as 1 meter
linhas maiores, mantendo os atributos da linha maior.
Algum conselho?
Tentei usar o primeiro testador para verificar o comprimento dos objetos de linha (se for menor que 1 m), e a saída passada passa para o LineJoiner. Mas, na verdade, nada acontece, e as linhas provenientes da porta de saída do LineJoiner não possuem atributos como linhas antes (como deveriam). Talvez eu complique demais, mas achei que seria uma tarefa fácil.
Respostas:
Você pode usar
LineJoiner
transformador com parâmetroList Name
. Mas você precisa fazer algum processamento de dados adicional:LengthCalculator
para calcular comprimentos.Sorter
para classificar suas linhas por comprimento (classificação numérica, decrescente).LineJoiner
para juntar linhas. Os maiores primeiro (graças ao passo 2). Especifique o parâmetroList Name
doLineJoiner
- algum nome para o novo atributo da lista.ListIndexer
com o índice da lista 0 - para obter os primeiros atributos do recurso associado (o maior) 'da lista.Aqui está como ficará:
EDIT1:
Para poder unir apenas <1m de recursos aos maiores, precisamos usar adicionalmente:
Tester
transformador após LengthCalculator com teste:_length < 1
SpatialFilter
(testes para executar o parâmetroTOUCHES
:) após o Testador para filtrar apenas os recursos que tocam em recursos <1m. Em seguida, execute a junção de linha neles juntamente com os recursos <1m. Recursos que não tocam em <1m, direto para a saída (ou processamento adicional).Modelo:
EDIT2:
Se você tem <1m de linha que toca dois grandes, todos eles serão unidos. Se esse caso (o recurso <1m tocar dois ou mais grandes) for possível em seus dados, você deverá adicionar algum processamento desses casos. Veja os parâmetros
Merge Attributes
e oAttribute Prefix
transformadorSpatialFilter
. Usando esses parâmetros, você poderá detectar esses casos e, em seguida, fazer alguma filtragem adicional.EDIT3:
Vamos resolver o caso quando você tiver duas linhas grandes tocando uma pequena (<1m). Precisamos usar apenas uma das grandes linhas para participar da junção com a pequena.
Para poder realizar essa filtragem, precisamos marcar esses dois grandes recursos com algum ID do pequeno que eles estão tocando. Conforme indicado no EDIT2, isso pode ser feito no
SpatialFilter
transformador usando os parâmetrosMerge Attributes
eAttribute Prefix
.Em seguida, use o transformador
DuplicateRemover
para filtrar esses recursos duplicados (dois grandes) e pegar apenas um deles.Dica: tente usar o
Inspector
transformador durante a criação do seu modelo e visualize resultados intermediários em qualquer caso que não esteja claro para você. Dessa forma, você entenderá melhor como cada um dos transformadores está funcionando. Experimente seus dados! :)fonte
Sorter
aplicarmos os recursos com maior comprimento, primeiroLineJoiner
os atributos estarão com o índice "0" na lista (consulte o parâmetroList Name
) e, em seguida, podemos movê-los para os principais atributos do recurso (ListIndexer
). Caso contrário, você poderá obter resultados em que os atributos dos pequenos recursos "dominarão". Você não pode ver nenhuma diferença no caso de grandes recursos serem os primeiros, mas não vou me referir a ele.