python - 匀称的 LineString 交叉点是否工作错误?
问题描述
在与 shapely 合作时,我遇到了一个奇怪的问题。有 2 个点 p1 和 p2,其中第一个属于多边形,第二个不属于。当我试图找到包含这 2 个点作为端点的 LineString 与多边形边界线之间的交点时,我收到了没有找到交点的消息。我想知道,这怎么可能?
from shapely.geometry import Polygon as SPolygon, Point, LineString
p1 = Point(5.414213562373095, 2.585786437626905)
p2 = Point(15.17279752753168, -7.172797527531679)
l = LineString([p1, p2])
l1 = LineString([(2, 2), (2, 6)])
l2 = LineString([(2, 6), (6, 6)])
l3 = LineString([(6, 6), (6, 2)])
l4 = LineString([(6, 2), (2, 2)])
sp = SPolygon([(2, 2), (2, 6), (6, 6), (6, 2)])
print "Polygon contains p1:", sp.contains(p1)
print "Polygon contains p2:", sp.contains(p2)
for i, line in enumerate((l1, l2, l3, l4)):
res = l.intersects(line)
print "Line {0} intersects l1: {1}".format(i, res)
这里是输出:
Polygon contains p1: True
Polygon contains p2: False
Line 0 intersects l1: False
Line 1 intersects l1: False
Line 2 intersects l1: False
Line 3 intersects l1: False
解决方案
我改成l.intersects(line)
了l.intersection(line)
,我确实在
LINESTRING (6 6, 6 2) at Point (6, 2)
不知道为什么.instersects()
表现不同。
然后我四舍五入 p1 和 p2
p1 = Point(round(5.414213562373095, 2), round(2.585786437626905, 2))
p2 = Point(round(15.17279752753168, 2), round(-7.172797527531679, 2))
我在 2 个路口
LINESTRING (6 6, 6 2) at POINT (6 2)
LINESTRING (6 2, 2 2) at POINT (6 2)
此修复也适用于.intersects()
(2 True's)
Shapely 在浮点精度方面可能有点棘手,我通常可以通过四舍五入来解决问题。虽然这对你来说可能是不可接受的。
推荐阅读
- php - 将 Laravel 应用程序部署到 Google App Engine
- lua - 如何使用 lau C api 在 lua 中创建多维数组
- apache-spark - Pyspark:爆炸数组后选择一个值
- java - 在java中匹配数组列表中的值
- python-3.x - Tweepy 过滤器不显示两个日期之间的所有结果
- python - 如何将复选框添加到表的每一行以更新/删除 tkinter 中 phpmyadmin 中的行数据
- java - Java中的方法引用
- reactjs - Spring Boot 和 React 中的多租户
- jestjs - react-hook-form submit 没有从 jest 测试中获取 changeText
- node.js - Kubernetes Crashloopbackoff 与 Minikube