Invalid multipolygon of valid individual polygons

Clash Royale CLAN TAG#URR8PPP
up vote
1
down vote
favorite
Could anyone please explain this to me? The polygons all have valid geometry but the resulting multipolygon somehow doesn't. The following script:
from shapely.geometry import Polygon, MultiPolygon
polygon1 = Polygon([(0,0), (1,0), (1,1), (0,1), (0,0)])
polygon2 = Polygon([(1,1), (2,1), (2,2), (1,2), (1,1)])
polygon3 = Polygon([(1,0), (2,0), (2,1), (1,1), (1,0)])
polygon_list = [polygon1,polygon2, polygon3]
mpolygon = MultiPolygon(polygon_list)
for item in polygon_list:
print(item.is_valid)
for item in mpolygon:
print(item.is_valid)
print(mpolygon.is_valid)
returns the following:
True
True
True
True
True
True
False
I believe this is causing me problems as I need to intersect a multilinestring with a multipolygon, and the intersection method requires for all the polygon geometries to be valid.
Why are the individual polygons valid while the full multipolygon is not?
python shapely
add a comment |Â
up vote
1
down vote
favorite
Could anyone please explain this to me? The polygons all have valid geometry but the resulting multipolygon somehow doesn't. The following script:
from shapely.geometry import Polygon, MultiPolygon
polygon1 = Polygon([(0,0), (1,0), (1,1), (0,1), (0,0)])
polygon2 = Polygon([(1,1), (2,1), (2,2), (1,2), (1,1)])
polygon3 = Polygon([(1,0), (2,0), (2,1), (1,1), (1,0)])
polygon_list = [polygon1,polygon2, polygon3]
mpolygon = MultiPolygon(polygon_list)
for item in polygon_list:
print(item.is_valid)
for item in mpolygon:
print(item.is_valid)
print(mpolygon.is_valid)
returns the following:
True
True
True
True
True
True
False
I believe this is causing me problems as I need to intersect a multilinestring with a multipolygon, and the intersection method requires for all the polygon geometries to be valid.
Why are the individual polygons valid while the full multipolygon is not?
python shapely
add a comment |Â
up vote
1
down vote
favorite
up vote
1
down vote
favorite
Could anyone please explain this to me? The polygons all have valid geometry but the resulting multipolygon somehow doesn't. The following script:
from shapely.geometry import Polygon, MultiPolygon
polygon1 = Polygon([(0,0), (1,0), (1,1), (0,1), (0,0)])
polygon2 = Polygon([(1,1), (2,1), (2,2), (1,2), (1,1)])
polygon3 = Polygon([(1,0), (2,0), (2,1), (1,1), (1,0)])
polygon_list = [polygon1,polygon2, polygon3]
mpolygon = MultiPolygon(polygon_list)
for item in polygon_list:
print(item.is_valid)
for item in mpolygon:
print(item.is_valid)
print(mpolygon.is_valid)
returns the following:
True
True
True
True
True
True
False
I believe this is causing me problems as I need to intersect a multilinestring with a multipolygon, and the intersection method requires for all the polygon geometries to be valid.
Why are the individual polygons valid while the full multipolygon is not?
python shapely
Could anyone please explain this to me? The polygons all have valid geometry but the resulting multipolygon somehow doesn't. The following script:
from shapely.geometry import Polygon, MultiPolygon
polygon1 = Polygon([(0,0), (1,0), (1,1), (0,1), (0,0)])
polygon2 = Polygon([(1,1), (2,1), (2,2), (1,2), (1,1)])
polygon3 = Polygon([(1,0), (2,0), (2,1), (1,1), (1,0)])
polygon_list = [polygon1,polygon2, polygon3]
mpolygon = MultiPolygon(polygon_list)
for item in polygon_list:
print(item.is_valid)
for item in mpolygon:
print(item.is_valid)
print(mpolygon.is_valid)
returns the following:
True
True
True
True
True
True
False
I believe this is causing me problems as I need to intersect a multilinestring with a multipolygon, and the intersection method requires for all the polygon geometries to be valid.
Why are the individual polygons valid while the full multipolygon is not?
python shapely
python shapely
edited 12 hours ago
Kadir
3,88011226
3,88011226
asked 13 hours ago
user32882
99911124
99911124
add a comment |Â
add a comment |Â
2 Answers
2
active
oldest
votes
up vote
4
down vote
accepted
It's because polygon1 and polygon3 that you created intersect along an infinite amount of points. Taken here from the Shapely documentation:

...On the right, a valid MultiPolygon with 2 members, and on the right, a MultiPolygon that is invalid because its members touch at an infinite number of points (along a line). Link
To fix this, you need to shift polygon3 so that it will have a maximum of one intersecting point with the other polygons (or none at all).
Your polygons plotted:

add a comment |Â
up vote
1
down vote
In addition to @15Step's answer, If you want to fix the invalidity, use buffer method. But if polygons are adjacent, you get polygon instead of multipolygon.
mpolygon = mpolygon.buffer(0)
print(mpolygon.is_valid)
print(type(mpolygon))
# OUT:
# True
# <class 'shapely.geometry.polygon.Polygon'>

If you need multipolygon, you have to convert polygon to multipolygon.
if isinstance(mpolygon, Polygon):
mpolygon = MultiPolygon([mpolygon])
I need anmpolygon, because I wish to dompolygon.intersection(multilinestring)wherempolygonhas many polygons andmultilinestringhas many LineStrings which may or may not share vertices
â user32882
11 hours ago
add a comment |Â
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
4
down vote
accepted
It's because polygon1 and polygon3 that you created intersect along an infinite amount of points. Taken here from the Shapely documentation:

