Answer: You can.
I found time for you and hurry to help you.
My answer is now practical.
The original data and table names are fictitious, do not forget to rename them with reference to your example.
Sit in my car and go together to the stop - the "center line of the road."
The initial geodata are polygons of a road network with a width of about 11 m in the EPSG: 4326 coordinate system, broken into segments, see Fig. 1.
- In a convenient way for you, create a negative buffer, for example in pgAdmin:
create table buf_negative as SELECT ST_Buffer (geom, -0.000045) as geom FROM buf_dump;
or in QGIS tools: "Vector-Geoprocessing-Buffer Zones".
Thus, we reduced the width of the roads from 11 m to 1 m, see Fig.2
- Convert the negative buffer (1 m) into lines, for example with QGIS tools:
"Vector-Processing geometry-polygons in a line" result see Fig. 3
- Extract from the lines of the point, for example with the QGIS tools: "Vector-Processing geometry-Extract nodes", the result see Fig. 4
- Create point buffers from them, so that they intersect each other,
Further combine them with each other using the tool "Vector>Geoprocessing>Merge" and extract centroids from adjacent buffers, the result is shown in Fig. 5
(centroids are red dots)
- From the centroid points, create the Delaunay Triangulation, for example with the QGIS tools: "Vector-Processing geometry-Delaunay triangulation", and trim the result with your 1 m negative buffer polygons, see the result of Fig. 6
- Blast the lines into segments, for example, using QGIS Desktop with GRASS tools: "Data Analysis - Lines-Explode Lines", see Fig. 7
- Run the following script in PGAdmin:
create table buf_centre_ln as SELECT ST_Intersection (a.geom, b.geom) AS geom FROM explode_ln as a JOIN buf_negative as b ON ST_Within (a.geom, b.geom);
see the result in Fig. 8
- Remove duplicating lines and do with the center lines, whatever,
Geometry processing | Skeleton / Medial Axis
).. it requires QGIS3.0+ though.