chelkaz
@chelkaz

Как высчитать площадь по точкам (Map) в пространстве?

Имеются вершины по диагонали.
Вот пример:
x(A , B) и y(A , B)
1) - 179.306462 , 63.034977
2) - 179.370413 , 63.067053
Что бы из них высчитать и получить прямоугольник, я делаю следующее: Рисую в пространстве по координатам:
от x(A , B) до x(A) y(B) до y(A , B) до y(A) x(B) и соединяю в x(A , B)
Получается прямоугольник как нужно.
Но вот задача, если таких прямоугольников много, как мне узнать какой из них по площади больше?

Я хотел вот так и думаю это правильно для данного:

2) 179.306462, 63.067053 3) 179.370413, 63.067053

1) 179.306462, 63.034977 4) 179.370413, 63.034977

Вычесть расстояние 63.067053 - 63.034977 и умножить на разницу 179.370413 - 179.306462
Это и будет число, которое чем больше, тем соответственно приоритет у прямоугольника выше, но в координатах есть еще точки с минусом и тут я попал в ступор... Вот пример такого прямоугольника с минусами:

-169.115964,65.762301, -169.106136,65.762301,

-169.115964,65.758185, -169.106136,65.758185,
Тут уже не получится вычесть как в первом... Как универсально вычислять приоритет площади прямоугольников, зная только две вершины в пространстве на карте...
  • Вопрос задан
  • 4556 просмотров
Решения вопроса 1
chelkaz
@chelkaz Автор вопроса
Нашел библиотеку для вычисления https://github.com/mjaschen/phpgeo
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Просто одна диагональ (две точки) даёт бесконечное множество прямоугольников, самым большим по площади из которых будет квадрат со второй диагональю перпендикулярной имеющейся. Площадь будет равна половине квадрата диагонали или, через координаты точек:
S = ((x2 - x1)2 + (y2 - y1)2) / 2

Если добавить ограничение на то, что стороны прямоугольника должны быть параллельны осям координат, то получается один прямоугольник с площадью
S = |x2 - x1| * |y2 - y1|
Ответ написан
Можно воспользоваться методом Google Maps API computeArea() – туда первым параметром передать массив из 4 точек вашего прямоугольника.

Upd. Чуть погуглив, нашёл формулу для вычисления площади:
A = 2*pi*R^2 |sin(lat1)-sin(lat2)| |lon1-lon2|/360
    = (pi/180)R^2 |sin(lat1)-sin(lat2)| |lon1-lon2|


Т.е. на JavaScript это будет примерно так:
// Площадь прямоугольника, заданного двумя параллелями и двумя меридианами
function area( lat1, lat2, lng1, lng2, R) {
  R = R || 6371000; // радиус Земли в метрах
  var k = Math.PI / 180;
  return k * R * R 
    * Math.abs( Math.sin(lat1 * k) - Math.sin(lat2 * k))
    * Math.abs( lng1 - lng2);
}


У меня по вашим координатам получилась в Google площадь 205804.64643832657, а своим JS кодом 205344.32281511626 – наверное, из-за значения радиуса Земли, которое я взял из Вики, а Google нашёл более точное для этой широты.

area( 65.758185, 65.762301, -169.115964, -169.106136) // 205344.32281511626
Ответ написан
freeExec
@freeExec
Участник OpenStreetMap
Если вам не нравятся минусы, то можете сдвинуть на 180 градусов и считать от 0 до 360.
Ну и разные площади могут получатся когда землю представляют как шар или как эллипсоид.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы