ArcGIS Desktop – Finding Parcel Polygon Features with Frontage on Multiple Streets

arcgis-9.3arcgis-desktoppolygon

The Department of Public Works would like to know how many properties in the city have a sidewalk at both the front and back. To get at this, I'm looking for a method to find parcels with frontage on more than one road. I'm working in ArcInfo 9.3.1 (file geodatabase). I'm looking for a solution that doesn't require scripting or downloading other tools. Street centerlines and parcel polygons are available; there is no sidewalk layer.

Using some of the ideas from this forum, I have developed and tested a process. Some of the results are puzzling (corner lots may or may not be included in the final results-I think DPW doesn't want corner lots included) and I'm concerned about scaling it up to the full 42000 parcels (I tested 1223 parcels).
Are there steps to add to this method to improve the results? Is there another way to accomplish the same thing that could be more automated through model builder?

  • Run Feature to Line tool on parcel polygons feature class (two lines are created for boundaries shared by polygons and lines retain parcel id)
  • Build a geodatabase topology with this newly created parcel line feature class using the rule “must not have overlaps” then validate topology (interior lines will be in error)
  • In ArcMap, add topology and feature class and open error inspector then search for errors > select all errors > right click > select features > delete (to delete interior lines)
  • Run Frequency on remaining features in parcel line feature class with parcel id as frequency field – select records in table where Frequency > 1 and export to new table
  • Join Frequency>1 table to parcel polygons based on parcel id, keeping only matching records – export join results

Best Answer

  1. If your road network is divided by segments, dissolve the buffers based on road name or some common attribute so that individual segments of roads do not count as two separate roads in the next step.

  2. Buffer your street centerlines by a standard amount - more than half the typical ROW width, but no so large that it would overlap parcels that do not front on it. You may want to choose different buffers for different classes of roads. When you buffer, don't merge the polygons.

  3. Spatially join the parcels to the road buffers, choosing "one to many". The "count" field on the results should allow you to identify all parcels with two frontages.

Now you have a table with rows for every overlap between a parcel and a road. You could easily summarize this to find all parcels overlapping two or more roads using either GIS or a database. But eliminating corner lots will be more tricky. Here's one broad method:

  1. Set up topology for the buffer layer with a rule "must not intersect".

  2. Export all errors to a new feature class of intersections.

  3. Spatial join the intersections to the buffer layer, choosing "one to many".

At this point you have two tables: one with all frontages and one with all intersections between roads. It won't be easy, but you can write a SQL query that selects finds all parcels that have two frontages where those frontages do not intersect. The results would be the set of all parcels that have multiple frontages that do not intersect.

One advantage of this method is that it avoids choosing parcels with edges that are not on roads, such as where a parcel is adjacent to an alley, a water features, a railroad ROW, etc. A disadvantage is that the buffering won't be perfect, and you'll still have to visually check it for errors.

I'm not sure how to write the SQL - perhaps someone else can chime in on that.

Edit Thoughts on the SQL:

It would be fairly simple to solve for parcels with two frontages as below. Then you might need to manually look at parcels with more than two frontages, but hopefully there would be few, and most would be corner lots anyway.

This might work for selecting only non-corner parcels with two frontages:

select ParcelID from parcels
where parcelID not in (
    ((select Parcels1.parcelID, intersections.intersectionID from
     intersections left join
        (Select first(RoadID) as Road1, last(RoadID) as Road2, count(*) as frontages, ParcelID
        from Parcels
        where count(*) = 2
        group by ParcelID) as Parcels1
    on intersections.RoadID = Parcels1.Road1) as int1
inner join
    (select Parcels2.parcelID, intersections.intersectionID from
    intersections left join
        (Select first(RoadID) as Road1, last(RoadID) as Road2, count(*) as frontages, ParcelID
        from Parcels
        where count(*) = 2
        group by ParcelID) as Parcels2
    on intersections.RoadID = Parcels2.Road2) as int2
on int1.intersectionID on int2.intersectionID))