2

We have a model/script that is set to run on a weekly basis, and is meant to update our parcel records using the parcel records from our county. Our parcels are stored in an SDE geodatabase version 10.2.2. In a nut shell, this model/script follows these steps:

  1. Download county parcels as a feature class in a file geodatabase from an FTP site into a file geodatabase on our server.
  2. Rename two of the fields in the county parcel feature class.
  3. Use Join Field to join the county parcel feature class to our parcel feature class in the SDE geodatabase using the parcel ID field.
  4. Run through a number of field calculate steps that recalculates the town parcel ownership field with the data in the county parcel ownership field. This process continues and updates other relevant fields including owner address, assessed value, deed number, etc.
  5. The last step after completing about 15 field calculates is to delete all the county parcel fields that were added to the town parcel feature class during the Join Field.

This may not be the most efficient method but it has worked for us, until now. Twice within the last 6 months I have received an underlying DBMS error when running the model. This error states that Cannot create a row of size 8063 which is greater than the allowable maximum row size of 8060. Working with Esri and our IT, we discovered that this error can occur when large, fixed-width columns are dropped, like the ones that are dropped in step 5 of my model. The solution is to simply rebuild the parcel table using a SQL command.

Is there a different way to automate the update of the fields in our parcel feature class using the county parcel feature class without performing the join command?

Removing the join step should remove the need to delete the added fields, which in turn should remove the row size error we are receiving.

Is there a more efficient method we could be using to update our parcel data?

Another factor in this process is that when the join is performed, we never end up with a perfect 1-to-1 match because we maintain some parcel records that the county does not. In this case, during step 4, I use the following expression to make sure that if a join was not found our current data will not be calculated with Null values from the county; instead our parcel will just keep whatever existing data is currently in that record:

Dim X
if IsNull ([PIN_18]) then
    X = [Owner_name] 
else
    X = [Owner]
end if

Owner_name refers to our records, while Owner and PIN_18 refer to the county's records. These fields change accordingly for whatever field is being calculated at the time.

2

A solution without using joins would require you to script this in Python. Read your table that you join into a data structure like a dictionary. Then have an update cursor over your town parcel layer. On each loop of the cursor you pull out the parcel ID and use that to retrieve the information stored in the dictionary and then do your calculation for the row.

  • Thank you for the suggestion. I have revised my original question to include a more detailed explanation of the field calculate process. Would the dictionary solution you suggested work in the scenario I describe? – Jacob DA Feb 7 '17 at 14:50
  • Can't see why not you would just need to program for that situation. – Hornbydd Feb 7 '17 at 17:31
  • I finally got to work on this project again, and with your dictionary idea I have had success. I will post my working code below. Hopefully it will help others. – Jacob DA Feb 24 '17 at 13:54
0

The solution to this problem, as indicated in the answer above, was to pull the county records into a dictionary using arcpy.da.SearchCursor; the Parcel ID is the dictionary key, with the other variables (owner, property class) as values.

The next step is to use arcpy.da.UpdateCursor with the town parcels as the cursor. Looking for a town Parcel ID match within the key of the county parcel dictionary, I am able to extract the values from the dictionary and calculate them into the town records. Please see below for trimmed version of the working code.

import arcpy, os

TownSample = r'C:\Users\TOC_GIS\Testing\UpdateOwnership\Data.gdb\TownParcels'
CountySample = r'C:\Users\TOC_GIS\Testing\UpdateOwnership\Data.gdb\CountyParcels'

C_Parcels = {}
with arcpy.da.SearchCursor(CountySample,['PIN_18','Owner','PROP_Class_Code']) as searchcursor:
    for row in searchcursor:
        CountyParcelID = row[0]
        CountyOwner = row[1]
        CountyPropClass = row[2]
        C_Parcels.update({CountyParcelID: (CountyOwner, CountyPropClass)})

del searchcursor
del row

print "County dictionary created"

with arcpy.da.UpdateCursor(TownSample,['Parcel_num','Owner_name','Prop_c']) as updatecursor:
    for row2 in updatecursor:
        TownParcelID = row2[0]
        if TownParcelID in C_Parcels:
            x, y = C_Parcels.get(TownParcelID)
            row2[1] = x
            row2[2] = y
            updatecursor.updateRow(row2)

del updatecursor
del row2

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.