旋转系列的多边形以及包络

Rotating series of polygons aswell as the envelope

我在 geopandas 数据框中有一个多边形(矩形或非常接近它),它与 x 轴成一定角度,即它既不是水平的也不是垂直的。我有一个函数可以将多边形分割成更小的矩形(等轴测),但它只能(根据需要)作用于多边形,与 x 轴成 pi/2 倍数的角度。

所以,我的想法是旋转任何不满足我要求的多边形,将其分割并旋转回原来的位置。

例如:

polygon = 

id geometry
85 POLYGON ((49.37794 51.395203, 49.37794 51.395203, 49.37794 51.395203, 49.37794 51.395203, 49.178337 50.363914, 49.178337 50.363914, 49.178337 50.363914, 49.178337 50.363914, 59.99021 48.733814, 59.99021 48.733814, 59.99021 48.733814, 59.99021 48.733814, 60.223083 49.698566, 60.223083 49.698566, 60.223083 49.698566, 60.223083 49.698566, 49.37794 51.395203))

看起来像这样:

现在,我确定它与 x 轴的角度并旋转它:

polygon = pd.DataFrame(geostore_obstacles_geometry_polygon.loc[85:85,])
polygon['angle'] = polygon.apply(lambda row : polygon_angle(row['geometry']), axis = 1)
polygon = gpd.GeoDataFrame(polygon)
polygon = polygon.set_geometry('geometry')
polygon['rotated'] = polygon.apply(lambda row : shapely.affinity.rotate(row['geometry'], row['angle']), axis = 1)
polygon = polygon.set_geometry('rotated')

给出:

这一步将多边形分割成更小的部分:

polygon['add'] = polygon.apply(lambda row : split_polygon_up(row['rotated'],side_length=side_length, shape="square", thresh=threshold), axis = 1)
polygon = polygon.explode('add')
polygon = polygon.set_geometry('add')

在我最终将它旋转回来之前

polygon['rotated_add'] = polygon.apply(lambda row : shapely.rotate(row['add'], -row['angle']), axis = 1)
polygon = polygon.set_geometry('rotated_add')

但是,如您所想,这不是我期望的(抱歉图片太丑了)。

我明白为什么会这样,但我无法解决。我有一些想法,一种可能的解决方案是将所有较小的多边形与它们联合的凸包或包络一起旋转,但我很难使用 geopandas 来做到这一点。

如果您能就如何解决此问题提供任何帮助,我将不胜感激。所有转换后得到的dataframe可以在这里找到:https://drive.google.com/file/d/1wY7g3jsD7PNpaTkGBjbGvYArpRUr0UIk/view?usp=sharing

相关函数shapely.rotate()的默认选项是origin='center'。要围绕特定点 (x,y) 旋转,您必须使用 origin=(x,y).

明确指定

在您的特定情况下,原始多边形的质心是 (x,y) 的不错选择。