11 votos

Dibujar líneas paralelas dentro de polígonos (caminos de bien)

Me gustaría tomar una clase de entidad poligonal con varios polígonos irregulares, y han Arco dibujar líneas paralelas dentro de cada polígono. Idealmente, sería bueno para el Arco para determinar el ángulo del lado más largo de la poligonal y dibujar líneas paralelas a ese lado, pero para mantenerlo simple, yo creo que si yo sólo podía entrar en un ángulo para todas las líneas paralelas, que sería más fácil.

Así que la línea de ángulo ancho entre líneas, min/max de la longitud y el ancho del búfer de los lados de los polígonos son lo que a mi criterio básico. CUALQUIER ayuda sería muy apreciada. Si no, voy a tener que dibujar todas estas líneas manualmente :(

La imagen adjunta si que ayuda.

enter image description here

10voto

Marcin Puntos 11

Como menciona el @cndnflyr, esto puede ser secuencias de comandos en Python.

Herramienta de interfaz de usuario de la escritura:

enter image description here

Salida de la muestra:enter image description here

# import libraries
import arcpy

# set input/output parameters
polyFC = arcpy.GetParameterAsText(0)        # input polygons
outParallel = arcpy.GetParameterAsText(1)   # output parallel lines
lineSpacing = arcpy.GetParameterAsText(2)   # line spacing
buffDist = arcpy.GetParameterAsText(3)      # inner buffer distance

# parse numbers from parameters
lineSpaceNum = float(lineSpacing.split(' ')[0])
buffNum = float(buffDist.split(' ')[0])

# establish spatial reference
desc = arcpy.Describe(polyFC)
SR = desc.spatialReference

# set overwrite environment
arcpy.env.overwriteOutput = True
arcpy.env.outputCoordinateSystem = SR

parallels = []
# loop through each input shape
for row in arcpy.da.SearchCursor(polyFC, ["SHAPE@"], spatial_reference=SR):

    # create inner buffer
    polyBuff = row[0].buffer(buffNum * -1)

    # create hull rectangle to establish a rotated area of interest
    coordSplit = row[0].hullRectangle.split(' ')

    # collect corner coordinates
    coordList = arcpy.Array([arcpy.Point(coordSplit[0],coordSplit[1]),arcpy.Point(coordSplit[2],coordSplit[3]),arcpy.Point(coordSplit[4],coordSplit[5]),arcpy.Point(coordSplit[6],coordSplit[7]),arcpy.Point(coordSplit[0],coordSplit[1])])

    # create lines from hull rectangle
    currentLines = []
    for pointNum in range(0,4):
        arcpy.Array([coordList.getObject(pointNum),coordList.getObject(pointNum+1)])
        hullRecLine = arcpy.Polyline(arcpy.Array([coordList.getObject(pointNum),coordList.getObject(pointNum+1)]))
        currentLines.append(hullRecLine)

    # compare first and second line to determine if first line is short or long
    firstLong = 0
    if currentLines[0].length > currentLines[1].length:
        firstLong = 1

    # calculate number of points needed along short axis
    numPoints = int(math.floor(currentLines[firstLong].length/lineSpaceNum))

    # create and join points to create parallel lines
    for point in range(1,numPoints+1):
        shortPoint1 = currentLines[firstLong].positionAlongLine(lineSpaceNum*point)
        shortPoint2 = currentLines[firstLong + 2].positionAlongLine(currentLines[firstLong + 2].length - (lineSpaceNum*point))
        parallel = arcpy.Polyline(arcpy.Array([shortPoint1.centroid,shortPoint2.centroid]), SR)

        # intersect parallel lines with buffer
        parallelBuff = parallel.intersect(polyBuff,2)
        parallels.append(parallelBuff)

# write geometries to disk
arcpy.CopyFeatures_management(parallels, outParallel)

# add to map
mxd = arcpy.mapping.MapDocument("CURRENT")
dataFrame = arcpy.mapping.ListDataFrames(mxd, "*")[0]
addLayer = arcpy.mapping.Layer(outParallel)
arcpy.mapping.AddLayer(dataFrame, addLayer)

del row

4voto

Mister Smith Puntos 133

Esto se podría hacer con Python, pero tomaría algo de tiempo para escribir.

Creo que la manera más rápida de implementar sin Python es tener una plantilla de archivo SHP de estas líneas paralelas. Tiene un par de si usted tiene diferentes anchos necesarios, y sólo tiene que utilizar el más apropiado para que el Polígono. Hacer que las líneas de la plantilla cubrir un área suficiente para cubrir el mayor Polígono te vas a encontrar.

  1. Al editar, mover las líneas sobre el polígono.
  2. Utilice la herramienta Rotar, mover el punto de anclaje donde un Paralelo de la línea y el Polígono de borde de partido, y rotar las líneas de modo que encaje a presión en el Polígono de borde que se alineaban en.
  3. Convertir el Polígono a una Polilínea
  4. El búfer de la Polilínea cualquiera que sea la distancia que desea el paralelismo de las líneas de la poligonal perimetral.
  5. Utilice la herramienta de Borrado para borrar todas las Polilíneas que están cubiertos por el Búfer Polígono Perimetral
  6. Seleccione la ubicación de todas las líneas que no están dentro del polígono y eliminarlos. O creo que el Clip herramienta de trabajo también.
  7. Seleccionar por atributos de todas las líneas que están a menos de una cierta longitud (demasiado corto para mantener, aunque usted puede ser que necesite para agregar un campo y calcular la geometría de la primera), y más de una cierta longitud (demasiado largo para mantener si eso es lo que quieres), eliminarlos.
  8. Enjuague y Repita...

Los pasos 3 a 7 podría ser modelo, sin tener que escribir ningún código.

Casi el mismo proceso podría ser utilizado para codificar el proceso, pero en vez de tener la plantilla de líneas, usted podría tener el código de dibujar las líneas en el ángulo derecho, distancia, etc. Yo no he hecho esto por un tiempo, pero creo que una biblioteca de Python como bien formada es de ayuda. Sólo asegúrese de que cubre un área más grande que el Polígono, y el uso de las herramientas para convertir automáticamente a polilínea, buffer, borrar, seleccione las líneas no dentro del polígono, y eliminarlos.

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