LineJoiner no FME

8

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 meterlinhas 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.

Z77
fonte
Você poderia esclarecer - deseja que as linhas maiores usem os atributos das linhas menores às quais se juntam?
GIS-Jonathan
Oposto :) Preciso de linhas menores unidas para maiores (1 + 5 = 6).
Z77
Eu sei que você deseja mesclar as linhas, mas o que você quer que aconteça com os atributos? Deseja manter os atributos da linha maior como eram originalmente ou deseja usar os atributos das linhas menores para a nova linha grande?
GIS-Jonathan
Mantenha os atributos da linha maior.
Z77

Respostas:

7

Você pode usar LineJoinertransformador com parâmetro List Name. Mas você precisa fazer algum processamento de dados adicional:

  1. Use LengthCalculatorpara calcular comprimentos.
  2. Use Sorterpara classificar suas linhas por comprimento (classificação numérica, decrescente).
  3. Use LineJoinerpara juntar linhas. Os maiores primeiro (graças ao passo 2). Especifique o parâmetro List Namedo LineJoiner- algum nome para o novo atributo da lista.
  4. Use ListIndexercom o índice da lista 0 - para obter os primeiros atributos do recurso associado (o maior) 'da lista.

Aqui está como ficará: exemplo de modelo

EDIT1:

Para poder unir apenas <1m de recursos aos maiores, precisamos usar adicionalmente:

  1. Tester transformador após LengthCalculator com teste: _length < 1
  2. Use SpatialFilter(testes para executar o parâmetro TOUCHES:) 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: model2

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 Attributese o Attribute Prefixtransformador SpatialFilter. 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 SpatialFiltertransformador usando os parâmetros Merge Attributese Attribute Prefix.

Em seguida, use o transformador DuplicateRemoverpara filtrar esses recursos duplicados (dois grandes) e pegar apenas um deles.

Dica: tente usar o Inspectortransformador 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! :)

Alex Markov
fonte
Está bem. Obrigado pela resposta. Vou tentar isso também.
Z77
1
Ok, esta é uma tarefa mais complicada. Eu atualizei minha resposta. A idéia é usar o SpatialFilter e testar o recurso TOUCH. Dessa forma, podemos fornecer ao LineJoiner apenas <1m recursos e recursos que eles tocam.
Alex Markov
1
Percebeu que caso ainda mais complicado é possível e acrescentou algumas informações. Dê uma olhada.
Alex Markov
1
Atualizei ainda mais minha resposta. Dê uma olhada.
Alex Markov
1
Ao Sorteraplicarmos os recursos com maior comprimento, primeiro LineJoineros atributos estarão com o índice "0" na lista (consulte o parâmetro List 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.
Alex Markov