Checking if LinearRing contains a point always returns False in Shapely

Leif Neland

This is variation of Shapely contains(point) always gives False, not a duplicate

I want to determine if a point inside a certain figure created of many points, but to start simple I do this test, which fails. I define a 2x2 square, and the first point should be inside, the second outside, but both calls return 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)

The output is

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

So obviously I'm doing something (simple?) wrong.

Georgy

According to the Shapely documentation there are three fundamental types of geometric objects: points, curves, and surfaces. The LinearRing is one of the implementations of the curve type.

Citing the docs:

A Curve has an interior set consisting of the infinitely many points along its length (imagine a Point dragged in space), a boundary set consisting of its two end points, and an exterior set of all other points. A Curve has a topological dimension of 1.

And here is what it says about object.contains(other) method:

Returns True if no points of other lie in the exterior of the object and at least one point of the interior of other lies in the interior of object.

So, in your case the points Point(1, 1), Point(3, 3) don't lie on the curve LinearRing([[0, 0], [2, 0], [2, 2], [0, 2]]) but outside it, in the exterior, hence your tests return False.

In order to check if the points are enclosed by the LinearRing, in your simple case, you could construct polygons from those rings and do the same check:

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

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

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

Shapely contains(point) always gives False

Python Shapely - Checking if line contains a point

Contains always returns false

Checking if a Polygon contains MultiPoint in Shapely returns unexpected results

Checking if string is null or undefined always returns False

Checking if a value is in a list of lists always returns False

JS Checking return function with if, always returns false

strings.Contains() returns always false

ArrayList Contains with Object always returns false

Why contains() method on ArrayList always returns false?

Turfjs Point In Polygon always returns false

Django checking if message.tags contains string always return false

Checking the valid state of shapely.geometry.LinearRing object with is_valid property, bug or misconception from my side?

checking array value with if statement always returns (output) false (else)

ArrayList's contains() method always returns false with custom object

Shapely assertion error when checking if a Point object is within a Polygon

ImmutableHashSet .Contains returns false

isAssignableFrom always returns false

isEqualToString always returns False

hasNextLine() always returns false

isHardwareAccelerated() always returns false

Always returns false

StrPos always returns False?

PeekMessage always returns FALSE

windows batch file checking power plug with Battery.PowerOnline returns always FALSE

Empty object returns false on checking

Array.Contains() is always false

VB.NET - List.Contains always returns false when it should be true

Item::contains always returns true

TOP Ranking

  1. 1

    Failed to listen on localhost:8000 (reason: Cannot assign requested address)

  2. 2

    Loopback Error: connect ECONNREFUSED 127.0.0.1:3306 (MAMP)

  3. 3

    How to import an asset in swift using Bundle.main.path() in a react-native native module

  4. 4

    pump.io port in URL

  5. 5

    Compiler error CS0246 (type or namespace not found) on using Ninject in ASP.NET vNext

  6. 6

    BigQuery - concatenate ignoring NULL

  7. 7

    ngClass error (Can't bind ngClass since it isn't a known property of div) in Angular 11.0.3

  8. 8

    ggplotly no applicable method for 'plotly_build' applied to an object of class "NULL" if statements

  9. 9

    Spring Boot JPA PostgreSQL Web App - Internal Authentication Error

  10. 10

    How to remove the extra space from right in a webview?

  11. 11

    java.lang.NullPointerException: Cannot read the array length because "<local3>" is null

  12. 12

    Jquery different data trapped from direct mousedown event and simulation via $(this).trigger('mousedown');

  13. 13

    flutter: dropdown item programmatically unselect problem

  14. 14

    How to use merge windows unallocated space into Ubuntu using GParted?

  15. 15

    Change dd-mm-yyyy date format of dataframe date column to yyyy-mm-dd

  16. 16

    Nuget add packages gives access denied errors

  17. 17

    Svchost high CPU from Microsoft.BingWeather app errors

  18. 18

    Can't pre-populate phone number and message body in SMS link on iPhones when SMS app is not running in the background

  19. 19

    12.04.3--- Dconf Editor won't show com>canonical>unity option

  20. 20

    Any way to remove trailing whitespace *FOR EDITED* lines in Eclipse [for Java]?

  21. 21

    maven-jaxb2-plugin cannot generate classes due to two declarations cause a collision in ObjectFactory class

HotTag

Archive