5 votos

Convertir polilínea con ID izquierda e ID derecha en polígonos con ID

Tengo un archivo de forma polilínea que contiene información de ID izquierda y ID derecha y luchando en la conversión de esta capa polilínea a polígono con ID a través arcpy.

Estoy utilizando la licencia de ArcGIS(editor) por lo que herramienta de conversión de característica en polígono no está disponible para mí. También sé que hay varios métodos disponibles como este y éste en ArcGIS si tienes licencia de editor pero quiero usar arcpy para automatizar mi flujo de trabajo.

¿Alguna idea de cómo puedo hacerlo usando arcpy? enter image description here

0 votos

Tu diagrama tiene polilíneas con puntas de flecha en ambos extremos. Para saber en qué lado de la polilínea cae el polígono numerado, ¿no tendrían que ser unidireccionales?

0 votos

He usado puntas de flecha en ambos extremos, creo que fue mala idea. La dirección de las polilíneas es mixta pero si consultamos esta tabla "L_ID = 2 o R_ID = 2" seleccionará todas las polilíneas necesarias para construir el polígono con ID = 2.

1 votos

Sin poder ir desde el final de una polilínea hasta el inicio de la siguiente para determinar el polígono a encerrar creo que necesitarías alguna otra forma de determinar el orden de las polilíneas alrededor de un polígono.

2voto

kjo Puntos 197

No veo una manera strightforward de hacer esto en ArcPy licencia normal sin reinventar las ruedas..

Acaba de leer sobre Shapely (descargar enlace) un paquete python, que incluye el módulo "polygonize" función de suites JTS/GEOS familiares..

Mi idea es que podemos importar el paquete Shapely en ArcPy y obtener el WKT de las geometrías de polilíneas ESRI y pasarlas al poligonizador. Esto dará los polígonos resultantes. Estos podrían ser convertidos de nuevo a ESRI geometrías polilínea. Aunque debo decir, mi conocimiento de Python es terrible esto es sólo una idea genérica

aquí hay una muestra de polygonizer..

>>> from shapely.geometry import LineString, Point
    >>> from shapely.ops import polygonize
    >>> lines = [
    ... LineString(((0, 0), (1, 1))),
    ... LineString(((0, 0), (0, 1))),
    ... LineString(((0, 1), (1, 1))),
    ... LineString(((1, 1), (1, 0))),
    ... LineString(((1, 0), (0, 0))),
    ... LineString(((5, 5), (6, 6))),
    ... Point(0, 0),
    ... ]
    >>> result = polygonize(lines)
    >>> list(result)
    [<shapely.geometry.polygon.Polygon object at ...>, <shapely.geometry.polygon.Polygon object at ...>]

    >>> lines2 = [
    ... ((0, 0), (1, 1)),
    ... ((0, 0), (0, 1)),
    ... ((0, 1), (1, 1)),
    ... ((1, 1), (1, 0)),
    ... ((1, 0), (0, 0)),
    ... ((5, 5), (6, 6)),
    ... ]
    >>> result2 = polygonize(lines2)
    >>> list(result2)
    [<shapely.geometry.polygon.Polygon object at ...>, <shapely.geometry.polygon.Polygon object at ...>]

Tampoco estoy seguro de lo que podemos hacer con LEFT_ID y RIGHT_ID. Creo que son irrelevantes. Póngame al día si me equivoco.

0 votos

Creo que va por buen camino. Hay dos puntos que creo que deben resolverse. El primero es el orden de las líneas que se introducirán en la función poligonizador. Tienen que estar en el orden correcto o el polígono probablemente tendrá problemas de torsión. No sé mucho acerca de esa función, por lo que puede no importar. La forma en que el Left_ID y Right_ID podría ser útil es que se puede agrupar sobre la base de la ID para determinar qué líneas deben ser incluidos en un polígono en particular.

0 votos

@GetSpatial orden no es un problema en la función polygonizer.this es lo que se menciona en el sitio STC. "Polygonizes un conjunto de Geometrías que contienen líneas que representan los bordes de un gráfico plano. Se maneja cualquier dimensión de Geometría - se extraen las líneas constituyentes para formar las aristas. Las aristas deben estar correctamente asentadas, es decir, sólo deben encontrarse en sus puntos finales. El Poligonizador seguirá funcionando con datos incorrectamente nodados, pero no formará polígonos a partir de aristas incorrectamente nodadas." vividsolutions.com/jts/javadoc/com/vividsolutions/jts/operation/

1 votos

Bueno, eso soluciona el problema del pedido. Creo que el ID de izquierda y derecha todavía podría ser utilizado para asegurarse de que el polígono se atribuyen con la etiqueta de identificación correcta. Yo podría darle una oportunidad en el próximo par de días para armar un poco de código para hacer esto.

1voto

John Kramlich Puntos 286

Si quieres usar Python y el GeoProcessor para construir polígonos a partir de tus líneas tienes que echar un vistazo al archivo de Ayuda y buscar una página llamada trabajar con geometría en Python .

Tendrás que crear un cursor sobre tus polilíneas y encadenarlas, puede que primero tengas que "explotarlas" en puntos De todas formas no estoy seguro de cómo puedes resolver el tema del orden en que visitas las polilíneas. No sé (ya que nunca lo he probado en Python) si la geometría del polígono resultante se puede simplificar, es decir, el orden de los vértices se hace correcto cuando se crea el polígono.

1voto

Eric G Puntos 131

Quizás podrías usar arcpy.FeatureToRaster_conversion() para crear un raster a partir de tus polilíneas y luego arcpy.RasterToPolygon_conversion() para crear el polígono

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