[postgis-tickets] [PostGIS] #2786: st_buildArea returns null geom
PostGIS
trac at osgeo.org
Thu Jun 26 06:40:15 PDT 2014
#2786: st_buildArea returns null geom
---------------------+------------------------------------------------------
Reporter: mjurce | Owner: pramsey
Type: defect | Status: new
Priority: medium | Milestone:
Component: postgis | Version: 2.0.x
Keywords: |
---------------------+------------------------------------------------------
Changes (by robe):
* priority: blocker => medium
Comment:
I'm not sure there is an issue here. Result seems to be a cause of
rounding effects which makes the generated polygon invalid. Just to get
to the point, your example can be reduced to:
{{{
SELECT ST_LineMerge(st_curvetoline(st_GeomFromText('MULTICURVE((715537.187
91770.539,715541.774 91782.060,715552.413 91787.648,715554.587
91795.922,715557.280 91801.092,715557.152 91795.643,715559.827
91794.284,715580.191 91814.057,715584.102 91815.280,715607.318
91826.989,715609.459 91829.830,715609.588 91839.660,715606.190
91837.710,715603.506 91837.322,715599.678 91834.403,715593.014
91831.325,715592.151 91830.889,715588.161 91831.919,715584.211
91834.084,715580.055 91837.074,715575.738 91839.398,715571.882
91841.719,715569.010 91842.588,715562.923 91844.881,715551.009
91847.220,715541.481 91845.339,715538.953 91842.280,715528.604
91842.106,715527.956 91846.181,715525.549 91849.393,715525.717
91849.515,715516.818 91860.240,715505.961 91849.502,715501.797
91845.422,715491.018 91834.644,715479.196 91810.681,715477.609
91812.014,715446.445 91826.586,715445.016 91827.461,715443.889
91828.677,715443.198 91830.216,715443.020 91831.896,715443.345
91833.529,715438.564 91830.984,715437.963 91829.340,715432.470
91814.247,715423.645 91818.572,715416.744 91810.214,715417.434
91810.007,715412.152 91802.380,715411.587 91794.394,715411.386
91791.554,715411.378 91783.632,715411.425 91782.252,715411.638
91777.893,715413.585 91771.282,715408.214 91770.716,715406.827
91770.484,715401.043 91769.483,715391.406 91767.254,715378.023
91762.959,715377.340 91762.528,715376.939 91761.826,715369.312
91760.180,715370.885 91759.433,715372.130 91757.782,715372.655
91755.781,715373.354 91720.501,715370.178 91721.285,715368.303
91705.398,715365.812 91705.458,715365.203 91699.854,715377.986
91699.243,715379.798 91688.574,715382.266 91682.528,715382.283
91684.028,715382.403 91688.324,715384.534 91695.865,715388.055
91701.887,715395.704 91714.939),CIRCULARSTRING(715395.704
91714.939,715395.742 91715.167,715395.679 91715.389),(715395.679
91715.389,715395.186 91716.412),CIRCULARSTRING(715395.186
91716.412,715394.911 91716.841,715394.579
91717.227),CIRCULARSTRING(715394.579 91717.227,715394.199
91717.561,715393.776 91717.838),CIRCULARSTRING(715393.776
91717.838,715393.310 91718.057,715392.808
91718.172),CIRCULARSTRING(715392.808 91718.172,715392.532
91718.189,715392.255 91718.174),(715392.255 91718.174,715405.385
91719.053,715417.385 91719.739,715436.177 91720.812,715440.093
91720.705,715444.376 91719.881,715446.928 91718.899,715448.936
91718.127,715453.889 91715.987),CIRCULARSTRING(715453.889
91715.987,715453.301 91717.020,715452.497 91717.896),(715452.497
91717.896,715453.751 91717.354,715460.889 91714.267,715464.984
91712.969,715469.019 91712.225,715473.079 91711.950,715488.666
91711.014,715488.704 91715.333,715472.950 91716.313,715475.197
91719.457,715480.797 91727.668,715484.038 91732.282,715485.594
91731.384,715488.190 91729.587,715486.780 91726.930,715495.235
91720.858,715508.002 91712.134,715514.139 91709.249,715521.129
91710.293,715521.337 91711.690,715524.085 91719.505,715525.492
91722.476,715531.480 91720.161,715536.262 91728.232,715527.955
91736.355,715533.632 91752.179,715536.527 91767.968,715537.187
91770.539))')) );
}}}
which gives you a seemingly nice looking closed linestring which we can
use our lazy ST_MakePolygon to build a polygon out of:
{{{
SELECT ST_MakePolygon('LINESTRING(715392.255 91718.174,715405.385
91719.053,715417.385 91719.739,715436.177 91720.812,715440.093
91720.705,715444.376 91719.881,715446.928 91718.899,715448.936
91718.127,715453.889 91715.987,715453.780829874
91716.2231798697,715453.661201247 91716.4537675939,715453.530402315
91716.6782076665,715453.388748183 91716.8959593919,715453.236580109
91717.1064981869,715453.074264679 91717.3093168453,715452.902192926
91717.503926759,715452.720779384 91717.6898590959,715452.530461096
91717.8666659285,715452.497 91717.896,715453.751 91717.354,715460.889
91714.267,715464.984 91712.969,715469.019 91712.225,715473.079
91711.95,715488.666 91711.014,715488.704 91715.333,715472.95
91716.313,715475.197 91719.457,715480.797 91727.668,715484.038
91732.282,715485.594 91731.384,715488.19 91729.587,715486.78
91726.93,715495.235 91720.858,715508.002 91712.134,715514.139
91709.249,715521.129 91710.293,715521.337 91711.69,715524.085
91719.505,715525.492 91722.476,715531.48 91720.161,715536.262
91728.232,715527.955 91736.355,715533.632 91752.179,715536.527
91767.968,715537.187 91770.539,715541.774 91782.06,715552.413
91787.648,715554.587 91795.922,715557.28 91801.092,715557.152
91795.643,715559.827 91794.284,715580.191 91814.057,715584.102
91815.28,715607.318 91826.989,715609.459 91829.83,715609.588
91839.66,715606.19 91837.71,715603.506 91837.322,715599.678
91834.403,715593.014 91831.325,715592.151 91830.889,715588.161
91831.919,715584.211 91834.084,715580.055 91837.074,715575.738
91839.398,715571.882 91841.719,715569.01 91842.588,715562.923
91844.881,715551.009 91847.22,715541.481 91845.339,715538.953
91842.28,715528.604 91842.106,715527.956 91846.181,715525.549
91849.393,715525.717 91849.515,715516.818 91860.24,715505.961
91849.502,715501.797 91845.422,715491.018 91834.644,715479.196
91810.681,715477.609 91812.014,715446.445 91826.586,715445.016
91827.461,715443.889 91828.677,715443.198 91830.216,715443.02
91831.896,715443.345 91833.529,715438.564 91830.984,715437.963
91829.34,715432.47 91814.247,715423.645 91818.572,715416.744
91810.214,715417.434 91810.007,715412.152 91802.38,715411.587
91794.394,715411.386 91791.554,715411.378 91783.632,715411.425
91782.252,715411.638 91777.893,715413.585 91771.282,715408.214
91770.716,715406.827 91770.484,715401.043 91769.483,715391.406
91767.254,715378.023 91762.959,715377.34 91762.528,715376.939
91761.826,715369.312 91760.18,715370.885 91759.433,715372.13
91757.782,715372.655 91755.781,715373.354 91720.501,715370.178
91721.285,715368.303 91705.398,715365.812 91705.458,715365.203
91699.854,715377.986 91699.243,715379.798 91688.574,715382.266
91682.528,715382.283 91684.028,715382.403 91688.324,715384.534
91695.865,715388.055 91701.887,715395.704 91714.939,715395.713154168
91714.9631954524,715395.721110095 91714.987810934,715395.727848615
91715.0127871441,715395.733353493 91715.0380639127,715395.737611468
91715.0635803459,715395.740612282 91715.0892749724,715395.742348705
91715.1150858915,715395.742816556 91715.1409509225,715395.742014706
91715.1668077543,715395.739945087 91715.1925940954,715395.736612685
91715.2182478244,715395.732025529 91715.2437071392,715395.726194669
91715.268910706,715395.719134151 91715.2937978073,715395.710860987
91715.3183084878,715395.701395105 91715.3423836991,715395.690759311
91715.3659654421,715395.679 91715.389,715395.186
91716.412,715395.096710392 91716.5663712404,715394.9999537
91716.7161753005,715394.895963018 91716.8610512891,715394.78498887
91717.0006501874,715394.667298602 91717.1346356893,715394.579
91717.227,715394.452401023 91717.3490657436,715394.319965057
91717.4647725363,715394.182011154 91717.5738416303,715394.038871655
91717.6760102686,715393.890891396 91717.7710323179,715393.776
91717.838,715393.673467977 91717.8969548753,715393.568166681
91717.9508077291,715393.460349789 91717.9994288249,715393.350277044
91718.0427010304,715393.23821362 91718.0805200991,715393.124429488
91718.1127949214,715393.009198763 91718.1394477445,715392.892799046
91718.1604143594,715392.808 91718.172,715392.690809803
91718.1831208597,715392.573215092 91718.1884780735,715392.455499164
91718.1880587352,715392.337945605 91718.1818638553,715392.255
91718.174)'::geometry);
}}}
Except for the tincy littly problem that the generated polygon is invalid
even though it passes the quick spot check of being closed.
{{{
SELECT ST_IsValidReason(ST_MakePolygon('LINESTRING(715392.255
91718.174,715405.385 91719.053,715417.385 91719.739,715436.177
91720.812,715440.093 91720.705,715444.376 91719.881,715446.928
91718.899,715448.936 91718.127,715453.889 91715.987,715453.780829874
91716.2231798697,715453.661201247 91716.4537675939,715453.530402315
91716.6782076665,715453.388748183 91716.8959593919,715453.236580109
91717.1064981869,715453.074264679 91717.3093168453,715452.902192926
91717.503926759,715452.720779384 91717.6898590959,715452.530461096
91717.8666659285,715452.497 91717.896,715453.751 91717.354,715460.889
91714.267,715464.984 91712.969,715469.019 91712.225,715473.079
91711.95,715488.666 91711.014,715488.704 91715.333,715472.95
91716.313,715475.197 91719.457,715480.797 91727.668,715484.038
91732.282,715485.594 91731.384,715488.19 91729.587,715486.78
91726.93,715495.235 91720.858,715508.002 91712.134,715514.139
91709.249,715521.129 91710.293,715521.337 91711.69,715524.085
91719.505,715525.492 91722.476,715531.48 91720.161,715536.262
91728.232,715527.955 91736.355,715533.632 91752.179,715536.527
91767.968,715537.187 91770.539,715541.774 91782.06,715552.413
91787.648,715554.587 91795.922,715557.28 91801.092,715557.152
91795.643,715559.827 91794.284,715580.191 91814.057,715584.102
91815.28,715607.318 91826.989,715609.459 91829.83,715609.588
91839.66,715606.19 91837.71,715603.506 91837.322,715599.678
91834.403,715593.014 91831.325,715592.151 91830.889,715588.161
91831.919,715584.211 91834.084,715580.055 91837.074,715575.738
91839.398,715571.882 91841.719,715569.01 91842.588,715562.923
91844.881,715551.009 91847.22,715541.481 91845.339,715538.953
91842.28,715528.604 91842.106,715527.956 91846.181,715525.549
91849.393,715525.717 91849.515,715516.818 91860.24,715505.961
91849.502,715501.797 91845.422,715491.018 91834.644,715479.196
91810.681,715477.609 91812.014,715446.445 91826.586,715445.016
91827.461,715443.889 91828.677,715443.198 91830.216,715443.02
91831.896,715443.345 91833.529,715438.564 91830.984,715437.963
91829.34,715432.47 91814.247,715423.645 91818.572,715416.744
91810.214,715417.434 91810.007,715412.152 91802.38,715411.587
91794.394,715411.386 91791.554,715411.378 91783.632,715411.425
91782.252,715411.638 91777.893,715413.585 91771.282,715408.214
91770.716,715406.827 91770.484,715401.043 91769.483,715391.406
91767.254,715378.023 91762.959,715377.34 91762.528,715376.939
91761.826,715369.312 91760.18,715370.885 91759.433,715372.13
91757.782,715372.655 91755.781,715373.354 91720.501,715370.178
91721.285,715368.303 91705.398,715365.812 91705.458,715365.203
91699.854,715377.986 91699.243,715379.798 91688.574,715382.266
91682.528,715382.283 91684.028,715382.403 91688.324,715384.534
91695.865,715388.055 91701.887,715395.704 91714.939,715395.713154168
91714.9631954524,715395.721110095 91714.987810934,715395.727848615
91715.0127871441,715395.733353493 91715.0380639127,715395.737611468
91715.0635803459,715395.740612282 91715.0892749724,715395.742348705
91715.1150858915,715395.742816556 91715.1409509225,715395.742014706
91715.1668077543,715395.739945087 91715.1925940954,715395.736612685
91715.2182478244,715395.732025529 91715.2437071392,715395.726194669
91715.268910706,715395.719134151 91715.2937978073,715395.710860987
91715.3183084878,715395.701395105 91715.3423836991,715395.690759311
91715.3659654421,715395.679 91715.389,715395.186
91716.412,715395.096710392 91716.5663712404,715394.9999537
91716.7161753005,715394.895963018 91716.8610512891,715394.78498887
91717.0006501874,715394.667298602 91717.1346356893,715394.579
91717.227,715394.452401023 91717.3490657436,715394.319965057
91717.4647725363,715394.182011154 91717.5738416303,715394.038871655
91717.6760102686,715393.890891396 91717.7710323179,715393.776
91717.838,715393.673467977 91717.8969548753,715393.568166681
91717.9508077291,715393.460349789 91717.9994288249,715393.350277044
91718.0427010304,715393.23821362 91718.0805200991,715393.124429488
91718.1127949214,715393.009198763 91718.1394477445,715392.892799046
91718.1604143594,715392.808 91718.172,715392.690809803
91718.1831208597,715392.573215092 91718.1884780735,715392.455499164
91718.1880587352,715392.337945605 91718.1818638553,715392.255
91718.174)'::geometry));
}}}
Yields:
{{{
Self-intersection[715392.4655354 91718.1880944872]
}}}
So build area is fine, it will return NULL if the resulting polygon is
invalid. We can argue if ST_CurveToLine is at fault here and if anything
can be done about it or if that's just what you get with floating
precision issues.
I think this might end up being a won't fix (I've downgrade from blocker
to medium) but will leave that for others more knowledgeable to judge.
--
Ticket URL: <http://trac.osgeo.org/postgis/ticket/2786#comment:1>
PostGIS <http://trac.osgeo.org/postgis/>
The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project.
More information about the postgis-tickets
mailing list