Как получить равноудаленные точки от линии (географические координаты) - PullRequest
0 голосов
/ 20 января 2019

Я хочу пересчитать географические координаты на основе определенного числа значений, скажем, 1663 для следующего случая:

-78.0599088 -11.89402416
-78.04317744 -11.88622134
-78.0267798 -11.87700462
-78.010353 -11.8692050399999
-77.9953194 -11.86129017
-77.96128788 -11.8449840599999
-77.92870572 -11.82838707
-77.89554864 -11.8117820699999
-77.86357524 -11.79488952
-77.83013412 -11.77942518
-77.7978615599999 -11.76223743
-77.765589 -11.7456140699999
-77.73216732 -11.72927727
-77.6996085599999 -11.7117892799999
-77.6673594 -11.6965884599999
-77.63510052 -11.6819618399999
-77.6045808 -11.6618759099999
-77.57262108 -11.6432262
-77.5406624399999 -11.62628883
-77.5072638 -11.6099197199999
-77.4753066 -11.5923951899999
-77.4427813199999 -11.57658786
-77.4093902399999 -11.5599159
-77.38064244 -11.5446833099999

Однако сложная часть здесь состоит в том, чтобы сохранить первые и последние позиции ииспользовать программные инструменты с открытым исходным кодом (такие как GDAL, AWK, GMT или другие инструменты командной строки bash, это было бы замечательно).

В качестве примера я ищу что-то похожее на «Точки эквидистанта (исправлено»).число) "опция XTools Pro: https://help.xtools.pro/pro/12.2/en/XTools_Pro_Components/Feature_conversions/Convert_Features_to_Points.htm

Здесь ожидаемый вывод, линия расстояния X, из которой были созданы 7 точек (узел или вершина) с учетом первой и последней позиций:

enter image description here

Любая поддержка приветствуется.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Python сделал трюк:

from shapely.geometry import LineString
import csv

with open('input_xy.txt') as fin:
    reader = csv.reader(fin)
    xy_floats = map(lambda x: (float(x[0]), float(x[1])), list(reader))
line = LineString(xy_floats)

num_points = 9  # includes first and last

new_points = [line.interpolate(i/float(num_points - 1), normalized=True) for i in range(num_points)]

with open('output_xy.txt', 'w') as fout:
    writer = csv.writer(fout)
    writer.writerows([ [point.x, point.y] for point in new_points])

Надеюсь, это поможет кому-то еще.

0 голосов
/ 21 января 2019

В следующем ответе предполагается, что ваши координаты находятся на сфере, а не на эллипсоиде.

Ваш вход содержит набор точек на большом круге между двумя точками p и q с координатами по долготе и широте:

p = {&phi;<sub>p</sub>,&lambda;<sub>p</sub>} = {-78.0599088, -11.89402416}
q = {&phi;<sub>q</sub>,&lambda;<sub>q</sub>} = {-77.38064244, -11.5446833099999}

Вызов n p единичный вектор p и n q единичный вектор q , тогда его координаты:

<i><b>n</b></i><sub>p</sub> = {cos(&phi;<sub>p</sub>) cos(&lambda;<sub>p</sub>),cos(&phi;<sub>p</sub>) sin(&lambda;<sub>p</sub>),sin(&phi;<sub>p</sub>)}
<i><b>n</b></i><sub>q</sub> = {cos(&phi;<sub>q</sub>) cos(&lambda;<sub>q</sub>),cos(&phi;<sub>q</sub>) sin(&lambda;<sub>q</sub>),sin(&phi;<sub>q</sub>)}

Вызовите α, а затем угол между n p и n q

&alpha; = arccos(<i><b>n</b></i><sub>p</sub>&middot;<i><b>n</b></i><sub>q</sub>)

Если теперь вы хотите, чтобы n точек находились на одинаковом расстоянии между p и q , вы должны разделить их под углом Δα= α / (n-1).

Тогда координаты этих точек:

<i><b>n</b></i><sub>i</sub> = <i><b>n</b></i><sub>p</sub> cos(i &Delta;&alpha;) + <i><b>n</b></i><sub>r</sub> sin(i &Delta;&alpha;)
<i><b>n</b></i><sub>r</sub> = Normalized[<i><b>n</b></i><sub>q</sub> - (<i><b>n</b></i><sub>q</sub>&middot;<i><b>n</b></i><sub>p</sub>) <i><b>n</b></i><sub>p</sub>] = (<i><b>n</b></i><sub>q</sub> - cos(&alpha;) <i><b>n</b></i><sub>p</sub>) / sin(&alpha;)

для i ∈ [0, n-1].Вышеизложенное понимается как простое вращение над iΔα из n p в n p - n r плоскость ( n p · n r = 0)

Эти координаты могут затем быть преобразованы обратно в долготу и широту, давая вам все промежуточные точки.

примечание: Это для эквидистантных точек на сфере, а не эллипсоида, таких как WGS 84

примечание: Сказанное выше не удастся для антиподальных точек.

Очень хороший справочник - Авиационный справочник Эда Уильяма

...