LineJoiner en FME

8

Tengo muchos objetos de línea. Algunos de ellos son más pequeños que algunos criterios.

Me gustaría unir todas las líneas o segmentos de línea más pequeños que son más pequeños que las 1 meterlíneas más grandes, manteniendo los atributos de la línea más grande.

¿Algún consejo?

Traté de usar el primer probador para verificar la longitud de los objetos de línea (si es más pequeño que 1 m), y luego la salida pasada va a LineJoiner. Pero en realidad no sucede nada, y las líneas que provienen del puerto de salida de LineJoiner no tienen atributos como líneas antes (como deberían tener). Tal vez me complique demasiado, pero pensé que sería una tarea fácil.

Z77
fuente
¿Podría aclarar: desea que las líneas más grandes tomen los atributos de las líneas más pequeñas a las que se unen?
GIS-Jonathan
Opuesto :) Necesito líneas más pequeñas unidas a más grandes (1 + 5 = 6).
Z77
Sé que quieres fusionar las líneas, pero ¿qué quieres que suceda con los atributos? ¿Desea mantener los atributos para la línea más grande como eran originalmente o desea usar los atributos de las líneas más pequeñas para la nueva línea grande?
GIS-Jonathan
Mantenga los atributos de la línea más grande.
Z77

Respuestas:

7

Puede usar LineJoinertransformador con parámetro List Name. Pero necesita hacer un procesamiento de datos adicional:

  1. Use LengthCalculatorpara calcular longitudes.
  2. Use Sorterpara ordenar sus líneas por longitud (ordenación numérica, descendente).
  3. Use LineJoinerpara unir líneas. Los más grandes primero (gracias al paso 2). Especifique el parámetro List Namede LineJoiner- algún nombre para el nuevo atributo de lista.
  4. Use ListIndexercon el índice de lista 0: para obtener los atributos de la primera característica unida (la más grande) de la lista.

Así es como se verá: ejemplo modelo

EDITAR1:

Para poder unir solo <1m características a las más grandes, necesitamos adicionalmente usar:

  1. Tester transformador después de LengthCalculator con prueba: _length < 1
  2. Use SpatialFilter(pruebas para realizar el parámetro TOUCHES:) después de Probador para filtrar solo las funciones que tocan funciones <1m. Luego realice la unión de línea en ellos junto con <1m de características. Funciones que no tocan <1 m, directo a la salida (o procesamiento adicional).

Modelo: modelo2

EDIT2:

Si tiene una línea <1m que toca dos grandes, entonces todas se unirán. Si tal caso (<1m la función toca dos o más grandes) es posible en sus datos, entonces debe agregar algún procesamiento de tales casos. Echa un vistazo a los parámetros Merge Attributesy Attribute Prefixdel transformador SpatialFilter. Al usar estos parámetros, debería poder detectar tales casos y luego hacer un filtrado adicional.

EDITAR3:

Resolvamos el caso cuando tenga dos líneas grandes tocando una pequeña (<1m). Necesitamos tomar solo una de las grandes líneas para participar en la unión con la pequeña.

Para poder realizar dicho filtrado, debemos marcar estas dos características grandes con alguna identificación de la pequeña que están tocando. Como se indica en EDIT2, se puede hacer en SpatialFiltertransformador utilizando parámetros Merge Attributesy Attribute Prefix.

Luego use el transformador DuplicateRemoverpara filtrar tales características duplicadas (dos grandes) y tome solo una de ellas.

Sugerencia: intente utilizar el Inspectortransformador durante la creación de su modelo y vea resultados intermedios en cualquier caso que no le resulte claro. De esta manera, comprenderá mejor cómo funciona cada uno de los transformadores. ¡Experimenta con tus datos! :)

Alex Markov
fuente
Okay. Gracias por la respuesta. Intentaré esto también.
Z77
1
Ok, esta es una tarea más complicada. He actualizado mi respuesta. La idea es usar SpatialFilter y probar la función TOUCH. De esta manera, podemos suministrar a LineJoiner solo <1m características y características que tocan.
Alex Markov
1
Me di cuenta de que es posible un caso aún más complicado y agregué información. Echar un vistazo.
Alex Markov
1
Más actualizado mi respuesta. Echar un vistazo.
Alex Markov
1
Al Sorterhacer cumplir las características con más longitud yendo primero LineJoinery luego sus atributos estarán con el índice "0" en la lista (ver parámetro List Name) y luego podemos moverlos a los atributos principales de la característica ( ListIndexer). De lo contrario, puede obtener un resultado donde los atributos de las características pequeñas "dominarán". No puede ver ninguna diferencia en caso de que las características grandes vayan primero, pero no voy a relatarlo.
Alex Markov