1 votos

Creación de una polilínea a partir de un archivo CSV

Estoy creando un shapefile basado en tres columnas de mi archivo CSV: Latitud, Longitud y Laps. En su mayor parte, entiendo cómo bucle a través de los datos y crear los muchos puntos basados en la columna de latitud y longitud, pero estoy teniendo problemas con mi columna Laps. Tengo que ser capaz de bucle a través de los datos, pero excluir las columnas en blanco. A continuación se muestra una muestra de mis datos del archivo CSV. La fila que necesita ser excluida es la fila con el tiempo total de la vuelta para esa vuelta (es decir, #Lap 0...)

enter image description here enter image description here

A continuación se muestra el código que estoy utilizando. Cuando lo ejecuto, obtengo un Error 99999: Algo inesperado ha hecho que la herramienta falle.

# This script reads GPS tracks in CSV format and
# writes the geometries (polyline) from the list of coordinate pairs

import csv
import arcpy

def addPolyline(fc, array, sr):
    polyline = arcpy.Polyline(array, sr)
    with arcpy.da.InsertCursor(fc, ("SHAPE@",)) as cursor:
      cursor.insertRow((polyline,))
      array.removeAll()

# setup workpace to save the file
arcpy.env.workspace = r"C:\\"

# setup the feature class and spatial reference 
polylineFC = "carpath.shp"
sr = arcpy.SpatialReference("GCS_WGS_1984")
arcpy.CreateFeatureclass_management(arcpy.env.workspace, polylineFC, "POLYLINE", spatial_reference = sr)
spatialref = arcpy.Describe(polylineFC).spatialReference

# open the input file
wakefieldRaceWay = open (arcpy.env.workspace + "\WakefieldParkRaceway_20160421.csv", "r") 
# setup csv reader and process the header
csvReader = csv.reader(wakefieldRaceWay)
header = next(csvReader)

latIndex = header.index("Latitude")
lonIndex = header.index("Longitude")
lapIndex = header.index("Lap")

# create an array
vertices = arcpy.Array()

# create a loop to iterate over lines but 
# exclude lines that have zero data in them
for row in csvReader:
    isLap = row[lapIndex]
    if isLap == '\n':
        if vertices.count> 0 :
            addPolyline(polylineFC, vertices, spatialref)

    # Loop through the lines in the file and get each coordinate 
    # put the coordinates into a tuple and add it to the list
    Latitude = row[latIndex]
    Longitude = row[lonIndex]
    vertex = arcpy.Point(Latitude, Longitude)
    vertices.add(vertex)

# add the last segment manually    
addPolyline(polylineFC, vertices, spatialref)

1voto

David Puntos 64
arcpy.env.workspace = r"C:\\"

utilizando una cadena sin procesar, el intérprete escapará las barras invertidas, por lo que resultará en 4 barras invertidas. Elimine la "r" ya que tiene que escapar para formar una cadena válida.

>>> dir = r"c:\\"
>>> dir
'c:\\\\'

aquí también se antepone una barra invertida al nombre del archivo, por lo que terminará con 5 barras.

wakefieldRaceWay = open (arcpy.env.workspace + "**\**WakefieldParkRaceway_20160421.csv", "r") 

>>> wakefieldRaceWay = dir + "\WakefieldParkRaceway_20160421.csv"
>>> wakefieldRaceWay
'c:\\\\\\WakefieldParkRaceway_20160421.csv'

un valor vacío en un csv estará en blanco, no un carácter de nueva línea

if isLap == '\n':

así que usa

 if isLap in (None, "") 

o mejor aún

if not isLap 

EDITAR: Necesitas algo de lógica para omitir el intento de crear puntos a partir de las líneas en blanco lat/long.

# Loop through the lines in the file and get each coordinate 
# put the coordinates into a tuple and add it to the list
if isLap:
  Latitude = row[latIndex]
  Longitude = row[lonIndex]
  vertex = arcpy.Point(Latitude, Longitude)
  vertices.add(vertex)

También es necesario borrar la matriz de vértices después de crear una nueva línea o cada línea incluirá los vértices de cada línea anterior.

if not isLap:
    if vertices.count> 0 :
        addPolyline(polylineFC, vertices, spatialref)
        vertices.removeAll()

0voto

UnkwnTech Puntos 21942

Creo que deberías mirar esta línea de código:

arcpy.env.workspace = r"C:\\"

No parece un espacio de trabajo válido, así que como prueba prueba a utilizar:

arcpy.env.workspace = r"C:\temp"

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