I have a problem transforming a linestring into a polygon.
The error is:
ERROR: lwpoly_from_lwlines: shell must be closed
So I checked but firstpoint and endpoint are the same.
I tried to use ST_makevalid
and ST_RemoveRepeatedPoints
but the problem was still there.
I finally found a workaround: I transform the geometry into text via st_astext
and then I use st_geomfromtext
and it works.
Does anyone undestand why I have to use this trick to transform my linestring into a polygon ?
You can make the test yourself:
select st_makepolygon('0102000020B46B00007D000000D89E591A2DD4284123D92354DF65F44013622E214AD42841E1B4E005AD65F4407A6EA1134AD42841F65E7C11AB65F440075C578C5CD4284157B4390E8B65F440043BFE335CD428412FC1A94F7E65F4405DA450CE5DD42841ED478A887B65F44040BD19E55DD42841C826F9D17E65F44040BD19E55DD42841C826F9D17E65F440C4500A195ED4284122D6BF8D7E65F4403BC8714D5ED42841EDF256667E65F440D14610825ED428410984EE5B7E65F440A3ACA5B65ED428417C38936E7E65F440E5E4F1EA5ED42841FE572E9E7E65F440F733B51E5FD42841A9DE85EA7E65F4401485B0515FD42841ACC33C537F65F4402EB7A5835FD42841AD6AD3D77F65F440A7E857B45FD42841483FA8778065F44082C18BE35FD42841FF79F8318165F440B4BB071160D42841900DE1058265F4404169943C60D42841B1BB5FF28265F440C3B7FC6560D42841BD4F54F68365F4401C310E8D60D42841F2FD81108565F440F43899B160D4284181E5903F8665F440BE4671D360D428419EB30F828765F440F91B6DF260D42841966575D68865F4407DF6660E61D42841C027233B8A65F44075BE3C2761D42841034F66AE8B65F440EE2FD03C61D428418E6A7A2E8D65F440BFFF064F61D42841396B8BB98E65F4408AFBCA5D61D42841E5DDB74D9065F440D1240A6961D428413B3613E99165F440E0C6B67061D42841E926A8899365F4408087C77461D428418A047B2D9565F4406172377561D4284157308CD29665F4401EFF057261D42841A087DA769865F440D76CE53D62D4284147AE9B129965F4403C855CA162D42841EB8B84369565F440BE839F9063D42841A41AF63B9B65F440944F8F2D60D42841A9BF5EE1BC65F4409F724C3E5FD42841F030EDDBB665F440B8B1D9A15FD4284192E7FAFEB265F44010035D635FD42841A0FEB3E6AC65F44010035D635FD428419FFEB3E6AC65F440473EFB305FD42841E25FBE58AD65F4409E88BDFD5ED42841E053DEAEAD65F44022ADE1C95ED4284149FEABE8AD65F4409835A6955ED4284126AAE105AE65F440111F4A615ED42841E81D5C06AE65F440F68D0C2D5ED42841E4C51AEAAD65F440E0812CF95DD4284104B53FB1AD65F440A289E8C55DD42841B07B0F5CAD65F440D6777E935DD4284120D5F0EAAC65F44051182B625DD42841772B6C5EAC65F440D1E629325DD4284143F32AB7AB65F44042C7B4035DD4284121DFF6F5AA65F440ECBF03D75CD4284183ECB81BAA65F440E9B54CAC5CD42841BB4A7829A965F4401F2CC3835CD428418F1D5920A865F4402605985D5CD42841F71C9B01A765F4405648F9395CD42841881398CEA565F4404F4013C14AD4284144F98216C465F440446E86B34AD42841EA961D22C265F440B2F336A62DD42841A0F99C7BF465F440B2F336A62DD42841A0F99C7BF465F440E87F7A942DD428413BE2D89CF565F440DF6451802DD42841B01EBBB3F665F44031ABD3692DD428415E39F7BEF765F440B0221C512DD42841AD9F4EBDF865F440784248362DD42841CD1D92ADF965F440C70578192DD428413048A38EFA65F440E4C5CDFA2CD42841F7D0755FFB65F44024116EDA2CD42841CCC7101FFC65F440617F7FB82CD42841A5C28FCCFC65F440EC832A952CD4284113EE2367FD65F4405E3D99702CD42841C90315EEFD65F4405E43F74A2CD428415126C260FE65F440A77271242CD42841CEA0A2BEFE65F44094B735FD2BD42841F0894607FF65F4405AD772D52BD428416449573AFF65F440493858AD2BD428410AFF9757FF65F4404EA915852BD4284188CBE55EFF65F440EF28DB5C2BD42841DEF93750FF65F44019ACD8342BD42841C609A02BFF65F440F1E43D0D2BD42841D79A49F1FE65F440FD093AE62AD4284186387AA1FE65F440D69DFBBF2AD428413B07913CFE65F440B937B09A2AD42841E95206C3FD65F4402C4D84762AD42841A7FF6A35FD65F44003FDA2532AD42841F0DC6794FC65F440EFDB35322AD428416ADCBCE0FB65F440F8C264122AD42841172D401BFB65F440BE89211129D42841FEEDB25FFC65F4405C76880F29D428414D81CC0EFC65F4401C7C61AA28D428411904568EFC65F440103FFF3528D428411D57237BE565F440C217269B28D42841E3C798FBE465F440F3C98A9928D4284188B9A4AAE465F44032C9C89129D42841E3DD9171E365F44032C9C89129D42841E4DD9171E365F440086EA1A729D4284126998763E265F4406683B9BF29D42841C4650462E165F4402267F4D929D428410D4B3A6EE065F4403EED32F629D4284156014B89DF65F440F48453142AD42841AC9946B4DE65F440996032342AD42841833A2AF0DD65F4402DA0A9552AD42841DCF2DE3DDD65F440577E91782AD4284150A5389EDC65F440AE7FC09C2AD428413E0CF511DC65F44006A40BC22AD4284155D8BA99DB65F440849946E82AD428417BEA1836DB65F44051F1430F2BD4284100AA85E7DA65F4409055D5362BD42841E7775EAEDA65F44077C0CB5E2BD42841F33FE78ADA65F4402AB4F7862BD42841E6274A7DDA65F440317329AF2BD42841725D9785DA65F4402E3931D72BD42841FE02C5A3DA65F440A673DFFE2BD428415B3BAFD7DA65F4408AFA04262CD4284167541821DB65F4403C48734C2CD428415F10A97FDB65F440E0B0FC712CD42841890DF1F2DB65F4409C9874962CD42841C54B677ADC65F440A1A8AFB92CD428415DCF6A15DD65F440A70284DB2CD42841526043C3DD65F440B272C9FB2CD428414C652283DE65F440D89E591A2DD4284121D92354DF65F440');
From binary to text and back:
select st_makepolygon(st_geomfromtext(st_astext('0102000020B46B00007D000000D89E591A2DD4284123D92354DF65F44013622E214AD42841E1B4E005AD65F4407A6EA1134AD42841F65E7C11AB65F440075C578C5CD4284157B4390E8B65F440043BFE335CD428412FC1A94F7E65F4405DA450CE5DD42841ED478A887B65F44040BD19E55DD42841C826F9D17E65F44040BD19E55DD42841C826F9D17E65F440C4500A195ED4284122D6BF8D7E65F4403BC8714D5ED42841EDF256667E65F440D14610825ED428410984EE5B7E65F440A3ACA5B65ED428417C38936E7E65F440E5E4F1EA5ED42841FE572E9E7E65F440F733B51E5FD42841A9DE85EA7E65F4401485B0515FD42841ACC33C537F65F4402EB7A5835FD42841AD6AD3D77F65F440A7E857B45FD42841483FA8778065F44082C18BE35FD42841FF79F8318165F440B4BB071160D42841900DE1058265F4404169943C60D42841B1BB5FF28265F440C3B7FC6560D42841BD4F54F68365F4401C310E8D60D42841F2FD81108565F440F43899B160D4284181E5903F8665F440BE4671D360D428419EB30F828765F440F91B6DF260D42841966575D68865F4407DF6660E61D42841C027233B8A65F44075BE3C2761D42841034F66AE8B65F440EE2FD03C61D428418E6A7A2E8D65F440BFFF064F61D42841396B8BB98E65F4408AFBCA5D61D42841E5DDB74D9065F440D1240A6961D428413B3613E99165F440E0C6B67061D42841E926A8899365F4408087C77461D428418A047B2D9565F4406172377561D4284157308CD29665F4401EFF057261D42841A087DA769865F440D76CE53D62D4284147AE9B129965F4403C855CA162D42841EB8B84369565F440BE839F9063D42841A41AF63B9B65F440944F8F2D60D42841A9BF5EE1BC65F4409F724C3E5FD42841F030EDDBB665F440B8B1D9A15FD4284192E7FAFEB265F44010035D635FD42841A0FEB3E6AC65F44010035D635FD428419FFEB3E6AC65F440473EFB305FD42841E25FBE58AD65F4409E88BDFD5ED42841E053DEAEAD65F44022ADE1C95ED4284149FEABE8AD65F4409835A6955ED4284126AAE105AE65F440111F4A615ED42841E81D5C06AE65F440F68D0C2D5ED42841E4C51AEAAD65F440E0812CF95DD4284104B53FB1AD65F440A289E8C55DD42841B07B0F5CAD65F440D6777E935DD4284120D5F0EAAC65F44051182B625DD42841772B6C5EAC65F440D1E629325DD4284143F32AB7AB65F44042C7B4035DD4284121DFF6F5AA65F440ECBF03D75CD4284183ECB81BAA65F440E9B54CAC5CD42841BB4A7829A965F4401F2CC3835CD428418F1D5920A865F4402605985D5CD42841F71C9B01A765F4405648F9395CD42841881398CEA565F4404F4013C14AD4284144F98216C465F440446E86B34AD42841EA961D22C265F440B2F336A62DD42841A0F99C7BF465F440B2F336A62DD42841A0F99C7BF465F440E87F7A942DD428413BE2D89CF565F440DF6451802DD42841B01EBBB3F665F44031ABD3692DD428415E39F7BEF765F440B0221C512DD42841AD9F4EBDF865F440784248362DD42841CD1D92ADF965F440C70578192DD428413048A38EFA65F440E4C5CDFA2CD42841F7D0755FFB65F44024116EDA2CD42841CCC7101FFC65F440617F7FB82CD42841A5C28FCCFC65F440EC832A952CD4284113EE2367FD65F4405E3D99702CD42841C90315EEFD65F4405E43F74A2CD428415126C260FE65F440A77271242CD42841CEA0A2BEFE65F44094B735FD2BD42841F0894607FF65F4405AD772D52BD428416449573AFF65F440493858AD2BD428410AFF9757FF65F4404EA915852BD4284188CBE55EFF65F440EF28DB5C2BD42841DEF93750FF65F44019ACD8342BD42841C609A02BFF65F440F1E43D0D2BD42841D79A49F1FE65F440FD093AE62AD4284186387AA1FE65F440D69DFBBF2AD428413B07913CFE65F440B937B09A2AD42841E95206C3FD65F4402C4D84762AD42841A7FF6A35FD65F44003FDA2532AD42841F0DC6794FC65F440EFDB35322AD428416ADCBCE0FB65F440F8C264122AD42841172D401BFB65F440BE89211129D42841FEEDB25FFC65F4405C76880F29D428414D81CC0EFC65F4401C7C61AA28D428411904568EFC65F440103FFF3528D428411D57237BE565F440C217269B28D42841E3C798FBE465F440F3C98A9928D4284188B9A4AAE465F44032C9C89129D42841E3DD9171E365F44032C9C89129D42841E4DD9171E365F440086EA1A729D4284126998763E265F4406683B9BF29D42841C4650462E165F4402267F4D929D428410D4B3A6EE065F4403EED32F629D4284156014B89DF65F440F48453142AD42841AC9946B4DE65F440996032342AD42841833A2AF0DD65F4402DA0A9552AD42841DCF2DE3DDD65F440577E91782AD4284150A5389EDC65F440AE7FC09C2AD428413E0CF511DC65F44006A40BC22AD4284155D8BA99DB65F440849946E82AD428417BEA1836DB65F44051F1430F2BD4284100AA85E7DA65F4409055D5362BD42841E7775EAEDA65F44077C0CB5E2BD42841F33FE78ADA65F4402AB4F7862BD42841E6274A7DDA65F440317329AF2BD42841725D9785DA65F4402E3931D72BD42841FE02C5A3DA65F440A673DFFE2BD428415B3BAFD7DA65F4408AFA04262CD4284167541821DB65F4403C48734C2CD428415F10A97FDB65F440E0B0FC712CD42841890DF1F2DB65F4409C9874962CD42841C54B677ADC65F440A1A8AFB92CD428415DCF6A15DD65F440A70284DB2CD42841526043C3DD65F440B272C9FB2CD428414C652283DE65F440D89E591A2DD4284121D92354DF65F440')));
Informations : PostgreSQL 9.3.4 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 4.8.2-16ubuntu6) 4.8.2, 64-bit.
The geometry come from a dxf file imported into postgis with ogr2ogr.
Best Answer
In order to close a linestring, the first and last binary coordinates (i.e. WKB) need to be exactly equal. WKT cannot be relied on, since it is rounded/truncated to be misinterpreted by humans. While the start and end points for the example problem have the same WKT, they do not have the same WKB, and thus the linestring is not exactly closed, even when the two points are about 291 nanometres apart!
If you want to force-close a linestring, you can use a function to do this. Here's one called
ST_ForceClosed
, which you can use beforeST_MakePolygon
:You may also want to remove the extra precision points using
ST_SnapToGrid
E.g., assuming you are okay with nanometre precision, here are the number of points in the polygons compared: