Suite

Construire une courbe à égale distance de deux droites


Étant donné deux lignes droites définies par deux points chacune, je veux obtenir la ligne qui sépare les points les plus proches de la ligne a des points les plus proches de la ligne b. Le code PostGIS joint est un exemple de cas, il trouve des points d'égale distance en créant beaucoup de tampons autour des lignes et en les coupant :

Existe-t-il un algorithme pour calculer cette ligne plus directement, sans points d'échantillonnage ni raster ?

Je pensais que la ligne de cet exemple aurait une partie centrale linéaire, mais les points sont placés légèrement sous cette ligne. Sont-ils placés correctement ?

CREATE TABLE tv_lines1 ( id text PRIMARY KEY, geom geometry(linestring, 4326)); -- définir un CRS sans signification pour une manipulation facile dans 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); CRÉER UN INDEX SUR tv_lines1 EN UTILISANT gist (geom); -- créer des tampons par étapes de 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; MISE À JOUR tv_buffers bf SET geom = ST_ExteriorRing(ST_Buffer(l1.geom, size)) FROM tv_lines1 l1 O l1.id = bf.line_id; CRÉER UN INDEX SUR tv_buffers EN UTILISANT gist(geom); -- recherche d'intersections CREATE TABLE tv_intersections ( id SERIAL PRIMARY KEY, distance float, geom geometry(point, 4326)); INSÉRER DANS tv_intersections (distance, geom) SELECTIONNER bf1.size, (ST_DUMP(ST_Intersection(bf1.geom, bf2.geom))).geom FROM tv_buffers bf1, tv_buffers bf2 O bf1.line_id = 'a' ET bf2.line_id = ' b' ET bf1.taille = bf2.taille; CRÉER UN INDEX SUR tv_intersections EN UTILISANT gist(geom);

Que diriez-vous de partitionner votre espace en 9 régions et d'imposer les critères d'égale distance séparément dans chacune. Par exemple,

Pour le segment de ligne #1, partitionnez l'espace en 3 régions

  1. Les points dont la projection le long du segment de droite normal tombent en fait sur le segment de droite. AppelerC1.
  2. Les points dont la projection le long de la normale du segment de droite tombe à gauche du segment de droite (c'est-à-dire qu'ils atterrissent sur la ligne imaginaire partant du segment mais pas sur le segment lui-même). AppelerL1.
  3. Identique à la région 2 mais les points atterrissent à droite. AppelerR1.

Répétez ce qui précède pour le segment de ligne #2. Appelez ses régionsC2,L2, etR2.

L'intersection de toutes les combinaisons de ces régions vous donne 9 régions distinctes où l'équation de la distance entre un point de cette région et les deux segments de ligne peut être calculée analytiquement. Par exemple, pour les régionsC1etC2les équations sont calculées analytiquement à leur segment respectif. Pour les régionsL1,R1,L2, etR2la distance est la distance jusqu'au point d'extrémité le plus proche de leur segment respectif.

Vous pouvez calculer ces distances de manière analytique et combiner les réponses des 9 régions.


Vous pouvez prendre une moyenne de chaque paire de points finaux et tracer une ligne entre eux. Disons que les deux points de gauche ont les ID 1 et 2,

WITH t AS ( SELECT avg(ST_X(geom)) as x, avg(ST_Y(geom)) as y FROM test WHERE gid in (1, 2) ) INSERT INTO test (geom) SELECT ST_SetSRID(ST_MakePoint(tx, ty) , 4326) DE t ;

Cela crée un nouveau point à mi-chemin entre eux. Faites de même pour la paire de droite, puis tracez une ligne entre eux. Si les emplacements des points de terminaison sont importants, vous pouvez peut-être couper la ligne une fois que vous l'avez créée.


Voir la vidéo: Distance entre deux droites parallèles (Octobre 2021).