Shapely: polygon.buffer works incorrectly.

Created on 5 Jun 2020  路  6Comments  路  Source: Toblerity/Shapely

Expected behavior and actual behavior.

Only buffer(-1e-6) works incorrectly. it makes area to zero. But buffer(-1e-5) and buffer(-1e-7) works well. what makes this difference?

Steps to reproduce the problem.

polygon boundary data :

[(-1567709.3083706305, 21844.531770653648),
 (-1567709.3083706305, 21844.53177065363),
 (-1567709.3083706896, 21844.53177057533),
 (-1567709.3083707409, 21844.531770491605),
 (-1567709.3083707835, 21844.531770403268),
 (-1567709.3083708175, 21844.531770311165),
 (-1567709.3083708421, 21844.53177021619),
 (-1567709.3083708573, 21844.531770119247),
 (-1567709.308370863, 21844.53177002128),
 (-1567709.3083708591, 21844.531769923226),
 (-1567709.3083708456, 21844.531769826033),
 (-1567709.3083708226, 21844.53176973063),
 (-1567709.3083707902, 21844.531769637946),
 (-1567709.3083707492, 21844.53176954887),
 (-1567709.3083706994, 21844.531769464254),
 (-1567709.3083706417, 21844.53176938492),
 (-1567709.3083705765, 21844.531769311627),
 (-1567709.3083705043, 21844.531769245084),
 (-1567709.3083705043, 21844.531769245077),
 (-1566848.2390979272, 21125.044030739882),
 (-1567633.4133449628, 20185.362391208644),
 (-1567633.4133449628, 20185.362391208626),
 (-1567633.413345022, 20185.362391130326),
 (-1567633.4133450731, 20185.3623910466),
 (-1567633.4133451157, 20185.362390958264),
 (-1567633.4133451497, 20185.36239086616),
 (-1567633.4133451744, 20185.362390771184),
 (-1567633.4133451895, 20185.362390674243),
 (-1567633.4133451954, 20185.362390576276),
 (-1567633.4133451914, 20185.36239047822),
 (-1567633.413345178, 20185.36239038103),
 (-1567633.4133451548, 20185.362390285627),
 (-1567633.4133451225, 20185.362390192942),
 (-1567633.4133450815, 20185.362390103866),
 (-1567633.4133450317, 20185.36239001925),
 (-1567633.413344974, 20185.362389939917),
 (-1567633.4133449087, 20185.362389866623),
 (-1567633.4133448366, 20185.36238980008),
 (-1567633.4133448366, 20185.362389800073),
 (-1563671.4730493322, 16874.865135169068),
 (-1563671.4730493322, 16874.865135169075),
 (-1563671.473049254, 16874.865135109918),
 (-1563671.47304917, 16874.865135058724),
 (-1563671.4730490819, 16874.86513501598),
 (-1563671.4730489897, 16874.865134982105),
 (-1563671.4730488947, 16874.865134957417),
 (-1563671.4730487978, 16874.86513494216),
 (-1563671.4730486998, 16874.86513493648),
 (-1563671.4730486018, 16874.865134940428),
 (-1563671.4730485044, 16874.865134953972),
 (-1563671.4730484092, 16874.865134976975),
 (-1563671.4730483163, 16874.865135009222),
 (-1563671.4730482274, 16874.865135050397),
 (-1563671.4730481426, 16874.865135100103),
 (-1563671.4730480635, 16874.865135157866),
 (-1563671.4730479901, 16874.865135223128),
 (-1563671.4730479235, 16874.865135295262),
 (-1563671.4730479235, 16874.865135295244),
 (-1559153.4332911205, 22281.96938299714),
 (-1559153.4332910613, 22281.96938307546),
 (-1559153.43329101, 22281.969383159183),
 (-1559153.4332909675, 22281.96938324752),
 (-1559153.4332909335, 22281.969383339623),
 (-1559153.4332909088, 22281.9693834346),
 (-1559153.4332908937, 22281.96938353154),
 (-1559153.4332908879, 22281.96938362951),
 (-1559153.4332908918, 22281.969383727563),
 (-1559153.4332909053, 22281.969383824755),
 (-1559153.4332909284, 22281.969383920157),
 (-1559153.4332909607, 22281.969384012842),
 (-1559153.4332910017, 22281.969384101918),
 (-1559153.4332910515, 22281.969384186534),
 (-1559153.4332911093, 22281.969384265867),
 (-1559153.4332911745, 22281.96938433916),
 (-1559153.4332912466, 22281.969384405704),
 (-1559153.4332912466, 22281.96938440571),
 (-1560022.394099932, 23008.051091188066),
 (-1560022.394099932, 23008.05109118806),
 (-1560022.3941000102, 23008.051091247216),
 (-1560022.394100094, 23008.05109129841),
 (-1560022.3941001822, 23008.051091341153),
 (-1560022.3941002744, 23008.05109137503),
 (-1560022.3941003694, 23008.051091399717),
 (-1560022.3941004663, 23008.051091414975),
 (-1560022.3941005643, 23008.051091420653),
 (-1560022.3941006623, 23008.051091416706),
 (-1560022.3941007596, 23008.051091403162),
 (-1560022.3941008549, 23008.05109138016),
 (-1560022.3941009478, 23008.051091347912),
 (-1560022.3941010367, 23008.051091306737),
 (-1560022.3941011215, 23008.05109125703),
 (-1560022.3941012006, 23008.051091199268),
 (-1560022.394101274, 23008.051091134006),
 (-1560022.3941013406, 23008.051091061872),
 (-1560022.3941013406, 23008.05109106189),
 (-1561246.8250177177, 21542.67540491616),
 (-1562587.3225330082, 22662.761275431232),
 (-1562587.3225330082, 22662.761275431225),
 (-1562587.3225330864, 22662.761275490382),
 (-1562587.3225331702, 22662.761275541576),
 (-1562587.3225332585, 22662.76127558432),
 (-1562587.3225333507, 22662.761275618195),
 (-1562587.3225334457, 22662.761275642883),
 (-1562587.3225335425, 22662.76127565814),
 (-1562587.3225336405, 22662.76127566382),
 (-1562587.3225337386, 22662.761275659872),
 (-1562587.322533836, 22662.761275646328),
 (-1562587.3225339311, 22662.761275623325),
 (-1562587.322534024, 22662.761275591078),
 (-1562587.322534113, 22662.761275549903),
 (-1562587.3225341977, 22662.761275500197),
 (-1562587.3225342769, 22662.761275442434),
 (-1562587.3225343502, 22662.761275377172),
 (-1562587.3225344168, 22662.761275305038),
 (-1562587.3225344168, 22662.761275305056),
 (-1563827.8108540243, 21178.168393675307),
 (-1566088.6549106995, 23067.272591508467),
 (-1565168.3083691986, 24168.725868050966),
 (-1565168.3083691986, 24168.725868050984),
 (-1565168.3083691394, 24168.725868129284),
 (-1565168.3083690882, 24168.72586821301),
 (-1565168.3083690456, 24168.725868301346),
 (-1565168.3083690116, 24168.72586839345),
 (-1565168.308368987, 24168.725868488425),
 (-1565168.3083689718, 24168.725868585367),
 (-1565168.308368966, 24168.725868683334),
 (-1565168.30836897, 24168.72586878139),
 (-1565168.3083689834, 24168.72586887858),
 (-1565168.3083690065, 24168.725868973983),
 (-1565168.3083690389, 24168.725869066668),
 (-1565168.3083690798, 24168.725869155744),
 (-1565168.3083691297, 24168.72586924036),
 (-1565168.3083691874, 24168.725869319693),
 (-1565168.3083692526, 24168.725869392987),
 (-1565168.3083693248, 24168.725869459537),
 (-1566088.6549107092, 24937.744196777505),
 (-1565168.3083692326, 26039.19747329144),
 (-1565168.3083691734, 26039.19747336976),
 (-1565168.3083691222, 26039.197473453485),
 (-1565168.3083690796, 26039.197473541826),
 (-1565168.3083690456, 26039.19747363393),
 (-1565168.308369021, 26039.19747372891),
 (-1565168.3083690058, 26039.197473825854),
 (-1565168.308369, 26039.197473923825),
 (-1565168.308369004, 26039.19747402188),
 (-1565168.3083690174, 26039.197474119075),
 (-1565168.3083690405, 26039.197474214478),
 (-1565168.3083690729, 26039.197474307162),
 (-1565168.3083691138, 26039.197474396242),
 (-1565168.3083691637, 26039.197474480858),
 (-1565168.3083692214, 26039.19747456019),
 (-1565168.3083692866, 26039.197474633485),
 (-1565168.3083693588, 26039.197474700028),
 (-1565168.308369437, 26039.197474759178),
 (-1565168.3083695208, 26039.197474810368),
 (-1565168.308369609, 26039.197474853107),
 (-1565168.3083697013, 26039.19747488698),
 (-1565168.3083697963, 26039.197474911663),
 (-1565168.308369893, 26039.197474926917),
 (-1565168.3083699911, 26039.197474932596),
 (-1565168.3083700892, 26039.197474928646),
 (-1565168.3083701865, 26039.1974749151),
 (-1565168.3083702817, 26039.1974748921),
 (-1565168.3083703746, 26039.19747485985),
 (-1565168.3083704636, 26039.197474818677),
 (-1565168.3083705483, 26039.19747476897),
 (-1565168.3083706275, 26039.197474711207),
 (-1565168.3083707008, 26039.197474645945),
 (-1565168.3083707674, 26039.197474573815),
 (-1565168.3083707674, 26039.197474573833),
 (-1567415.8784531695, 23349.348249428767),
 (-1567709.3083691455, 23594.530876865312),
 (-1567709.3083691455, 23594.530876865305),
 (-1567709.3083692237, 23594.53087692446),
 (-1567709.3083693075, 23594.530876975652),
 (-1567709.3083693958, 23594.530877018395),
 (-1567709.308369488, 23594.53087705227),
 (-1567709.308369583, 23594.53087707696),
 (-1567709.3083696798, 23594.530877092217),
 (-1567709.3083697779, 23594.5308770979),
 (-1567709.308369876, 23594.530877093952),
 (-1567709.3083699732, 23594.53087708041),
 (-1567709.3083700684, 23594.530877057412),
 (-1567709.308370161, 23594.53087702517),
 (-1567709.3083702503, 23594.530876983998),
 (-1567709.3083703348, 23594.530876934292),
 (-1567709.3083704142, 23594.53087687653),
 (-1567709.3083704875, 23594.530876811277),
 (-1567709.3083705541, 23594.530876739147),
 (-1567709.3083706133, 23594.530876660847),
 (-1567709.3083706645, 23594.530876577122),
 (-1567709.308370707, 23594.530876488785),
 (-1567709.308370741, 23594.530876396682),
 (-1567709.3083707658, 23594.530876301702),
 (-1567709.308370781, 23594.53087620476),
 (-1567709.3083707867, 23594.53087610679),
 (-1567709.3083707828, 23594.530876008732),
 (-1567709.3083707693, 23594.530875911536),
 (-1567709.3083707462, 23594.530875816134),
 (-1567709.3083707138, 23594.530875723445),
 (-1567709.3083706729, 23594.530875634366),
 (-1567709.308370623, 23594.53087554975),
 (-1567709.3083705653, 23594.530875470413),
 (-1567709.3083705, 23594.53087539712),
 (-1567709.308370428, 23594.530875330573),
 (-1567709.308370428, 23594.530875330565),
 (-1566848.2390978509, 22875.04313682535),
 (-1567709.3083706305, 21844.531770653648)]

Operating system

windows 10

Shapely version and provenance

1.6.4.post2 installed with pip

geos upstream bug

All 6 comments

I get the same result with Shapely 1.7 on Ubuntu. Seems like a GEOS issue? Here's a (very) old report which describes this same error, but is marked as "fixed".

This is a bug with GEOS master (ish) on Linux, as confirmed with PostGIS. The buffer returns POLYGON EMPTY. The valid input has hex-encoded WKB:

010300000001000000D0000000AD60F14EDDEB37C199C787082255D540AD60F14EDDEB37C194C787082255D540AB61F14EDDEB37C1817387082255D5408762F14EDDEB37C19B1987082255D5403E63F14EDDEB37C1C1BA86082255D540D063F14EDDEB37C1DC5786082255D5403A64F14EDDEB37C1E1F185082255D5407B64F14EDDEB37C1CA8985082255D5409464F14EDDEB37C1992085082255D5408364F14EDDEB37C150B784082255D5404964F14EDDEB37C1F44E84082255D540E663F14EDDEB37C184E883082255D5405B63F14EDDEB37C1FF8483082255D540AB62F14EDDEB37C15A2583082255D540D561F14EDDEB37C17FCA82082255D540DD60F14EDDEB37C1507582082255D540C55FF14EDDEB37C19D2682082255D5408F5EF14EDDEB37C12ADF81082255D5408F5EF14EDDEB37C128DF81082255D5409285353D80E837C1F44E66D142A1D440B9F9D06991EB37C15FE56A3157B6D340B9F9D06991EB37C15AE56A3157B6D340B7FAD06991EB37C147916A3157B6D34093FBD06991EB37C161376A3157B6D3404AFCD06991EB37C187D8693157B6D340DCFCD06991EB37C1A275693157B6D34046FDD06991EB37C1A70F693157B6D34087FDD06991EB37C190A7683157B6D340A0FDD06991EB37C15F3E683157B6D3408FFDD06991EB37C116D5673157B6D34055FDD06991EB37C1BA6C673157B6D340F2FCD06991EB37C14A06673157B6D34067FCD06991EB37C1C5A2663157B6D340B7FBD06991EB37C12043663157B6D340E1FAD06991EB37C145E8653157B6D340E9F9D06991EB37C11693653157B6D340D1F8D06991EB37C16344653157B6D3409BF7D06991EB37C1F0FC643157B6D3409BF7D06991EB37C1EEFC643157B6D340D3C2197917DC37C171E65F5EB77AD040D3C2197917DC37C173E65F5EB77AD04083C1197917DC37C1EEA65F5EB77AD0401BC0197917DC37C1F66F5F5EB77AD040A0BE197917DC37C111425F5EB77AD04014BD197917DC37C1B11D5F5EB77AD0407CBB197917DC37C12F035F5EB77AD040DCB9197917DC37C1CDF25E5EB77AD04037B8197917DC37C1B4EC5E5EB77AD04092B6197917DC37C1F1F05E5EB77AD040F0B4197917DC37C17CFF5E5EB77AD04057B3197917DC37C12F185F5EB77AD040C8B1197917DC37C1CF3A5F5EB77AD0404AB0197917DC37C105675F5EB77AD040DEAE197917DC37C1649C5F5EB77AD0408AAD197917DC37C16ADA5F5EB77AD0404FAC197917DC37C17D20605EB77AD04031AB197917DC37C1F16D605EB77AD04031AB197917DC37C1EC6D605EB77AD040B82AEC6E71CA37C181FB5E0A7EC2D540BA29EC6E71CA37C1994F5F0A7EC2D540DE28EC6E71CA37C17FA95F0A7EC2D5402728EC6E71CA37C15908600A7EC2D5409527EC6E71CA37C13E6B600A7EC2D5402B27EC6E71CA37C139D1600A7EC2D540EA26EC6E71CA37C15039610A7EC2D540D126EC6E71CA37C181A2610A7EC2D540E226EC6E71CA37C1CA0B620A7EC2D5401C27EC6E71CA37C12674620A7EC2D5407F27EC6E71CA37C196DA620A7EC2D5400A28EC6E71CA37C11B3E630A7EC2D540BA28EC6E71CA37C1C09D630A7EC2D5409029EC6E71CA37C19BF8630A7EC2D540882AEC6E71CA37C1CA4D640A7EC2D540A02BEC6E71CA37C17D9C640A7EC2D540D62CEC6E71CA37C1F0E3640A7EC2D540D62CEC6E71CA37C1F2E3640A7EC2D540AFBBE364D6CD37C177F913450378D640AFBBE364D6CD37C175F913450378D640FFBCE364D6CD37C1FA3814450378D64067BEE364D6CD37C1F26F14450378D640E2BFE364D6CD37C1D79D14450378D6406EC1E364D6CD37C137C214450378D64006C3E364D6CD37C1B9DC14450378D640A6C4E364D6CD37C11BED14450378D6404BC6E364D6CD37C134F314450378D640F0C7E364D6CD37C1F7EE14450378D64092C9E364D6CD37C16CE014450378D6402BCBE364D6CD37C1B9C714450378D640BACCE364D6CD37C119A514450378D64038CEE364D6CD37C1E37814450378D640A4CFE364D6CD37C1844314450378D640F8D0E364D6CD37C17E0514450378D64033D2E364D6CD37C16BBF13450378D64051D3E364D6CD37C1F77113450378D64051D3E364D6CD37C1FC7113450378D640745C34D39ED237C19E8AD539AB09D540F2859152DBD737C11996BCB8B021D640F2859152DBD737C11796BCB8B021D64042879152DBD737C19CD5BCB8B021D640AA889152DBD737C1940CBDB8B021D640258A9152DBD737C1793ABDB8B021D640B18B9152DBD737C1D95EBDB8B021D640498D9152DBD737C15B79BDB8B021D640E98E9152DBD737C1BD89BDB8B021D6408E909152DBD737C1D68FBDB8B021D64033929152DBD737C1998BBDB8B021D640D5939152DBD737C10E7DBDB8B021D6406E959152DBD737C15B64BDB8B021D640FD969152DBD737C1BB41BDB8B021D6407B989152DBD737C18515BDB8B021D640E7999152DBD737C126E0BCB8B021D6403B9B9152DBD737C120A2BCB8B021D640769C9152DBD737C10D5CBCB8B021D640949D9152DBD737C1990EBCB8B021D640949D9152DBD737C19E0EBCB8B021D6401C2194CFB3DC37C11344F6C68AAED440443AA8A788E537C182A72372D186D640A748F14EF0E137C107459F742E9AD740A748F14EF0E137C10C459F742E9AD740A947F14EF0E137C11F999F742E9AD740CD46F14EF0E137C105F39F742E9AD7401646F14EF0E137C1DF51A0742E9AD7408445F14EF0E137C1C4B4A0742E9AD7401A45F14EF0E137C1BF1AA1742E9AD740D944F14EF0E137C1D682A1742E9AD740C044F14EF0E137C107ECA1742E9AD740D144F14EF0E137C15055A2742E9AD7400B45F14EF0E137C1ACBDA2742E9AD7406E45F14EF0E137C11C24A3742E9AD740F945F14EF0E137C1A187A3742E9AD740A946F14EF0E137C146E7A3742E9AD7407F47F14EF0E137C12142A4742E9AD7407748F14EF0E137C15097A4742E9AD7408F49F14EF0E137C103E6A4742E9AD740C54AF14EF0E137C1782DA5742E9AD7406E3AA8A788E537C14B85EBA06F5AD8403949F14EF0E137C1240467A3CC6DD9403B48F14EF0E137C13D5867A3CC6DD9405F47F14EF0E137C123B267A3CC6DD940A846F14EF0E137C1FE1068A3CC6DD9401646F14EF0E137C1E37368A3CC6DD940AC45F14EF0E137C1DFD968A3CC6DD9406B45F14EF0E137C1F74169A3CC6DD9405245F14EF0E137C129AB69A3CC6DD9406345F14EF0E137C172146AA3CC6DD9409D45F14EF0E137C1CF7C6AA3CC6DD9400046F14EF0E137C13FE36AA3CC6DD9408B46F14EF0E137C1C4466BA3CC6DD9403B47F14EF0E137C16AA66BA3CC6DD9401148F14EF0E137C145016CA3CC6DD9400949F14EF0E137C174566CA3CC6DD940214AF14EF0E137C127A56CA3CC6DD940574BF14EF0E137C19AEC6CA3CC6DD940A74CF14EF0E137C11D2C6DA3CC6DD9400F4EF14EF0E137C114636DA3CC6DD9408A4FF14EF0E137C1F8906DA3CC6DD9401651F14EF0E137C157B56DA3CC6DD940AE52F14EF0E137C1D8CF6DA3CC6DD9404E54F14EF0E137C139E06DA3CC6DD940F355F14EF0E137C152E66DA3CC6DD9409857F14EF0E137C114E26DA3CC6DD9403A59F14EF0E137C189D36DA3CC6DD940D35AF14EF0E137C1D6BA6DA3CC6DD940625CF14EF0E137C136986DA3CC6DD940E05DF14EF0E137C1006C6DA3CC6DD9404C5FF14EF0E137C1A1366DA3CC6DD940A060F14EF0E137C19BF86CA3CC6DD940DB61F14EF0E137C188B26CA3CC6DD940F962F14EF0E137C115656CA3CC6DD940F962F14EF0E137C11A656CA3CC6DD940924EE2E0B7EA37C1DAF8B74956CDD640C347F14EDDEB37C1AEF5E2F9A10AD740C347F14EDDEB37C1ACF5E2F9A10AD7401349F14EDDEB37C13035E3F9A10AD7407B4AF14EDDEB37C1286CE3F9A10AD740F64BF14EDDEB37C10D9AE3F9A10AD740824DF14EDDEB37C16DBEE3F9A10AD7401A4FF14EDDEB37C1EFD8E3F9A10AD740BA50F14EDDEB37C151E9E3F9A10AD7405F52F14EDDEB37C16BEFE3F9A10AD7400454F14EDDEB37C12EEBE3F9A10AD740A655F14EDDEB37C1A4DCE3F9A10AD7403F57F14EDDEB37C1F2C3E3F9A10AD740CD58F14EDDEB37C153A1E3F9A10AD7404C5AF14EDDEB37C11E75E3F9A10AD740B75BF14EDDEB37C1BF3FE3F9A10AD7400C5DF14EDDEB37C1BA01E3F9A10AD740475EF14EDDEB37C1A9BBE2F9A10AD740655FF14EDDEB37C1366EE2F9A10AD7406360F14EDDEB37C1231AE2F9A10AD7403F61F14EDDEB37C13DC0E1F9A10AD740F661F14EDDEB37C16361E1F9A10AD7408862F14EDDEB37C17EFEE0F9A10AD740F262F14EDDEB37C18298E0F9A10AD7403363F14EDDEB37C16B30E0F9A10AD7404C63F14EDDEB37C139C7DFF9A10AD7403B63F14EDDEB37C1EF5DDFF9A10AD7400163F14EDDEB37C192F5DEF9A10AD7409E62F14EDDEB37C1228FDEF9A10AD7401362F14EDDEB37C19C2BDEF9A10AD7406361F14EDDEB37C1F6CBDDF9A10AD7408D60F14EDDEB37C11B71DDF9A10AD740955FF14EDDEB37C1EB1BDDF9A10AD7407D5EF14EDDEB37C138CDDCF9A10AD740475DF14EDDEB37C1C485DCF9A10AD740475DF14EDDEB37C1C285DCF9A10AD7404A84353D80E837C188F5C0C2C256D640AD60F14EDDEB37C199C787082255D540

