J'essaie d'extrapoler à partir d'un segment de ligne pour trouver un point sur la ligne mais un tiers du chemin «retour», c'est-à-dire essayer de trouver un point new
, des points donnés A
et B
ci - dessous:
Étant donné une ligne, je peux l'interpoler pour obtenir une position à un pourcentage particulier le long de celle-ci:
=# select st_line_interpolate_point(
st_makeline('0101000020E6100000300DC347C49418C03EE8D9ACFAA44A40',
'0101000020E6100000FB743C66A03218C0CDCCCCCCCC7C4A40'),
0.333);
0101000020E6100000ED45B41D537718C069C6A2E9EC984A40
J'ai essayé d'entrer un nombre négatif pour trouver un point le long de la ligne dans la direction opposée, mais cela échoue car l'argument d'interpolation doit être dans la plage [0, 1]
J'ai d'abord pensé à mettre la ligne à l'échelle, mais cela n'utilise pas le centre de la ligne comme origine, donc inutile pour mes besoins.
la source
Je l'ai résolu avec:
Explication:
(2-d) Mettez le point de départ à l'échelle par un facteur de 1,3333, en prenant le milieu du segment de ligne comme origine pour la mise à l'échelle.
Sortez le papier millimétré!
http://en.wikipedia.org/wiki/Affine_transformation
la source
J'ai écrit une fonction pour cela:
Usage:
Notez que cela donne la chaîne de caractères la plus longue mais pas le point de terminaison.
Code sur GitHub Gist (si vous votez ici, j'apprécierais une étoile là aussi)
Description des paramètres (au cas où vous les auriez manqués dans le commentaire de la fonction sql):
la source
original_length * head_rate + head_constant
. Si vous voulez qu'il soit doublé, le taux de tête est de 2, la constante est de 0. En Hongrie, nous utilisons normalement une projection EOV qui est basée sur un compteur. Donc, si je veux ajouter 2 mètres à la fin de la ligne, je mets la queue: rate à 1 et le tail_constant à 2.