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

Мне нужно проверить, находится ли точка в заданном прямоугольнике на карте. Я использую листовку для создания ограничивающих рамок, которые требуют от меня указать юго-западную и северо-восточную точки прямоугольника.

У меня есть следующая информация: 1. средняя точка верхнего края прямоугольника 2. средняя точка нижнего края прямоугольника 3. длина края (т.е. ширина) = 1000 м.

Можно с уверенностью предположить, что две приведенные выше точки очень близки.

Любые идеи о том, как этого можно достичь, будут полезны.


person user1628340    schedule 05.09.2013    source источник


Ответы (1)


Во-первых, чтобы получить верхнюю левую и нижнюю правую точки, вам нужно использовать некоторую геометрию. Эта страница: https://gis.stackexchange.com/questions/2951/algorithm-for-offsetting-a-latitude-longitude-by-some-amount-of-meters - отличный пример того, как точно преобразовать метры в десятичные градусы.

Например, чтобы получить верхнюю левую точку, вы начинаете со средней точки линии, и у вас есть общая длина линии, вам нужно разделить длину линии на 2, а затем преобразовать эту длину от метров до десятичных градусов, затем добавьте координату X на эту величину. Это даст вам верхний правый угол. Повторите это для нижнего левого угла, вычитая эту сумму вместо вычитания.

var upperMiddlePoint = [30,50];
var segmentLength = 5000;
var northEastPoint = upperMiddlePoint;
var northEastPoint.x = northEastPoint.x + ((segmentLength / 2) * DECIMAL_DEGREES_PER_METER)

Здесь есть быстрый и простой ответ: Простые вычисления для работы с расстоянием широта / долгота + км?, в котором описано, как получить значение DECIMAL_DEGREES_PER_METER в приведенном выше фрагменте.

Чтобы создать объект LatLngBounds для представления границ вашего прямоугольника. API здесь.

var bounds = new L.LatLngBounds(southWestPoint, northEastPoint);

Затем используйте функцию LatLngBounds.contains(), как описано здесь, чтобы определить, соответствует ли ваша точка зрения эти границы.

var contains = bounds.contains([50, 30]);
if (contains) {
     doStuff();
}

Логическое значение contains будет истинным, если границы содержат точку, и ложным, если нет.

person Patrick D    schedule 05.09.2013
comment
Я знаю о вышеуказанной функции. Какой у меня вопрос, как рассчитать SouthWestPoint и northEastPoint, когда у меня есть данные, упомянутые в вопросе - person user1628340; 05.09.2013
comment
Тогда это может показаться простой проблемой геометрии. Можете ли вы вычесть 1/2 длины вашего края (скажем, 500 м) из координаты X верхнего края средней точки, чтобы получить верхний левый угол? Тогда проделать то же самое с низом? - person Patrick D; 05.09.2013
comment
Добавил код в начало моего ответа, чтобы описать это. - person Patrick D; 05.09.2013