Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: user1628340Ответов: 1

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

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

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

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

leafletlatitude-longitudegeometrymaprectangles

Ответы

Ответ 1 · рейтинг 1 · Patrick D

Во-первых, чтобы получить верхнюю левую и нижнюю правую точки, вам нужно использовать некоторую геометрию. Эта страница: 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 будет истинным, если границы содержат точку, и ложным, если нет.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы