Given two straight lines defined by two points each, I want to get the line which separates points nearer to line a from points nearer to line b. The attached PostGIS code is an example case, it finds points of equal distance by creating a lot of buffers around the lines and intersecting them:
Is there an algorithm to calculate this line more direct, without sampling points or rastering?
I thought the line for this example would have a linear central part, but the dots are placed slightly under that line. Are they placed correctly?
CREATE TABLE tv_lines1 (
id text PRIMARY KEY,
geom geometry(linestring, 4326)); -- set meaningless CRS for easy handling in QGIS
INSERT INTO tv_lines1 (id, geom)
SELECT 'a', ST_SetSRID(ST_MakeLine(ST_Point(0.0, 0.0), ST_Point(30.0, 0.0)), 4326);
INSERT INTO tv_lines1 (id, geom)
SELECT 'b', ST_SetSRID(ST_MakeLine(ST_Point(16.0, 2.0), ST_Point(40.0, 12.0)), 4326);
CREATE INDEX ON tv_lines1 USING gist (geom);
-- create buffers in Steps of 0.1
CREATE TABLE tv_buffers (
line_id text,
size float,
geom geometry(linestring, 4326),
PRIMARY KEY (line_id, size));
INSERT INTO tv_buffers (line_id, size)
SELECT
id,
generate_series(1, 1000) / 10.0
FROM tv_lines1;
UPDATE tv_buffers bf
SET geom = ST_ExteriorRing(ST_Buffer(l1.geom, size))
FROM tv_lines1 l1
WHERE l1.id = bf.line_id;
CREATE INDEX ON tv_buffers USING gist(geom);
-- find intersections
CREATE TABLE tv_intersections (
id SERIAL PRIMARY KEY,
distance float,
geom geometry(point, 4326));
INSERT INTO tv_intersections (distance, geom)
SELECT
bf1.size,
(ST_DUMP(ST_Intersection(bf1.geom, bf2.geom))).geom
FROM tv_buffers bf1, tv_buffers bf2
WHERE bf1.line_id = 'a' AND
bf2.line_id = 'b' AND
bf1.size = bf2.size;
CREATE INDEX ON tv_intersections USING gist(geom);