Вот некоторый код 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
Что показывает, что Шейпли думает p1
и p2
не делай t пересекаются или касаются, тогда как p1
и p3
пересекаются и касаются.
РЕДАКТИРОВАТЬ: как заметил Жиль-Филипп Пайе и другие, это проблема точности с координатами многоугольника. Использование следующего твика устраняет проблему в этом случае:
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))] )