Of course it is possible that an address point may be closer to a road that it is not addressed off of. An ArcINFO AML script can be used to loop through each street name. For each name it creates a subset of the streets and address points with that street name. It performs a NEAR command on those subset coverages and transfers the unique street coverage COVER-ID to the address points. Then it appends the resulting point coverages into one. The resulting coverage is basically the original address coverage with a few additional attributes, including the COVER-ID of the street centerline and the X and Y coordinate along the closest arc.
If [HOUSE_NUMBER] = Round( [HOUSE_NUMBER] / 2, 0) * 2 Then Output = "EVEN_HOUSE" Else Output = "ODD_HOUSE" End If
If [Distancec] > 0 Then Output = "LEFT_SIDE" Else Output = "RIGHT_SIDE" End If
If [OBJECTID] = Round( [OBJECTID] / 2 , 0) * 2 Then Output = [OBJECTID] + 1 Else Output = [OBJECTID] End If
Min_Meas = [CL_ENDS_LINES.MIN_MEAS] Asc_Desc = [ADDRESS_ODD_RIGHT_Full.ASC_DESC] Min_Min_Meas = [ADDRESS_ODD_RIGHT_Full.MIN_MIN_MEAS] Max_Max_Meas = [ADDRESS_ODD_RIGHT_Full.MAX_MAX_MEAS] House_Interval = [ADDRESS_ODD_RIGHT_Full.HOUSE_INTERVAL] Min_From_House_Number = [ADDRESS_ODD_RIGHT_Full.MIN_FROM_HOUSE_NUMBER] Max_To_House_Number = [ADDRESS_ODD_RIGHT_Full.MAX_TO_HOUSE_NUMBER] Max_From_House_Number = [ADDRESS_ODD_RIGHT_Full.MAX_FROM_HOUSE_NUMBER] Min_To_House_Number = [ADDRESS_ODD_RIGHT_Full.MIN_TO_HOUSE_NUMBER] If Asc_Desc = "Ascending" AND Min_Meas < Min_Min_Meas Then Raw = (Min_Meas - Min_Min_Meas) / House_Interval + Min_From_House_Number Output = Round((Min_Meas - Min_Min_Meas) / House_Interval/2, 0) * 2 + Min_From_House_Number If Output < Raw Then Output = Output + 2 ElseIf Asc_Desc = "Ascending" AND Min_Meas > Max_Max_Meas Then Raw = (Min_Meas - Max_Max_Meas) / House_Interval + Max_To_House_Number Output = Round((Min_Meas - Max_Max_Meas) / House_Interval/2, 0) * 2 + Max_To_House_Number If Output < Raw Then Output = Output + 2 ElseIf Asc_Desc = "Descending" AND Min_Meas < Min_Min_Meas Then Raw = (Min_Meas - Min_Min_Meas) / House_Interval + Max_From_House_Number Output = Round((Min_Meas - Min_Min_Meas) / House_Interval/2, 0) * 2 + Max_From_House_Number If Output > Raw Then Output = Output - 2 ElseIf Asc_Desc = "Descending" AND Min_Meas > Max_Max_Meas Then Raw = (Min_Meas - Max_Max_Meas) / House_Interval + Min_To_House_Number Output = Round((Min_Meas - Max_Max_Meas) / House_Interval/2, 0) * 2 + Min_To_House_Number If Output > Raw Then Output = Output - 2 Else Output = "" End If
Max_Meas = [CL_ENDS_LINES.MAX_MEAS] Asc_Desc = [ADDRESS_ODD_RIGHT_Full.ASC_DESC] Min_Min_Meas = [ADDRESS_ODD_RIGHT_Full.MIN_MIN_MEAS] Max_Max_Meas = [ADDRESS_ODD_RIGHT_Full.MAX_MAX_MEAS] House_Interval = [ADDRESS_ODD_RIGHT_Full.HOUSE_IINTERVAL] Min_From_House_Number = [ADDRESS_ODD_RIGHT_Full.MIN_FROM_HOUSE_NUMBER] Max_To_House_Number = [ADDRESS_ODD_RIGHT_Full.MAX_TO_HOUSE_NUMBER] Max_From_House_Number = [ADDRESS_ODD_RIGHT_Full.MAX_FROM_HOUSE_NUMBER] Min_To_House_Number = [ADDRESS_ODD_RIGHT_Full.MIN_TO_HOUSE_NUMBER] If Asc_Desc = "Ascending" AND Max_Meas < Min_Min_Meas Then Raw = (Max_Meas - Min_Min_Meas) / House_Interval + Min_From_House_Number Output = Round((Max_Meas - Min_Min_Meas) / House_Interval/2, 0) * 2 + Min_From_House_Number If Output > Raw Then Output = Output - 2 ElseIf Asc_Desc = "Ascending" AND Max_Meas > Max_Max_Meas Then Raw = (Max_Meas - Max_Max_Meas) / House_Interval + Max_To_House_Number Output = Round((Max_Meas - Max_Max_Meas) / House_Interval/2, 0) * 2 + Max_To_House_Number If Output > Raw Then Output = Output - 2 ElseIf Asc_Desc = "Descending" AND Max_Meas < Min_Min_Meas Then Raw = (Max_Meas - Min_Min_Meas) / House_Interval + Max_From_House_Number Output = Round((Max_Meas - Min_Min_Meas) / House_Interval/2, 0) * 2 + Max_From_House_Number If Output < Raw Then Output = Output + 2 ElseIf Asc_Desc = "Descending" AND Max_Meas > Max_Max_Meas Then Raw = (Max_Meas - Max_Max_Meas) / House_Interval + Min_To_House_Number Output = Round((Max_Meas - Max_Max_Meas) / House_Interval/2, 0) * 2 + Min_To_House_Number If Output < Raw Then Output = Output + 2 Else Output = "" End If
If [ADDRESS_ODD_RIGHT_Full.ASC_DESC] = "Ascending" AND [CL_ENDS_LINES.MIN_MEAS] < [ADDRESS_ODD_RIGHT_Full.MIN_MIN_MEAS] Then Raw = ([CL_ENDS_LINES.MIN_MEAS] - [ADDRESS_ODD_RIGHT_Full.MIN_MIN_MEAS]) / [ADDRESS_ODD_RIGHT_Full.HOUSE_INTERVAL] + [ADDRESS_ODD_RIGHT_Full.MIN_FROM_HOUSE_NUMBER] Output = Round(([CL_ENDS_LINES.MIN_MEAS] - [ADDRESS_ODD_RIGHT_Full.MIN_MIN_MEAS]) / [ADDRESS_ODD_RIGHT_Full.HOUSE_INTERVAL]/2, 0) * 2 + [ADDRESS_ODD_RIGHT_Full.MIN_FROM_HOUSE_NUMBER] If Output < Raw Then Output = Output + 2 ElseIf [ADDRESS_ODD_RIGHT_Full.ASC_DESC] = "Ascending" AND [CL_ENDS_LINES.MIN_MEAS] > [ADDRESS_ODD_RIGHT_Full.MAX_MAX_MEAS] Then Raw = ([CL_ENDS_LINES.MIN_MEAS] - [ADDRESS_ODD_RIGHT_Full.MAX_MAX_MEAS]) / [ADDRESS_ODD_RIGHT_Full.HOUSE_INTERVAL] + [ADDRESS_ODD_RIGHT_Full.MAX_TO_HOUSE_NUMBER] Output = Round(([CL_ENDS_LINES.MIN_MEAS] - [ADDRESS_ODD_RIGHT_Full.MAX_MAX_MEAS]) / [ADDRESS_ODD_RIGHT_Full.HOUSE_INTERVAL]/2, 0) * 2 + [ADDRESS_ODD_RIGHT_Full.MAX_TO_HOUSE_NUMBER] If Output < Raw Then Output = Output + 2 ElseIf [ADDRESS_ODD_RIGHT_Full.ASC_DESC] = "Descending" AND [CL_ENDS_LINES.MIN_MEAS] < [ADDRESS_ODD_RIGHT_Full.MIN_MIN_MEAS] Then Raw = ([CL_ENDS_LINES.MIN_MEAS] - [ADDRESS_ODD_RIGHT_Full.MIN_MIN_MEAS]) / [ADDRESS_ODD_RIGHT_Full.HOUSE_INTERVAL] + [ADDRESS_ODD_RIGHT_Full.MAX_FROM_HOUSE_NUMBER] Output = Round(([CL_ENDS_LINES.MIN_MEAS] - [ADDRESS_ODD_RIGHT_Full.MIN_MIN_MEAS]) / [ADDRESS_ODD_RIGHT_Full.HOUSE_INTERVAL]/2, 0) * 2 + [ADDRESS_ODD_RIGHT_Full.MAX_FROM_HOUSE_NUMBER] If Output > Raw Then Output = Output - 2 ElseIf [ADDRESS_ODD_RIGHT_Full.ASC_DESC] = "Descending" AND [CL_ENDS_LINES.MIN_MEAS] > [ADDRESS_ODD_RIGHT_Full.MAX_MAX_MEAS] Then Raw = ([CL_ENDS_LINES.MIN_MEAS] - [ADDRESS_ODD_RIGHT_Full.MAX_MAX_MEAS]) / [ADDRESS_ODD_RIGHT_Full.HOUSE_INTERVAL] + [ADDRESS_ODD_RIGHT_Full.MIN_TO_HOUSE_NUMBER] Output = Round(([CL_ENDS_LINES.MIN_MEAS] - [ADDRESS_ODD_RIGHT_Full.MAX_MAX_MEAS]) / [ADDRESS_ODD_RIGHT_Full.HOUSE_INTERVAL]/2, 0) * 2 + [ADDRESS_ODD_RIGHT_Full.MIN_TO_HOUSE_NUMBER] If Output > Raw Then Output = Output - 2 Else Output = "" End If
If [ADDRESS_ODD_RIGHT_Full.ASC_DESC] = "Ascending" AND [CL_ENDS_LINES.MAX_MEAS] < [ADDRESS_ODD_RIGHT_Full.MIN_MIN_MEAS] Then Raw = ([CL_ENDS_LINES.MAX_MEAS] - [ADDRESS_ODD_RIGHT_Full.MIN_MIN_MEAS]) / [ADDRESS_ODD_RIGHT_Full.HOUSE_INTERVAL] + [ADDRESS_ODD_RIGHT_Full.MIN_FROM_HOUSE_NUMBER] Output = Round(([CL_ENDS_LINES.MAX_MEAS] - [ADDRESS_ODD_RIGHT_Full.MIN_MIN_MEAS]) / [ADDRESS_ODD_RIGHT_Full.HOUSE_INTERVAL]/2, 0) * 2 + [ADDRESS_ODD_RIGHT_Full.MIN_FROM_HOUSE_NUMBER] If Output > Raw Then Output = Output - 2 ElseIf [ADDRESS_ODD_RIGHT_Full.ASC_DESC] = "Ascending" AND [CL_ENDS_LINES.MAX_MEAS] > [ADDRESS_ODD_RIGHT_Full.MAX_MAX_MEAS] Then Raw = ([CL_ENDS_LINES.MAX_MEAS] - [ADDRESS_ODD_RIGHT_Full.MAX_MAX_MEAS]) / [ADDRESS_ODD_RIGHT_Full.HOUSE_INTERVAL] + [ADDRESS_ODD_RIGHT_Full.MAX_TO_HOUSE_NUMBER] Output = Round(([CL_ENDS_LINES.MAX_MEAS] - [ADDRESS_ODD_RIGHT_Full.MAX_MAX_MEAS]) / [ADDRESS_ODD_RIGHT_Full.HOUSE_INTERVAL]/2, 0) * 2 + [ADDRESS_ODD_RIGHT_Full.MAX_TO_HOUSE_NUMBER] If Output > Raw Then Output = Output - 2 ElseIf [ADDRESS_ODD_RIGHT_Full.ASC_DESC] = "Descending" AND [CL_ENDS_LINES.MAX_MEAS] < [ADDRESS_ODD_RIGHT_Full.MIN_MIN_MEAS] Then Raw = ([CL_ENDS_LINES.MAX_MEAS] - [ADDRESS_ODD_RIGHT_Full.MIN_MIN_MEAS]) / [ADDRESS_ODD_RIGHT_Full.HOUSE_INTERVAL] + [ADDRESS_ODD_RIGHT_Full.MAX_FROM_HOUSE_NUMBER] Output = Round(([CL_ENDS_LINES.MAX_MEAS] - [ADDRESS_ODD_RIGHT_Full.MIN_MIN_MEAS]) / [ADDRESS_ODD_RIGHT_Full.HOUSE_INTERVAL]/2, 0) * 2 + [ADDRESS_ODD_RIGHT_Full.MAX_FROM_HOUSE_NUMBER] If Output < Raw Then Output = Output + 2 ElseIf [ADDRESS_ODD_RIGHT_Full.ASC_DESC] = "Descending" AND [CL_ENDS_LINES.MAX_MEAS] > [ADDRESS_ODD_RIGHT_Full.MAX_MAX_MEAS] Then Raw = ([CL_ENDS_LINES.MAX_MEAS] - [ADDRESS_ODD_RIGHT_Full.MAX_MAX_MEAS]) / [ADDRESS_ODD_RIGHT_Full.HOUSE_INTERVAL] + [ADDRESS_ODD_RIGHT_Full.MIN_TO_HOUSE_NUMBER] Output = Round(([CL_ENDS_LINES.MAX_MEAS] - [ADDRESS_ODD_RIGHT_Full.MAX_MAX_MEAS]) / [ADDRESS_ODD_RIGHT_Full.HOUSE_INTERVAL]/2, 0) * 2 + [ADDRESS_ODD_RIGHT_Full.MIN_TO_HOUSE_NUMBER] If Output < Raw Then Output = Output + 2 Else Output = "" End If
If [ADDRESS_EVEN_LEFT_Lines_Sum.ASC_DESC] = "Ascending" AND [CL_ENDS_LINES.MIN_MEAS] < [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_FROM_MEAS] Then Raw = ([CL_ENDS_LINES.MIN_MEAS] - [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_FROM_MEAS]) * [ADDRESS_EVEN_LEFT_Lines_Sum.HOUSE_INTERVAL] + [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_MIN_HOUSE_NUMBER] Output = Round(([CL_ENDS_LINES.MIN_MEAS] - [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_FROM_MEAS]) * [ADDRESS_EVEN_LEFT_Lines_Sum.HOUSE_INTERVAL]/2, 0) * 2 + [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_MIN_HOUSE_NUMBER] If Output < Raw Then Output = Output + 2 ElseIf [ADDRESS_EVEN_LEFT_Lines_Sum.ASC_DESC] = "Ascending" AND [CL_ENDS_LINES.MIN_MEAS] > [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_TO_MEAS] Then Raw = ([CL_ENDS_LINES.MIN_MEAS] - [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_TO_MEAS]) * [ADDRESS_EVEN_LEFT_Lines_Sum.HOUSE_INTERVAL] + [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_MAX_HOUSE_NUMBER] Output = Round(([CL_ENDS_LINES.MIN_MEAS] - [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_TO_MEAS]) * [ADDRESS_EVEN_LEFT_Lines_Sum.HOUSE_INTERVAL]/2, 0) * 2 + [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_MAX_HOUSE_NUMBER] If Output < Raw Then Output = Output + 2 ElseIf [ADDRESS_EVEN_LEFT_Lines_Sum.ASC_DESC] = "Descending" AND [CL_ENDS_LINES.MIN_MEAS] < [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_FROM_MEAS] Then Raw = ([CL_ENDS_LINES.MIN_MEAS] - [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_FROM_MEAS]) * [ADDRESS_EVEN_LEFT_Lines_Sum.HOUSE_INTERVAL] + [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_MAX_HOUSE_NUMBER] Output = Round(([CL_ENDS_LINES.MIN_MEAS] - [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_FROM_MEAS]) * [ADDRESS_EVEN_LEFT_Lines_Sum.HOUSE_INTERVAL]/2, 0) * 2 + [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_MAX_HOUSE_NUMBER] If Output > Raw Then Output = Output - 2 ElseIf [ADDRESS_EVEN_LEFT_Lines_Sum.ASC_DESC] = "Descending" AND [CL_ENDS_LINES.MIN_MEAS] > [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_TO_MEAS] Then Raw = ([CL_ENDS_LINES.MIN_MEAS] - [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_TO_MEAS]) * [ADDRESS_EVEN_LEFT_Lines_Sum.HOUSE_INTERVAL] + [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_MIN_HOUSE_NUMBER] Output = Round(([CL_ENDS_LINES.MIN_MEAS] - [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_TO_MEAS]) * [ADDRESS_EVEN_LEFT_Lines_Sum.HOUSE_INTERVAL]/2, 0) * 2 + [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_MIN_HOUSE_NUMBER] If Output > Raw Then Output = Output - 2 Else Output = "" End If
If [ADDRESS_EVEN_LEFT_Lines_Sum.ASC_DESC] = "Ascending" AND [CL_ENDS_LINES.MAX_MEAS] < [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_FROM_MEAS] Then Raw = ([CL_ENDS_LINES.MAX_MEAS] - [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_FROM_MEAS]) * [ADDRESS_EVEN_LEFT_Lines_Sum.HOUSE_INTERVAL] + [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_MIN_HOUSE_NUMBER] Output = Round(([CL_ENDS_LINES.MAX_MEAS] - [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_FROM_MEAS]) * [ADDRESS_EVEN_LEFT_Lines_Sum.HOUSE_INTERVAL]/2, 0) * 2 + [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_MIN_HOUSE_NUMBER] If Output > Raw Then Output = Output - 2 ElseIf [ADDRESS_EVEN_LEFT_Lines_Sum.ASC_DESC] = "Ascending" AND [CL_ENDS_LINES.MAX_MEAS] > [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_TO_MEAS] Then Raw = ([CL_ENDS_LINES.MAX_MEAS] - [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_TO_MEAS]) * [ADDRESS_EVEN_LEFT_Lines_Sum.HOUSE_INTERVAL] + [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_MAX_HOUSE_NUMBER] Output = Round(([CL_ENDS_LINES.MAX_MEAS] - [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_TO_MEAS]) * [ADDRESS_EVEN_LEFT_Lines_Sum.HOUSE_INTERVAL]/2, 0) * 2 + [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_MAX_HOUSE_NUMBER] If Output > Raw Then Output = Output - 2 ElseIf [ADDRESS_EVEN_LEFT_Lines_Sum.ASC_DESC] = "Descending" AND [CL_ENDS_LINES.MAX_MEAS] < [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_FROM_MEAS] Then Raw = ([CL_ENDS_LINES.MAX_MEAS] - [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_FROM_MEAS]) * [ADDRESS_EVEN_LEFT_Lines_Sum.HOUSE_INTERVAL] + [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_MAX_HOUSE_NUMBER] Output = Round(([CL_ENDS_LINES.MAX_MEAS] - [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_FROM_MEAS]) * [ADDRESS_EVEN_LEFT_Lines_Sum.HOUSE_INTERVAL]/2, 0) * 2 + [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_MAX_HOUSE_NUMBER] If Output < Raw Then Output = Output + 2 ElseIf [ADDRESS_EVEN_LEFT_Lines_Sum.ASC_DESC] = "Descending" AND [CL_ENDS_LINES.MAX_MEAS] > [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_TO_MEAS] Then Raw = ([CL_ENDS_LINES.MAX_MEAS] - [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_TO_MEAS]) * [ADDRESS_EVEN_LEFT_Lines_Sum.HOUSE_INTERVAL] + [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_MIN_HOUSE_NUMBER] Output = Round(([CL_ENDS_LINES.MAX_MEAS] - [ADDRESS_EVEN_LEFT_Lines_Sum.MAX_TO_MEAS]) * [ADDRESS_EVEN_LEFT_Lines_Sum.HOUSE_INTERVAL]/2, 0) * 2 + [ADDRESS_EVEN_LEFT_Lines_Sum.MIN_MIN_HOUSE_NUMBER] If Output < Raw Then Output = Output + 2 Else Output = "" End If
Raw_House = ( [TO_HOUSE_NUMBER] - [FROM_HOUSE_NUMBER] ) * ( [meas] - [FROM_MEAS] ) / ( [TO_MEAS] - [FROM_MEAS] ) + [FROM_HOUSE_NUMBER] Int_House = Round(( [TO_HOUSE_NUMBER] - [FROM_HOUSE_NUMBER] ) * ( [meas] - [FROM_MEAS] ) / ( [TO_MEAS] - [FROM_MEAS] ) / 2, 0) * 2 + [FROM_HOUSE_NUMBER] If [FROM_HOUSE_NUMBER] < [TO_HOUSE_NUMBER] Then If Int_House < Raw_House Then Output = Int_House + 2 Else Output = Int_House End If Else If Int_House > Raw_House Then Output = Int_House - 2 Else Output = Int_House End If End If
Raw_House = ( [TO_HOUSE_NUMBER] - [FROM_HOUSE_NUMBER] ) * ( [meas] - [FROM_MEAS] ) / ( [TO_MEAS] - [FROM_MEAS] ) + [FROM_HOUSE_NUMBER] Int_House = Round(( [TO_HOUSE_NUMBER] - [FROM_HOUSE_NUMBER] ) * ( [meas] - [FROM_MEAS] ) / ( [TO_MEAS] - [FROM_MEAS] ) / 2, 0) * 2 + [FROM_HOUSE_NUMBER] If [FROM_HOUSE_NUMBER] < [TO_HOUSE_NUMBER] Then If Int_House < Raw_House Then Output = Int_House Else Output = Int_House - 2 End If Else If Int_House > Raw_House Then Output = Int_House Else Output = Int_House + 2 End If End If
If [ASC_DESC] = "Ascending" then Output = ([MAX_TO_MEAS] - [MIN_FROM_MEAS]) / ( [MAX_MAX_HOUSE_NUMBER] - [MIN_MIN_HOUSE_NUMBER]) ElseIf [ASC_DESC] = "Descending" then Output = ([MIN_FROM_MEAS] - [MAX_TO_MEAS]) / ( [MAX_MAX_HOUSE_NUMBER] - [MIN_MIN_HOUSE_NUMBER]) End If
If [OBJECTID] <> ROUND([OBJECTID] / 2, 0) * 2 Then Output = "From_End" Else Output = "To_End" End If
Determining positions along the lines relative to the ends of the lines is what Linear Referencing can much more easily analyze than a simple Spatial Join or Near tool match. It also is the only method that can deal with ordering your chains of segments that need to match up the ranges where their ends meet in a logical, sortable manner.Linear Referencing is the only method that is capable of ordering adjoining road segments and lists of intersections along a given road according to the way you would actually drive a road from one end to the other. It is therefore ideal for this kind of problem.
For those line segs without joined address numbers, you can:1. Extract those segs and export them as one feature class - class A, and export the another part segs (with address number) as the another feature class - class B; 2. Convert the class B to the point feature class - class C, then join (Intesect Spatial Join) the Class C to the class A - joined point class D;3. Then join the class D table back to the Class A by using common field (line ID) and the output as Class E;4. Open the Class E table, you can transfer the Min & Max number from joined fields (you need to know which one is Min & Max due to double Min & Max values joined - the larger Min value from both Min values is Max value for this seg, and less Max value from bothe Max values is Min value for this seg.After above process, you may couldn't assign address for all non-address segs (ig. two adjacent non-address lines), you may need to repeat above process.
Thank you, I did not think of using a join then summarize. This may be a simpler answer than what I anticipated. Thank you and I'll give it a try.Langdon
The relationship between points (address) and lines (network) is "many-to-1", so you need:1. Using "Spatial Join" function (also called Near - in old ArcInfo version) to join line class to point class (point as target layer), the output joined point layer should have the line ID field;2.Open the joined the point layer's attribute table, go to the ID field (from line layer), using "Field Summarize" function to get the Min and Max values for the Address number field (if the Address field data type is Text, convert it to Intege first), this summarized output should be one standalone table;3.Using "Common Field" (line ID) to join that summarized standalone table back to the original line feature class, export it as one joined feature class;4.In the joined line feature class, the Min field should be the start address number and the Max field should be the end address number - you can merge both fields to one new field (call it as Address Range) to fit your application.
My theory for the workflow would be as followsDefine the two feature classes (street centerline & address points)Define the field names I will be referencing for street name (STR_NAME in both)Create a search cursor that cycles through each address point record, and identifying its street name (Main, Oak, Broadway, etc)Output the street name from the address pointRun a definition query for the centerline where STR_NAME = the output from address point street name Run the NEAR function for Address point to Centerline with this definition in effect(creating the appropriate fields)Clear the centerline definition queryNext row in the Address PointsrepeatAm I on the right track? I am learning the code and formatting so will update as help is needed.
Angemeldete Mitglieder können Beiträge verfassen, Updates folgen und mehr. Neu hier? Registriere ein kostenloses Konto.
Find useful guides, FAQs, and documents to help you navigate and make the most of Esri Community.