Hallo
ich habe ein kleines Problem mit einem ArcGIS Skript. Das Skript an sich wandelt mir ein Polygon in seine Punkte (Stützpunkte) um und speichert sie mir anschließend in einer txt Datei.
Mein Problem dabei ist jedoch, dass er immer alle Punkte ausliest. Das bedeutet, dass z.B. bei einem einzelnen Polygon der letzte Punkt identisch ist mit dem ersten. Und das möchte ich verhindern. Ich habe schon versucht die Anzahl der gezählten Punkte eines Multipartfeatures (partcount = feat.partcount) um eins zu verringern, so das einfach der letzte Punkt beim auslesen immer weg gelassen wird aber irgendwie funktioniert das bei mir nicht .
Kann mir jemand dabei ein wenig Hilfestellung leisten? In Python bin ich nämlich nicht besonders gut.....
Hier das Skript:
import string, os, sys, locale, arcgisscripting
gp = arcgisscripting.create()
gp.overwriteoutput = 1
msgNotEnoughParams = "Incorrect number of input parameters."
msgUseValidDecimalPointSep = "Please use one of the valid decimal point separators."
try:
if len(sys.argv) < 4: raise Exception, msgNotEnoughParams
inputFC = sys.argv[1]
outFile = open(sys.argv[2], "w")
arg3poss = ['default python output', 'locale decimal point', 'comma', 'period', '$sep$']
if sys.argv[3].lower() not in arg3poss: raise Exception, msgUseValidDecimalPointSep
if sys.argv[3].lower() == arg3poss[1]:
locale.setlocale(locale.LC_ALL, '')
sepchar = locale.localeconv()['decimal_point']
elif sys.argv[3].lower() == arg3poss[2]: sepchar = ','
elif sys.argv[3].lower() == arg3poss[3]: sepchar = '.'
elif sys.argv[3].lower() == arg3poss[4]: sepchar = '$SEP$'
elif sys.argv[3].lower() == arg3poss[0]: sepchar = ""
inDesc = gp.describe(inputFC)
inRows = gp.searchcursor(inputFC)
inRow = inRows.next()
outFile.write("X" + ";" + "Y" + ";" + "Z" + ";" + "M" + ";" + "Order" + ";" + inDesc.ShapeType+ "\n")
while inRow:
feat = inRow.GetValue(inDesc.ShapeFieldName)
partnum = 0
partcount = feat.partcount
while partnum < partcount:
part = feat.getpart(partnum)
part.reset()
pnt = part.next()
interiorring_count = 0
pnt_count = 0
while pnt:
outLine = str(pnt.x) + ";" + str(pnt.y) + ";" + str(pnt.z) + ";" + str(pnt.m) + ";" + str(pnt_count) + ";" + "'" + str(inRow.GetValue(inDesc.OIDFieldName)) + "_" + str(interiorring_count) + "'" + "\n"
if sepchar == "": outFile.write(outLine)
else: outFile.write(outLine.replace(".", sepchar))
pnt = part.next()
pnt_count += 1
if not pnt:
pnt = part.next()
if pnt:
pnt_count = 0
interiorring_count += 1
partnum += 1
inRow = inRows.next()
outFile.flush()
outFile.close()
except Exception, ErrorDesc:
gp.AddError(ErrorDesc[0])
if outFile: outFile.close()
gp.AddError(gp.getmessages(2))
ich habe ein kleines Problem mit einem ArcGIS Skript. Das Skript an sich wandelt mir ein Polygon in seine Punkte (Stützpunkte) um und speichert sie mir anschließend in einer txt Datei.
Mein Problem dabei ist jedoch, dass er immer alle Punkte ausliest. Das bedeutet, dass z.B. bei einem einzelnen Polygon der letzte Punkt identisch ist mit dem ersten. Und das möchte ich verhindern. Ich habe schon versucht die Anzahl der gezählten Punkte eines Multipartfeatures (partcount = feat.partcount) um eins zu verringern, so das einfach der letzte Punkt beim auslesen immer weg gelassen wird aber irgendwie funktioniert das bei mir nicht .
Kann mir jemand dabei ein wenig Hilfestellung leisten? In Python bin ich nämlich nicht besonders gut.....
Hier das Skript:
import string, os, sys, locale, arcgisscripting
gp = arcgisscripting.create()
gp.overwriteoutput = 1
msgNotEnoughParams = "Incorrect number of input parameters."
msgUseValidDecimalPointSep = "Please use one of the valid decimal point separators."
try:
if len(sys.argv) < 4: raise Exception, msgNotEnoughParams
inputFC = sys.argv[1]
outFile = open(sys.argv[2], "w")
arg3poss = ['default python output', 'locale decimal point', 'comma', 'period', '$sep$']
if sys.argv[3].lower() not in arg3poss: raise Exception, msgUseValidDecimalPointSep
if sys.argv[3].lower() == arg3poss[1]:
locale.setlocale(locale.LC_ALL, '')
sepchar = locale.localeconv()['decimal_point']
elif sys.argv[3].lower() == arg3poss[2]: sepchar = ','
elif sys.argv[3].lower() == arg3poss[3]: sepchar = '.'
elif sys.argv[3].lower() == arg3poss[4]: sepchar = '$SEP$'
elif sys.argv[3].lower() == arg3poss[0]: sepchar = ""
inDesc = gp.describe(inputFC)
inRows = gp.searchcursor(inputFC)
inRow = inRows.next()
outFile.write("X" + ";" + "Y" + ";" + "Z" + ";" + "M" + ";" + "Order" + ";" + inDesc.ShapeType+ "\n")
while inRow:
feat = inRow.GetValue(inDesc.ShapeFieldName)
partnum = 0
partcount = feat.partcount
while partnum < partcount:
part = feat.getpart(partnum)
part.reset()
pnt = part.next()
interiorring_count = 0
pnt_count = 0
while pnt:
outLine = str(pnt.x) + ";" + str(pnt.y) + ";" + str(pnt.z) + ";" + str(pnt.m) + ";" + str(pnt_count) + ";" + "'" + str(inRow.GetValue(inDesc.OIDFieldName)) + "_" + str(interiorring_count) + "'" + "\n"
if sepchar == "": outFile.write(outLine)
else: outFile.write(outLine.replace(".", sepchar))
pnt = part.next()
pnt_count += 1
if not pnt:
pnt = part.next()
if pnt:
pnt_count = 0
interiorring_count += 1
partnum += 1
inRow = inRows.next()
outFile.flush()
outFile.close()
except Exception, ErrorDesc:
gp.AddError(ErrorDesc[0])
if outFile: outFile.close()
gp.AddError(gp.getmessages(2))
- Anmelden oder Registieren, um Kommentare verfassen zu können
Gespeichert von BlackAngel am Do., 02.05.2013 - 09:38
PermalinkGespeichert von BlackAngel am Sa., 04.05.2013 - 10:29
Permalink