我有一个线条和多边形,我创建了线和多边形边界的交点
这些交点应该相交(至少触摸)多边形的边界,右边?
从shapely import geometry,wkt )=几何矩阵([(13.51039642756912,52.598912814414675),(13.525173800277184,52.60620240344557)]) poly = geometry.Polygon([(13.52072838433517,52.61735554606274),(13.52233276805985,52.59511541819082),(13.51312087418833,52.59394589806786) (13.51526963068252,52.60338701649216),(13.51836560008325,52.6009395669487),(13.52072838433517,52.61735554606274)]) ips = line.intersection(poly.boundary) for i in ip s:打印i.touches(聚边界)#应该触摸,但它不! >>> False解决方案>
这不是一个错误,但这是一个常见的问题。
没有精度模型,所有浮点计算都受到机器epsilon 。相交点从每个几何插值,很少精确(除非你有直角)。所有 DE-9IM 谓词如touches目前需要精确的编码(除非我们有一个精确模型,这可能会发生一天。更新:使用 JTS拓扑套件,DE-9IM谓词不使用精度模型,因此GEOS克隆不太可能会有任何差异)。
更强大的策略是测试两者之间的距离,如果它们相交,应该小于机器的epsilon。例如:
EPS = 1e-15 在ips中: print i.distance(poly ) EPS
Hi I wonder if I am thinking the wrong way or if this is a bug:
I have a linestring and a polygon, I create the intersection points of the line and the polygon's boundary
These intersection points should intersect (at least touch) the polygon's boundary, right?
from shapely import geometry,wkt line = geometry.LineString([(13.51039642756912, 52.598912814414675), (13.525173800277184, 52.60620240344557)]) poly = geometry.Polygon ([(13.52072838433517, 52.61735554606274), (13.52233276805985, 52.59511541819082), (13.51312087418833, 52.59394589806786),( 13.51526963068252, 52.60338701649216),( 13.51836560008325 ,52.6009395669487), (13.52072838433517, 52.61735554606274)]) ips = line.intersection(poly.boundary) for i in ips: print i.touches(poly.boundary)# should touch but it doesnt!!!! >>>False解决方案
It's not a bug, but this is a frequent question.
Without a precision model, all floating point calculations are limited by the machine epsilon. The intersected points are interpolated from each geometry, and are seldom exact (unless you have right angles). All of the DE-9IM predicates like 'touches' currently require exact noding (unless we have a precision model, which might happen one day UPDATE: testing with JTS Topology Suite, the DE-9IM predicates don't use the precision model, therefore it is unlikely that the GEOS clone will work any different).
A more robust strategy is to test the distance between the two, which should be less than the machine epsilon if they intersect. E.g.:
EPS = 1e-15 for i in ips: print i.distance(poly) < EPS
更多推荐
形状相交与形体关系
发布评论