Shapely Polygons, которые должны касаться не - PullRequest
1 голос
/ 27 января 2020

Вот некоторый код 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))] ) 

1 Ответ

2 голосов
/ 27 января 2020

Даже если строковое представление многоугольника показывает, что координаты совпадают, базовое представление с плавающей запятой не совсем то, что напечатано, и может включать некоторую неточность. Используя ваши координаты и тот же расчет, я получаю:

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
...