python - 应该接触的匀称多边形不
问题描述
下面是一些 Shapely 代码,它创建了三个正方形多边形p1
、p2
和p3
。p2
位于 的右侧p1
,并且p3
位于 的正下方。
问题是 Shapely 告诉我不要碰,而不要p1
碰。我看不出这里出了什么问题。p2
p1
p3
from shapely.geometry import Polygon
DELTA = 0.2
def polygonFromPoint(p):
return Polygon([(p[0]-DELTA*0.5, p[1]-DELTA*0.5),
(p[0]-DELTA*0.5, p[1]+DELTA*0.5),
(p[0]+DELTA*0.5, p[1]+DELTA*0.5),
(p[0]+DELTA*0.5, p[1]-DELTA*0.5)])
p1 = polygonFromPoint([-118.8,35.0])
p2 = polygonFromPoint([-118.6,35.0])
p3 = polygonFromPoint([-118.8,34.8])
print(p1)
print(p2)
print(p3)
print(p1.overlaps(p2), p1.intersects(p2), p1.crosses(p2), p1.contains(p2),
p1.disjoint(p2), p1.touches(p2))
print(p1.overlaps(p3), p1.intersects(p3), p1.crosses(p3), p1.contains(p3),
p1.disjoint(p3), p1.touches(p3))
运行它会产生以下输出:
POLYGON ((-118.9 34.9, -118.9 35.1, -118.7 35.1, -118.7 34.9, -118.9 34.9))
POLYGON ((-118.7 34.9, -118.7 35.1, -118.5 35.1, -118.5 34.9, -118.7 34.9))
POLYGON ((-118.9 34.7, -118.9 34.9, -118.7 34.9, -118.7 34.7, -118.9 34.7))
False False False False True False
False True False False False True
这表明Shapely思考p1
并且p2
不相交或触摸,而p1
相交p3
和触摸。
编辑:正如 Gilles-Philippe Paillé 和其他人所说,这是多边形坐标的精度问题。在这种情况下,使用以下调整可以解决问题:
def polygonFromPoint(p):
return Polygon( [(round(p[0]-DELTA*0.5,1), round(p[1]-DELTA*0.5,1)),
(round(p[0]-DELTA*0.5,1), round(p[1]+DELTA*0.5,1)),
(round(p[0]+DELTA*0.5,1), round(p[1]+DELTA*0.5,1)),
(round(p[0]+DELTA*0.5,1), round(p[1]-DELTA*0.5,1))] )
解决方案
即使多边形的字符串表示显示坐标相同,底层浮点表示也不完全是打印的内容,并且可能包含一些不精确性。使用您的坐标和相同的计算,我得到:
DELTA = 0.5
a = -118.6 - 0.2 * DELTA
b = -118.8 + 0.2 * DELTA
print(a)
print(b)
print(a <= b)
a = 35.0 - 0.2 * DELTA
b = 34.8 + 0.2 * DELTA
print(a)
print(b)
print(a <= b)
给出以下输出:
-118.69999999999999
-118.7
False
34.9
34.9
True
推荐阅读
- docker - Compose 文件 './docker-compose.yml' 无效,因为:不支持的配置选项
- shell - linux中停止进程的状态并发送电子邮件
- linux - 构建交叉编译器:pthread.h:没有这样的文件或目录
- laravel - 如何在 Laravel 中使用 Jcrop
- reactjs - 如何从不直接处理状态管理的 reactstrap 为 UncontrolledTooltip 创建一个单元测试?
- asp.net - 无法通过 WSL 运行 .NET Core Angular 应用程序
- ibm-watson - 如何索引内容节点中的 XML 数据?
- r - 删除仅通过比较行来明确关系的重复项(R中的相对参考)
- python - 如何在 React Native 中使用 SQLAlchemy 数据库?
- android - OTP 自动填充不起作用 - facebook 帐户工具包