Opened 10 years ago
Closed 10 years ago
#2964 closed defect (invalid)
ST_OffSetCurve returns EMPTY geometries and other issues
Reported by: | drbullit | Owned by: | pramsey |
---|---|---|---|
Priority: | medium | Milestone: | PostGIS 2.1.6 |
Component: | postgis | Version: | 2.1.x |
Keywords: | st_offsetcurve | Cc: |
Description
First issue is that when using negative offset values, st_offsetcurve returns an EMPTY geometry in some cases.
Reference geometry: LINESTRING(-76.941839 38.915428,-76.941883 38.915476,-76.94189 38.915497)
Both st_astext(st_offsetcurve(geom, -15)) and st_astext(st_offsetcurve(geom, -1)) return LINESTRING EMPTY
Positive offset values do not return empty geometries, but do seem to affect length of the geometry. I was under the assumption these result geometries would only be 'shifted parallelly' not see significant geometry changes:
original geometry length -- st_length(geom, true) --> 4879.15614361318
result of st_length(st_offsetcurve(geom, 1),true) --> 168892.068090029
SRID of original geometry is 4326
Attachments (1)
Change History (3)
comment:1 by , 10 years ago
Milestone: | PostGIS 2.1.5 → PostGIS 2.1.6 |
---|
by , 10 years ago
Attachment: | screenshot_239.png added |
---|
comment:2 by , 10 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
The first issue is related directly to the second. An offset curve does not just "shift" things (if you want that, maybe look at ST_Affine) it produces a line that could be used along with other lines to produce a cartographic rendering. For lines that "bend" to the right, the left-hand offset will be somewhat longer than the line which will in turn be somewhat longer than the right-hand offset.
Your initial example is offsetting a relatively "short" line by a relatively "huge" amount, and since the line is concave in the direction you're offsetting it, the offset shrinks away to nothing. Empty. I took your example and just started reducing the offset distance until I got an answer back. You'll see the picture of it attached.
select st_astext(st_offsetcurve('LINESTRING(-76.941839 38.915428,-76.941883 38.915476,-76.94189 38.915497)',-0.0001));