Good afternoon,
I've been working on a script that will compare two different feature classes and move changes from the one that has been edited to the target feature class. I got most of my logic from this forum post Comparing Two Feature Classes and Updating One of Them. The script is working but it leaves out the actual geometry so all that is left in the Shape_Length field is "0" so I get records in the table but no actual geometry. You can see in the below images the zeros and the street that should be copied to the target feature class the green line should be covered by the records that have a zero in the Shape_Length field.


I think there is something wrong with the search cursor/insert cursor that I'm using but not 100% sure. My code is below.
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">creatingMatchingFieldList</SPAN><SPAN class="punctuation token">(</SPAN>fc1<SPAN class="punctuation token">,</SPAN> fc2<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
lst1 <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>fld<SPAN class="punctuation token">.</SPAN>name <SPAN class="keyword token">for</SPAN> fld <SPAN class="keyword token">in</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>ListFields<SPAN class="punctuation token">(</SPAN>fc1<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN>
lst2 <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN>fld<SPAN class="punctuation token">.</SPAN>name <SPAN class="keyword token">for</SPAN> fld <SPAN class="keyword token">in</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>ListFields<SPAN class="punctuation token">(</SPAN>fc2<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">return</SPAN> list<SPAN class="punctuation token">(</SPAN>set<SPAN class="punctuation token">(</SPAN>lst1<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">&</SPAN> set<SPAN class="punctuation token">(</SPAN>lst2<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">createWhereClause</SPAN><SPAN class="punctuation token">(</SPAN>fc<SPAN class="punctuation token">,</SPAN> fld_name<SPAN class="punctuation token">,</SPAN> value<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="string token">"""
Should return 'GGMID = 20412.0'
can be some other value...
"""</SPAN>
logger<SPAN class="punctuation token">.</SPAN>info<SPAN class="punctuation token">(</SPAN>fc<SPAN class="punctuation token">)</SPAN>
logger<SPAN class="punctuation token">.</SPAN>info<SPAN class="punctuation token">(</SPAN>fld_name<SPAN class="punctuation token">)</SPAN>
logger<SPAN class="punctuation token">.</SPAN>info<SPAN class="punctuation token">(</SPAN>value<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> len<SPAN class="punctuation token">(</SPAN>arcpy<SPAN class="punctuation token">.</SPAN>ListFields<SPAN class="punctuation token">(</SPAN>fc<SPAN class="punctuation token">,</SPAN> fld_name<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">==</SPAN> <SPAN class="number token">1</SPAN><SPAN class="punctuation token">:</SPAN>
fld <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>ListFields<SPAN class="punctuation token">(</SPAN>fc<SPAN class="punctuation token">,</SPAN> fld_name<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN>
logger<SPAN class="punctuation token">.</SPAN>info<SPAN class="punctuation token">(</SPAN>fld<SPAN class="punctuation token">.</SPAN>name<SPAN class="punctuation token">)</SPAN>
logger<SPAN class="punctuation token">.</SPAN>info<SPAN class="punctuation token">(</SPAN>fld<SPAN class="punctuation token">.</SPAN>type<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">if</SPAN> fld<SPAN class="punctuation token">.</SPAN>type <SPAN class="operator token">==</SPAN> <SPAN class="string token">"String"</SPAN><SPAN class="punctuation token">:</SPAN>
where <SPAN class="operator token">=</SPAN> <SPAN class="string token">"{0} = '{1}'"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>arcpy<SPAN class="punctuation token">.</SPAN>AddFieldDelimiters<SPAN class="punctuation token">(</SPAN>fc<SPAN class="punctuation token">,</SPAN> fld_name<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> value<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN>
where <SPAN class="operator token">=</SPAN> <SPAN class="string token">"{0} = {1}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>arcpy<SPAN class="punctuation token">.</SPAN>AddFieldDelimiters<SPAN class="punctuation token">(</SPAN>fc<SPAN class="punctuation token">,</SPAN> fld_name<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">,</SPAN> value<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">return</SPAN> where
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">getPrimaryFieldValues</SPAN><SPAN class="punctuation token">(</SPAN>fc<SPAN class="punctuation token">,</SPAN> field<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">return</SPAN> <SPAN class="punctuation token">[</SPAN>r<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="keyword token">for</SPAN> r <SPAN class="keyword token">in</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>SearchCursor<SPAN class="punctuation token">(</SPAN>fc<SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">[</SPAN>field<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">getSelectCursor</SPAN><SPAN class="punctuation token">(</SPAN>fc<SPAN class="punctuation token">,</SPAN> flds<SPAN class="punctuation token">,</SPAN> whereClause<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">return</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>SearchCursor<SPAN class="punctuation token">(</SPAN>fc<SPAN class="punctuation token">,</SPAN> flds<SPAN class="punctuation token">,</SPAN> whereClause<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">diff</SPAN><SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">,</SPAN> b<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">return</SPAN> list<SPAN class="punctuation token">(</SPAN>set<SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">-</SPAN> set<SPAN class="punctuation token">(</SPAN>b<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">try</SPAN><SPAN class="punctuation token">:</SPAN>
logger<SPAN class="punctuation token">.</SPAN>info<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Creating a list of field names that are in both fcs..."</SPAN><SPAN class="punctuation token">)</SPAN>
flds <SPAN class="operator token">=</SPAN> creatingMatchingFieldList<SPAN class="punctuation token">(</SPAN>NewStreets<SPAN class="punctuation token">,</SPAN> OLDStreets<SPAN class="punctuation token">)</SPAN>
flds<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'SHAPE@LENGTH'</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#flds.append('SHAPE')</SPAN>
flds<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN><SPAN class="string token">'Shape_Length'</SPAN><SPAN class="punctuation token">)</SPAN>
logger<SPAN class="punctuation token">.</SPAN>info<SPAN class="punctuation token">(</SPAN>flds<SPAN class="punctuation token">)</SPAN>
sourceValues <SPAN class="operator token">=</SPAN> getPrimaryFieldValues<SPAN class="punctuation token">(</SPAN>NewStreets<SPAN class="punctuation token">,</SPAN> fieldName<SPAN class="punctuation token">)</SPAN>
destinationValues <SPAN class="operator token">=</SPAN> getPrimaryFieldValues<SPAN class="punctuation token">(</SPAN>OLDStreets<SPAN class="punctuation token">,</SPAN> fieldName<SPAN class="punctuation token">)</SPAN>
additions <SPAN class="operator token">=</SPAN> diff<SPAN class="punctuation token">(</SPAN>sourceValues<SPAN class="punctuation token">,</SPAN> destinationValues<SPAN class="punctuation token">)</SPAN>
deletions <SPAN class="operator token">=</SPAN> diff<SPAN class="punctuation token">(</SPAN>destinationValues<SPAN class="punctuation token">,</SPAN> sourceValues<SPAN class="punctuation token">)</SPAN>
workspace <SPAN class="operator token">=</SPAN> NetworkDatasetGDB
logger<SPAN class="punctuation token">.</SPAN>info<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Creating the insert cursor and adding the New street lines to the Old Street Lines..."</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>Editor<SPAN class="punctuation token">(</SPAN>workspace<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> edit<SPAN class="punctuation token">:</SPAN>
insertRows <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN>
<SPAN class="keyword token">for</SPAN> a <SPAN class="keyword token">in</SPAN> additions<SPAN class="punctuation token">:</SPAN>
logger<SPAN class="punctuation token">.</SPAN>info<SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">)</SPAN>
where <SPAN class="operator token">=</SPAN> createWhereClause<SPAN class="punctuation token">(</SPAN>NewStreets<SPAN class="punctuation token">,</SPAN> fieldName<SPAN class="punctuation token">,</SPAN> a<SPAN class="punctuation token">)</SPAN>
logger<SPAN class="punctuation token">.</SPAN>info<SPAN class="punctuation token">(</SPAN>where<SPAN class="punctuation token">)</SPAN>
Row <SPAN class="operator token">=</SPAN> getSelectCursor<SPAN class="punctuation token">(</SPAN>NewStreets<SPAN class="punctuation token">,</SPAN> flds<SPAN class="punctuation token">,</SPAN> where<SPAN class="punctuation token">)</SPAN>
insertRows<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>Row<SPAN class="punctuation token">)</SPAN>
logger<SPAN class="punctuation token">.</SPAN>info<SPAN class="punctuation token">(</SPAN>insertRows<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>InsertCursor<SPAN class="punctuation token">(</SPAN>OLDStreets<SPAN class="punctuation token">,</SPAN> flds<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> insertCursor<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">for</SPAN> rec <SPAN class="keyword token">in</SPAN> insertRows<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">for</SPAN> r <SPAN class="keyword token">in</SPAN> rec<SPAN class="punctuation token">:</SPAN>
logger<SPAN class="punctuation token">.</SPAN>info<SPAN class="punctuation token">(</SPAN>r<SPAN class="punctuation token">)</SPAN>
insertCursor<SPAN class="punctuation token">.</SPAN>insertRow<SPAN class="punctuation token">(</SPAN>r<SPAN class="punctuation token">)</SPAN>
<SPAN class="comment token">#edit.stopEditing(True)</SPAN>
logger<SPAN class="punctuation token">.</SPAN>info<SPAN class="punctuation token">(</SPAN><SPAN class="string token">"Creating the update cursor and updating the old Street Lines with the values from the new Street Lines..."</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>Editor<SPAN class="punctuation token">(</SPAN>workspace<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> edit<SPAN class="punctuation token">:</SPAN>
<SPAN class="keyword token">for</SPAN> d <SPAN class="keyword token">in</SPAN> deletions<SPAN class="punctuation token">:</SPAN>
where <SPAN class="operator token">=</SPAN> createWhereClause<SPAN class="punctuation token">(</SPAN>OLDStreets<SPAN class="punctuation token">,</SPAN> fieldName<SPAN class="punctuation token">,</SPAN> d<SPAN class="punctuation token">)</SPAN>
logger<SPAN class="punctuation token">.</SPAN>info<SPAN class="punctuation token">(</SPAN>where<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>UpdateCursor<SPAN class="punctuation token">(</SPAN>OLDStreets<SPAN class="punctuation token">,</SPAN> flds<SPAN class="punctuation token">,</SPAN> where<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> deleteCursor<SPAN class="punctuation token">:</SPAN>
logger<SPAN class="punctuation token">.</SPAN>info<SPAN class="punctuation token">(</SPAN>d<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">for</SPAN> d <SPAN class="keyword token">in</SPAN> deleteCursor<SPAN class="punctuation token">:</SPAN>
deleteCursor<SPAN class="punctuation token">.</SPAN>deleteRow<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>If anyone has an idea why the the actual shape is not being inserted with the insert cursor that would be awesome!
Thanks,
Christopher Long