मैंने पिछले हफ्ते एक पायथन स्क्रिप्ट बनाई (हालांकि आर्कपी का उपयोग नहीं कर रहा हूं), जो कि एक अनुक्रमिक संख्या क्षेत्र ("एसईक्यू") के अनुसार बस लाइनों (एक बिंदु एसपीपी) की ज्यामिति बना रहे हैं। आप आसानी से इसे एक ही फ़ीचर के क्षेत्र से समन्वय करने के लिए ट्विक कर सकते हैं (ज्यामिति के बजाय फ़ील्ड मान का उपयोग करके)।
# -*- 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"
बिंदु की प्रत्येक जोड़ी एक सिंगल लाइन बनाएगी। ऐसा करने का एक और अधिक सुंदर तरीका हो सकता है, लेकिन इसने लगभग 15 सेकंड में 3900 लाइनें बनाईं, इसलिए यह मेरे लिए काम करता है ...