I have a bus line with bus stops along the route.
The sample data looks like this:
LINESTRING (-70.57243474999999933 -33.37452829000000065, -70.57308152999999606 -33.37470645999999874, -70.57543062999999961 -33.37539473999999728, -70.57551596999999788 -33.3754228700000013, -70.57676012999999671 -33.37580358000000302, -70.57838608999999508 -33.37581671000000227, -70.5790643100000068 -33.37582045999999991, -70.58024559999999781 -33.37582420999999755, -70.58068577000000232 -33.37587485000000243, -70.5810989999999947 -33.37592361000000096, -70.58192544999999996 -33.3760173800000004, -70.58280580000000271 -33.37611865000000222)
POINT(-70.58176091969386334 -33.37599871220383818)
POINT(-70.58081166577235877 -33.37588970535671251)
POINT(-70.5789007062584659 -33.37581955540557743)
POINT(-70.57517086297514197 -33.3753186292262285)
POINT(-70.57426670966613358 -33.37505371514445329)
How can I order (add an order ID) the bus stops along the route?
Any Open Source Software is welcome. Preferably something that can be automated (QGIS, Python, PostGIS).
Answer
If using PostGIS, you can order the bus stops according to their value returned for an ST_Line_Locate_point()
call.
This is how it looks if I apply it to the linestring and points you supplied:
SELECT
ST_Line_Locate_Point(line.f1, ST_GeomFromText('POINT(-70.58176091969386334 -33.37599871220383818)')) as A,
ST_Line_Locate_Point(line.f1, ST_GeomFromText('POINT(-70.58081166577235877 -33.37588970535671251)')) as B,
ST_Line_Locate_Point(line.f1, ST_GeomFromText('POINT(-70.5789007062584659 -33.37581955540557743)')) as C,
ST_Line_Locate_Point(line.f1, ST_GeomFromText('POINT(-70.57517086297514197 -33.3753186292262285)')) as D,
ST_Line_Locate_Point(line.f1, ST_GeomFromText('POINT(-70.57426670966613358 -33.37505371514445329)')) as E
FROM
(
SELECT
ST_GeomFromText('LINESTRING (-70.57243474999999933 -33.37452829000000065, -70.57308152999999606 -33.37470645999999874, -70.57543062999999961 -33.37539473999999728, -70.57551596999999788 -33.3754228700000013, -70.57676012999999671 -33.37580358000000302, -70.57838608999999508 -33.37581671000000227, -70.5790643100000068 -33.37582045999999991, -70.58024559999999781 -33.37582420999999755, -70.58068577000000232 -33.37587485000000243, -70.5810989999999947 -33.37592361000000096, -70.58192544999999996 -33.3760173800000004, -70.58280580000000271 -33.37611865000000222)')
as f1
) as line;
-----------------------------------------------------------------------------------------
A | B | C | D | E
0.900519204659061;0.810142121650764;0.629032670938557;0.269386835869428;0.180270638952756
-----------------------------------------------------------------------------------------
And a pic, just in case that helps..
No comments:
Post a Comment