Creé un script de Python la semana pasada (sin usar ArcPy), que toma puntos que crean la geometría de las líneas de bus (un punto shp) según un campo de número secuencial ("SEQ"). Puede ajustarlo fácilmente para tomar la coordenada de un campo de la misma entidad (usando el valor del campo en lugar de la geometría).
# -*- coding: utf-8 -*-
###############################################################################
from sys import argv
import osgeo.ogr
import os, os.path
###############################################################################
script, srcSHP = argv
#-- Open source shapefile
shapefile = osgeo.ogr.Open(srcSHP)
layer = shapefile.GetLayer(0)
spatialRef = layer.GetSpatialRef()
#-- Output directory
outDir = os.path.dirname(srcSHP)
outDirName = os.path.basename(outDir)
driver = osgeo.ogr.GetDriverByName("ESRI Shapefile")
outFile = driver.CreateDataSource(os.path.join(outDir,outDirName + "_lines.shp"))
outLayer = outFile.CreateLayer("layer", spatialRef)
#-- Adding fields to the output shapefile
fieldDef = osgeo.ogr.FieldDefn("line_no", osgeo.ogr.OFTString)
fieldDef.SetWidth(12)
outLayer.CreateField(fieldDef)
fieldDef = osgeo.ogr.FieldDefn("From_SEQ", osgeo.ogr.OFTReal)
outLayer.CreateField(fieldDef)
fieldDef = osgeo.ogr.FieldDefn("To_SEQ", osgeo.ogr.OFTReal)
outLayer.CreateField(fieldDef)
#-- Going through each feature, one by one
#-- The last point is the end of the line so I don't want to iterate through that one
for i in range(layer.GetFeatureCount()-1):
lString = osgeo.ogr.Geometry(osgeo.ogr.wkbLineString)
feature1 = layer.GetFeature(i)
feature2 = layer.GetFeature(i+1)
# When it's a new line, the sequential number restart to 1, so we don't want that line
if feature1.GetField("SEQ") < feature2.GetField("SEQ"):
geom1 = feature1.GetGeometryRef()
geom2 = feature2.GetGeometryRef()
geom1x = geom1.GetX()
geom1y = geom1.GetY()
geom2x = geom2.GetX()
geom2y = geom2.GetY()
lString.AddPoint(geom1x, geom1y)
lString.AddPoint(geom2x, geom2y) # Adding the destination point
#-- Adding the information from the source file to the output
feat = osgeo.ogr.Feature(outLayer.GetLayerDefn())
feat.SetGeometry(lString)
feat.SetField("line_no", feature1.GetField("line_no"))
feat.SetField("From_SEQ", feature1.GetField("SEQ"))
feat.SetField("To_SEQ", feature2.GetField("SEQ"))
outLayer.CreateFeature(feat)
print "The End"
Cada par de puntos creará una sola línea. Puede haber una forma más elegante de hacer esto, pero creó 3900 líneas en aproximadamente 15 segundos, así que funciona para mí ...