如何将WKT多边形质心移至原点(0,0)?问题排查与解决
将WKT多边形质心移至原点的问题解决
问题描述
我有一个WKT多边形对象,希望将其质心移动到原点(0,0),但尝试的代码未达到预期效果,示例代码如下:
from shapely import wkt poly_str = 'POLYGON ((14.217343909259455 -2.9030822376560224, 16.003619392313993 -2.639545672126154, 16.363681477720576 -5.080080154489572, 14.577405994666037 -5.34361672001944, 14.217343909259455 -2.9030822376560224))' geom = wkt.loads(poly_str) normalized = geom.normalize() # 这行代码未产生预期作用 normalized == geom # 返回TRUE centroid = geom.centroid moved_geom = geom - centroid # 逻辑上看似可行,但未达到平移效果 print(moved_geom) >>>> 'POLYGON ((16.003619392313993 -2.639545672126154, 16.363681477720576 -5.080080154489572, 14.577405994666037 -5.34361672001944, 14.217343909259455 -2.9030822376560224, 16.003619392313993 -2.639545672126154))'
疑问:为什么最终的多边形没有按质心偏移量移动?如何获取质心位于原点(0,0)的平移后多边形?
原因分析
- Shapely中的
-运算符并非用于几何平移,它实际执行的是集合差运算:即从第一个几何对象中移除第二个对象覆盖的区域。由于质心是零面积的点,geom - centroid只是移除了这个点(对多边形无实质影响),甚至可能仅调整了顶点顺序,完全不是平移操作。 normalize()方法的作用是标准化几何顶点顺序(如确保多边形为逆时针方向)和清理冗余顶点,并非用于坐标归一化,因此对你的需求无效。
解决方案
方法一:使用affinity.translate()(推荐)
Shapely的affinity.translate()是专门用于几何平移的工具,只需传入x和y方向的偏移量即可:
from shapely import wkt from shapely.affinity import translate poly_str = 'POLYGON ((14.217343909259455 -2.9030822376560224, 16.003619392313993 -2.639545672126154, 16.363681477720576 -5.080080154489572, 14.577405994666037 -5.34361672001944, 14.217343909259455 -2.9030822376560224))' geom = wkt.loads(poly_str) centroid = geom.centroid # 偏移量为质心坐标的相反数,将质心移至原点 moved_geom = translate(geom, xoff=-centroid.x, yoff=-centroid.y) # 验证质心位置 print(moved_geom.centroid) # 输出:POINT (0 0) print(wkt.dumps(moved_geom))
方法二:手动调整顶点坐标
直接遍历多边形的所有顶点,将每个顶点的坐标减去质心的坐标:
from shapely import wkt from shapely.geometry import Polygon poly_str = 'POLYGON ((14.217343909259455 -2.9030822376560224, 16.003619392313993 -2.639545672126154, 16.363681477720576 -5.080080154489572, 14.577405994666037 -5.34361672001944, 14.217343909259455 -2.9030822376560224))' geom = wkt.loads(poly_str) centroid = geom.centroid # 生成新的顶点坐标列表 new_coords = [(x - centroid.x, y - centroid.y) for x, y in geom.exterior.coords] moved_geom = Polygon(new_coords) print(moved_geom.centroid) # 输出:POINT (0 0)
内容的提问来源于stack exchange,提问作者emilaz
相关产品推荐
相关产品推荐

