Есть ли математический расчет, чтобы определить, есть ли видимость между точкой A и точкой B с помощью Google Elevation API? - PullRequest
0 голосов
/ 18 апреля 2020

Есть ли способ проверить, есть ли прямая видимость между двумя точками, получая данные профиля высоты через Google API?

Например, я могу получить профиль высоты по этой ссылке: https://maps.googleapis.com/maps/api/elevation/json?path=36.578581, - 118.291994 | 36.23998, -116.83171 & samples = 10 & key = YOUR_API_KEY

В результате получается json с 10 точками, расположенными между двумя точками с отметкой земли, например:

    {
   "results" : [
      {
         "elevation" : 4411.94189453125,
         "location" : {
            "lat" : 36.578581,
            "lng" : -118.291994
         },
         "resolution" : 19.08790397644043
      },
      {
         "elevation" : 1658.561645507812,
         "location" : {
            "lat" : 36.54183904164596,
            "lng" : -118.1291141726249
         },
         "resolution" : 9.543951988220215
      },
      {
         "elevation" : 1085.295776367188,
         "location" : {
            "lat" : 36.50487579522382,
            "lng" : -117.966389550823
         },
         "resolution" : 9.543951988220215
      },
      {
         "elevation" : 1491.4912109375,
         "location" : {
            "lat" : 36.46769177008888,
            "lng" : -117.8038207060907
         },
         "resolution" : 9.543951988220215
      },
      {
         "elevation" : 1583.762817382812,
         "location" : {
            "lat" : 36.43028747728768,
            "lng" : -117.6414082023003
         },
         "resolution" : 9.543951988220215
      },
      {
         "elevation" : 488.8834228515625,
         "location" : {
            "lat" : 36.39266342953181,
            "lng" : -117.4791525957044
         },
         "resolution" : 9.543951988220215
      },
      {
         "elevation" : 933.0382080078125,
         "location" : {
            "lat" : 36.35482014117158,
            "lng" : -117.3170544349424
         },
         "resolution" : 9.543951988220215
      },
      {
         "elevation" : 1657.123779296875,
         "location" : {
            "lat" : 36.31675812816988,
            "lng" : -117.1551142610472
         },
         "resolution" : 9.543951988220215
      },
      {
         "elevation" : 1074.835205078125,
         "location" : {
            "lat" : 36.27847790807609,
            "lng" : -116.9933326074523
         },
         "resolution" : 9.543951988220215
      },
      {
         "elevation" : -84.51690673828125,
         "location" : {
            "lat" : 36.23998,
            "lng" : -116.83171
         },
         "resolution" : 9.543951988220215
      }
   ],
   "status" : "OK"
}

Существует ли математическая формула, чтобы проверить, можно ли увидеть точку A и точку B?

Мне нужно написать код в PHP.

Спасибо за все.

1 Ответ

0 голосов
/ 21 апреля 2020

Учитывая, что вы работаете с 2 точками вдоль прямой линии, я думаю, что самый простой способ справиться с этим - посмотреть на это с точки зрения 2D, где ось x относится к номеру вашей выборки, а ось y - ось относится к вашей отметке.

Затем мы предполагаем, что если отметка с результатом n выше, чем прямая, то линия визирования нарушается.

Где:

(x1, y1) = (1, 4411,94)

(x2, y2) = (10, -84,51)

Вот изображение графика и строка из одна точка к другой, нарисованная над ним: enter image description here

Мы видим, что для образцов 8 и 9 линия обзора нарушена.

Ниже приведен код найти то же самое. Он использует базовое c уравнение линии: y = mx + c

$results_json  = json_decode('{"results":[{"elevation":4411.94189453125,"location":{"lat":36.578581,"lng":-118.291994},"resolution":19.08790397644043},{"elevation":1658.561645507812,"location":{"lat":36.54183904164596,"lng":-118.1291141726249},"resolution":9.543951988220215},{"elevation":1085.295776367188,"location":{"lat":36.50487579522382,"lng":-117.966389550823},"resolution":9.543951988220215},{"elevation":1491.4912109375,"location":{"lat":36.46769177008888,"lng":-117.8038207060907},"resolution":9.543951988220215},{"elevation":1583.762817382812,"location":{"lat":36.43028747728768,"lng":-117.6414082023003},"resolution":9.543951988220215},{"elevation":488.8834228515625,"location":{"lat":36.39266342953181,"lng":-117.4791525957044},"resolution":9.543951988220215},{"elevation":933.0382080078125,"location":{"lat":36.35482014117158,"lng":-117.3170544349424},"resolution":9.543951988220215},{"elevation":1657.123779296875,"location":{"lat":36.31675812816988,"lng":-117.1551142610472},"resolution":9.543951988220215},{"elevation":1074.835205078125,"location":{"lat":36.27847790807609,"lng``":-116.9933326074523},"resolution":9.543951988220215},{"elevation":-84.51690673828125,"location":{"lat":36.23998,"lng":-116.83171},"resolution":9.543951988220215}],"status":"OK"}');

$x1 = 0;
$x2 = count($results_json->results);

$y1 = $results_json->results[0]->elevation;
$y2 = $results_json->results[$x2 - 1]->elevation; // last result in results array

$m = ($y2 - $y1) / ($x2 - $x1); // slope of the line
$c = $y2 - ($m * $x2);

$i = 0;
foreach ($results_json->results as $result){
    $elevation_of_straight_line = ($m * $i) + $c;
    $elevation_of_result = $result->elevation;
    if ($elevation_of_result > $elevation_of_straight_line){
        echo 'line of sight broken';
        echo 'Elevation of sample index '.$i.' = '.$elevation_of_result;
        echo 'Elevation of line of sight = '.$elevation_of_straight_line;
    }
    $i++;
}

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

...