...On the right, a valid MultiPolygon with 2 members, and on the right, a MultiPolygon that is invalid because its members touch at an infinite number of points (along a line). Link
To fix this, you need to shift polygon3 so that it will have a maximum of one intersecting point with the other polygons (or none at all).
Your polygons plotted:

add a comment |Â
up vote
4
down vote
accepted
It's because polygon1 and polygon3 that you created intersect along an infinite amount of points. Taken here from the Shapely documentation:

...On the right, a valid MultiPolygon with 2 members, and on the right, a MultiPolygon that is invalid because its members touch at an infinite number of points (along a line). Link
To fix this, you need to shift polygon3 so that it will have a maximum of one intersecting point with the other polygons (or none at all).
Your polygons plotted:

add a comment |Â
up vote
4
down vote
accepted
up vote
4
down vote
accepted
It's because polygon1 and polygon3 that you created intersect along an infinite amount of points. Taken here from the Shapely documentation:

...On the right, a valid MultiPolygon with 2 members, and on the right, a MultiPolygon that is invalid because its members touch at an infinite number of points (along a line). Link
To fix this, you need to shift polygon3 so that it will have a maximum of one intersecting point with the other polygons (or none at all).
Your polygons plotted:

It's because polygon1 and polygon3 that you created intersect along an infinite amount of points. Taken here from the Shapely documentation:

...On the right, a valid MultiPolygon with 2 members, and on the right, a MultiPolygon that is invalid because its members touch at an infinite number of points (along a line). Link
To fix this, you need to shift polygon3 so that it will have a maximum of one intersecting point with the other polygons (or none at all).
Your polygons plotted:

edited 12 hours ago
answered 12 hours ago
15Step
1,2111217
1,2111217
add a comment |Â
add a comment |Â
up vote
1
down vote
In addition to @15Step's answer, If you want to fix the invalidity, use buffer method. But if polygons are adjacent, you get polygon instead of multipolygon.
mpolygon = mpolygon.buffer(0)
print(mpolygon.is_valid)
print(type(mpolygon))
# OUT:
# True
# <class 'shapely.geometry.polygon.Polygon'>

If you need multipolygon, you have to convert polygon to multipolygon.
if isinstance(mpolygon, Polygon):
mpolygon = MultiPolygon([mpolygon])
I need anmpolygon, because I wish to dompolygon.intersection(multilinestring)wherempolygonhas many polygons andmultilinestringhas many LineStrings which may or may not share vertices
â user32882
11 hours ago
add a comment |Â
up vote
1
down vote
In addition to @15Step's answer, If you want to fix the invalidity, use buffer method. But if polygons are adjacent, you get polygon instead of multipolygon.
mpolygon = mpolygon.buffer(0)
print(mpolygon.is_valid)
print(type(mpolygon))
# OUT:
# True
# <class 'shapely.geometry.polygon.Polygon'>

If you need multipolygon, you have to convert polygon to multipolygon.
if isinstance(mpolygon, Polygon):
mpolygon = MultiPolygon([mpolygon])
I need anmpolygon, because I wish to dompolygon.intersection(multilinestring)wherempolygonhas many polygons andmultilinestringhas many LineStrings which may or may not share vertices
â user32882
11 hours ago
add a comment |Â
up vote
1
down vote
up vote
1
down vote
In addition to @15Step's answer, If you want to fix the invalidity, use buffer method. But if polygons are adjacent, you get polygon instead of multipolygon.
mpolygon = mpolygon.buffer(0)
print(mpolygon.is_valid)
print(type(mpolygon))
# OUT:
# True
# <class 'shapely.geometry.polygon.Polygon'>

If you need multipolygon, you have to convert polygon to multipolygon.
if isinstance(mpolygon, Polygon):
mpolygon = MultiPolygon([mpolygon])
In addition to @15Step's answer, If you want to fix the invalidity, use buffer method. But if polygons are adjacent, you get polygon instead of multipolygon.
mpolygon = mpolygon.buffer(0)
print(mpolygon.is_valid)
print(type(mpolygon))
# OUT:
# True
# <class 'shapely.geometry.polygon.Polygon'>

If you need multipolygon, you have to convert polygon to multipolygon.
if isinstance(mpolygon, Polygon):
mpolygon = MultiPolygon([mpolygon])
edited 11 hours ago
answered 12 hours ago
Kadir
3,88011226
3,88011226
I need anmpolygon, because I wish to dompolygon.intersection(multilinestring)wherempolygonhas many polygons andmultilinestringhas many LineStrings which may or may not share vertices
â user32882
11 hours ago
add a comment |Â
I need anmpolygon, because I wish to dompolygon.intersection(multilinestring)wherempolygonhas many polygons andmultilinestringhas many LineStrings which may or may not share vertices
â user32882
11 hours ago
I need an
mpolygon, because I wish to do mpolygon.intersection(multilinestring) where mpolygon has many polygons and multilinestring has many LineStrings which may or may not share verticesâ user32882
11 hours ago
I need an
mpolygon, because I wish to do mpolygon.intersection(multilinestring) where mpolygon has many polygons and multilinestring has many LineStrings which may or may not share verticesâ user32882
11 hours ago
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fgis.stackexchange.com%2fquestions%2f298307%2finvalid-multipolygon-of-valid-individual-polygons%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password