расстояние от точки внутри многоугольника до края многоугольника

Я работаю с огромной территорией, 7 состояниями леса и нелеса, используя данные NLCD. В некоторых лесных массивах есть участок (над моей магистерской диссертацией я работаю). Я поставил всех в тупик этим большим набором данных, но мы уверены, что есть решение. Лесная / нелесная область представляет собой дискретный растр со знаком. Я смог разделить лесную зону на многоугольники, выделив лесную зону. Я не могу превратить нелесную территорию в полигоны (слишком большие). Итак, я пытался получить расстояние от точки (точка находится внутри многоугольника) до края многоугольника, засаженного деревьями. Есть ли у вас предложения по увеличению расстояния до опушки леса?


person Community    schedule 22.05.2009    source источник
comment
Не могли бы вы уточнить, чего хотите? Вы хотите среднее расстояние или самое короткое расстояние? Что-то другое?   -  person Breton    schedule 22.05.2009
comment
Кроме того, вы собираетесь вычислить это для нескольких точек, верно?   -  person Dave    schedule 22.05.2009


Ответы (3)


Что ж, это действительно зависит от нескольких вещей; конкретно, какой край вам нужен? Вы хотите найти ближайшее ребро или у вас есть другие критерии, по которым вы хотите выбрать ребро (например, направление света)?

Если вы хотите найти ближайшее ребро, вы в основном хотите перебрать все линейные сегменты, определяемые многоугольником, выполняя расчет расстояния между отрезками линии и точкой; это определит ваше расстояние. Есть хорошая реализация алгоритма в Python на this Вопрос, а там есть хорошее описание алгоритмов.

person Paul Sonier    schedule 22.05.2009

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

- (double) distanceFromPoint:(yourPoint)testPoint
{

double pointX = edgePointB.x - edgePointA.x;
double pointY = edgePointB.y - edgePointA.y;

double k = pointX * pointX + pointY * pointY;
double u = ((testPoint.x - edgePointA.x) * pointX + (testPoint.y - edgePointA.y) * pointY) / k;

if (u > 1)
    u = 1;
else if (u < 0)
    u = 0;

double x = edgePointA.x + (u * pointX);
double y = edgePointA.y + (u * pointY);

double dx = x - testPoint.x;
double dy = y - testPoint.y;

return sqrt((dx * dx) + (dy * dy));

}
person Benoît Lahoz    schedule 18.03.2013
comment
Работает отлично, но вы допустили опечатку: u = ((testPoint.x - edgePointA.x) * pointX + (testPoint.y - edgePointA.y) * pointY) / k; - person scippie; 05.08.2013
comment
эй, ребята, а что такое ты там? - person http8086; 28.05.2019
comment
@workplaylifecycle: это дробь (от [0, 1]), которая представляет, где в сегменте / ребре падает проекция точки - person Azat Ibrakov; 30.04.2020

если вы не уверены, что точка находится внутри внешнего многоугольника, сначала проверьте это. Затем, чтобы проверить расстояние до ближайшего края леса, вы можете попробовать что-то вроде этого:

http://www.bdcc.co.uk/Gmaps/BdccGeo.js

У Google есть множество результатов по запросу «расстояние от точки до края многоугольника».

person Luke Schafer    schedule 22.05.2009