I have a point file that has two fields with values that represent its neighboring point. We will call them Up for the point above it and down for the point below it for this. For example Up field is 1205 and the down field is 1201. For the next point in that sequence the up field is 1201 and the down field is 991. For the next point the up is 991 and the down is 977. The down field always indicates correctly the next point in the sequence however the numbers are not sequential. Also to add to the problem, they are string values and they may include a letter such as 981a however there is always a matching value for that in the next point in the opposite field. The final issue is that sometimes the sequence stops which would represent the end of one line feature and a new sequence begins that would represent the beginning of a new line feature. I would like to build a new field that can properly sequence these points so that I can convert this point file to a line file. Ideally I would like to do this in a way that I can incorporate it into a larger model. I really appreciate any help you can provide or other suggestions on how to approach the problem.
Thanks.
It might be possible to navigate through your point feature using a dictionary, where the value of the point (down) becomes the key for the next point (up). From your sample data, the points starting and ending a line segment, do not match other points. That is, the starting point's up value does not have a match in the down column, and the ending point's down value does not have a match the up column.
In my test, I converted your shape file to a file geodatabase feature. To the feature, I added fields for line segment and segment order. The name for the line segment is the up value for the starting point. Here's a debug printout:
OID UP DOWN LINE ORDER 1 1118 1113 1118 1 2 1113 1121 1118 2 3 1121 1115 1118 3 4 1115 1114 1118 4 5 1114 1123 1118 5 6 1123 1119 1118 6 ... 20 1031 1041 1118 20 21 1041 1009 1118 21 22 1009 1035 1118 22 23 1035 1040 1118 23 24 1040 1069 1118 24 25 995 1000 1184 4 26 1000 1103 1184 5 27 1003 987 1003 1 28 987 985 1003 2 29 985 993 1003 3 ... 794 156 184 259 104 795 171 149 173B 2 796 149 164 173B 3 797 164 157 173B 4 798 157 137 173B 5 799 137 155 173B 6 800 688 670 743 56 801 680 688 743 55 802 683 680 743 54 803 184 178 259 105 804 178 L-14 259 106 805 L-14 178B 259 107 806 173B 171 173B 1 807 687 704 743 52 808 704 683 743 53 809 173 192 259 79 ... 851 116 94 133 18 852 94 109 133 19 853 109 115 133 20 854 115 123 133 21 855 123 131 133 22 856 L-63A 744 L-63A 1 857 744 L-57A L-63A 2 858 L-57A 675 L-63A 3 859 675 744A L-63A 4 860 168 159 168 1 861 159 151 168 2 862 151 158 168 3 863 158 166 168 4 864 166 145 168 5 865 145 144 168 6 866 144 120 168 7 867 120 154 168 8 868 655 630 743 112 869 630 L-60 743 113 870 L-60 630A 743 114 871 630A 666C 743 115 872 666C 635 743 116 873 635 L-24A 743 117 874 L-24A 1083 743 118<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>
Here's the code I used:
<SPAN class="keyword token">import</SPAN> arcpy <SPAN class="keyword token">import</SPAN> numpy <SPAN class="keyword token">as</SPAN> np sourceFC <SPAN class="operator token">=</SPAN> r<SPAN class="string token">'C:\Path\to\example.gdb\example'</SPAN> <SPAN class="comment token"># use OID@ token</SPAN> sourceFieldsList <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">"JOINT___UP"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"JOINT___DO"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"OID@"</SPAN><SPAN class="punctuation token">]</SPAN> updateFields <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="string token">"OID@"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"LineSeg"</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">"SegOrder"</SPAN> <SPAN class="punctuation token">]</SPAN> <SPAN class="comment token"># LineSeg is text, SegOrder is long int</SPAN> valueDict <SPAN class="operator token">=</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="punctuation token">:</SPAN><SPAN class="punctuation token">(</SPAN>r<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">:</SPAN><SPAN class="punctuation token">]</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>sourceFC<SPAN class="punctuation token">,</SPAN> sourceFieldsList<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">}</SPAN> up <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="comment token"># values of JOINT___UP (the up point list)</SPAN> do <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="comment token"># values of JOINT___DO (the down point list)</SPAN> <SPAN class="keyword token">for</SPAN> k <SPAN class="keyword token">in</SPAN> valueDict<SPAN class="punctuation token">:</SPAN> dn<SPAN class="punctuation token">,</SPAN> id <SPAN class="operator token">=</SPAN> valueDict<SPAN class="punctuation token">[</SPAN>k<SPAN class="punctuation token">]</SPAN> <SPAN class="comment token"># k = key = JOINT___UP, dn = JOINT___DO, id = OID@, LineSeg, SegOrder</SPAN> up<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>k<SPAN class="punctuation token">)</SPAN> <SPAN class="comment token"># up point values</SPAN> do<SPAN class="punctuation token">.</SPAN>append<SPAN class="punctuation token">(</SPAN>dn<SPAN class="punctuation token">)</SPAN> <SPAN class="comment token"># down point values</SPAN> <SPAN class="comment token"># https://stackoverflow.com/questions/41125909</SPAN> <SPAN class="comment token"># determine line start : up point doesn't have matching value in down point list</SPAN> lineStart <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>setdiff1d<SPAN class="punctuation token">(</SPAN>up<SPAN class="punctuation token">,</SPAN>do<SPAN class="punctuation token">)</SPAN> <SPAN class="comment token"># determine line end : down point doesn't have matching value in up point list</SPAN> lineEnd <SPAN class="operator token">=</SPAN> np<SPAN class="punctuation token">.</SPAN>setdiff1d<SPAN class="punctuation token">(</SPAN>do<SPAN class="punctuation token">,</SPAN>up<SPAN class="punctuation token">)</SPAN> updateDict <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">{</SPAN><SPAN class="punctuation token">}</SPAN> <SPAN class="keyword token">for</SPAN> ln <SPAN class="keyword token">in</SPAN> lineStart<SPAN class="punctuation token">:</SPAN> <SPAN class="comment token"># print "New line: {}".format(ln)</SPAN> seg_order <SPAN class="operator token">=</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="comment token"># key, next point, oid, line_seg, seg_order</SPAN> <SPAN class="comment token"># print "\t{}\t{}\t{}\t{}\t{}".format(ln, valueDict[ln][0],valueDict[ln][1], ln, seg_order)</SPAN> updateDict<SPAN class="punctuation token">[</SPAN>valueDict<SPAN class="punctuation token">[</SPAN>ln<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">(</SPAN>ln<SPAN class="punctuation token">,</SPAN> valueDict<SPAN class="punctuation token">[</SPAN>ln<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> ln<SPAN class="punctuation token">,</SPAN> seg_order<SPAN class="punctuation token">)</SPAN> pt_next <SPAN class="operator token">=</SPAN> valueDict<SPAN class="punctuation token">[</SPAN>ln<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="keyword token">while</SPAN> <SPAN class="token boolean">True</SPAN><SPAN class="punctuation token">:</SPAN> next_pt <SPAN class="operator token">=</SPAN> pt_next seg_order <SPAN class="operator token">+=</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="comment token"># print "\t{}\t{}\t{}\t{}\t{}".format(next_pt, valueDict[next_pt][0],valueDict[next_pt][1], ln, seg_order)</SPAN> updateDict<SPAN class="punctuation token">[</SPAN>valueDict<SPAN class="punctuation token">[</SPAN>next_pt<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">(</SPAN>next_pt<SPAN class="punctuation token">,</SPAN> valueDict<SPAN class="punctuation token">[</SPAN>next_pt<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> ln<SPAN class="punctuation token">,</SPAN> seg_order<SPAN class="punctuation token">)</SPAN> pt_next <SPAN class="operator token">=</SPAN> valueDict<SPAN class="punctuation token">[</SPAN>next_pt<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="keyword token">if</SPAN> valueDict<SPAN class="punctuation token">[</SPAN>next_pt<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="keyword token">in</SPAN> lineEnd<SPAN class="punctuation token">:</SPAN> <SPAN class="keyword token">break</SPAN> <SPAN class="keyword token">print</SPAN> <SPAN class="comment token"># for debugging</SPAN> <SPAN class="keyword token">print</SPAN> <SPAN class="string token">"OID\tUP\tDOWN\tLINE\tSEGMENT"</SPAN> <SPAN class="keyword token">for</SPAN> k <SPAN class="keyword token">in</SPAN> sorted<SPAN class="punctuation token">(</SPAN>updateDict<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="keyword token">print</SPAN> <SPAN class="string token">"{}\t{}\t{}\t{}\t{}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN> k<SPAN class="punctuation token">,</SPAN> updateDict<SPAN class="punctuation token">[</SPAN>k<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN>updateDict<SPAN class="punctuation token">[</SPAN>k<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN>updateDict<SPAN class="punctuation token">[</SPAN>k<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN>updateDict<SPAN class="punctuation token">[</SPAN>k<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">3</SPAN><SPAN class="punctuation token">]</SPAN><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>sourceFC<SPAN class="punctuation token">,</SPAN> updateFields<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> cursor<SPAN class="punctuation token">:</SPAN> <SPAN class="keyword token">for</SPAN> row <SPAN class="keyword token">in</SPAN> cursor<SPAN class="punctuation token">:</SPAN> row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> updateDict<SPAN class="punctuation token">[</SPAN>row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="comment token"># line segment (starting point's JOINT___UP value)</SPAN> row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> updateDict<SPAN class="punctuation token">[</SPAN>row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">3</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="comment token"># segment order</SPAN> cursor<SPAN class="punctuation token">.</SPAN>updateRow<SPAN class="punctuation token">(</SPAN>row<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>
This will update the feature with a line segment name and a segment order. From there you should be able to use the Points to Line tool.
PointsToLine_management (Input_Features, Output_Feature_Class, {Line_Field}, {Sort_Field}, {Close_Line})
Hope this helps.
UPDATE:
The while block (lines 35-42 above) should be replaced with the following code. A line segment with only one point (because of a data entry error) would cause an error.
<SPAN class="keyword token">while</SPAN> pt_next <SPAN class="operator token">not</SPAN> <SPAN class="keyword token">in</SPAN> lineEnd<SPAN class="punctuation token">:</SPAN> next_pt <SPAN class="operator token">=</SPAN> pt_next seg_order <SPAN class="operator token">+=</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="comment token"># print "\t{}\t{}\t{}\t{}\t{}".format(next_pt, valueDict[next_pt][0],valueDict[next_pt][1], ln, seg_order)</SPAN> updateDict<SPAN class="punctuation token">[</SPAN>valueDict<SPAN class="punctuation token">[</SPAN>next_pt<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">(</SPAN>next_pt<SPAN class="punctuation token">,</SPAN> valueDict<SPAN class="punctuation token">[</SPAN>next_pt<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">,</SPAN> ln<SPAN class="punctuation token">,</SPAN> seg_order<SPAN class="punctuation token">)</SPAN> pt_next <SPAN class="operator token">=</SPAN> valueDict<SPAN class="punctuation token">[</SPAN>next_pt<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
Additionally, because of some issues with data entry errors, it is possible to not have a dictionary key for some rows. The code below (replacing lines 49-53 above) will print a warning message when a KeyError is encountered.
<SPAN class="keyword token">with</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>UpdateCursor<SPAN class="punctuation token">(</SPAN>sourceFC<SPAN class="punctuation token">,</SPAN> updateFields<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">as</SPAN> cursor<SPAN class="punctuation token">:</SPAN> <SPAN class="keyword token">for</SPAN> row <SPAN class="keyword token">in</SPAN> cursor<SPAN class="punctuation token">:</SPAN> <SPAN class="keyword token">try</SPAN><SPAN class="punctuation token">:</SPAN> row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> updateDict<SPAN class="punctuation token">[</SPAN>row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="comment token"># line segment (starting point's JOINT___UP value)</SPAN> row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> updateDict<SPAN class="punctuation token">[</SPAN>row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="number token">3</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="comment token"># segment order</SPAN> cursor<SPAN class="punctuation token">.</SPAN>updateRow<SPAN class="punctuation token">(</SPAN>row<SPAN class="punctuation token">)</SPAN> <SPAN class="keyword token">except</SPAN> KeyError<SPAN class="punctuation token">:</SPAN> <SPAN class="keyword token">print</SPAN> <SPAN class="string token">"Unable to process row: {}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">)</SPAN> row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">1</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="string token">'ERROR'</SPAN> row<SPAN class="punctuation token">[</SPAN><SPAN class="number token">2</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN> cursor<SPAN class="punctuation token">.</SPAN>updateRow<SPAN class="punctuation token">(</SPAN>row<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>
Randy,
I wanted to apologize for the delay in responding to you. I was out of the office all of this week. I just had a chance to look and the modifications worked perfectly! I should of caught it when I was munging the data. What was actually going on is that there is a T joint in the line. I modified one of the three intersecting lines as well as inserted the modified condition and it worked perfectly. Thank you sincerely for your help!
I believe there are some data entry issues with the some of the rows in Weld 1. I have made some code adjustments in the answer above. You should replace the while block and the update cursor block.
One of the errors appears to be a circular reference. I believe that rows 1138 and 1139 should go between 328 and 329. I suspect an error with the values 533 and 533A. Since these values follow the 1:1 rule of matching up:down values, neither value was identified as the start and stop of a line segment. Therefore, it was causing a KeyError in the update cursor.
OID UP DOWN LINE SEGMENT 330 543 540 1029 37 329 540 533 1029 38 1138 533A 536A (circular reference) 1139 536A 533A 328 533 519 1029 39 327 519 527 1029 40 <SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>
The second error is a bit more puzzling. The points are in proximity, but I am not sure how they are connected. Does the down T-3 connect to row 1158 or 1144. Numerically, 1144 makes sense, but with the 1:1 rule, T3 should only be in the up column once. And there are two single points that are not connected unless I1220F connects to 1220F.
OID UP DOWN LINE SEGMENT 1142 1216E L-11 IJ-2 2 1143 L-11 T-3 IJ-2 3 1156 I1220F YL-1 I1220F 1 1157 FL-11 1220F FL-11 1 1158 T-3 FL-2 IJ-2 4 1144 T-3 1216B ERROR -1 1145 1216B FL13 1216B 1<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>
I would assume the errors are data entry errors. The code adjustments should help identify some of them.
Hi Randy, I was hoping you might be able to help me once more. I've had success with this code up until this point. I've successfully used it in both 2.7 and 3.5 after correcting the print statements however I've hit a wall on a recent file. The fileds are slightly different however the 5 fields that I understand are being used are the same (ObjectID, JOINT___UP, JOINT___DO, LineSeg, SegOrder) I can't figure out what is different but it seems that the keys in the value dictionaries are not working correctly? any help you con provide is greatly appreciated. I've uploaded a GDB that has two files. The one called Weld works correctly however the one called Weld1 does not.
Hi Randy,
I just ran this and it worked perfectly! thank you so much for the solution!
Thank you for your help Darren,
I think I will have to figure out why some segments didn't get identified as a start or a stop as there are a few in there. Lines 2 and 3 have duplicate Line_POS ID's (they could possibly actually have duplicate Line_ID's causing multiple Line_POS_ID's) Of the 874 points in the sample file, I have 64 without a LINE_D or Line_POS_ID and 51 with duplicate Line_ID & LINE_POS_ID.
Hi Randy, The up and downs do not refer to an OID they are somewhat random however they are set based on an joint of a line as part of a separate asset management system. They are all unique for the line system so none of them overlap. The L and C do not correlate with a start and a stop unfortunately. The one thing that is consistent is that for every up there is a matching down and vise versa with the exception of the start and end of a line segment. I hope that helps.
It looks like, for some reason, the start point for the last line segment (line 57:
<SPAN class="" style="color: #990000; border: 0px; font-weight: inherit;">867</SPAN> <SPAN class="" style="color: #990000; border: 0px; font-weight: inherit;">655</SPAN> <SPAN class="" style="color: #990000; border: 0px; font-weight: inherit;">630</SPAN> <SPAN class="" style="color: #990000; border: 0px; font-weight: inherit;">False</SPAN> <SPAN class="" style="color: #990000; border: 0px; font-weight: inherit;">False</SPAN>
...did not get identified as a START. You can set it individually by:
df<SPAN class="" style="color: #999999; border: 0px; font-weight: inherit;">.</SPAN>at<SPAN class="" style="color: #999999; border: 0px; font-weight: inherit;">[867</SPAN><SPAN class="" style="color: #999999; border: 0px; font-weight: inherit;">,</SPAN><SPAN class="" style="color: #669900; border: 0px; font-weight: inherit;">'START'</SPAN><SPAN class="" style="color: #999999; border: 0px; font-weight: inherit;">]</SPAN> <SPAN class="" style="color: #a67f59; background: rgba(255, 255, 255, 0.5); border: 0px; font-weight: inherit;">=</SPAN> True
...or try to figure out why the last line segment didn't get identified as a START.
To assist in my understanding your question...
I am assuming the number in the up/down fields does not refer in any way to the OID. Could you explain the meaning of data such as L-60 and L-24A? Would these be line start/stop? Also, 630A and 666C? Would these be points used in multiple lines? Or would a line go L-60, 630A, 666C, 635, L-24A? And the next L-24A, 1083 ...etc?
Darren,
I was able to populate my array finally using arcpy to convert a Numpy Array to a pandas DataFrame like so:
<SPAN class="keyword token">import</SPAN> arcpy input <SPAN class="operator token">=</SPAN> <SPAN class="string token">"C:\Users\cstallings\Desktop\From_James\Import_Excel_to_Database\Example_points_for_sequence_from_two_fields.shp"</SPAN> arr <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>da<SPAN class="punctuation token">.</SPAN>TableToNumPyArray<SPAN class="punctuation token">(</SPAN>input<SPAN class="punctuation token">,</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="string token">'JOINT___UP'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'JOINT___DO'</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> data <SPAN class="operator token">=</SPAN> pd<SPAN class="punctuation token">.</SPAN>DataFrame<SPAN class="punctuation token">(</SPAN>arr<SPAN class="punctuation token">)</SPAN> df <SPAN class="operator token">=</SPAN> pd<SPAN class="punctuation token">.</SPAN>DataFrame<SPAN class="punctuation token">(</SPAN>data<SPAN class="punctuation token">,</SPAN> columns<SPAN class="operator token">=</SPAN><SPAN class="punctuation token">[</SPAN><SPAN class="string token">'JOINT___UP'</SPAN><SPAN class="punctuation token">,</SPAN> <SPAN class="string token">'JOINT___DO'</SPAN><SPAN class="punctuation token">,</SPAN><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>
I'm sure this is not the proper way but it did populate the DataFrame.
after running your suggested code it appears that some values came back NaN that i believe should not for example:
<SPAN class="operator token">>></SPAN><SPAN class="operator token">></SPAN> df JOINT___UP JOINT___DO START END LINE_ID LINE_POS_ID <SPAN class="number token">0</SPAN> <SPAN class="number token">1118</SPAN> <SPAN class="number token">1113</SPAN> <SPAN class="token boolean">True</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="number token">1113</SPAN> <SPAN class="number token">1121</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">2.0</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="number token">1121</SPAN> <SPAN class="number token">1115</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">3.0</SPAN> <SPAN class="number token">3</SPAN> <SPAN class="number token">1115</SPAN> <SPAN class="number token">1114</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">4.0</SPAN> <SPAN class="number token">4</SPAN> <SPAN class="number token">1114</SPAN> <SPAN class="number token">1123</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">5.0</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">1123</SPAN> <SPAN class="number token">1119</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">6.0</SPAN> <SPAN class="number token">6</SPAN> <SPAN class="number token">1119</SPAN> <SPAN class="number token">1112</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">7.0</SPAN> <SPAN class="number token">7</SPAN> <SPAN class="number token">1112</SPAN> <SPAN class="number token">1116</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">8.0</SPAN> <SPAN class="number token">8</SPAN> <SPAN class="number token">1116</SPAN> <SPAN class="number token">1122</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">9.0</SPAN> <SPAN class="number token">9</SPAN> <SPAN class="number token">1122</SPAN> <SPAN class="number token">1043</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">10.0</SPAN> <SPAN class="number token">10</SPAN> <SPAN class="number token">1043</SPAN> <SPAN class="number token">1045</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">11.0</SPAN> <SPAN class="number token">11</SPAN> <SPAN class="number token">1045</SPAN> <SPAN class="number token">1042</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">12.0</SPAN> <SPAN class="number token">12</SPAN> <SPAN class="number token">1042</SPAN> <SPAN class="number token">1038</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">13.0</SPAN> <SPAN class="number token">13</SPAN> <SPAN class="number token">1038</SPAN> <SPAN class="number token">1032</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">14.0</SPAN> <SPAN class="number token">14</SPAN> <SPAN class="number token">1032</SPAN> <SPAN class="number token">1044</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">15.0</SPAN> <SPAN class="number token">15</SPAN> <SPAN class="number token">1044</SPAN> <SPAN class="number token">1111</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">16.0</SPAN> <SPAN class="number token">16</SPAN> <SPAN class="number token">1111</SPAN> <SPAN class="number token">1110</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">17.0</SPAN> <SPAN class="number token">17</SPAN> <SPAN class="number token">1110</SPAN> <SPAN class="number token">1117</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">18.0</SPAN> <SPAN class="number token">18</SPAN> <SPAN class="number token">1117</SPAN> <SPAN class="number token">1031</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">19.0</SPAN> <SPAN class="number token">19</SPAN> <SPAN class="number token">1031</SPAN> <SPAN class="number token">1041</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">20.0</SPAN> <SPAN class="number token">20</SPAN> <SPAN class="number token">1041</SPAN> <SPAN class="number token">1009</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">21.0</SPAN> <SPAN class="number token">21</SPAN> <SPAN class="number token">1009</SPAN> <SPAN class="number token">1035</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">22.0</SPAN> <SPAN class="number token">22</SPAN> <SPAN class="number token">1035</SPAN> <SPAN class="number token">1040</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">23.0</SPAN> <SPAN class="number token">23</SPAN> <SPAN class="number token">1040</SPAN> <SPAN class="number token">1069</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">24.0</SPAN> <SPAN class="number token">24</SPAN> <SPAN class="number token">995</SPAN> <SPAN class="number token">1000</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">16.0</SPAN> <SPAN class="number token">4.0</SPAN> <SPAN class="number token">25</SPAN> <SPAN class="number token">1000</SPAN> <SPAN class="number token">1103</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">True</SPAN> <SPAN class="number token">16.0</SPAN> <SPAN class="number token">5.0</SPAN> <SPAN class="number token">26</SPAN> <SPAN class="number token">1003</SPAN> <SPAN class="number token">987</SPAN> <SPAN class="token boolean">True</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">2.0</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">27</SPAN> <SPAN class="number token">987</SPAN> <SPAN class="number token">985</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">2.0</SPAN> <SPAN class="number token">2.0</SPAN> <SPAN class="number token">28</SPAN> <SPAN class="number token">985</SPAN> <SPAN class="number token">993</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">2.0</SPAN> <SPAN class="number token">3.0</SPAN> <SPAN class="number token">29</SPAN> <SPAN class="number token">993</SPAN> <SPAN class="number token">978</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">2.0</SPAN> <SPAN class="number token">4.0</SPAN> <SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN> <SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN> <SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN> <SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN> <SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN> <SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN> <SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="punctuation token">.</SPAN> <SPAN class="number token">844</SPAN> <SPAN class="number token">135</SPAN> <SPAN class="number token">122</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">21.0</SPAN> <SPAN class="number token">12.0</SPAN> <SPAN class="number token">845</SPAN> <SPAN class="number token">122</SPAN> <SPAN class="number token">114</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">21.0</SPAN> <SPAN class="number token">13.0</SPAN> <SPAN class="number token">846</SPAN> <SPAN class="number token">114</SPAN> <SPAN class="number token">108</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">21.0</SPAN> <SPAN class="number token">14.0</SPAN> <SPAN class="number token">847</SPAN> <SPAN class="number token">108</SPAN> <SPAN class="number token">129</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">21.0</SPAN> <SPAN class="number token">15.0</SPAN> <SPAN class="number token">848</SPAN> <SPAN class="number token">129</SPAN> <SPAN class="number token">102</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">21.0</SPAN> <SPAN class="number token">16.0</SPAN> <SPAN class="number token">849</SPAN> <SPAN class="number token">102</SPAN> <SPAN class="number token">116</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">21.0</SPAN> <SPAN class="number token">17.0</SPAN> <SPAN class="number token">850</SPAN> <SPAN class="number token">116</SPAN> <SPAN class="number token">94</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">21.0</SPAN> <SPAN class="number token">18.0</SPAN> <SPAN class="number token">851</SPAN> <SPAN class="number token">94</SPAN> <SPAN class="number token">109</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">21.0</SPAN> <SPAN class="number token">19.0</SPAN> <SPAN class="number token">852</SPAN> <SPAN class="number token">109</SPAN> <SPAN class="number token">115</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">21.0</SPAN> <SPAN class="number token">20.0</SPAN> <SPAN class="number token">853</SPAN> <SPAN class="number token">115</SPAN> <SPAN class="number token">123</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">21.0</SPAN> <SPAN class="number token">21.0</SPAN> <SPAN class="number token">854</SPAN> <SPAN class="number token">123</SPAN> <SPAN class="number token">131</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">True</SPAN> <SPAN class="number token">21.0</SPAN> <SPAN class="number token">22.0</SPAN> <SPAN class="number token">855</SPAN> L<SPAN class="number token">-63A</SPAN> <SPAN class="number token">744</SPAN> <SPAN class="token boolean">True</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">22.0</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">856</SPAN> <SPAN class="number token">744</SPAN> L<SPAN class="number token">-57A</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">22.0</SPAN> <SPAN class="number token">2.0</SPAN> <SPAN class="number token">857</SPAN> L<SPAN class="number token">-57A</SPAN> <SPAN class="number token">675</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">22.0</SPAN> <SPAN class="number token">3.0</SPAN> <SPAN class="number token">858</SPAN> <SPAN class="number token">675</SPAN> <SPAN class="number token">744A</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">True</SPAN> <SPAN class="number token">22.0</SPAN> <SPAN class="number token">4.0</SPAN> <SPAN class="number token">859</SPAN> <SPAN class="number token">168</SPAN> <SPAN class="number token">159</SPAN> <SPAN class="token boolean">True</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">23.0</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">860</SPAN> <SPAN class="number token">159</SPAN> <SPAN class="number token">151</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">23.0</SPAN> <SPAN class="number token">2.0</SPAN> <SPAN class="number token">861</SPAN> <SPAN class="number token">151</SPAN> <SPAN class="number token">158</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">23.0</SPAN> <SPAN class="number token">3.0</SPAN> <SPAN class="number token">862</SPAN> <SPAN class="number token">158</SPAN> <SPAN class="number token">166</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">23.0</SPAN> <SPAN class="number token">4.0</SPAN> <SPAN class="number token">863</SPAN> <SPAN class="number token">166</SPAN> <SPAN class="number token">145</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">23.0</SPAN> <SPAN class="number token">5.0</SPAN> <SPAN class="number token">864</SPAN> <SPAN class="number token">145</SPAN> <SPAN class="number token">144</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">23.0</SPAN> <SPAN class="number token">6.0</SPAN> <SPAN class="number token">865</SPAN> <SPAN class="number token">144</SPAN> <SPAN class="number token">120</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">23.0</SPAN> <SPAN class="number token">7.0</SPAN> <SPAN class="number token">866</SPAN> <SPAN class="number token">120</SPAN> <SPAN class="number token">154</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">True</SPAN> <SPAN class="number token">23.0</SPAN> <SPAN class="number token">8.0</SPAN> <SPAN class="number token">867</SPAN> <SPAN class="number token">655</SPAN> <SPAN class="number token">630</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> NaN NaN <SPAN class="number token">868</SPAN> <SPAN class="number token">630</SPAN> L<SPAN class="number token">-60</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> NaN NaN <SPAN class="number token">869</SPAN> L<SPAN class="number token">-60</SPAN> <SPAN class="number token">630A</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> NaN NaN <SPAN class="number token">870</SPAN> <SPAN class="number token">630A</SPAN> <SPAN class="number token">666C</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> NaN NaN <SPAN class="number token">871</SPAN> <SPAN class="number token">666C</SPAN> <SPAN class="number token">635</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> NaN NaN <SPAN class="number token">872</SPAN> <SPAN class="number token">635</SPAN> L<SPAN class="number token">-24A</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> NaN NaN <SPAN class="number token">873</SPAN> L<SPAN class="number token">-24A</SPAN> <SPAN class="number token">1083</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">True</SPAN> NaN NaN<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>
I'm way over my head at the moment but I think I'm pretty close to getting the values needed and populating new attribute fields from them.
Thank you again for your help!
Thank you Darren, I've uploaded an example file. Admittedly I'm having a little trouble running this. This is 100% due to my poor python skills. I'm using 2.7 in ArcMap 10.6. I don't believe I am indexing the dataframe correctly for 'UP' and 'Down' (I modified them to match their names in the shapefile) however I very well could be completely wrong. I really appreciate your help with this.
Assuming your data looks like this (I added PRE_ORDER_ID and PRE_LINE_ID as columns indicating the desired final output):
import pandas as pd data = [ [30, 56, 1, 1], [78, 45, 5, 1], [45, 59, 6, 1], [59, 64, 7, 1], [12, 48, 3, 1], [56, 12, 2, 1], [48, 78, 4, 1], [82, 10, 3, 2], [84, 99, 5, 2], [79, 95, 1, 2], [95, 82, 2, 2], [10, 84, 4, 2], ] df = pd.DataFrame(data, columns=['UP', 'DOWN', 'PRE_ORDER_ID', 'PRE_LINE_ID']) df<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>
...then you should be able to do something like this:
<SPAN class="comment token"># determine if the point is a start, end, or neither</SPAN> <SPAN class="keyword token">for</SPAN> index<SPAN class="punctuation token">,</SPAN> row <SPAN class="keyword token">in</SPAN> df<SPAN class="punctuation token">.</SPAN>iterrows<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN> df<SPAN class="punctuation token">.</SPAN>at<SPAN class="punctuation token">[</SPAN>index<SPAN class="punctuation token">,</SPAN><SPAN class="string token">'START'</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> row<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'UP'</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">not</SPAN> <SPAN class="keyword token">in</SPAN> df<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'DOWN'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">.</SPAN>values df<SPAN class="punctuation token">.</SPAN>at<SPAN class="punctuation token">[</SPAN>index<SPAN class="punctuation token">,</SPAN><SPAN class="string token">'END'</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> row<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'DOWN'</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">not</SPAN> <SPAN class="keyword token">in</SPAN> df<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'UP'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">.</SPAN>values counter <SPAN class="operator token">=</SPAN> <SPAN class="number token">0</SPAN> line_counter <SPAN class="operator token">=</SPAN> <SPAN class="number token">1</SPAN> pos_counter <SPAN class="operator token">=</SPAN> <SPAN class="number token">1</SPAN> cur_index <SPAN class="operator token">=</SPAN> <SPAN class="number token">0</SPAN> <SPAN class="keyword token">while</SPAN> counter <SPAN class="operator token"><</SPAN> <SPAN class="number token">100</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="comment token"># I'm paranoid about while loops, so change when you're comfortable</SPAN> df<SPAN class="punctuation token">.</SPAN>at<SPAN class="punctuation token">[</SPAN>cur_index<SPAN class="punctuation token">,</SPAN><SPAN class="string token">'LINE_ID'</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> line_counter <SPAN class="comment token"># record line number</SPAN> df<SPAN class="punctuation token">.</SPAN>at<SPAN class="punctuation token">[</SPAN>cur_index<SPAN class="punctuation token">,</SPAN><SPAN class="string token">'LINE_POS_ID'</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">=</SPAN> pos_counter <SPAN class="comment token"># record position number</SPAN> <SPAN class="keyword token">if</SPAN> df<SPAN class="punctuation token">.</SPAN>at<SPAN class="punctuation token">[</SPAN>cur_index<SPAN class="punctuation token">,</SPAN><SPAN class="string token">'END'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">:</SPAN> <SPAN class="comment token"># if it's an end point</SPAN> pos_counter <SPAN class="operator token">=</SPAN> <SPAN class="number token">0</SPAN> <SPAN class="comment token"># reset position counter</SPAN> line_counter <SPAN class="operator token">+=</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="comment token"># increment line counter</SPAN> cur_index <SPAN class="operator token">=</SPAN> df<SPAN class="punctuation token">.</SPAN>loc<SPAN class="punctuation token">[</SPAN>df<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'START'</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="operator token">&</SPAN> df<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'LINE_ID'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">.</SPAN>isnull<SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">.</SPAN>index<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="comment token"># set index to next available start point</SPAN> <SPAN class="keyword token">else</SPAN><SPAN class="punctuation token">:</SPAN> down_val <SPAN class="operator token">=</SPAN> df<SPAN class="punctuation token">.</SPAN>at<SPAN class="punctuation token">[</SPAN>cur_index<SPAN class="punctuation token">,</SPAN><SPAN class="string token">'DOWN'</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="comment token"># find next point</SPAN> cur_index <SPAN class="operator token">=</SPAN> df<SPAN class="punctuation token">.</SPAN>loc<SPAN class="punctuation token">[</SPAN>df<SPAN class="punctuation token">[</SPAN><SPAN class="string token">'UP'</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="operator token">==</SPAN>down_val<SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">.</SPAN>index<SPAN class="punctuation token">[</SPAN><SPAN class="number token">0</SPAN><SPAN class="punctuation token">]</SPAN> <SPAN class="comment token"># set index</SPAN> pos_counter <SPAN class="operator token">+=</SPAN> <SPAN class="number token">1</SPAN> counter <SPAN class="operator token">+=</SPAN><SPAN class="number token">1</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>
...resulting in:
UP DOWN PRE_ORDER_ID PRE_LINE_ID START END LINE_ID LINE_POS_ID <SPAN class="number token">0</SPAN> <SPAN class="number token">30</SPAN> <SPAN class="number token">56</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="token boolean">True</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="number token">78</SPAN> <SPAN class="number token">45</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">5.0</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="number token">45</SPAN> <SPAN class="number token">59</SPAN> <SPAN class="number token">6</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">6.0</SPAN> <SPAN class="number token">3</SPAN> <SPAN class="number token">59</SPAN> <SPAN class="number token">64</SPAN> <SPAN class="number token">7</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">True</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">7.0</SPAN> <SPAN class="number token">4</SPAN> <SPAN class="number token">12</SPAN> <SPAN class="number token">48</SPAN> <SPAN class="number token">3</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">3.0</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">56</SPAN> <SPAN class="number token">12</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">2.0</SPAN> <SPAN class="number token">6</SPAN> <SPAN class="number token">48</SPAN> <SPAN class="number token">78</SPAN> <SPAN class="number token">4</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">4.0</SPAN> <SPAN class="number token">7</SPAN> <SPAN class="number token">82</SPAN> <SPAN class="number token">10</SPAN> <SPAN class="number token">3</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">2.0</SPAN> <SPAN class="number token">3.0</SPAN> <SPAN class="number token">8</SPAN> <SPAN class="number token">84</SPAN> <SPAN class="number token">99</SPAN> <SPAN class="number token">5</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">True</SPAN> <SPAN class="number token">2.0</SPAN> <SPAN class="number token">5.0</SPAN> <SPAN class="number token">9</SPAN> <SPAN class="number token">79</SPAN> <SPAN class="number token">95</SPAN> <SPAN class="number token">1</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="token boolean">True</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">2.0</SPAN> <SPAN class="number token">1.0</SPAN> <SPAN class="number token">10</SPAN> <SPAN class="number token">95</SPAN> <SPAN class="number token">82</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">2.0</SPAN> <SPAN class="number token">2.0</SPAN> <SPAN class="number token">11</SPAN> <SPAN class="number token">10</SPAN> <SPAN class="number token">84</SPAN> <SPAN class="number token">4</SPAN> <SPAN class="number token">2</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="token boolean">False</SPAN> <SPAN class="number token">2.0</SPAN> <SPAN class="number token">4.0</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>
...which you can use the last two columns to determine line ID, and position ID within the line.
A lot to digest for one paragraph! Sometimes it helps to step back and state your requirement/need instead of asking for help with a solution because there might be a better overall approach.
Do you need to have the sequences renumbered, or is the main need to take the series of points and turn them into a line?
If you can share some examples of your data, that is most helpful, even if you make up some data that resembles the structure of your actual data.
Signed in members can post, follow updates, and more. New here? Register a free account.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.