POST
|
I notice the indentations where off when attached my code. I tried to fix the indentations but it would not let me. I am using line 48 to use the selected point for line 50 for the selectlayerbylocation.
... View more
07-08-2015
03:08 PM
|
0
|
2
|
1035
|
POST
|
I am working a code/button that will help me update address points attributes based on the parcel they are in. I am trying to to use filed list to create a mach and update the points with dictionaries. I don't not get error but my address points don't get updated from the parcels. I would appreciate any help with my code. import arcpy
from datetime import datetime as d
startTime = d.now()
#set to folder where features are located
arcpy.env.workspace = r"Database Servers\DSD15_SQLEXPRESS.gds\TEST (VERSION:dbo.DEFAULT)" #r"Database Servers\DSD15_SQLEXPRESS.gds\TonyTwoWay (VERSION:dbo.DEFAULT)" #on windows use \ instead of /
arcpy.env.overwriteOutput = True
arcpy.env.qualifiedFieldNames = False
#define variables for cursor
#---------------------------
FC = "TEST.DBO.CCAPTEST" #pointlayer
TaxPar = "TaxParcels" #Parcels
poly = "ACCOUNT"#'SiteAddres_1','SiteAddres_1', 'SiteNum_1', 'SiteNumSfx_1','Predir_1','SiteStreet_1', 'StreetType_1', 'Postdir_1', 'SiteCity_1', 'SiteZIP_1', 'OwnerName_1'
Pnt = "Account"#
TaxPar1 = "selectedParcels"
parcelsCount = int(arcpy.GetCount_management(FC).getOutput(0))
dsc = arcpy.Describe(FC)
selection_set = dsc.FIDSet
if len(selection_set) == 0:
print "There are no features selected"
elif parcelsCount >= 1:
#Select parcel within selected Address Points
int(arcpy.GetCount_management(FC).getOutput(0))
arcpy.SelectLayerByLocation_management(TaxPar, "CONTAINS", FC)
#Create in memory parcel layer
selectedParcels = arcpy.MakeFeatureLayer_management(TaxPar, TaxPar1)
arcpy.SelectLayerByAttribute_management(TaxPar1, "NEW_SELECTION", "OBJECTID= "+OID)
# define the field list from the parcels
sourceFieldsList = ["ACCOUNT", poly,"SiteAddres",'SiteNum', 'SiteStreet','SiteNumSfx','Predir','SiteStreet', 'StreetType', 'Postdir', 'SiteCity', 'SiteZIP', 'OwnerName']
# define the field list to the points
updateFieldsList = ["Account", Pnt,"SiteAddres", 'SiteNum', 'SiteStreet', 'SiteNumSfx','Predir','SiteStreet', 'StreetType', 'Postdir', 'SiteCity', 'SiteZip', 'OwnerName']
# Start an edit session. Must provide the workspace.
edit = arcpy.da.Editor(arcpy.env.workspace)
# Edit session is started without an undo/redo stack for versioned data
# (for second argument, use False for unversioned data)
edit.startEditing(True)
# Start an edit operation
edit.startOperation()
# populate the dictionary from the polygon
valueDict = {r[0]:(r[1:]) for r in arcpy.da.SearchCursor(TaxPar1, sourceFieldsList)}
with arcpy.da.UpdateCursor(FC, updateFieldsList) as updateRows:
for updateRow in updateRows:
keyValue = updateRow[0]
if keyValue in valueDict:
for n in range (1,len(sourceFieldsList)):
updateRow = valueDict[keyValue][n-1]
updateRows.updateRow(updateRow)
# Stop the edit operation.
edit.stopOperation()
# Stop the edit session and save the changes
edit.stopEditing(True)
arcpy.RefreshActiveView()
#arcpy.Delete_management(sjpoints)
... View more
07-08-2015
01:35 PM
|
0
|
14
|
5254
|
POST
|
Richard the codes runs fine but if there is nothing selected i get Traceback (most recent call last): File "<string>", line 55, in <module> NameError: name 'row' is not defined If i remove the del row, del rows, del rowInserter the codes runs with points selected and with out points selected. Without points i do get the message "There are no features selected". I thought the "if" statment would handle it if nothing was selected? Thank you for all your help Richard. I am trying to understand the list part in your code. could you or do you mind explaining what is happening in this line (if FCfield.name.upper() == incidentFCfield.name.upper() and FCfield.type == incidentFCfield.type and incidentFCfield.editable == True and not (FCfield.name.upper() in matchedFields): )
... View more
06-29-2015
08:18 AM
|
0
|
2
|
332
|
POST
|
after making the change to "incidentFCfield.editable() == True. i still get the error. Runtime error Traceback (most recent call last): File "<string>", line 28, in <module> TypeError: 'bool' object is not callable thanks.
... View more
06-26-2015
03:25 PM
|
0
|
4
|
332
|
POST
|
Richard thank your your patience and help. python is not my strong point obviously. i am not familiar with list. when i first got the error i removed .name from manualField.name.upper but once i removed i got an error on line 35, in TypeError: 'bool' object is not callable. i proceeding to remove all of them from line 28 and got error an line 23, in 'Field' object has no attribute 'upper'. So i didn't understand the error so that's why i posted the error i got. i am still stuck on the error. Thanks.
... View more
06-26-2015
11:30 AM
|
0
|
6
|
971
|
POST
|
I get the folloing on line 20 Runtime error Traceback (most recent call last): File "<string>", line 20, in <module> AttributeError: 'str' object has no attribute 'name'
... View more
06-26-2015
11:05 AM
|
0
|
8
|
971
|
POST
|
I am getting an error on line 17 "unexpected character after line continuation character. I believe the forward slashes are erroring out on lines 17, 25-27. I also noticed that some fields in the manualFields list have single quotes and other have double quotes is this correct?
... View more
06-26-2015
10:31 AM
|
0
|
10
|
971
|
POST
|
After making the correction to the SHAPE@X AND SHAPE@Y the code ran fine. You code make more sense now that i can see it. I did not know that you can use insertRow of one layer inside an updateCursor for a different layer. I need to copy pretty pretty much every field of the selected point or points to the back up, i was just testing my code and figured that once i got it working i could add the other fields but there are like 50 fields and i would prefer not to have to type every one. I think you touched on this with dictionaries and lists? Yes, if nothing is selected then i don't need anything backed up. I have attached a small portion of the feature classes.
... View more
06-26-2015
08:51 AM
|
0
|
12
|
971
|
POST
|
Richard, thank you for your help, i gratefully appreciate it. The reason i have two update cursors is because i need to update "only" the selected features (could be 1 or 20 or 100) of FC layer first with the first arcpy.da.UpdateCursor, then after the attributes have been updated i need to copy over the features that were updated in the first cursor to incidentsFC. I was trying to implement the InsertCursor you suggested and since none of the FC layers get copied over i used another updatecursor. The FC already has the already has "Account" and "SiteStreet, those are fileds i need to copy over to the incidentFC as well . The code you posted give me an error; Runtime error Traceback (most recent call last): File "<string>", line 26, in <module> RuntimeError: unknown geometry token 'SHAPE@CENTROID.X' import arcpy
from datetime import datetime as d
startTime = d.now()
#set to folder where features are located
arcpy.env.workspace = r"C:\GIS\CCAP\CCAP_NEW.mdb" #on windows use \ instead of /
arcpy.env.overwriteOutput = True
#---------------------------
#define variables for cursor
#---------------------------
FC = "test"
incidentsFC = "CCAP"
parcelsCount = int(arcpy.GetCount_management(FC).getOutput(0))
dsc = arcpy.Describe(FC)
rowInserter = arcpy.da.InsertCursor(incidentsFC, ["SHAPE@", 'Account', 'SiteStreet'])
selection_set = dsc.FIDSet
if len(selection_set) == 0:
print "There are no features selected"
elif parcelsCount >= 1:
with arcpy.da.UpdateCursor(FC, ["FacltyType", "StructType", "Verified", "Status", "StructCat", "APA_CODE", "ACCOUNT", 'SiteStreet', 'SHAPE@CENTROID.X', 'SHAPE@CENTROID.Y']) as rows:
for row in rows:
row[0] = ("Single Family Home")
row[1] = ("Primary, Private")
row[2] = ("Yes, GRM, TA")
row[3] = ("Active")
row[4] = ("Residential")
row[5] = ("1110")
ACCOUNT = row[6]
SiteStreet = row[7]
X = row[8]
Y = row[9]
rows.updateRow(row)
inPoint = arcpy.PointGeometry(arcpy.Point(X,Y))
rowInserter.insertRow((inPoint, ACCOUNT, SiteStreet))
del row
del rows
del rowInserter
arcpy.RefreshActiveView()
try:
print '(Elapsed time: ' + str(d.now() - startTime)[:-3] + ')'
except Exception, e:
# If an error occurred, print line number and error message
import traceback, sys
tb = sys.exc_info()[2]
print "Line %i" % tb.tb_lineno
print e.message
... View more
06-25-2015
03:43 PM
|
0
|
14
|
971
|
POST
|
Thanks for the reply Richard, i am not familiar with dictionaries and lists so am unable to incorporate your suggestions to my code.
... View more
06-25-2015
01:39 PM
|
0
|
16
|
471
|
POST
|
Richard you were correct my fgdb were corrupted, thanks. I deleted and recreated them and the cursor ran FAST. Although i still have an issue. When I select one record and run either codes from above it creates the point to the backup database, but it updates the fields of all the points in the backup database with the same attribute info as the selected point. I only want it to back up and update the selected points only. I also tried selected two or more points but only creates one point on the backup database and it also updates every point as well. What adjustments do i need to make to my code to only copy and update the selected points?
... View more
06-25-2015
10:19 AM
|
0
|
18
|
471
|
POST
|
The purpose of this script/tool would be that i can select one or two or 50 points at once and update just those selected points with the info in the rows = arcpy.UpdateCursor(APT). Then take those selected points and copy them to a different personal/filedatabase but with the info that was updated in the rows = arcpy.UpdateCursor(APT) and other fields. I have tried to implementing your suggestion on insert cursor and i have been able to create a point with insertcursor but it seems as the arcpy.da.UpdateCursor is still very slow. takes about 2-4 minutes to add one point to the backup data base. sometimes after testing and testing it takes 20 mins... weird The insertcursor is superfast it's the and arcpy.update cursor and arcpy.da.UpdateCursor that are super slow. Maybe i am not doing it the most efficient way... apologies my code is a little mangled import arcpy
from datetime import datetime as d
startTime = d.now()
#set to folder where features are located
arcpy.env.workspace = r"C:\CCAP_Copy_NEW.gdb" #on windows use \ instead of /
arcpy.env.overwriteOutput = True
FC = "test"
#---------------------------
#define variables for cursor
#---------------------------
rows = arcpy.SearchCursor(FC)
for row in rows:
geom = row.Shape
X = geom.centroid.X
Y = geom.centroid.Y
del rows
incidentsFC = "CCAP"
# Create point
inPoint = arcpy.PointGeometry(arcpy.Point(X,Y))
#Check to make sure user had at least one point is selected.
parcelsCount = int(arcpy.GetCount_management(FC).getOutput(0))
"""SEARCHCURSOR"""
stable = "test"
sfield = ["ACCOUNT","SiteNum","OwnerName","SiteAddres","SiteNumSfx","SiteStreet","Predir"]
#where clause will be written in SQL and not assigned to variable
"""UPDATECURSOR"""
utable = "CCAP"
ufield = ["ACCOUNT","SiteNum","OwnerName","SiteAddres","SiteNumSfx","SiteStreet","Predir"]
#where clause will be written in SQL and not assigned to variable
#Check to make sure user had at least one point is selected.
dsc = arcpy.Describe(FC)
dsc = arcpy.Describe(stable)
selection_set = dsc.FIDSet
if len(selection_set) == 0:
print "There are no features selected"
#--------------------------
#start the loop
#--------------------------
elif parcelsCount >= 1:
rows = arcpy.UpdateCursor(FC)
for row in rows:
row.FacltyType = ("Single Family Home")
row.StructType = ("Primary, Private")
row.Verified = ("Yes, GRM, TA")
row.Status = ("Active")
row.StructCat = ("Residential")
row.APA_CODE = ("1110")
rows.updateRow(row)
del row, rows
#arcpy.Append_management(APT, fc1, "NO_TEST")
# Create the insert cursor and a new empty row
rowInserter = arcpy.InsertCursor(incidentsFC)
newIncident = rowInserter.newRow()
# Populate attributes of new row
newIncident.SHAPE = inPoint
#newIncident.setValue(descriptionField, inDescription)
# Insert the new row into the shapefile
rowInserter.insertRow(newIncident)# Handle Exception
del rowInserter
with arcpy.da.SearchCursor(stable, sfield) as scursor:
for srow in scursor:
print srow
with arcpy.da.UpdateCursor(utable, ufield) as ucursor:
for urow in ucursor:
ucursor.updateRow(srow)
arcpy.RefreshActiveView()
try:
print '(Elapsed time: ' + str(d.now() - startTime)[:-3] + ')'
except Exception, e:
# If an error occurred, print line number and error message
import traceback, sys
tb = sys.exc_info()[2]
print "Line %i" % tb.tb_lineno
print e.message
arcpy.da.UpdateCursor rows = arcpy.SearchCursor(FC)
for row in rows:
geom = row.Shape
X = geom.centroid.X
Y = geom.centroid.Y
del rows
incidentsFC = "CCAP"
# Create point
inPoint = arcpy.PointGeometry(arcpy.Point(X,Y))
#Check to make sure user had at least one point is selected.
parcelsCount = int(arcpy.GetCount_management(FC).getOutput(0))
dsc = arcpy.Describe(FC)
selection_set = dsc.FIDSet
if len(selection_set) == 0:
print "There are no features selected"
elif parcelsCount >= 1:
rows = arcpy.UpdateCursor(FC)
for row in rows:
row.FacltyType = ("Single Family Home")
row.StructType = ("Primary, Private")
row.Verified = ("Yes, GRM, TA")
row.Status = ("Active")
row.StructCat = ("Residential")
row.APA_CODE = ("1110")
rows.updateRow(row)
#arcpy.Append_management(APT, fc1, "NO_TEST")
# Create the insert cursor and a new empty row
rowInserter = arcpy.InsertCursor(incidentsFC)
newIncident = rowInserter.newRow()
# Populate attributes of new row
newIncident.SHAPE = inPoint
#newIncident.setValue(descriptionField, inDescription)
# Insert the new row into the shapefile
rowInserter.insertRow(newIncident)# Handle Exception
#print "No features selected."
del rowInserter
with arcpy.da.SearchCursor(FC, ['ACCOUNT', 'SiteStreet']) as parcelCursor:
for parcelRow in parcelCursor:
ACCOUNT = parcelRow[0]
SiteStreet = parcelRow[1]
with arcpy.da.UpdateCursor(incidentsFC, ['Account', 'SiteStreet']) as addressCursor:
for addressRow in addressCursor:
addressRow[0] = ACCOUNT
addressRow[1] = SiteStreet
addressCursor.updateRow(addressRow)
... View more
06-24-2015
03:56 PM
|
0
|
20
|
471
|
POST
|
Going back to my original code, i made some modifications. It seems to some what run to my needs. my python skills are not so great. I changed line 26 on my original post from, workspace = r"C:\GIS\CCAP\CCAP.mdb" to arcpy.env.workspace = r"C:\GIS\CCAP\CCAP.mdb". After that change the Append Management works and even refreshed fine. The only issue is that it takes 1 min to copy just one point from one layer to the other. The other thing is that i need so some times select 1 or 50 points at a time and run this scrip\tool, but i do not know how set that part up. any help would be great. Currently it can only run against one point. Current code. import arcpy
APT = "TEST"
fc1 = "CCAP"
arcpy.env.workspace = r"C:\GIS\CCAP\CCAP_Copy_NEW.gdb"
arcpy.env.overwriteOutput = True
mxd = arcpy.mapping.MapDocument("CURRENT")
#Fill in attributes on point layer
Pointcount = int(arcpy.GetCount_management(APT).getOutput(0))
if 0 < Pointcount < 2:
rows = arcpy.UpdateCursor(APT)
for row in rows:
row.FacltyType = ("Single Family Home")
row.StructType = ("Primary, Private")
row.Verified = ("Yes, GRM, TA")
row.Status = ("Active")
row.StructCat = ("Residential")
row.APA_CODE = ("1110")
rows.updateRow(row)
del row, rows
else:
# Handle Exception
print "No features selected."
#Check to make sure user had at least one point is selected.
#If point selected Copy to back up point layer.
parcelsCount2 = int(arcpy.GetCount_management(APT).getOutput(0))
if 0 < parcelsCount2 < 2:
arcpy.Append_management(APT, fc1, "NO_TEST")
else:
# Handle Exception
print "No features selected."
arcpy.RefreshActiveView()
Richard you mentioned insert cursor, do have any similar code available as to what i am trying to accomplish? i would be gratefully appreciative... I am not the greatest python writer.
... View more
06-16-2015
11:43 AM
|
0
|
22
|
471
|
POST
|
I deleted line 20, ran the current code with one point selected and it updated the selected point for APT but still did not copy the feature to "CCAP". If nothing is selected and i run it it keeps repeating the process the process indicator goes from 0 to 100 and then refreshes results. I have to terminate arcmap through task manager. Maybe i am not going about this the right way? is there a batter way to do what i am trying to do?
... View more
06-12-2015
03:13 PM
|
0
|
1
|
471
|
Title | Kudos | Posted |
---|---|---|
1 | 10-27-2022 11:37 AM | |
1 | 10-31-2023 10:16 AM | |
1 | 02-16-2023 01:50 PM | |
1 | 08-11-2021 11:13 AM | |
1 | 01-06-2021 10:45 AM |
Online Status |
Offline
|
Date Last Visited |
3 weeks ago
|