Проверка, содержит ли LinearRing точку, всегда возвращает False в Shapely - PullRequest
0 голосов
/ 23 мая 2019

Это вариация Shapely содержит (точка) всегда дает False , а не дубликат

Я хочу определить, создана ли точка внутри определенной фигуры из множества точек, но для началаПросто я делаю этот тест, который не проходит.Я определяю квадрат 2x2, и первая точка должна быть внутри, а вторая снаружи, но оба вызова возвращают False

import unittest
from shapely.geometry import LineString,Point,LinearRing
class TestTools(unittest.TestCase):
    def test_isInside(self):
        points = [
            [0,0],
            [2,0],
            [2,2],
            [0,2]
        ]
        ring=LinearRing(points)
        print(ring)
        print(Point(1,2))
        self.assertEqual(ring.contains(Point(1,1)),True) 
        self.assertEqual(ring.contains(Point(3,3)),False)

Выход составляет

LINEARRING (0 0, 2 0, 2 2, 0 2, 0 0)
POINT (1 2)
======================================================================
FAIL: test_isInside (__main__.TestTools)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_tools.py", line 17, in test_isInside
    self.assertEqual(ring.contains(Point(1,1)),True)
AssertionError: False != True

Так что, очевидно, я 'я делаю что-то (простое?) неправильно.

1 Ответ

1 голос
/ 23 мая 2019

Согласно документации Shapely существует три основных типа геометрических объектов: точки, кривые и поверхности. LinearRing является одной из реализаций типа кривой.

Ссылаясь на документы:

A Кривая имеет внутреннюю часть , состоящую из бесконечного множества точек по ее длине (представьте Точку , перетащенную в пространство), границу набор, состоящий из двух его конечных точек и внешний набор всех остальных точек. A Кривая имеет топологический размер 1.

И вот что он говорит о object.contains(other) метод:

Возвращает True, если никакие точки других не находятся снаружи объекта , и по крайней мере одна точка внутренней части других лежит в области интерьер объекта .

Итак, в вашем случае точки Point(1, 1), Point(3, 3) лежат не на кривой LinearRing([[0, 0], [2, 0], [2, 2], [0, 2]]), а снаружи, снаружи, поэтому ваши тесты возвращают False.

Чтобы проверить, заключены ли точки в LinearRing, в вашем простом случае вы могли бы построить полигонов из этих колец и выполнить ту же проверку:

>>> Polygon(ring).contains(Point(1, 1))
True

>>> Polygon(ring).contains(Point(3, 3))
False
...