[postgis-users] postgis 1.4 and curves

Mark Cave-Ayland mark.cave-ayland at siriusit.co.uk
Wed Jul 29 05:33:16 PDT 2009


mario at geosar.ch wrote:

> Hi,
> the geometry is :
> GeomFromText('COMPOUNDCURVE((723702.522 121248.15,723892.918
> 121297.093),(723892.918 121297.093,724230.191
> 121220.96),CIRCULARSTRING(724230.191 121220.96,724268.27
> 121144.826,724251.951 121025.188))')
> 
> Then try:
> select st_astext( st_linetocurve(
> st_curvetoline(GeomFromText('COMPOUNDCURVE((723702.522 121248.15,723892.918
> 121297.093),(723892.918 121297.093,724230.191
> 121220.96),CIRCULARSTRING(724230.191 121220.96,724268.27
> 121144.826,724251.951 121025.188))')) ) )
> 
> I obtain:
> COMPOUNDCURVE((723702.522 121248.15,723892.918 121297.093,724230.191
> 121220.96),CIRCULARSTRING(724230.191 121220.96,724271.107624879
> 121128.220456049,724253.605225062 121028.378284577),(724253.605225062
> 121028.378284577,724251.951 121025.188))
> 
> After the arc another line is added and the points of the arc are different.
> 
> Thanks
> Mario

Hi Mario,

I don't think that this is actually a PostGIS bug. The reason for this 
is that the transformation from curve to line is lossy in that any 
CIRCULARSTRINGs are converted from smooth curves into a series of short 
linestring segments, and so when converting back from line to curve, the 
curve fitting algorithm has no knowledge of the makeup of the original 
geometry. So as it traverses the input line segments, it will generate 
CIRCULARSTRINGs for lines that appear to fit around a given radius, 
regardless of whether they were originally mapped as LINESTRINGs or 
CIRCULARSTRINGs.

Note that you can test yourself to see that your original input geometry 
and the output geometry are equivalent by comparing the results of the 
conversion from curves back to lines:


postgis14=# select 
st_astext(st_curvetoline(geomfromtext('COMPOUNDCURVE((723702.522 
121248.15,723892.918 121297.093,724230.191
121220.96),CIRCULARSTRING(724230.191 121220.96,724271.107624879
121128.220456049,724253.605225062 121028.378284577),(724253.605225062
121028.378284577,724251.951 121025.188))')));
 
 
 
 
 
 
                        st_astext 
 
 
 
 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  LINESTRING(723702.522 121248.15,723892.918 121297.093,724230.191 
121220.96,724235.615995416 121214.326233812,724240.708952709 
121207.434266378,724245.457602499 121200.300701051,724249.850504871 
121192.942723214,724253.87707694 121185.378058881,724257.527618341 
121177.62493199,724260.793334599 121169.702020504,724263.666358319 
121161.62841141,724266.139768134 121153.423554739,724268.207605384 
121145.10721671,724269.864888467 121136.69943211,724271.107624843 
121128.220456028,724271.932820652 121119.69071506,724272.338487925 
121111.1307581,724272.323649373 121102.561206832,724271.888340744 
121094.002706058,724271.033610735 121085.475873955,724269.761518465 
121077.001252409,724268.075128515 121068.599257524,724265.978503548 
121060.290130444,724263.476694515 121052.093888581,724260.575728495 
121044.030277402,724257.282594168 121036.118722851,724253.605225062 
121028.378284577,724251.951 121025.188)
(1 row)


postgis14=# select 
st_astext(st_curvetoline(GeomFromText('COMPOUNDCURVE((723702.522 
121248.15,723892.918
121297.093),(723892.918 121297.093,724230.191
121220.96),CIRCULARSTRING(724230.191 121220.96,724268.27
121144.826,724251.951 121025.188))')));
 
 
 
 
 
 
                        st_astext 
 
 
 
 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  LINESTRING(723702.522 121248.15,723892.918 121297.093,724230.191 
121220.96,724235.61599542 121214.326233776,724240.708952716 
121207.434266306,724245.457602506 121200.300700942,724249.850504877 
121192.942723069,724253.877076943 121185.378058699,724257.527618339 
121177.624931772,724260.793334591 121169.70202025,724263.666358302 
121161.62841112,724266.139768107 121153.423554414,724268.207605344 
121145.107216351,724269.864888414 121136.699431717,724271.107624775 
121128.220455602,724271.932820567 121119.690714601,724272.338487822 
121111.130757609,724272.32364925 121102.561206312,724271.8883406 
121094.002705508,724271.033610568 121085.475873377,724269.761518274 
121077.001251803,724268.075128299 121068.599256892,724265.978503305 
121060.290129786,724263.476694244 121052.0938879,724260.575728195 
121044.030276699,724257.282593838 121036.118722128,724253.605224622 
121028.378283815,724251.951 121025.188)
(1 row)


(Note that there are some small rounding errors since the CIRCULARSTRING 
conversions occur in different places, but again remember that these 
conversions are lossy)


HTH,

Mark.

-- 
Mark Cave-Ayland - Senior Technical Architect
PostgreSQL - PostGIS
Sirius Corporation plc - control through freedom
http://www.siriusit.co.uk
t: +44 870 608 0063



More information about the postgis-users mailing list