3 votos

Actualizar el campo ID mediante tipos comunes

No estoy muy seguro de cómo redactar esto, pero espero hacerlo de una manera que transmita con precisión lo que estoy tratando de hacer...

Estoy usando Manifold GIS para este proyecto en particular, pero estoy abierto a cualquier método que logre el resultado deseado (menos ArcGIS ya que no tengo ningún software ESRI con licencia).

Empecé con un conjunto de datos que contenía una serie de puntos. Usando un script publicado por un usuario de Manifold, pude convertir estos puntos en segmentos de línea (que pueden o no ser necesarios para hacer lo que necesito).

Tengo datos como los siguientes:

ID      US_NUMBER    Absolute_Distance_ft   DESCRIPTION    FEATURE_TYPE_ID   Line id
365694    5          0.059                  GWD            30                5
365695    0          0.059                  Weld Start     77                0
365696    0          1.814                  VLV 1          7                 0
365697    7          3.56                   GWD            30                7
365698    0          4.177                  Offtake        78                0
365699    10         4.783                 GWD            30                10
365700    0          5.774                  Weldolet       80                0
365701    20         6.709                 GWD            30                20
365702    0          7.602                                 5                 0
365703    0          9.209                  Bend           2                 0
365704    30         11.683                GWD            30                30
365705    40         20.705                GWD            30                40

Cada segmento de línea comienza donde el "FEATURE_TYPE_ID" es 30 y tiene un "US_NUMBER" de n. La siguiente línea comienza en el siguiente 30 y tiene un "US_NUMBER" n1, y así sucesivamente...

Como puede ver en la tabla, "US_NUMBER" 5 es el inicio de un segmento de línea. El siguiente segmento de línea relevante es "US_NUMBER" 7. Los dos segmentos entre 5 y 7 son 0 y 0.

Quiero recorrer toda la línea y actualizar el "ID de línea" de cada segmento para que cada segmento que tenga un ID de línea de 0 se establezca en el "US_NUMBER" donde el anterior "FEATURE_TYPE_ID" era 30...

Así que tendría algo como...

ID      US_NUMBER    Absolute_Distance_ft   DESCRIPTION    FEATURE_TYPE_ID   Line id
365694    5          0.059                  GWD            30                5
365695    0          0.059                  Weld Start     77                5
365696    0          1.814                  VLV 1          7                 5
365697    7          3.56                   GWD            30                7
365698    0          4.177                  Offtake        78                7
365699    10         4.783                 GWD            30                 10
365700    0          5.774                  Weldolet       80                10
365701    20         6.709                 GWD            30                 20
365702    0          7.602                                 5                 20
365703    0          9.209                  Bend           2                 20
365704    30         11.683                GWD            30                 30
365705    40         20.705                GWD            30                 40

¿Tiene sentido?

0 votos

Podrías utilizar el módulo csv de python (tendrías que convertir los datos a csv primero) para leer cada línea capturando el ID de línea. Yo crearía 2 variables Pre_Feat_ID y Current_Feat_ID para almacenar el ID de la característica actual y la anterior. Luego usaría una sentencia if para comprobar si el Current_Feat_ID == 0, si es cierto, actualizaría el Current_Feat_ID con el valor del Pre_Feat_ID. No estoy muy familiarizado con Manifold, pero esto fue lo primero que se me ocurrió

0 votos

Suena bastante simple. ¡Tan simple que puede funcionar! Lo intentaré y veré si puedo hacerlo funcionar. ¡Gracias!

0 votos

Me encuentro con algunos problemas de lógica en este caso... ¿Podría publicar un ejemplo para ilustrar su proceso de pensamiento?

1voto

Michael Puntos 604

Esta habría sido mi solución:

import csv

results_csv = r"D:\results.csv"
# This is the location of the csv containing your results

modified_results_csv = r"D:\modified_results.csv"
# This is the location of the csv that will contain the modified results

header = ["US_NUMBER","Absolute_Distance_ft","DESCRIPTION","FEATURE_TYPE_ID",
            "Line id","ID"]
# This is the header information for the columns in the csv

Pre_Feat_ID = 0
# This variable will hold the line id number if it is not = 0

with open(modified_results_csv,"w") as csv_file:
# This creates the modified_results.csv and writes in the column headings

            writer = csv.DictWriter(csv_file, fieldnames = header,
                                    lineterminator='\n')

            writer.writeheader()

with open(results_csv,"r") as results_csv_file:
# This reads the results.csv

    reader = csv.DictReader(results_csv_file)

    for row in reader:
        # loops through rows and assigns row attributes to variable

        row_id = row["ID"]

        row_us_number = row["US_NUMBER"]

        row_abs_dist = row["Absolute_Distance_ft"]

        row_desc = row["DESCRIPTION"]

        row_feat_type_id = row["FEATURE_TYPE_ID"]

        row_line_id = row["Line id"]

        if row_line_id  != "0":
        # If the Line ID  is not = 0, then assign the Line Id value to Pre_Feat_ID
        # and append  the row to modified_results.csv

            Pre_Feat_ID = int(row_line_id)

            with open(modified_results_csv,"a") as mod_results_csv_file:

                writer = csv.DictWriter(mod_results_csv_file, fieldnames = header,
                                        lineterminator='\n')

                writer.writerow({"ID": row_id,"US_NUMBER": row_us_number,
                                "Absolute_Distance_ft": row_abs_dist,
                                "DESCRIPTION": row_desc,
                                "FEATURE_TYPE_ID": row_feat_type_id,
                                "Line id":row_line_id})

        else:
        # If the Line ID is 0, then assign the Pre_Feat_ID to the Line
        # ID value and append the row to modified_results.csv

             with open(modified_results_csv,"a") as mod_results_csv_file:

                writer = csv.DictWriter(mod_results_csv_file, fieldnames = header,
                                        lineterminator='\n')

                writer.writerow({"ID": row_id,"US_NUMBER": row_us_number,
                                "Absolute_Distance_ft": row_abs_dist,
                                "DESCRIPTION": row_desc,
                                "FEATURE_TYPE_ID": row_feat_type_id,
                                "Line id":Pre_Feat_ID})

print("Done")

La línea de salida del código es la siguiente:

  1. Crear un nuevo csv (modified_results.csv) para contener los nuevos resultados utilizando la información de la cabecera de los resultados originales
  2. Leer los resultados del original results.csv y asignar los valores de las filas a las variables
  3. Utilice una sentencia condicional para ver si el valor de la ID de línea no es igual a 0. Si es verdadero, asigne el valor de la ID de línea a la variable Pre_Feat_ID y luego escriba la fila en modified_results.csv. Si la condición es falsa, entonces la variable Pre_Feat_ID se asigna a la ID de línea y luego la fila se escribe en modified_results.csv

Aquí están los resultados del script: resultados originales.csv original results.csv

resultados_modificados.csv modified_results.csv

Nota: En el modified_results.csv he movido la columna del ID al final para evitar que Excel dé un error por ser el csv un archivo SYLK.

0 votos

¡Eso es! Estaba tratando de hacer con las listas y estaba corriendo en problemas twith mi pobre lógica de bucle ... ¡Dicts mucho mejor idea y mucho más rápido! ¡Gracias, señor!

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