📄 createlinkvectors.py
字号:
import string, os, sys, traceback
import win32com.client
gp = win32com.client.Dispatch("esriGeoprocessing.GpDispatch.1")
gp.overwriteoutput = 1
skipmessage = "No corresponding point for link value %s"
def AddPrintMessage(msg, severity):
print msg
if severity == 0: gp.AddMessage(msg)
elif severity == 1: gp.AddWarning(msg)
elif severity == 2: gp.AddError(msg)
def GetFieldWrapper(desc):
if desc.DataType == "ShapeFile":
lb = '"'; rb = '"'
elif desc.DataType == "FeatureClass":
lb = "["; rb = "]"
elif desc.DataType == "FeatureLayer":
lb, rb = GetFieldWrapper(gp.describe(desc.CatalogPath))
else:
lb = ""; rb = ""
return lb, rb
def CreatePoint(x, y):
pnt = gp.CreateObject("Point")
pnt.x = x
pnt.y = y
return pnt
try:
#Input Data
fromFC = gp.GetParameterAsText(0)
fromLnkFld = gp.GetParameterAsText(1)
toFC = gp.GetParameterAsText(2)
toLnkFld = gp.GetParameterAsText(3)
outputFC = gp.GetParameterAsText(4)
fromDesc = gp.describe(fromFC)
toDesc = gp.describe(toFC)
lb, rb = GetFieldWrapper(toDesc)
FClist = fromFC + ';' + toFC
outSR = gp.CreateSpatialReference("#", fromFC, "#", "#", "#", FClist, 100)
gp.CreateFeatureclass(os.path.split(outputFC)[0], os.path.split(outputFC)[1], "POLYLINE", "#", "ENABLED", "ENABLED", outSR)
outDesc = gp.describe(outputFC)
outRows = gp.insertcursor(outputFC)
fromRows = gp.searchcursor(fromFC)
fromRow = fromRows.next()
pointArray = gp.CreateObject("Array")
partArray = gp.CreateObject("Array")
while fromRow:
fromFeat = fromRow.GetValue(fromDesc.Shapefieldname)
fromX, fromY = map(lambda x: float(x), fromFeat.centroid.split(" "))
fromPnt = CreatePoint(fromX, fromY)
lnkValue = fromRow.GetValue(fromLnkFld)
queryStr = "%s%s%s = %s" % (lb, toLnkFld, rb, lnkValue)
toRows = gp.searchcursor(toFC, queryStr)
toRow = toRows.next()
matchcount = 0
while toRow:
toFeat = toRow.GetValue(toDesc.Shapefieldname)
toX, toY = map(lambda x: float(x), toFeat.centroid.split(" "))
toPnt = CreatePoint(toX, toY)
pointArray.add(fromPnt)
pointArray.add(toPnt)
partArray.add(pointArray)
outRow = outRows.newrow()
outRow.SetValue(outDesc.shapefieldname, partArray)
outRows.InsertRow(outRow)
pointArray.removeall()
partArray.removeall()
toRow = toRows.next()
matchcount+=1
if matchcount == 0:
AddPrintMessage(skipmessage % lnkValue, 1)
del toRow
del toRows
fromRow = fromRows.next()
del outRow
del outRows
del fromRow
del fromRows
except:
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
pymsg = "PYTHON ERRORS:\nTraceback Info:\n" + tbinfo + "\nError Info:\n " + \
str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n"
AddPrintMessage(pymsg, 2)
msgs = "GP ERRORS:\n" + gp.GetMessages(2) + "\n"
AddPrintMessage(msgs, 2)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -