[postgis-users] Issue with St_OffsetCurve()

Jibran Khan jibran at envs.au.dk
Fri Jun 2 12:10:16 PDT 2017


My ultimate goal is to compute the street width. By:

1)      getting offset curves at the intersection of polygons and buffer geometry on both sides of street

2)      computing the distance between nearest offset curves from street center line and sum them up

I wonder there could be other approaches to do this as well but for me, this was my initial attempt. Thanks for your suggestion anyways to break the multiline string into line strings and circular strings. I may give it a try to see if this work in my case.
Well, I have datasets containing billions of features and since I am running into query execution time/performance issues so I don’t think that this query would help much with large datasets.


From: postgis-users [mailto:postgis-users-bounces at lists.osgeo.org] On Behalf Of Basques, Bob (CI-StPaul)
Sent: 02 June 2017 20:49
To: PostGIS Users Discussion
Subject: Re: [postgis-users] Issue with St_OffsetCurve()


I don’t know what you end goal is with this (completely) but I’ve been working on something similar.  And I founf that you needed to isolate the circular strings into separate features, in other words, “explode” the parcel edges into separate features, and work the process against both feature types, lineStrings, and CircularStrings.

I’m running into the same sort of slowdown in the processing as well.  I have a much bigger dataset too.   So I’m also trying to partiion up by a spatial grid.  I’m currently out of my mainstream knowledge level though, so it’s still a learning experience right now.  There’s not much out there for setting up a spatial grid partition, if that’s even what the correct search term is. . .


On Jun 2, 2017, at 12:06 PM, Jibran Khan <jibran at envs.au.dk<mailto:jibran at envs.au.dk>> wrote:

Hi everyone,

I have two street files in my PostgreSQL 9.5 database i.e., street1 and street2. Street1 contains 85 rows while street2 contains 2,065 rows. With the following query: for every street, I am trying to get offset curves at the intersection of polygons and 50 meters buffer around street layer. The code works fine provided street  and polygons are  straight (parallel).

                -- get street buffer
                street_buffer AS (
                                                Street1.gid as street_id,
                                                Street1.geom as street_geom,
                                                ST_Buffer(street1.geom, 50, 'endcap=square join=round') as geom1,
                                                building.geom  as geom2
                                from street1
                                left join building on st_dwithin(building.geom, street1.geom, 50)
                                order by street_id),
                -- get selected polygons at the intersection
                selected_buildings AS (
                                                ST_Intersection(geom1, geom2) geom
                                from street_buffer),
                -- compute distance from street to polygons
                distance as (
                                                ST_Distance(street_geom, geom) as dist
                                from selected_buildings ),
                -- get offset curves
                curves as (
                                                ST_OffsetCurve(ST_LineMerge(street_geom), dist) as curve1,
                                                ST_OffsetCurve(ST_LineMerge(street_geom), -dist) as curve2
                                from distance
                                order by street_id),
                -- merge both curves
                com_curves as (
                                                ST_Union(curve1, curve2)::geometry as com_geom from curves
                                order by street_id)

-- finally get nearest curves within a distance of 50 meters
Select distinct on (a.street_id)
                                b.com_geom as offset,
                                st_distance(a.street_geom, b.com_geom) as dist
from curves a
left join com_curves b on st_dwithin(a.street_geom, b.com_geom, 50)
order by a.street_id, dist

I have two issues:

1)      Is there a better way to do above job as for large datasets query execution time expands in minutes??

2)      When I use street2 layer, then I am getting following ERROR:

ERROR:  ST_OffsetCurve only works with LineStrings
********** Error **********

ERROR: ST_OffsetCurve only works with LineStrings
SQL state: XX000

I googled this error and came to know about two possible fixes. (1) In QGIS, I can use multiparts to singleparts and  (2) I can use ST_Dump() like this:

ST_OffsetCurve(ST_LineMerge((ST_Dump(street_geom)).geom), dist) as curve1,
ST_OffsetCurve(ST_LineMerge((ST_Dump(street_geom)).geom), - dist) as curve2


ST_OffsetCurve((ST_Dump(street_geom)).geom, dist) as curve1

I tested both ways. The code worked (at least I didn’t get the error) but code output is not the desired one. Any suggestions how to fix this error?

I had the feeling probably my postgis or GEOS versions are problematic but I think thigs look fine here:

Select PostGIS_full_version();
"POSTGIS="2.2.1 r14555" GEOS="3.5.0-CAPI-1.9.0 r4090" PROJ="Rel. 4.9.1, 04 March 2015" GDAL="GDAL 2.0.1, released 2015/09/15" LIBXML="2.7.8" LIBJSON="0.12" RASTER"

Any suggestions for above issues?

Thanks a lot,


Jibran Khan,
Department of Environmental Science,
Aarhus University,
postgis-users mailing list
postgis-users at lists.osgeo.org<mailto:postgis-users at lists.osgeo.org>

"The power of accurate observation is frequently called cynicism by those who don't have it."
- George Bernard Shaw

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20170602/17482d6c/attachment.html>

More information about the postgis-users mailing list