6 votos

¿Por qué hay un campo adicional al crear shapefile de puntos desde archivos csv en Python?

Tengo un script de Python que se crea un punto de shapefile desde un archivo csv dentro de una secuencia de comandos de Python. Este script me da un ValueError para la longitud de campo (LON), si no hay un extra absurdo campo a la derecha de la misma. A continuación es el error y cómo el archivo csv se ha formateado para eliminar este error:

    lonValueIndex = valueList.index("LON")
    ValueError: list.index(x): x not in list

DATE       LAT      LON          TEST
2/19/2011  34.27531  -118.21071    a
2/19/2011  34.18069  -118.34079    b
2/19/2011  34.0215   -118.21857    c

¿Ves que la Prueba de campo con los valores de a, b y c? Si no pongo un campo a la derecha de la LON campo me sale el ValueError. A continuación es parte de mi script. ¿Alguien sabe por qué ese extra de campo es necesario? Gracias.

import arcpy, csv
arcpy.env.overwriteOutput = True

#Set variables
arcpy.env.workspace = "C:\\GIS\\StackEx\\"
outFolder = arcpy.env.workspace
pointFC = "art2.shp"
coordSys = "C:\\Program Files\\ArcGIS\\Desktop10.0\\Coordinate Systems" + \
           "\\Geographic Coordinate Systems\\World\\WGS 1984.prj"
csvFile = "C:\\GIS\\StackEx\\chicken.csv"
fieldName = "DATE1"

#Create shapefile and add field
arcpy.CreateFeatureclass_management(outFolder, pointFC, "POINT", "", "", "", coordSys)
arcpy.AddField_management(pointFC, fieldName, "TEXT","","", 10)

gpsTrack = open(csvFile, "r")

headerLine = gpsTrack.readline()
#print headerLine
valueList = headerLine.split(",")
print valueList
latValueIndex = valueList.index("LAT")
lonValueIndex = valueList.index("LON")
dateValueIndex = valueList.index("DATE")

# Read each line in csv file
cursor = arcpy.InsertCursor(pointFC)
for point in gpsTrack.readlines():

   segmentedPoint = point.split(",")
   # Get the lat/lon values of the current reading                    
   latValue = segmentedPoint[latValueIndex]
   lonValue = segmentedPoint[lonValueIndex]
   dateValue = segmentedPoint[dateValueIndex]
   vertex = arcpy.CreateObject("Point")
   vertex.X = lonValue
   vertex.Y = latValue
   feature = cursor.newRow()
   feature.shape = vertex
   feature.DATE1 = dateValue
   cursor.insertRow(feature)

del cursor

12voto

Harshad Kshirsagar Puntos 76

Cuando dividir headerLine por las comas, la última entrada "LON" contiene un carácter de nueva línea:

print headerLine.split(",")
['DATE', 'LAT', 'LON\n']

Por esta razón se añade que una nueva columna después de LON hace que el script funcione, ya que el caracter se aplica en el campo de prueba.

Trate de usar faja para eliminar el caracter de:

print headerLine.strip().split(",")
['DATE', 'LAT', 'LON']

4voto

auramo Puntos 161

Aquí es una alternativa de flujo de trabajo utilizando las herramientas de geoprocesamiento que puede ser más fácil:

  1. El uso de Hacer XY Evento (Capa de Gestión de Datos) para crear temporal de una capa de puntos a partir de su archivo CSV

  2. Uso de Funciones de Copia (Gestión de Datos) o Clase de entidad A Clase de entidad (Conversión) para realizar una característica permanente de la clase o shapefile desde el punto temporal de la capa.

0voto

Antti Sykäri Puntos 10381

Si usted está dispuesto a utilizar OGR/GDAL, sus problemas pueden ser resueltos fácilmente. Si usted puede exportar sus datos a ser separados por comas (o separados por tabulaciones), y ponerlo en un archivo llamado test.csv. A continuación, puede crear un archivo XML que va a definir la ubicación del lat/long columnas son para ser leídos a partir de:

<OGRVRTDataSource>
  <OGRVRTLayer name="test">
    <SrcDataSource>test.csv</SrcDataSource>
    <GeometryType>wkbPoint</GeometryType>
    <LayerSRS>WGS84</LayerSRS>
    <GeometryField encoding="PointFromColumns" x="LAT" y="LON"/>
  </OGRVRTLayer>
</OGRVRTDataSource>

Entonces, para obtener su shapefile, uso ogr2ogr:

$ ogr2ogr -f "ESRI Shapefile"  /tmp/stuff.shp /tmp/test.vrt 
$ ogrinfo -al -so stuff.shp
INFO: Open of `stuff.shp'
using driver `ESRI Shapefile' successful.

Layer name: stuff
Geometry: Point
Feature Count: 3
Extent: (34.021500, -118.340790) - (34.275310, -118.210710)
Layer SRS WKT:
GEOGCS["GCS_WGS_1984",
   DATUM["WGS_1984",
     SPHEROID["WGS_1984",6378137,298.257223563]],
    PRIMEM["Greenwich",0],
UNIT["Degree",0.017453292519943295]]
DATE: String (80.0)
LAT: String (80.0)
LON: String (80.0)
TEST: String (80.0)

Hay más documentación aquí.

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