I want a quantification technique to differentiate different shapes of polygons. For example, the following image consists of 3 seperate polygons, e.g., (a) is stretched to its tails, (b) is bowl shaped, and (c) is a complex polygon.

enter image description here

Is there any geometrical way to differentiate these phenomenon?

For instance, if I want to segregate only the bowl shaped polygons, what would be the technique in GIS?

I dont want to use any kind of pattern recognition techniques, just looking for a geometrical solution in ArcGIS.

  • 1
    What has your research to date indicated?
    – Vince
    Apr 6 '18 at 1:03
  • 3
    One observation I have made is the ratio of perimeter (shape_length) to area is higher in A and C than in B, C is a bit more tricky, you could look at the convex hull containing the geometry and erase it with the geometry, C should have a higher outside area than B. How are you planning to implement this? What API/Language(s) do you plan to use? The best you're going to get is a value for stretchyness and complexity, which you will need to apply an arbitrary limit to determine what category the geometry falls in. Apr 6 '18 at 1:04
  • 1
    Thanks @MichaelStimson for your insights. The points you have mentioned seem interesting. I can only think of ArcPy for this work right now. As I have a lot of polygons to work with, I can implement these factors, e.g., ratio of length to area, and difference of convex hull geometry and shape geometry. Then, I can do a binary logistic regression to see which factor has higher importance in this classification. I will post the final findings.
    – sbhadra
    Apr 6 '18 at 1:23
  • 1
    That would be most interesting, have a read of polygon.convexHull() and polygon.difference() resources.arcgis.com/en/help/main/10.2/index.html#/Polygon/… to help with the difficult part. Assume your geometry is Geom then OutsideArea = Geom.convexHull().difference(Geom).area (make a convex hull and erase the inside returning the area)... you could do this on an arcpy.da.updateCursor and have a quantifiable value to work with (along with shape_length and shape_area if you're in a geodatabase, if you have a shapefile then you will need to get these from the polygon). Apr 6 '18 at 1:51

You can use some shape characteristics, e.g. orientation, elongation, convexity, rentangularity, compactness etc.

  • Orientation is direction angle of long axis of minimum area bounding rectangle (MABR) of a polygon.
  • Elongation is the ratio of the length of the MABR’s short axis to long axis.(b/a)
  • Convexity is the ratio of the polygon area to the area of its convex hull. area(Polygon)/area(ConvexHull)
  • Rectangularity is the ratio of polygon area to MABR area. area(Polygon)/area(MABR)
  • Compactness/Roundness is the ratio of the area of the circle with the same length as the polygon to the polygon area. area(Circle)/area(Polygon)

enter image description here

Then, you will come to a conclusion by comparing them. For example:

  • If compactness value is close to 1, it's almost bowl shaped.
  • If convexity is big, it's a complex polygon.
  • If elongation is far far away from 1 and orientation is close to 90 degree, it is stretched to its tails.

For further information, you may read this article: Performance of shape indices and classification schemes for characterising perceptual shape complexity of building footprints in GIS


Not the answer you're looking for? Browse other questions tagged or ask your own question.