1 votos

¿Generar puntos a lo largo de la línea?

Estoy tratando de encontrar un punto a lo largo de una serie de línea en un porcentaje especificado de cada línea (el porcentaje a lo largo de la línea también cambia con cada punto). He encontrado la documentación de ArcGIS de la herramienta de gestión de datos GeneratePointsAlongLines, pero cuando trato de usarlo me sale el mensaje de error:

Traceback (última llamada): Archivo " L:\gathr\indonesia\Sara\Scripts\1234.py ", línea 11, en arcpy.GeneratePointsAlongLines_management(Input_Features, Output_features, "PERCENTAGE",percentage) AttributeError: el objeto 'module' no tiene el atributo 'GeneratePointsAlongLines_management'

¿Qué estoy haciendo mal? ¿Hay alguna manera más fácil de hacer esto en lugar de generar puntos a lo largo de las líneas? Estoy teniendo un tiempo difícil de averiguar cómo utilizar positionAlongLine, pero parece que podría ser útil. ¿Qué opinas?

import arcpy
import os
in_data = "L:\\gathr\\indonesia\\Sara\\Lines_withinTimes\\Day_andmmsi\\s20160101fc_lines.gdb\\Detection1_lines_UTM"
rows = arcpy.SearchCursor("L:\\gathr\\indonesia\\Sara\\Lines_withinTimes\\Day_andmmsi\\s20160101fc_lines.gdb\\Detection1_lines_UTM")
for row in rows:
    row_name = str(row)
    Input_Features = in_data
    Output_path = "L:\\gathr\\indonesia\\Sara\\Lines_withinTimes\\Day_andmmsi\\s20160101fc_lines.gdb\\"
    Ouput_features = os.path.join(Output_path, "Detection_" + row_name)
    percentage = row.getValue("duration_fraction")
    arcpy.GeneratePointsAlongLines_management(Input_Features, Output_features, "PERCENTAGE",percentage)

0 votos

¿Cuál es el error completo, incluido el número de línea, que obtiene al ejecutar el fragmento de código que ha publicado?

0 votos

Una cosa rápida que he notado es que si miras la documentación ( pro.arcgis.com/es/pro-app/tool-reference/data-management/ ) Creo que el orden de tus argumentos está un poco mal. Es posible que haya proporcionado un porcentaje cuando la herramienta estaba pidiendo una distancia. No estoy seguro de si eso lo arreglará o no, pero intente arcpy.GeneratePointsAlongLines_management(Input_Features, Output_features, "PERCENTAGE","",percentage) en cambio

0 votos

Rumski20, me sale el mismo mensaje de error cuando lo cambio por esto...

7voto

steveax Puntos 316

Siempre lo he hecho con un cursor de búsqueda y un cursor de inserción. El Objeto geométrico polilínea tiene un getPostitionAlongLine() método que puedes aprovechar:

import arcpy
import os
import math
arcpy.env.overwriteOutput = True

def addPointsAlongLine(lines, out_points, percentage_field):

    def iterPercentages(p):
        """iterate by percentage"""
        p = min([p, 100])
        div = int(math.floor(100.0 / p))
        for i in range(1,div+1):
            yield (0.01 * (p * i))

    path, name = os.path.split(out_points)
    sr = arcpy.Describe(lines).spatialReference
    sm = 'SAME_AS_TEMPLATE'
    arcpy.management.CreateFeatureclass(path, name, 'POINT', lines, sm, sm, sr)
    fields = [f.name for f in arcpy.ListFields(lines)
              if f.type not in ('OID', 'Geometry')
              and not f.name.lower().startswith('shape')]

    # field index for percentage
    fi = fields.index(percentage_field)

    # add points along line
    with arcpy.da.InsertCursor(out_points, fields + ['SHAPE@']) as irows:
        with arcpy.da.SearchCursor(lines, fields + ['SHAPE@']) as rows:
            for row in rows:
                perc = float(row[fi])
                for p in iterPercentages(perc):
                    irows.insertRow(row[:-1] + (row[-1].positionAlongLine(p, True),))
    return out_points

if __name__ == '__main__':

    gdb = r'L:\gathr\indonesia\Sara\Lines_withinTimes\Day_andmmsi\s20160101fc_lines.gdb'
    lines = os.path.join(gdb, 'Detection1_lines_UTM')
    out_points = os.path.join(gdb, 'Direction_along_line')
    perc_field = "duration_fraction"

    addPointsAlongLine(lines, out_points, perc_field)
    print 'done'

Debo añadir que en este caso, los valores porcentuales del campo deben ser números entre 1-100 como enteros o flotantes.

0 votos

Vaya, acabo de copiar y pegar esto y ha funcionado de maravilla. Muchas gracias. El único problema es que para una de las líneas creó 6 puntos a lo largo de la línea en lugar de sólo 1, espaciados uniformemente. Es un detalle que probablemente pueda encontrar una manera de solucionar, pero ¿alguna idea de por qué podría haber ocurrido? Gracias de nuevo.

0 votos

Este código está diseñado para añadir puntos a lo largo de la línea en un porcentaje basado en un campo. Pondría 6 puntos en una línea si se utilizara un valor como el 15%, porque el 15 entra en el 100 6.667 veces (el script redondeará hacia abajo, de lo contrario el punto final pasaría de la línea). Así que si su valor no es alrededor de 15, mi única otra conjetura es que puede haber dos líneas dibujadas una encima de la otra? Sólo haría un punto en la línea si el valor del campo es >= 50%. ¿Tiene esto sentido? Esto es usando el porcentaje de la distancia total a lo largo de las líneas.

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