2D геометрия расчета - на плоской поверхности - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь выполнить некоторые геометрические вычисления (, например, расстояние от точки до линии ) на плоских двухмерных плоскостях.

В настоящее время исследуется turfjs для вычисления расстояния от точки до линии.


Код

distance.js:

// hello
var turf = require('@turf/turf')

init();

// init,
function init() {
    distance();
}

function distance() {
    // line
    let line = turf.lineString([
    [0, 0],
    [3, 4]
    ]);
    console.log(line);

    // point
    let point = turf.point([3, 0]);
    console.log(point);

    // calculate distance from point to line, using planar,
    let dis = turf.pointToLineDistance(point, line, {
    units: 'degrees',
    method: 'planar'
    });
    console.log("distance: %f", dis);
}

Выход

расстояние: 2.398995395932417

Если изменить точку на [30, 0] и линию на [0, 0], [30, 40], то получится:

расстояние: 25.741472914575986

Программа использует degrees в качестве единицы и planar в качестве метода.

Ожидаемые результаты: 2.4 и 24, но это не так.


Вопрос

  • Значит ли это, что эти точки находятся на изогнутой поверхности вместо плоской плоскости?
  • Можно ли определять точки, линии и многоугольники в плоской плоскости вместоКривая поверхность?
  • Если нет, то есть ли другой аналогичный инструмент для выполнения этой задачи?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Turf.js предназначен для использования на картах Меркатора (веб, 2D), но для расчетов он основан на стандартах WSG84 (3D), т.е. считает Землю сфероидом.Однако иногда, особенно на больших территориях, представления и операции со сферическими элементами на 2D-карте дают неинтуитивные или неожиданные результаты;в этих случаях мы использовали Rhumb или даже евклидовы операции (отсюда, например, параметр planar для pointToLineDistance), что иногда может привести к снижению точности.

Итак, чтобы ответить наНа ваш первый вопрос Turf рассматривает ваши точки на изогнутой поверхности, а на ваш второй вопрос невозможно дать Turf команду работать на плоской поверхности.

Что касается альтернативных библиотек, вы можете рассмотреть возможность использования болееодин;В дополнение к уже предложенному flatten.js вы можете взглянуть на jsts для таких операций, как объединение и пересечение.

Если вы не ограничены Javascript, вы можете взглянуть на Python Shapely, который, на мой взгляд, очень мощный и надежный инструмент.

Обе вышеупомянутые библиотеки используются в нескольких пакетах Turf или используются в качестве справочного материала для реализации и / или результата.Замечание по jsts, оно показало некоторые проблемы в Turf, но вам может подойти это в зависимости от сложности ваших дел.

0 голосов
/ 06 июня 2018

Если вы посмотрите на исходный код turf.js для расстояния от точки до линии , вы увидите, что он вычисляет плоские расстояния вдоль прямой линии , и это не то, что вы бы сделалиожидать в плоской геометрии.

Чтобы достичь того, что вы хотите, вы можете самостоятельно реализовать уравнение , что-то вроде

function pointToLineDistance(line, p0) {
    var p1 = line[0],
        p2 = line[1];

    var x0 = p0[0], y0 = p0[1],
        x1 = p1[0], y1 = p1[1],
        x2 = p2[0], y2 = p2[1]


    return Math.abs(
        (y2 - y1) * x0
        - (x2 - x1) * y0
        + x2 * y1
        - y2 * x1
    ) 
    /
    Math.sqrt(
        (y2 - y1) * (y2 - y1)
        +
        (x2 - x1) * (x2 - x1)
    );
}

console.log(
    pointToLineDistance([[0, 0], [3, 4]], [3, 0]),
    pointToLineDistance([[0, 0], [30, 40]], [30, 0]),
);

Или, если вы предпочитаете библиотеку, вам может помочь что-то вроде flatten.js :

let Flatten = require('flatten-js');

let {point, line} = Flatten;

let l = line(point(0, 0), point(3, 4));
let p = point(3, 0)
let d = p.distanceTo(l);

console.log(d[0]);
...