Dear Members list,
First of all, I apologize to post this question modified and improved from a previous post. Recently i am working on shapefiles polygon in order to compute basic contour features:
- Area,
- Perimeter,
- Area convex hull,
- Perimeter convex hull,
- major axis length = gives the length of major axis,
- minor axis length = gives the length of minor axis,
where major and minor axis length are computed following the Figure:
Using osgeo.gdal, ogr and shapely is possible to load and calculate all indeces but not the major and minor axis length. Reading online solution can be using
- scikit-image = Measure region properties
- OpenCV
I am looking a straightforward solution in order to make my code easy and elegant. Some blogs suggest to make an ellipse approximation to my polygon in order to retrieve the major and minor axis length. Is it the best solution?
Any references would be quite helpful. Thanks in advance
import osgeo.gdal, ogr
from shapely.geometry import Polygon
shp = osgeo.ogr.Open('../examples/mypoly.shp')
layer = shp.GetLayer()
feature = layer.GetFeature(0)
geometry = feature.GetGeometryRef()
# get area
Area = geometry.GetArea()
pts = geometry.GetGeometryRef(0)
points = []
for p in range(pts.GetPointCount()):
points.append((pts.GetX(p), pts.GetY(p)))
polygon = Polygon(points)
# get Perimeter
Perimeter = polygon.length
# convex Hull
ConvexHull = polygon.convex_hull
# get Perimeter convex Hull
PerimeterConvexHull = ConvexHull.length
# get Area convex Hull
AreaConvexHull = ConvexHull.area
these are the coordinate vertices of my polygon
polygon = Polygon([(560023.4495758876400000 6362057.3904932579000000),(560023.4495758876400000 6362060.3904932579000000),(560024.4495758876400000 6362063.3904932579000000),(560026.9495758876400000 6362068.3904932579000000),(560028.4495758876400000 6362069.8904932579000000),(560034.9495758876400000 6362071.8904932579000000),(560036.4495758876400000 6362071.8904932579000000),(560037.4495758876400000 6362070.3904932579000000),(560037.4495758876400000 6362064.8904932579000000),(560036.4495758876400000 6362063.3904932579000000),(560034.9495758876400000 6362061.3904932579000000),(560026.9495758876400000 6362057.8904932579000000),(560025.4495758876400000 6362057.3904932579000000),(560023.4495758876400000 6362057.3904932579000000)])
in order to test my code from here:
polygon = Polygon(points)
# get Perimeter
Perimeter = polygon.length
# convex Hull
ConvexHull = polygon.convex_hull
# get Perimeter convex Hull
PerimeterConvexHull = ConvexHull.length
# get Area convex Hull
AreaConvexHull = ConvexHull.area
majoraxis_length
andminoraxis_length
, can you use these then? – ev-br