It is not a bug with JTS, which returns a non-empty:

POLYGON ((-1567709.30837 21844.53177, -1566848.2391 22875.04314, -1567415.87845 23349.34825, -1566088.65491 24937.7442, -1565168.30837 24168.72587, -1566088.65491 23067.27259, -1563827.81085 21178.16839, -1562587.32253 22662.76127, -1561246.82502 21542.6754, -1560022.3941 23008.05109, -1559153.43329 22281.96938, -1563671.47305 16874.86514, -1567633.41334 20185.36239, -1566848.2391 21125.04403, -1567709.30837 21844.53177))

image


There is a history of buffer robustness issues with JTS/GEOS, see this trac from ~9 years ago. Also, anyone that follows @dr-jts will know there are some fantastic advancements with OverlayNG in JTS that provide more robust buffer outputs, read about them here. Paul Ramsey has started porting this to GEOS, and would appreciate some help.

@mwtoews I was about to post almost exactly the same screenshot of JTS testbuilder but you beat me to it!

@tomplex Hopefully you weren't also filing a GEOS bug...

See upstream GEOS #1032. There's nothing that can be done on the Shapely side, unfortunately.

Also, anyone that follows @dr-jts will know there are some fantastic advancements with OverlayNG in JTS that provide more robust buffer outputs,

@mwtoews Thanks for pointing out the OverlayNG improvements. Unfortunately at the moment that code is only targeting overlay. But there is potential to use it in buffering as well. Not sure of the timeline for that however.

I've marked this as an upstream bug.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

akadouri picture akadouri  路  4Comments

mromanie picture mromanie  路  3Comments

MarkWieczorek picture MarkWieczorek  路  4Comments

romainfontaine picture romainfontaine  路  5Comments

jrobichaud picture jrobichaud  路  3Comments