So if you have Multiple Ring Buffer boundaries defined at say 20, 50, and 100 miles, which 'Ring' does a point at exactly 50 miles fall in? Are the boundaries inclusive or exclusive limits? I have scoured the internet for an answer and cannot find a single post that addresses this.
Thanks in advance for your comments.
Darren, if you are using a select by location on those rings (assuming they are non-overlapping here) have you tried other rotation angles (fractional works best) to see if the ring is using some hidden 'tolerance' in its selection. Also, a calculation of the area of the ring inside a gdb and outside (shapefile) would give some clue as to the true geometry of the 'circle' n-gons will yield area less than expected based on the number of sides used to represent the circle.
PS
if your suspicion of the 2nd classification scheme being the case, this should be noted in the help topic. I will flag it for clarification
<Add Muddy Water>
Also, won't a shapefile potentially provide a different result than a geodatbase, as the rings are not parametric curves in a shapefile (instead they are composed of many tiny straight line segments)?
(I'm not sure on this)
Chris Donohue, GISP
</Add Muddy Water>
are they true parametric rings or just calculated on an add need basis. I haven't seen the output of the geometry exported to some 'useable' format... at least with shapefiles, the n-gon representation was there and could be played with as could that for the ellipse. I test using euclidean calculations in situations of simple geometry constructs rather than using selectbylocation tools/code/methods or equivalent. This works easily for regular geometry, from triangles,rectangles, pent*, hex* n-gon circle and ellipse etc.
Here's another way that indicates that the boundaries are identical:
>>> point = 'mypoints' # a point ... pt_geom = [i for i in arcpy.da.SearchCursor(point,'SHAPE@')][0][0] # get geometry ... buff = pt_geom.buffer(20) # buffer point by 20m ... buff_line = buff.boundary() # convert to line ... ring_buffs_fc = 'buffs' # premade multiple ring buffers (10-20m, and 20-30m) ... ring_buffs = [i for i in arcpy.da.SearchCursor(ring_buffs_fc,['SHAPE@','distance'])] # get geometries ... mypoints = [] # points container, otional ... counts = [] # counts list ... reps = 100000 # how many times to test ... for i in range(reps): # start looping ... new_point = buff_line.positionAlongLine(float(i)/reps,True) # create point at percentage along buffer line ... count = 0 # reset counter ... mypoints.append(new_point) # add point, optional ... for ring_buff in ring_buffs: # test against ring buffers ... if not ring_buff[0].disjoint(new_point): # see if disjoint ... count += 1 # add to count ... counts.append(count) # add count to list ... print (min(counts),max(counts)) # print min/max ... arcpy.CopyFeatures_management(mypoints,r'in_memory\points') # write points, optional ... (2, 2) # each and every record intersects 2 ring buffers
Darren, I presume a spatial reference was defined for the layer since geometry errors have been noted when one isn't set (written on many times). I know what you are doing, but I will try yours against, exporting the buffer (aka.... circle) geometry and do a center to point on circle geometry. If this is done on a shapefile, then you get 'hit' points where the buffer is exact, but the interpoint shape is determined by a straight line, hence an n-gon. So if you do a 'within' or 'on' distance calculation it will fall short unless the distance is calculated to a 'hit' point. I haven't experimented yet with gdb featureclasses, so I am worried about positionAlongLine and how it operates. Does it generate the location from the equation of a circle? or are points pre-generated to define the shape..therein lies my question. Something else to add to the list. In any event, if the point does lie on the boundary of two shapes, that should be reported differently than 'within' or 'on', ... perhaps 'shared' would be better in keeping with classification principles, since the rings should represent locations on a continuum. thanks
In my example above, if I calculate the distance between the points generated along the buffer line (20 m) to the original center point, they range from 19.999999999553737 to 20.000000000465356. However, they still "intersect" both geometries according to the software. I see what you're saying about n-gons, but if the software doesn't recognize it and the precision of the data almost certainly doesn't support it, then splitting hairs exactly with math doesn't do much good. Whether or not the buffers are true circles or n-gons, points falling on the boundary belong to both.
Thanks Darren for the additional information.
Most aren't interested in the geometry and its implications... therein lies my interests.
Fuzzy boundaries would be a nice addition to vector world as they have added, to some degree, in raster world An overview of fuzzy classes—Spatial Analyst module | ArcGIS for Desktop
It opens up a whole new realm of questions that can be addressed in vector world that are now addressed solely in raster world.
This is EXACTLY what I'm talking about, wondering about, trying to do. I will do some analysis with my data set tomorrow to try to validate, although I suspect the likelihood of a floating point distance landing exactly at 50 miles, for example, is astronomical. One might have to test with a bogus data set to get conclusive results.
Looking over the original question, I have some questions on terminology.
I don't mean to get hung up on semantics, or sound pedantic, but being precise matters when talking about specificities like this question. Additionally, there isn't one universally correct answer. Different geometry models or geometry implementations can treat edge cases differently, so it is important to frame the question in the context of the geometry model you are interested in. Since you are posting on GeoNet, it is likely Esri's ArcGIS Desktop geometry model, but even that is complicated by Esri supporting OGC simple features.
Basically, what I'm trying to ascertain is this: does a point at exactly 50 miles get assigned to and counted as a member of the 20 to 50 mile buffer, the 50 to 100 mile buffer, or both, when you spatially join a layer of xy data with a layer of multiple ring buffers.
Thanks