2 votos

Dividir línea por punto (punto sobre línea) para varios puntos

Estoy usando el transformador de FME PointOnLineOverlayer para dividir una línea (formada por elementos de carretera) por un punto (señal de tráfico), para hacer algún procesamiento posterior en las líneas divididas. En caso de que haya más de un punto en la línea, mi línea dividida no es como se esperaba, es decir, para cada punto no crea 2 líneas, con cada línea que tiene un extremo en el punto y el segundo extremo al final de la línea.

La imagen adjunta debería ilustrar mi problema. Los puntos verdes y rojos representan 2 puntos (señales de tráfico) en una línea (carretera). Después de dividir por FME estoy recibiendo 3 líneas (doble flecha líneas negras) para mi línea, mientras que quiero obtener líneas como dibujado en rojo y verde para cada uno de mis puntos.

¿Existe algún ajuste en el transformador de FME para realizar la división desde el punto hasta el final de la línea de entrada? enter image description here

2voto

superjoe30 Puntos 6876

Esta es difícil. La cuestión aquí es que realmente quieres hacer una copia de las líneas de entrada para cada punto, de modo que consideres cada punto con su línea vecina separada de cualquier otro punto (incluso de aquellos que puedan estar cerca de la misma línea).

Lamentablemente, no existe ningún ajuste en PointOnLineOverlayer para hacer exactamente lo que quieres. Sin embargo, este transformador tiene un grupo por, por lo que si usted podría conseguir cada punto en su propio grupo con las líneas, usted estaría listo. Ingenuamente, esto significaría hacer una copia de todas las líneas para cada punto, pero eso sería ineficiente (y también difícil de hacer en general).

¿Qué hacer? Pues bien, el NeighbourFinder puede indicarte la línea más cercana a cada punto. Y luego puedes capturar tanto la geometría como los atributos que quieras de esa línea, para reconstituirla más tarde. En efecto, se hace una copia de la línea más cercana a cada punto. Siempre que tenga un ID único en los puntos, y asegurarse de que la copia que acaba de hacer tiene ese id, entonces usted puede utilizar el GroupBy en el PointOnLine Overlayer para obtener los dos segmentos que desee.

He hecho una prueba utilizando los datos abiertos de la ciudad de Vancouver con la red de calles y el conjunto de datos de árboles. Parece que funciona. Voy a adjuntar lo que puedo aquí - espero que eso te pone en marcha.

Buen problema.

Captura de pantalla a continuación, enlace al espacio de trabajo aquí

Screenshot of Workspace

1voto

MobileCushion Puntos 217

Vi esto y pensé en intentarlo también. Tomé un enfoque ligeramente diferente (por lo general hay varias maneras de hacer algo en FME).

Estoy de acuerdo con Dale en que necesitarás varias copias de la línea. El SpatialRelator nos dice cuántos puntos se encuentran en cada línea, por lo tanto, cuántas copias que necesitamos. Así que un SpatialRelator seguido de Cloner nos consigue el 80% del camino.

El último 20% es, como siempre, la parte más difícil. Queremos hacer coincidir cada copia de la línea con un único punto y obtener sus coordenadas. Así que extraigo las coordenadas del punto (CoordinateExtractor) y me aseguro de que se copian en el SpatialRelator en una lista.

Para cada copia, extraemos los valores x/y de una característica puntual de la lista (ListIndexer). Ahora sólo tenemos que dividir la línea en ese punto. Pensé que habría un transformador que dividiría una línea en un determinado valor x / y, pero al parecer no. Así que volvemos a crear el punto (VertexCreator) y luego - por último - hacer la superposición (PointOnLineOverlayer). La clave es asegurarse de que el grupo por se establece.

enter image description here

Esta es mi versión. En el muy improbable caso de que tengas un problema con la solución de Dale, inténtalo .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X