POST
|
I would just use the RasterToPoint tool. NoData values are not exported... Specify a .shp output as that is the vector format that SpatialAnalyst writes to directly (FGDB is a post process!). Took my machine 3 min 14sec for a 7364 x 4454 cell raster. Be mindful of keeping the .dbf file under 2.1 GB. Once in .shp (.dbf) format, you quite readily have your x,y,z database. I should note that RasterToAscii only took 16 seconds overall to run on the same raster, but you would need to include the added overhead of writing/processing a function to give you the cell center x/y pairs.
... View more
10-11-2010
08:44 AM
|
0
|
0
|
1859
|
POST
|
FROM ESRI 10/08/2010: "Running an update cursor on a feature layer that contains in-memory tabular joins created using the AddJoin tool is not supported (in v9.3.1 or v10.0). Instead, use the JoinField tool or the CalculateField tool's VB expression." Yarrr... Seems that if you were intent on not using what ESRI recommends, use a searchcursor store the "look up" values in a Python Dictionary (in memory), and then use an updatecursor on the main table and access the values stored in the dictionary. For example: #Defines the inputs
sourceTable = gp.GetParameterAsText(0)
destinationTable = gp.GetParameterAsText(1)
sourceKey = gp.GetParameterAsText(2)
destinationKey = gp.GetParameterAsText(3)
sourceField1 = gp.GetParameterAsText(4)
destinationField1 = gp.GetParameterAsText(5)
sourceField2 = gp.GetParameterAsText(6)
destinationField2 = gp.GetParameterAsText(7)
sourceField3 = gp.GetParameterAsText(8)
destinationField3 = gp.GetParameterAsText(9)
#Process: Print out the input parameters
message = "INPUT PARAMETERS"; showPyMessage()
message = "----------------"; showPyMessage()
message = "Source Table = " + sourceTable; showPyMessage()
message = "Destination Table = " + destinationTable; showPyMessage()
message = "Source Key = " + sourceKey; showPyMessage()
message = "Destination Key = " + destinationKey; showPyMessage()
message = "Source Field #1 = " + sourceField1; showPyMessage()
message = "Destination Field #1 = " + destinationField1; showPyMessage()
message = "Source Field #2 = " + sourceField2; showPyMessage()
message = "Destination Field #2 = " + destinationField2; showPyMessage()
message = "Source Field #3 = " + sourceField3; showPyMessage()
message = "Destination Field #3 = " + destinationField3 + "\n"; showPyMessage()
#Do some error checking
message = "Running error checks..."; showPyMessage()
#Process: Makes sure sourceTable exists
if gp.exists(sourceTable) != True:
message = "ERROR: " + sourceTable + " does not exist! Exiting script..."; showPyError(); sys.exit()
#Process: Makes sure the sourceKey and sourceField1 fields exist in sourceTable
fieldList = gp.listfields(sourceTable)
fieldNameList = []
for field in fieldList:
fieldNameList.append(field.name)
if sourceKey not in fieldNameList:
message = "ERROR: " + sourceKey + " field does not exist in " + sourceTable + "! Exiting script..."; showPyError(); sys.exit()
if sourceField1 not in fieldNameList:
message = "ERROR: " + sourceField1 + " field does not exist in " + sourceTable + "! Exiting script..."; showPyError(); sys.exit()
#Process: Makes sure destinationTable exists
if gp.exists(destinationTable) != True:
message = "ERROR: " + destinationTable + " does not exist! Exiting script..."; showPyError(); sys.exit()
#Process: Makes sure the destinationKey and destinationField1 fields exist in destinationTable
fieldList = gp.listfields(destinationTable)
fieldNameList = []
for field in fieldList:
fieldNameList.append(field.name)
if destinationKey not in fieldNameList:
message = "ERROR: " + str(destinationKey) + " field does not exist in " + destinationTable + "! Exiting script..."; showPyError(); sys.exit()
if destinationField1 not in fieldNameList:
message = "ERROR: " + str(destinationField1) + " field does not exist in " + destinationTable + "! Exiting script..."; showPyError(); sys.exit()
#Process: Figure out what fields we need for the search cursor
searchCurFieldListString = sourceKey + ";" + sourceField1
#Process: Builds a dictionary of the sourceTable's sourceKey field values
message = "Building source dictionary..."; showPyMessage()
sourceDict = {}
searchRows = gp.searchcursor(sourceTable,"","",searchCurFieldListString)
searchRow = searchRows.next()
while searchRow:
sourceKeyValue = str(searchRow.getvalue(sourceKey)) #ensure the key is a string!
sourceDict[sourceKeyValue] = searchRow.getvalue(sourceField1)
searchRow = searchRows.next()
del searchRow
del searchRows
#Process: Figure out what fields we need for the update cursor
updateCurFieldListString = destinationKey + ";" + destinationField1
#Process: Updates the destinationTable
message = "Updating destination table..."; showPyMessage()
updateRows = gp.updatecursor(destinationTable,"","",updateCurFieldListString)
updateRow = updateRows.next()
while updateRow:
destinationKeyValue = str(updateRow.getvalue(destinationKey)) #ensure the key is a string!
if destinationKeyValue in sourceDict:
updateRow.setvalue(destinationField1, sourceDict[destinationKeyValue])
updateRows.updaterow(updateRow)
else:
pass
updateRow = updateRows.next()
del sourceDict
del updateRow
del updateRows
... View more
10-08-2010
02:36 PM
|
0
|
0
|
570
|
POST
|
You could also use the "z-factor" parameter in the Contour tool to do the unit conversion (for example, from a DEM in meters to contours in feet). From meters to feet would be a z-factor of 3.2808 and of course the inverse would be 0.3048.
... View more
10-07-2010
10:29 AM
|
0
|
0
|
586
|
POST
|
You could do this in a rough way using the "SQL Expression" parameter type (make sure it is set to "obtained from" the Input_Data parameter). Another fancier way is to build up some "validation" code. Here's an examples of what a clever coworker of mine came up with to included a toolbox pick list that gets populated with the folder names in a certain directory. I haven't messed with it yet (that's for next week, so I can't really answer many questions about it), but seems like it could be easily altered to give you the unique field values of your selected features using a searchcursor applied to the input featurelayer. import os
class ToolValidator:
"""Class for validating a tool's parameter values and controlling
the behavior of the tool's dialog."""
basePath = r"\\snarf\am\div_lm\ds\for_inv\data"
def __init__(self):
"""Setup the Geoprocessor and the list of tool parameters."""
import arcgisscripting as ARC
self.GP = ARC.create(9.3)
self.params = self.GP.getparameterinfo()
self.fripnameParam = self.params[0]
self.fristypeParam = self.params[1]
return
def initializeParameters(self):
"""Refine the properties of a tool's parameters. This method is
called when the tool is opened."""
self.fristypeParam.Value = self.fristypeParam.Filter.List[0]
self.updateFripnamePickList()
return
def updateParameters(self):
"""Modify the values and properties of parameters before internal
validation is performed. This method is called whenever a parmater
has been changed."""
self.updateFripnamePickList()
return
def updateMessages(self):
"""Modify the messages created by internal validation for each tool
parameter. This method is called after internal validation."""
fripname = self.fripnameParam.Value
fristype = self.fristypeParam.Value
if fripname and fristype:
if not os.path.isdir(os.path.join(self.basePath, fristype, fripname)):
self.fripnameParam.SetErrorMessage(fripname + " does not exist")
return
def updateFripnamePickList(self):
pickList = []
for d in self.listSubdirectories(os.path.join(self.basePath, self.fristypeParam.Value)):
pickList.append(d)
self.fripnameParam.Filter.List = pickList
return
def listSubdirectories(self, directory):
subdirectories = []
for f in os.listdir(directory):
if os.path.isdir(os.path.join(directory, f)):
subdirectories.append(f)
return subdirectories
# The thing in square brackets (next line) is a "list comprehension".
#return [f for f in os.listdir(directory) if os.path.isdir(os.path.join(directory, f))]
... View more
10-06-2010
10:02 AM
|
0
|
0
|
520
|
POST
|
Verified that (9.3.1 SP1) an updatecursor does NOT work with a featurelayer/table view created with the MakeQueryTable tool. I will submit a bug report to ESRI.
... View more
10-06-2010
07:55 AM
|
0
|
0
|
570
|
POST
|
My bad... Use the CopyFeatures tool. The Copy tool will not reformat the data (FGDB to shp), but CopyFeatures will. The item in my other post probably wouldn't hurt either...
... View more
10-05-2010
07:50 PM
|
2
|
1
|
2072
|
POST
|
Try either this: import arcpy, sys, os, string
infc = r'C:\temp\basedata\SK_BS.gdb\BS_1250009_0'
outshp = r'C:\temp\Basedata_shps\BS_1250009_0.shp'
arcpy.Copy_management(infc, outshp) or this: import arcpy, sys, os, string
infc = r'C:\temp\basedata\SK_BS.gdb\BS_1250009_0'
outshp = 'BS_1250009_0.shp'
outpath = r'C:\temp\Basedata_shps'
arcpy.env.workspace = outpath
arcpy.Copy_management(infc, outshp) When you use the full shp path coupled with setting the arcpy.env.workspace, ArcPy gets confused because you are basically then saying the outputshapefile should be: r'C:\temp\Basedata_shps\C:\temp\Basedata_shps\BS_1250009_0.shp' Personally I almost always use the full path to a dataset instead of setting the workspace. It is cleaner and the code is easier to read/follow.
... View more
10-05-2010
09:08 AM
|
0
|
0
|
2072
|
POST
|
I wonder if an updatecursor would work with a FeaterLayer or TableView created with the MakeQueryTable tool?
... View more
10-01-2010
07:56 AM
|
0
|
0
|
839
|
POST
|
I swear you used to be able to do this (v92?), but now that I actually need to do it in v9.3.1 SP1, I get the same error. I hate to choke on my own claims, but I'm pretty choked up right now! Dang!!! runtimeError: ERROR 999999: Error executing function. You certainly can search the joined records (in a searchcursor), as well as use the CalculateField tool (aka Update). Hmmm...
... View more
09-30-2010
11:10 AM
|
0
|
0
|
839
|
POST
|
Note that is entirely correct to rasterize your lake, and use the lake raster as input to the Watershed tool (along with your flow direction raster). Then the output watershed will represent all the cells that contribute flow to the lake as a whole (not just a "pour point" or "outlet" point of the lake). Using the rasterized lake is much easier and probably more correct. Also, while maybe more glitzy and seemingly user-friendly, the ArcHydro tools are all based on the existing Hydro toolset in Spatial Analyst. Nothing new - just repackaging.
... View more
09-29-2010
10:40 AM
|
0
|
0
|
567
|
POST
|
By "cell" do you mean a field value in a table or a raster pixel? If it's the former, and you are using a cursor in your script, be sure to delete the reference to the cursor object. For example: updateRows = gp.updatecursor(occBuffersUnionFC)
updateRow = updateRows.next()
while updateRow:
if updateRow.FID_occ_buff_1320ft > -1:
updateRow.OCCBUFF_TY = "Quarter Mile"
if updateRow.FID_occ_buff_100m > -1:
updateRow.OCCBUFF_TY = "100 Meter"
if updateRow.FID_occ_buff_300ft > -1:
updateRow.OCCBUFF_TY = "300 Feet"
if updateRow.FID_occ_buff_165ft > -1:
updateRow.OCCBUFF_TY = "165 Feet"
if updateRow.FID_mm_policy > -1:
updateRow.OCCBUFF_TY = "Occupied Site"
updateRows.updaterow(updateRow)
updateRow = updateRows.next()
del updateRow
del updateRows
... View more
09-28-2010
04:17 PM
|
0
|
0
|
264
|
POST
|
Could it be that the machine that you developed the .py script is 64 bit OS and uses the path: C:/Program Files (x86)/ArcGIS/ArcToolbox/Toolboxes/Data Management Tools.tbx while your server machine is 32 bit OS and uses the path C:/Program Files/ArcGIS/ArcToolbox/Toolboxes/Data Management Tools.tbx
... View more
09-28-2010
04:08 PM
|
0
|
0
|
355
|
POST
|
Don't know of a pre-built script, but a possible algorithm that would be easy to do via Python: 1. Convert the line features to their constituent vertices - taking it a step further, maybe densifying the lines 1st would be a good idea and give you better results. Dan Patterson wrote a great Python script to do this (densify a feature) a while back. 2. Assign one of the line features (now also in point/vertex format) as the "starting points". The other line feature (and it's constituent vertices) would be the "end points". 3. For each "start" vertex, find the closest "end" vertex (maybe the out of the box "near" tool or your own algorithm). 4. Compute the midpont between the start vertex and end vertex. 5. Each midpoint would be a vertex in the "composite" line feature. Since you are looping through the vertices in the "start" line in their connect-the-dot order, the composite line would be oriented the same way/direction as the "start" line. This would be a fun tool to to code via Python! Dan Lee will probably come up with something better/cooler than my idea, but maybe if I get some time next week (and he hasn't already done it)I can write some code next week.
... View more
09-28-2010
03:52 PM
|
0
|
0
|
617
|
POST
|
Jim, Seeing that the majority of the Geoprocessing-related questions seem to be in the "ArcGIS Desktop-General" forum, it might make sense to post (cross-post?) this thread there as well. Basically the question would be: Would users interested in "Geoprocessing" like to see additional 'split-out' forums for Python Scripting, ModelBuilder, etc. - or is a single all-inclusive "Geoprocessing" forum good enough? BTW: Until that is decided, please post your Geoprocessing-related posts to the existing "Geoprocessing" forum (in the "Functions" section)!
... View more
09-23-2010
08:08 PM
|
0
|
0
|
577
|
POST
|
1) Here's how to figure out if a field value is NULL in a searchcursor: searchRows = gp.searchcursor(fc):
searchRow = searchRows.next()
while searchRow:
if searchRow.FIELDNAME == None: #or inverse of "... != None:"
print "It's NULL!"
searchRow = searchRows.next()
del searchRow
del searchRows 2) A searchcursor is used to simply reterieve (e.g. read) field/record values (read cursor = read access). An updatecursor is used to change existing field/record values in a table. Note that you can't change values in a lookup table (only the join to table) if you are dealing with a joined table situation (updatecursor = write access). An updatecursor has all the functionality of a readcursor, but with the added ability to alter the field/record values. An insertcursor is used to write (aka insert) new records (and field values) into a table. So here's some things to try: 1. Instead of using the .csv file directly, convert it to a table (.dbf, PGDB, FGDB, etc.) via ArcGIS. That way it will be garannteed to generate an OBJECTID field. I think this is where things are going wrong for you. 2. Just a note: You line of code: for i in range(0,numSchools): should probably be for i in range(0,numSchools + 1): because: for i in range (0,5): print i 0 1 2 3 4
... View more
09-23-2010
08:39 AM
|
0
|
0
|
328
|
Title | Kudos | Posted |
---|---|---|
1 | a month ago | |
1 | 02-13-2012 09:06 AM | |
2 | 10-05-2010 07:50 PM | |
1 | 02-08-2012 03:09 PM | |
1 | 10-31-2013 02:18 PM |
Online Status |
Offline
|
Date Last Visited |
a month ago
|